@@ -2124,11 +2124,8 @@ else
21242124 /* https://dlang.org/spec/statement.html#IfStatement
21252125 */
21262126
2127- // Evaluate at runtime
2128- CSX cs0 = sc.ctorflow.callSuper;
2129- CSX cs1;
2130- CSX [] fi0 = sc.ctorflow.saveFieldInit();
2131- CSX [] fi1 = null ;
2127+ // Save 'root' of two branches (then and else)
2128+ CtorFlow ctorflow_root = sc.ctorflow.clone();
21322129
21332130 // check in syntax level
21342131 ifs.condition = checkAssignmentAsCondition(ifs.condition);
@@ -2187,14 +2184,13 @@ else
21872184 ifs.ifbody = ifs.ifbody.semanticNoScope(scd);
21882185 scd.pop();
21892186
2190- cs1 = sc.ctorflow.callSuper;
2191- fi1 = sc.ctorflow.fieldinit;
2192- sc.ctorflow.callSuper = cs0;
2193- sc.ctorflow.fieldinit = fi0;
2187+ CtorFlow ctorflow_then = sc.ctorflow; // move flow results
2188+ sc.ctorflow = ctorflow_root; // reset flow analysis back to root
21942189 if (ifs.elsebody)
21952190 ifs.elsebody = ifs.elsebody.semanticScope(sc, null , null );
2196- sc.mergeCallSuper(ifs.loc, cs1);
2197- sc.mergeFieldInit(ifs.loc, fi1);
2191+
2192+ // Merge 'then' results into 'else' results
2193+ sc.merge(ifs.loc, ctorflow_then);
21982194
21992195 if (ifs.condition.op == TOK .error ||
22002196 (ifs.ifbody && ifs.ifbody.isErrorStatement()) ||
@@ -3228,23 +3224,22 @@ else
32283224 rs.error(" `return` without calling constructor" );
32293225 errors = true ;
32303226 }
3231- sc.ctorflow.callSuper |= CSX .return_;
3232- if (sc.ctorflow.fieldinit.length)
3227+
3228+ if (sc.ctorflow.fieldinit.length) // if aggregate fields are being constructed
32333229 {
32343230 auto ad = fd.isMember2();
32353231 assert (ad);
3236- foreach (i; 0 .. sc.ctorflow.fieldinit.length )
3232+ foreach (i, v; ad.fields )
32373233 {
3238- VarDeclaration v = ad.fields[i];
32393234 bool mustInit = (v.storage_class & STC .nodefaultctor || v.type.needsNested());
32403235 if (mustInit && ! (sc.ctorflow.fieldinit[i] & CSX .this_ctor))
32413236 {
32423237 rs.error(" an earlier `return` statement skips field `%s` initialization" , v.toChars());
32433238 errors = true ;
32443239 }
3245- sc.ctorflow.fieldinit[i] |= CSX .return_;
32463240 }
32473241 }
3242+ sc.ctorflow.orCSX(CSX .return_);
32483243
32493244 if (errors)
32503245 return setError ();
@@ -4004,10 +3999,8 @@ else
40043999
40054000 sc = sc.push();
40064001 sc.scopesym = sc.enclosing.scopesym;
4007- sc.ctorflow.callSuper |= CSX .label;
40084002
4009- foreach (ref u; sc.ctorflow.fieldinit)
4010- u |= CSX .label;
4003+ sc.ctorflow.orCSX(CSX .label);
40114004
40124005 sc.slabel = ls;
40134006 if (ls.statement)
0 commit comments