compiler/libec: Fixed reference level assigning a struct to a map
authorJerome St-Louis <jerome@ecere.com>
Mon, 9 Jun 2014 18:29:50 +0000 (14:29 -0400)
committerJerome St-Louis <jerome@ecere.com>
Mon, 9 Jun 2014 18:29:50 +0000 (14:29 -0400)
compiler/bootstrap/libec/bootstrap/pass2.c
compiler/libec/src/pass2.ec

index db78ef1..006ae92 100644 (file)
@@ -1757,6 +1757,7 @@ if(exp->__anon1.op.op == '=' || exp->__anon1.op.op == MUL_ASSIGN || exp->__anon1
 {
 struct Expression * memberExp;
 struct Expression * parentExp = (((void *)0));
+unsigned int isIndexedContainerAssignment = 0;
 
 if(exp->__anon1.op.exp1 && exp->__anon1.op.exp1->type == 8)
 {
@@ -1894,7 +1895,10 @@ if(memberExp && memberExp->type == 6 && memberExp->__anon1.index.exp && memberEx
 struct __ecereNameSpace__ecere__com__Class * c = memberExp->__anon1.index.exp->expType->__anon1._class->__anon1.registered;
 
 if(strcmp((c->templateClass ? c->templateClass : c)->name, "Array"))
+{
 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2)))));
+isIndexedContainerAssignment = 1;
+}
 ProcessExpression(memberExp);
 while(memberExp && ((memberExp->type == 5 && (*memberExp->__anon1.list).count == 1) || memberExp->type == 32 || memberExp->type == 23))
 {
@@ -2165,7 +2169,7 @@ if(value)
 value->tempCount = exp->tempCount;
 ProcessExpression(value);
 if(needAddress)
-FixReference(value, 1);
+FixReference(isIndexedContainerAssignment ? GetInnerExp(value) : value, 1);
 }
 FreeExpression(memberExp);
 }
index 681a21a..b51d0f7 100644 (file)
@@ -422,6 +422,7 @@ static void ProcessExpression(Expression exp)
          {
             Expression memberExp;
             Expression parentExp = null; // Where to take memberExp out from
+            bool isIndexedContainerAssignment = false;
 
             // TOCHECK: See note below for this if
             if(exp.op.exp1 && exp.op.exp1.type == ExpressionType::memberExp)
@@ -589,7 +590,10 @@ static void ProcessExpression(Expression exp)
             {
                Class c = memberExp.index.exp.expType._class.registered;
                if(strcmp((c.templateClass ? c.templateClass : c).name, "Array"))
+               {
                   exp.op.exp2 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), null), MkExpBrackets(MkListOne(exp.op.exp2)))));
+                  isIndexedContainerAssignment = true;
+               }
 
                ProcessExpression(memberExp);
 
@@ -897,7 +901,7 @@ static void ProcessExpression(Expression exp)
                                  value.tempCount = exp.tempCount;
                                  ProcessExpression(value);
                                  if(needAddress)
-                                    FixReference(value, true);
+                                    FixReference(isIndexedContainerAssignment ? GetInnerExp(value) : value, true);
                               }
 
                               FreeExpression(memberExp);