diff dmd/mtype.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 04177061f98d
children 05c235309d6f
line wrap: on
line diff
--- a/dmd/mtype.c	Sun Jun 14 14:28:11 2009 +0200
+++ b/dmd/mtype.c	Sun Jun 14 19:49:58 2009 +0200
@@ -3409,7 +3409,7 @@
 		v = s->isVarDeclaration();
 		if (v && id == Id::length)
 		{
-		    if (v->isConst() && v->getExpInitializer())
+		    if (v->isSameAsInitializer() && v->getExpInitializer())
 		    {	e = v->getExpInitializer()->exp;
 		    }
 		    else
@@ -3456,7 +3456,7 @@
 	if (v)
 	{
 	    // It's not a type, it's an expression
-	    if (v->isConst() && v->getExpInitializer())
+	    if (v->isSameAsInitializer() && v->getExpInitializer())
 	    {
 		ExpInitializer *ei = v->getExpInitializer();
 		assert(ei);
@@ -4520,7 +4520,7 @@
     s = s->toAlias();
 
     v = s->isVarDeclaration();
-    if (v && v->isConst() && v->type->toBasetype()->ty != Tsarray)
+    if (v && v->isSameAsInitializer() && v->type->toBasetype()->ty != Tsarray)
     {	ExpInitializer *ei = v->getExpInitializer();
 
 	if (ei)
@@ -4932,7 +4932,7 @@
 	s->checkDeprecated(e->loc, sc);
     s = s->toAlias();
     v = s->isVarDeclaration();
-    if (v && v->isConst() && v->type->toBasetype()->ty != Tsarray)
+    if (v && v->isSameAsInitializer() && v->type->toBasetype()->ty != Tsarray)
     {	ExpInitializer *ei = v->getExpInitializer();
 
 	if (ei)