@@ -621,7 +621,7 @@ TupleDeclaration isAliasThisTuple(Expression e)
621621 */
622622Expression addressOf(Expression e)
623623{
624- //printf("Expression::addressOf()\n");
624+ //printf("Expression::addressOf() %s \n", e.toChars() );
625625 debug
626626 {
627627 assert(e.op == EXP.error || e.isLvalue());
@@ -16213,7 +16213,9 @@ private Expression toLvalueImpl(Expression _this, Scope* sc, const(char)* action
1621316213 // convert (econd ? e1 : e2) to *(econd ? &e1 : &e2)
1621416214 CondExp e = cast(CondExp)(_this.copy());
1621516215 e.e1 = _this.e1.toLvalue(sc, action).addressOf();
16216+ checkAddressable(e.e1, sc);
1621616217 e.e2 = _this.e2.toLvalue(sc, action).addressOf();
16218+ checkAddressable(e.e2, sc);
1621716219 e.type = _this.type.pointerTo();
1621816220 return new PtrExp(_this.loc, e, _this.type);
1621916221
@@ -16600,6 +16602,7 @@ private bool checkAddressVar(Scope* sc, Expression exp, VarDeclaration v)
1660016602 */
1660116603bool checkAddressable(Expression e, Scope* sc)
1660216604{
16605+ //printf("checkAddressable() %s\n", e.toChars());
1660316606 Expression ex = e;
1660416607 while (true)
1660516608 {
@@ -16627,7 +16630,7 @@ bool checkAddressable(Expression e, Scope* sc)
1662716630 continue;
1662816631
1662916632 case EXP.variable:
16630- if (sc.inCfile)
16633+ if (sc && sc .inCfile)
1663116634 {
1663216635 // C11 6.5.3.2: A variable that has its address taken cannot be
1663316636 // stored in a register.
0 commit comments