diff dmd/expression.c @ 1499:df11cdec45a2

Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324. The idea is to separate the notion of const from 'this variable can always be replaced with its initializer' in the frontend. To do that, I introduced Declaration::isSameAsInitializer, which is overridden in VarDeclaration to return false for constants that have a struct literal initializer. So {{{ const S s = S(5); void foo() { auto ps = &s; } // is no longer replaced by void foo() { auto ps = &(S(5)); } }}} To make taking the address of a struct constant with a struct-initializer outside of function scope possible, I made sure that AddrExp::optimize doesn't try to run the argument's optimization with WANTinterpret - that'd again replace the constant with a struct literal temporary.
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Jun 2009 19:49:58 +0200
parents 229e02867307
children 05c235309d6f
line wrap: on
line diff
--- a/dmd/expression.c	Sun Jun 14 14:28:11 2009 +0200
+++ b/dmd/expression.c	Sun Jun 14 19:49:58 2009 +0200
@@ -2113,7 +2113,7 @@
 		type = Type::terror;
 	    }
 	}
-	if (v->isConst() && type->toBasetype()->ty != Tsarray)
+	if (v->isSameAsInitializer() && type->toBasetype()->ty != Tsarray)
 	{
 	    if (v->init)
 	    {
@@ -3242,13 +3242,10 @@
 }
 #endif
 
-/*
-Removed in LDC. See declaration.
 Expression *StructLiteralExp::toLvalue(Scope *sc, Expression *e)
 {
     return this;
 }
-*/
 
 
 int StructLiteralExp::checkSideEffect(int flag)
@@ -3949,7 +3946,7 @@
     VarDeclaration *v = var->isVarDeclaration();
     if (v)
     {
-	if (v->isConst() && type->toBasetype()->ty != Tsarray && v->init)
+	if (v->isSameAsInitializer() && type->toBasetype()->ty != Tsarray && v->init)
 	{
 	    ExpInitializer *ei = v->init->isExpInitializer();
 	    if (ei)
@@ -5355,7 +5352,7 @@
 		    return this;
 		}
 		type = v->type;
-		if (v->isConst())
+		if (v->isSameAsInitializer())
 		{
 		    if (v->init)
 		    {
@@ -5614,7 +5611,7 @@
 		accessCheck(loc, sc, e1, var);
 
 	    VarDeclaration *v = var->isVarDeclaration();
-	    if (v && v->isConst())
+	    if (v && v->isSameAsInitializer())
 	    {	ExpInitializer *ei = v->getExpInitializer();
 		if (ei)
 		{   Expression *e = ei->exp->copy();