diff dmd2/optimize.c @ 1577:e4f7b5d9c68a

DMD 2.032 Merge.
author Robert Clipsham <robert@octarineparrot.com>
date Tue, 08 Sep 2009 10:07:56 +0100
parents 54b3c1394d62
children
line wrap: on
line diff
--- a/dmd2/optimize.c	Tue Aug 25 21:35:43 2009 +0200
+++ b/dmd2/optimize.c	Tue Sep 08 10:07:56 2009 +0100
@@ -86,6 +86,8 @@
 		    e = ei->syntaxCopy();
 		    e = e->semantic(v->scope);
 		    e = e->implicitCastTo(v->scope, v->type);
+		    // enabling this line causes test22 in test suite to fail
+		    //ei->type = e->type;
 		    v->scope = NULL;
 		    v->inuse--;
 		}
@@ -426,11 +428,50 @@
     return this;
 }
 
+Expression *NewExp::optimize(int result)
+{
+    if (thisexp)
+	thisexp = thisexp->optimize(WANTvalue);
+
+    // Optimize parameters
+    if (newargs)
+    {
+	for (size_t i = 0; i < newargs->dim; i++)
+	{   Expression *e = (Expression *)newargs->data[i];
+
+	    e = e->optimize(WANTvalue);
+	    newargs->data[i] = (void *)e;
+	}
+    }
+
+    if (arguments)
+    {
+	for (size_t i = 0; i < arguments->dim; i++)
+	{   Expression *e = (Expression *)arguments->data[i];
+
+	    e = e->optimize(WANTvalue);
+	    arguments->data[i] = (void *)e;
+	}
+    }
+    return this;
+}
+
 Expression *CallExp::optimize(int result)
 {
     //printf("CallExp::optimize(result = %d) %s\n", result, toChars());
     Expression *e = this;
 
+    // Optimize parameters
+    if (arguments)
+    {
+	for (size_t i = 0; i < arguments->dim; i++)
+	{   Expression *e = (Expression *)arguments->data[i];
+
+	    e = e->optimize(WANTvalue);
+	    arguments->data[i] = (void *)e;
+	}
+    }
+
     e1 = e1->optimize(result);
     if (e1->op == TOKvar)
     {
@@ -792,7 +833,8 @@
     e2 = e2->optimize(WANTvalue | (result & WANTinterpret));
     e = this;
 
-    if (this->e1->isConst() && this->e2->isConst())
+    if ((this->e1->isConst()     && this->e2->isConst()) ||
+	(this->e1->op == TOKnull && this->e2->op == TOKnull))
     {
 	e = Identity(op, type, this->e1, this->e2);
     }