sdk: const correctness
[sdk] / compiler / libec / src / pass16.ec
index 09adbe9..d32569f 100644 (file)
@@ -1,7 +1,7 @@
 import "ecdefs"
 
 #define YYLTYPE Location
-#include "grammar.eh"
+#include "grammar.h"
 
 extern External curExternal;
 static Statement curCompound;
@@ -25,15 +25,13 @@ static void CreateInstancesBody()
       //strcpy(moduleName, outputFile);
       GetLastDirectory(outputFile, moduleName);
       StripExtension(moduleName);
-      ChangeCh(moduleName, ' ', '_');
-      ChangeCh(moduleName, '.', '_');
-      ChangeCh(moduleName, '-', '_');
+      FixModuleName(moduleName);
       sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
 
       declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
 
       {
-         FunctionDefinition function = MkFunction(specifiers, declarator, null);
+         FunctionDefinition function = _MkFunction(specifiers, declarator, null, false);
          ProcessFunctionBody(function, createInstancesBody);
          ListAdd(ast, MkExternalFunction(function));
       }
@@ -50,7 +48,7 @@ static void CreateInstancesBody()
       declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
 
       {
-         FunctionDefinition function = MkFunction(specifiers, declarator, null);
+         FunctionDefinition function = _MkFunction(specifiers, declarator, null, false);
          ProcessFunctionBody(function, destroyInstancesBody);
          ListAdd(ast, MkExternalFunction(function));
       }
@@ -138,7 +136,7 @@ static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Insta
                               {
                                  curMember = thisMember;
                                  curClass = curMember._class;
-                                 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                                 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                                  subMemberStackPos = _subMemberStackPos;
                               }
                               if(!firstID.next && thisMember == dataMember)
@@ -149,7 +147,7 @@ static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Insta
                            }
 
                            /*
-                           BTNamedLink link = parentMember.membersAlpha.Find((uint)firstID.string);
+                           BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
                            if(link)
                            {
                               curMember = link.data;
@@ -277,7 +275,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                            {
                               curMember = thisMember;
                               curClass = curMember._class;
-                              memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                              memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                               subMemberStackPos = _subMemberStackPos;
                            }
                            if(thisMember == bitMember)
@@ -323,7 +321,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                               MkTypeName(specs, decl), MkExpBrackets(MkListOne(member.initializer.exp))))), LEFT_OP, MkExpConstant(pos))));
                         }
                         else
-                           part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl), 
+                           part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl),
                               MkExpBrackets(MkListOne(member.initializer.exp)))));
                         // Take it out
                         member.initializer.exp = null;
@@ -502,11 +500,11 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                                        {
                                           curMember = thisMember;
                                           curClass = curMember._class;
-                                          memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                                          memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                                           subMemberStackPos = _subMemberStackPos;
                                        }
                                        if(!firstID.next && curMember == dataMember)
-                                       {                                 
+                                       {
                                           memberFilled = true;
                                           break;
                                        }
@@ -599,7 +597,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                         {
                            curMember = thisMember;
                            curClass = curMember._class;
-                           memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                           memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                            subMemberStackPos = _subMemberStackPos;
                         }
                      }
@@ -616,7 +614,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                      thisMember = curMember;
                   }
 
-                  if(thisMember || method)
+                  if(instExp && (thisMember || method))
                   {
                      Expression instExpCopy = CopyExpression(instExp);
                      Expression setExp = null;
@@ -628,6 +626,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                      if(ident)
                      {
                         Expression memberExp;
+                        bool freeMemberExp = false;
 
                         if(thisMember && thisMember.isProperty && ((Property)thisMember).conversion)
                            convert = true;
@@ -637,7 +636,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                            // TODO: Set the member types for those
                            memberExp = MkExpMember(instExpCopy, id);
                            for(id = id.next; id; id = id.next)
-                              memberExp = MkExpMember(memberExp, id);                     
+                              memberExp = MkExpMember(memberExp, id);
                         }
                         else
                            memberExp = MkExpMember(instExpCopy, ident);
@@ -652,8 +651,12 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                            FreeInitializer(member.initializer);
                            member.initializer = null;
                         }
+                        else
+                        {
+                           freeMemberExp = true;
+                           // TOCHECK: WHat happens in here?
+                        }
                         // TODO: list initializer not working...
-
                         memberExp.loc = inst.loc;
 
                         if(member.identifiers)
@@ -674,6 +677,8 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
 
                            ListAdd(list, setExp);
                         }
+                        if(freeMemberExp)
+                           FreeExpression(memberExp);
                      }
                   }
                }
@@ -684,7 +689,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
    return fullSet || convert;
 }
 
-public void DeclareClass(Symbol classSym, char * className)
+public void DeclareClass(Symbol classSym, const char * className)
 {
    /*if(classSym.registered.templateClass)
    {
@@ -712,7 +717,7 @@ public void DeclareClass(Symbol classSym, char * className)
          if(!classSym.module) return;
          classSym._import = ClassImport
          {
-            isRemote = classSym.registered ? classSym.registered.isRemote : false;
+            isRemote = classSym.registered ? classSym.registered.isRemote : 0;
             name = CopyString(classSym.string);
          };
          classSym.module.classes.Add(classSym._import);
@@ -726,7 +731,7 @@ public void DeclareClass(Symbol classSym, char * className)
       ListAdd(specifiers, MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null));
 
       d = MkDeclaratorPointer(MkPointer(null, null),
-         MkDeclaratorIdentifier(MkIdentifier(className)));                           
+         MkDeclaratorIdentifier(MkIdentifier(className)));
 
       ListAdd(declarators, MkInitDeclarator(d, null));
 
@@ -743,7 +748,7 @@ public void DeclareClass(Symbol classSym, char * className)
          classSym.idCode = classSym.id;
       }
    }
-   else if(classSym && curExternal.symbol.idCode < classSym.id)
+   else if(classSym && curExternal && curExternal.symbol.idCode < classSym.id)
    //else if(curExternal.symbol.id <= classSym.id)
    {
       // DANGER: (Moved here)
@@ -800,7 +805,7 @@ static void ProcessExpression(Expression exp)
                   OldList list = { 0 };
 
                   ProcessInstMembers(inst, null, &list, false);
-               
+
                   ProcessExpression(inst.exp);
 
                   //Why was this here twice? ProcessInstMembers(inst, null, &list);
@@ -845,7 +850,7 @@ static void ProcessExpression(Expression exp)
                   Expression e;
 
                   ProcessInstMembers(inst, null, &list, false);
-               
+
                   ProcessExpression(inst.exp);
 
                   //Why was this here twice? ProcessInstMembers(inst, null, &list);
@@ -858,7 +863,7 @@ static void ProcessExpression(Expression exp)
                   inst.exp = null;
 
                   list.Remove(list.first);
-                  while(e = list.first)
+                  while((e = list.first))
                   {
                      list.Remove(e);
                      FreeExpression(e);
@@ -882,7 +887,7 @@ static void ProcessExpression(Expression exp)
                      exp.expType = expType;
                      exp.prev = prev;
                      exp.next = next;
-                     while(e = list.first)
+                     while((e = list.first))
                      {
                         list.Remove(e);
                         FreeExpression(e);
@@ -904,16 +909,17 @@ static void ProcessExpression(Expression exp)
                   exp.list = MkList();
 
                   ProcessInstMembers(inst, inst.exp, exp.list, false);
-               
+
                   ProcessExpression(inst.exp);
 
                   if(!exp.list->count)
                   {
-                     exp.type = (ExpressionType)1000; // remove expression
+                     exp.type = dummyExp; // remove expression
+                     delete exp.list;
                   }
 
-                  // Take expression out...
-                  inst.exp = null;
+                  // Take expression out... -- It seems ProcessInstMembers() makes copies of it and it needs to be freed now
+                  // inst.exp = null;
                }
                else
                {
@@ -1024,7 +1030,7 @@ static void ProcessExpression(Expression exp)
             {
                Expression newCall;
 
-               if(classSym && classSym.registered && classSym.registered.type == noHeadClass && 
+               if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
                   (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
                {
                   char size[256];
@@ -1089,8 +1095,8 @@ static void ProcessExpression(Expression exp)
                      char ecereTemp[100];
                      MembersInit members;
                      int tempCount = exp.tempCount;
-                     Expression tmpExp;
-               
+                     OldList * expList;
+
                      // Check if members use temp count...
                      for(members = inst.members->first; members; members = members.next)
                      {
@@ -1108,53 +1114,36 @@ static void ProcessExpression(Expression exp)
                         }
                      }
                      if(curDecl)
-                     {
                         tempCount = Max(tempCount, declTempCount);
-                     }
-               
+
                      tempCount++;
                      curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
-                     sprintf(ecereTemp, "__ecereTemp%d", tempCount);
-
-                     // (__ecereTemp = eInstance_New(_class), __ecerePropclass_Set( ), __ecereTemp)
-               
-                     /*
-                     instExp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp))));
-                     //instExp = QMkExpId(ecereTemp);
+                     sprintf(ecereTemp, "__ecereInstance%d", tempCount);
+                     exp.type = extensionCompoundExp;
+                     exp.compound = MkCompoundStmt(null, null);
+                     exp.compound.compound.context = PushContext();
+                     exp.compound.compound.context.simpleID = exp.compound.compound.context.parent.simpleID;
+                     exp.compound.compound.declarations = MkListOne(QMkDeclaration(inst._class.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)),
+                        MkInitializerAssignment(newCall))));
+                     exp.compound.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
+
+                     instExp = QMkExpId(ecereTemp);
                      instExp.tempCount = tempCount;
-
-                     exp.type = bracketsExp;
-                     exp.list = MkList();
-
-                     ListAdd(exp.list, MkExpOp(instExp, '=', newCall));
-                     */
-
-                     instExp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp))));
-
-                     instExp.tempCount = tempCount;
-                     exp.type = bracketsExp;
-                     exp.list = MkList();
-
-                     ListAdd(exp.list,           MkExpOp((tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp), '=', newCall));
-
                      instExp.expType = MkClassType(inst._class.name);
-
-                     ProcessInstMembers(inst, instExp, exp.list, false);
-                  
+                     instExp.byReference = true;
+                     ProcessInstMembers(inst, instExp, expList, false);
                      FreeExpression(instExp);
 
-                     ProcessExpression(tmpExp);
-
-                     // TEST: exp.tempCount = Max(exp.tempCount, instExp.tempCount);
-
                      if(exp.usage)
-                        //ListAdd(exp.list, QMkExpId(ecereTemp));
-                        ListAdd(exp.list, MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp)))));
+                     {
+                        Expression tmpExp = QMkExpId(ecereTemp);
+                        tmpExp.byReference = true;
+                        ListAdd(expList, tmpExp);
+                     }
                      exp.tempCount = tempCount;
                      if(curDecl)
-                     {
                         declTempCount = Max(declTempCount, tempCount);
-                     }
+                     PopContext(exp.compound.compound.context);
                   }
                   else
                   {
@@ -1192,17 +1181,17 @@ static void ProcessExpression(Expression exp)
          break;
       case opExp:
       {
-         bool assign = false;
+         //bool assign = false;
 
          switch(exp.op.op)
          {
             // Assignment Operators
-            case '=': 
+            case '=':
                if(exp.op.exp2)
                   exp.op.exp2.usage.usageGet = true;
                if(exp.op.exp1)
                   exp.op.exp1.usage.usageSet = true;
-               assign = true;
+               //assign = true;
                break;
             case MUL_ASSIGN:
             case DIV_ASSIGN:
@@ -1216,7 +1205,7 @@ static void ProcessExpression(Expression exp)
             case OR_ASSIGN:
                if(exp.op.exp2)
                   exp.op.exp2.usage.usageGet = true;
-               assign = true;
+               //assign = true;
                if(exp.op.exp1)
                   exp.op.exp1.usage.usageSet = true;
                break;
@@ -1263,7 +1252,7 @@ static void ProcessExpression(Expression exp)
             case '|':
             case '^':
             case AND_OP:
-            case OR_OP:        
+            case OR_OP:
                if(exp.op.exp1)
                   exp.op.exp1.usage.usageGet = true;
                if(exp.op.exp2)
@@ -1338,16 +1327,16 @@ static void ProcessExpression(Expression exp)
                Context context = PushContext();
 
                sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
-      
+
                ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
-               
+
                ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
                   MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
 
                ListAdd(args, MkExpBrackets(exp.index.index));
                ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
-               
-               ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")), 
+
+               ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
                   MkIdentifier("Index")), args))));
 
                ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
@@ -1367,7 +1356,7 @@ static void ProcessExpression(Expression exp)
       case callExp:
       {
          Expression e;
-         Method method = null;
+         //Method method = null;
 
          ProcessExpression(exp.call.exp);
 
@@ -1428,7 +1417,7 @@ static void ProcessExpression(Expression exp)
                      }
                   }
                }
-               if(!prop && !member)
+               if(!prop && !member && !method)     // NOTE: Recently added the !method here, causes private methods to unprioritized
                   method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
                if(!prop && !member && !method)
                {
@@ -1440,7 +1429,7 @@ static void ProcessExpression(Expression exp)
                         revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
                   }
                }
-      
+
                if(prop)
                {
                   exp.member.memberType = propertyMember;
@@ -1457,7 +1446,7 @@ static void ProcessExpression(Expression exp)
                   if(!method.dataType)
                      //method.dataType = ((Symbol)method.symbol).type;
                      ProcessMethodType(method);
-                  
+
                   FreeType(exp.expType);
                   exp.expType = method.dataType;
                   if(method.dataType) method.dataType.refCount++;
@@ -1481,7 +1470,7 @@ static void ProcessExpression(Expression exp)
                   exp.expType = MkClassType(revConvert._class.fullName);
                }/*
                else
-                  printf("Error: Couldn't find member %s in class %s\n", 
+                  printf($"Error: Couldn't find member %s in class %s\n",
                      exp.member.member.string, _class.name);*/
             }
          }
@@ -1517,7 +1506,8 @@ static void ProcessExpression(Expression exp)
       case extensionCompoundExp:
       {
          if(exp.compound.compound.statements &&
-         ((Statement)exp.compound.compound.statements->last).type == expressionStmt && 
+         ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
+         ((Statement)exp.compound.compound.statements->last).expressions &&
          ((Statement)exp.compound.compound.statements->last).expressions->last)
          {
             ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
@@ -1530,6 +1520,11 @@ static void ProcessExpression(Expression exp)
          ProcessExpression(exp.vaArg.exp);
          break;
       }
+      case extensionInitializerExp:
+      {
+         ProcessInitializer(exp.initializer.initializer);
+         break;
+      }
    }
    CheckTemplateTypes(exp);
 }
@@ -1598,7 +1593,7 @@ static void ProcessSpecifier(Specifier spec)
    }
 }
 
-static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list)
+static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list, DataMember namedParentMember, bool parentMemberSet)
 {
    Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
    DataMember dataMember = null;
@@ -1612,10 +1607,28 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
 
       if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
       {
-         if(!ProcessBracketInst_DataMember(dataMember, inst, list))
+         OldList * subList = 0; //(dataMember.type == structMember) ? MkList() : null;
+
+         if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember.name ? dataMember : namedParentMember, someMemberSet || parentMemberSet))
+         {
+            if(subList)
+               FreeList(subList, FreeInitializer);
+
             return false;
+         }
+         if(subList && subList->count)
+         {
+            ListAdd(list, MkInitializerList(subList));
+            someMemberSet = true;
+         }
+         else
+         {
+            if(list.count)
+               someMemberSet = true;
+            delete subList;
+         }
       }
-      else 
+      else
       {
          Class curClass = null;
          DataMember curMember = null;
@@ -1646,11 +1659,11 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
                         {
                            curMember = thisMember;
                            curClass = curMember._class;
-                           memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                           memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                            subMemberStackPos = _subMemberStackPos;
                         }
                         /*
-                        BTNamedLink link = parentMember.membersAlpha.Find((uint)firstID.string);
+                        BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
                         if(link)
                         {
                            curMember = link.data;
@@ -1691,10 +1704,10 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
                                  // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
                                  // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
                                  /*member.identifiers->Remove(firstID);*/
-                                 ListAdd(partList, 
+                                 ListAdd(partList,
                                     MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
                               }
-                          
+
                               for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
                               {
                                  if(!nextMembers.dataMembers)
@@ -1710,7 +1723,7 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
                                         nextMember = next, next = nextMember ? nextMember.next : null)
                                     {
                                        Identifier nextID = nextMember.identifiers->first;
-                                       if(nextMember.identifiers && 
+                                       if(nextMember.identifiers &&
                                           nextMember.identifiers->count > 1 &&
                                           !strcmp(firstID.string, nextID.string))
                                        {
@@ -1722,7 +1735,7 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
                                  }
                               }
 
-                              member.initializer.exp = MkExpInstance(MkInstantiation(spec, null, 
+                              member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
                                  MkListOne(MkMembersInitList(partList))));
                            }
                            found = true;
@@ -1759,21 +1772,37 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
 
          if(member && member.initializer && member.initializer.type == expInitializer)
          {
-            Expression memberExp = null;
+            Initializer init { loc = yylloc };
+            if(namedParentMember.type == unionMember && dataMember.name)
+               init.id = MkIdentifier(dataMember.name);
+
             if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
                member.initializer.exp.expType._class.registered.type == structClass)
             {
                OldList * subList = MkList();
                ProcessBracketInst(member.initializer.exp.instance, subList);
                FreeExpression(member.initializer.exp);
-               ListAdd(list, MkInitializerList(subList));
+               if(subList->count)
+               {
+                  init.type = listInitializer;
+                  init.list = subList;
+               }
+               else
+               {
+                  FreeInitializer(init);
+                  init = null;
+               }
             }
             else
             {
                member.initializer.exp.usage.usageGet = true;
                ProcessExpression(member.initializer.exp);
-               ListAdd(list, MkInitializerAssignment(member.initializer.exp));
+               init.type = expInitializer;
+               init.exp = member.initializer.exp;
             }
+            if(init)
+               ListAdd(list, init);
+
             member.initializer.exp = null;
             FreeInitializer(member.initializer);
             member.initializer = null;
@@ -1781,28 +1810,50 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
          }
          else if(member && member.initializer && member.initializer.type == listInitializer)
          {
+            if(namedParentMember.type == unionMember && dataMember.name)
+               member.initializer.id = MkIdentifier(dataMember.name);
+
             ListAdd(list, member.initializer);
             member.initializer = null;
             someMemberSet = true;
          }
-         else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember)
+         else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember && namedParentMember.type != unionMember)
          {
             Symbol classSym;
+            Initializer init { loc = yylloc };
+            if(namedParentMember.type == unionMember && dataMember.name)
+               init.id = MkIdentifier(dataMember.name);
+
             if(!dataMember.dataType)
                dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
             classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
             if(classSym && classSym.registered && classSym.registered.type == structClass)
             {
                OldList * subList = MkList();
-               Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null); 
+               Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
                Instantiation inst = MkInstantiation(spec, null, null);
                ProcessBracketInst(inst, subList);
                FreeInstance(inst);
 
-               ListAdd(list, MkInitializerList(subList));
+               if(subList->count)
+               {
+                  init.type = listInitializer;
+                  init.list = subList;
+               }
+               else
+               {
+                  FreeInitializer(init);
+                  init = null;
+               }
             }
             else
-               ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
+            {
+               init.type = expInitializer;
+               init.exp = MkExpConstant("0");
+            }
+            someMemberSet = true;
+            if(init)
+               ListAdd(list, init);
          }
       }
       /*
@@ -1811,25 +1862,35 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
       */
    }
    // TESTING THIS NEW CODE FOR ANCHORS...
-   if(parentMember.type == unionMember && !someMemberSet)
+   if(parentMember.type == unionMember && !someMemberSet && !parentMemberSet)
    {
       Symbol classSym;
+      Initializer init { loc = yylloc };
+
       dataMember = parentMember.members.first;
+      if(namedParentMember.type == unionMember && dataMember.name)
+         init.id = MkIdentifier(dataMember.name);
+
       if(!dataMember.dataType && dataMember.dataTypeString)
          dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
       classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
       if(classSym && classSym.registered && classSym.registered.type == structClass)
       {
          OldList * subList = MkList();
-         Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null); 
+         Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
          Instantiation inst = MkInstantiation(spec, null, null);
          ProcessBracketInst(inst, subList);
          FreeInstance(inst);
 
-         ListAdd(list, MkInitializerList(subList));
+         init.type = listInitializer;
+         init.list = subList;
       }
       else
-         ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
+      {
+         init.type = expInitializer;
+         init.exp = MkExpConstant("0");
+      }
+      ListAdd(list, init);
    }
    return true;
 }
@@ -1854,13 +1915,21 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
       {
          if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
          {
-            if(!ProcessBracketInst_DataMember(dataMember, inst, list))
+            OldList * subList = 0 /*(dataMember.type == structMember ? MkList() : null)*/;
+
+            if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember, false))
             {
+               if(subList)
+                  FreeList(subList, FreeInitializer);
                recursionCount--;
                return false;
             }
+            if(dataMember.type == structMember || (subList && subList->count))
+               ListAdd(list, MkInitializerList(subList));
+            else
+               delete subList;
          }
-         else 
+         else
          {
             MembersInit members;
             MemberInit member = null;
@@ -1892,7 +1961,7 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                            {
                               curMember = thisMember;
                               curClass = curMember._class;
-                              memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+                              memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
                               subMemberStackPos = _subMemberStackPos;
                            }
 
@@ -1900,9 +1969,9 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                            {
                               if(dataMember.isProperty)
                               {
-                                 if(!((Property)dataMember).Set) 
+                                 if(!((Property)dataMember).Set)
                                  {
-                                    Compiler_Error("No set defined for property %s\n", dataMember.name);
+                                    Compiler_Error($"No set defined for property %s\n", dataMember.name);
                                     continue;
                                  }
                                  recursionCount--;
@@ -1922,10 +1991,10 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                                  if(!dataMember.dataType)
                                     dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
                                  symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
-                                 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null); 
+                                 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
 
                                  member.identifiers->Remove(firstID);
-                                 ListAdd(partList, 
+                                 ListAdd(partList,
                                     MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
 
                                  for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
@@ -1942,7 +2011,7 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                                            nextMember = next, next = nextMember ? nextMember.next : null)
                                        {
                                           Identifier nextID = nextMember.identifiers->first;
-                                          if(nextMember.identifiers && 
+                                          if(nextMember.identifiers &&
                                              nextMember.identifiers->count > 1 &&
                                              !strcmp(firstID.string, nextID.string))
                                           {
@@ -1954,7 +2023,7 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                                     }
                                  }
 
-                                 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null, 
+                                 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
                                     MkListOne(MkMembersInitList(partList))));
 
                                  // TESTING THIS
@@ -1971,9 +2040,9 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                            {
                               if(dataMember.isProperty)
                               {
-                                 if(!((Property)dataMember).Set) 
+                                 if(!((Property)dataMember).Set)
                                  {
-                                    Compiler_Error("No set defined for property %s\n", dataMember.name);
+                                    Compiler_Error($"No set defined for property %s\n", dataMember.name);
                                     continue;
                                  }
                                  recursionCount--;
@@ -1992,20 +2061,20 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
             if(dataMember.isProperty) continue;
             if(member && member.initializer && member.initializer.type == expInitializer)
             {
-               Expression memberExp = null;
                if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
                   member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
                {
                   OldList * subList = MkList();
                   ProcessBracketInst(member.initializer.exp.instance, subList);
                   FreeExpression(member.initializer.exp);
+                  member.initializer.exp = null;
                   ListAdd(list, MkInitializerList(subList));
                }
                else
                {
                   member.initializer.exp.usage.usageGet = true;
                   ProcessExpression(member.initializer.exp);
-                  ListAdd(list, MkInitializerAssignment(member.initializer.exp));
+                  ListAdd(list, MkInitializerAssignment(CopyExpression(member.initializer.exp)));
                }
 
                // Take this out
@@ -2028,7 +2097,7 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                if(classSym && classSym.registered && classSym.registered.type == structClass)
                {
                   OldList * subList = MkList();
-                  Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null); 
+                  Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
                   Instantiation inst = MkInstantiation(spec, null, null);
                   ProcessBracketInst(inst, subList);
                   FreeInstance(inst);
@@ -2056,7 +2125,6 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
             {
                if(member.takeOutExp)
                {
-                  member.initializer.exp = null;
                   FreeInitializer(member.initializer);
                   member.initializer = null;
                }
@@ -2103,7 +2171,7 @@ static void ProcessDeclaration(Declaration decl)
       case instDeclaration:
       {
          Instantiation inst = decl.inst;
-         
+
          if(inCompiler)
          {
             Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
@@ -2134,7 +2202,7 @@ static void ProcessDeclaration(Declaration decl)
 
                   if(classSym && classSym.registered && (classSym.registered.type == normalClass))
                   {
-                     ListAdd(createInstancesBody.compound.statements, 
+                     ListAdd(createInstancesBody.compound.statements,
                         MkExpressionStmt(MkListOne(MkExpCall(
                            MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
                            MkListOne(CopyExpression(inst.exp))))));
@@ -2160,14 +2228,15 @@ static void ProcessDeclaration(Declaration decl)
                   CreateInstancesBody();
                }
             }
-         
+
             {
                char className[1024];
-               
+               className[0] = 0;
+
                decl.type = initDeclaration;
                decl.specifiers = MkList();
                decl.declarators = MkList();
-      
+
                // Replace instantiation here
                if(classSym && classSym.registered && classSym.registered.type == bitClass)
                {
@@ -2215,11 +2284,11 @@ static void ProcessDeclaration(Declaration decl)
                      if(inst.fullSet)
                      {
                         ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
-                        ListAdd(decl.declarators, 
+                        ListAdd(decl.declarators,
                            MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
                         inst.exp.identifier = null;
                      }
-                     else 
+                     else
                      {
                         OldList * list = MkList();
                         if(ProcessBracketInst(inst, list))
@@ -2254,7 +2323,21 @@ static void ProcessDeclaration(Declaration decl)
                {
                   Expression newCall;
 
-                  if(classSym && classSym.registered && classSym.registered.type == noHeadClass && 
+                  strcpy(className, "__ecereClass_");
+
+                  if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
+                  {
+                     classSym = FindClass(classSym.registered.templateClass.fullName);
+                     FullClassNameCat(className, classSym.string, true);
+                  }
+                  else
+                     FullClassNameCat(className, inst._class.name, true);
+                  MangleClassName(className);
+
+                  if(classSym)
+                     DeclareClass(classSym, className);
+
+                  if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
                      (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
                   {
                      char size[256];
@@ -2263,26 +2346,11 @@ static void ProcessDeclaration(Declaration decl)
                   }
                   else
                   {
-                     strcpy(className, "__ecereClass_");
-
-                     if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
-                     {
-                        classSym = FindClass(classSym.registered.templateClass.fullName);
-                        FullClassNameCat(className, classSym.string, true);
-                     }
-                     else
-                        FullClassNameCat(className, inst._class.name, true);
-                     MangleClassName(className);
-
-                     DeclareClass(classSym, className);   // THIS WAS IN C VERSION BUT NOT IN eC VERSION?
                      newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
                      ProcessExpressionType(newCall);
                      newCall.byReference = true;
                   }
 
-                  if(classSym)
-                     DeclareClass(classSym, className);
-
                   if(inst.exp)
                   {
                      Expression exp, newExp;
@@ -2535,7 +2603,7 @@ public void ProcessInstantiations()
    External external;
    // Is this still needed?
    //CreateInstancesBody();
-   
+
    for(external = ast->first; external; external = external.next)
    {
       curExternal = external;
@@ -2582,7 +2650,7 @@ public void ProcessInstantiations()
                      type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
                   };
                   globalContext.symbols.Add((BTNode)thisSymbol);
-                  
+
                   for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
                   {
                      //thisClass = regClass;
@@ -2604,7 +2672,7 @@ public void ProcessInstantiations()
                      type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
                   };
                   globalContext.symbols.Add((BTNode)thisSymbol);
-                  
+
                   //thisClass = regClass;
                   if(prop.setStmt)
                   {
@@ -2629,7 +2697,7 @@ public void ProcessInstantiations()
                else if(def.type == propertyWatchClassDef && def.propertyWatch)
                {
                   PropertyWatch propertyWatch = def.propertyWatch;
-        
+
                   // Add this to the context
                   Symbol thisSymbol
                   {
@@ -2637,15 +2705,16 @@ public void ProcessInstantiations()
                      type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
                   };
                   globalContext.symbols.Add((BTNode)thisSymbol);
-                  
+
                   //thisClass = regClass;
                   if(propertyWatch.compound)
                   {
+                     /* This was already added in pass15:ProcessClass()
                      Symbol thisSymbol
                      {
                         string = CopyString("this");
                         type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
-                     };
+                     };*/
                      propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
                      curExternal = null;
                      ProcessStatement(propertyWatch.compound);