compiler/libec: Map & AVLTree fixes with float/double values
[sdk] / compiler / bootstrap / libec / bootstrap / pass2.c
index 446e846..79350d5 100644 (file)
@@ -51,7 +51,7 @@ typedef unsigned __int64 uint64;
 #include <sys/types.h>
 enum yytokentype
 {
-IDENTIFIER = 258, CONSTANT = 259, STRING_LITERAL = 260, SIZEOF = 261, PTR_OP = 262, INC_OP = 263, DEC_OP = 264, LEFT_OP = 265, RIGHT_OP = 266, LE_OP = 267, GE_OP = 268, EQ_OP = 269, NE_OP = 270, AND_OP = 271, OR_OP = 272, MUL_ASSIGN = 273, DIV_ASSIGN = 274, MOD_ASSIGN = 275, ADD_ASSIGN = 276, SUB_ASSIGN = 277, LEFT_ASSIGN = 278, RIGHT_ASSIGN = 279, AND_ASSIGN = 280, XOR_ASSIGN = 281, OR_ASSIGN = 282, TYPE_NAME = 283, TYPEDEF = 284, EXTERN = 285, STATIC = 286, AUTO = 287, REGISTER = 288, CHAR = 289, SHORT = 290, INT = 291, UINT = 292, INT64 = 293, LONG = 294, SIGNED = 295, UNSIGNED = 296, FLOAT = 297, DOUBLE = 298, CONST = 299, VOLATILE = 300, VOID = 301, VALIST = 302, STRUCT = 303, UNION = 304, ENUM = 305, ELLIPSIS = 306, CASE = 307, DEFAULT = 308, IF = 309, SWITCH = 310, WHILE = 311, DO = 312, FOR = 313, GOTO = 314, CONTINUE = 315, BREAK = 316, RETURN = 317, IFX = 318, ELSE = 319, CLASS = 320, THISCLASS = 321, CLASS_NAME = 322, PROPERTY = 323, SETPROP = 324, GETPROP = 325, NEWOP = 326, RENEW = 327, DELETE = 328, EXT_DECL = 329, EXT_STORAGE = 330, IMPORT = 331, DEFINE = 332, VIRTUAL = 333, ATTRIB = 334, PUBLIC = 335, PRIVATE = 336, TYPED_OBJECT = 337, ANY_OBJECT = 338, _INCREF = 339, EXTENSION = 340, ASM = 341, TYPEOF = 342, WATCH = 343, STOPWATCHING = 344, FIREWATCHERS = 345, WATCHABLE = 346, CLASS_DESIGNER = 347, CLASS_NO_EXPANSION = 348, CLASS_FIXED = 349, ISPROPSET = 350, CLASS_DEFAULT_PROPERTY = 351, PROPERTY_CATEGORY = 352, CLASS_DATA = 353, CLASS_PROPERTY = 354, SUBCLASS = 355, NAMESPACE = 356, NEW0OP = 357, RENEW0 = 358, VAARG = 359, DBTABLE = 360, DBFIELD = 361, DBINDEX = 362, DATABASE_OPEN = 363, ALIGNOF = 364, ATTRIB_DEP = 365, __ATTRIB = 366, BOOL = 367, _BOOL = 368, _COMPLEX = 369, _IMAGINARY = 370, RESTRICT = 371, THREAD = 372, WIDE_STRING_LITERAL = 373
+IDENTIFIER = 258, CONSTANT = 259, STRING_LITERAL = 260, SIZEOF = 261, PTR_OP = 262, INC_OP = 263, DEC_OP = 264, LEFT_OP = 265, RIGHT_OP = 266, LE_OP = 267, GE_OP = 268, EQ_OP = 269, NE_OP = 270, AND_OP = 271, OR_OP = 272, MUL_ASSIGN = 273, DIV_ASSIGN = 274, MOD_ASSIGN = 275, ADD_ASSIGN = 276, SUB_ASSIGN = 277, LEFT_ASSIGN = 278, RIGHT_ASSIGN = 279, AND_ASSIGN = 280, XOR_ASSIGN = 281, OR_ASSIGN = 282, TYPE_NAME = 283, TYPEDEF = 284, EXTERN = 285, STATIC = 286, AUTO = 287, REGISTER = 288, CHAR = 289, SHORT = 290, INT = 291, UINT = 292, INT64 = 293, LONG = 294, SIGNED = 295, UNSIGNED = 296, FLOAT = 297, DOUBLE = 298, CONST = 299, VOLATILE = 300, VOID = 301, VALIST = 302, STRUCT = 303, UNION = 304, ENUM = 305, ELLIPSIS = 306, CASE = 307, DEFAULT = 308, IF = 309, SWITCH = 310, WHILE = 311, DO = 312, FOR = 313, GOTO = 314, CONTINUE = 315, BREAK = 316, RETURN = 317, IFX = 318, ELSE = 319, CLASS = 320, THISCLASS = 321, CLASS_NAME = 322, PROPERTY = 323, SETPROP = 324, GETPROP = 325, NEWOP = 326, RENEW = 327, DELETE = 328, EXT_DECL = 329, EXT_STORAGE = 330, IMPORT = 331, DEFINE = 332, VIRTUAL = 333, ATTRIB = 334, PUBLIC = 335, PRIVATE = 336, TYPED_OBJECT = 337, ANY_OBJECT = 338, _INCREF = 339, EXTENSION = 340, ASM = 341, TYPEOF = 342, WATCH = 343, STOPWATCHING = 344, FIREWATCHERS = 345, WATCHABLE = 346, CLASS_DESIGNER = 347, CLASS_NO_EXPANSION = 348, CLASS_FIXED = 349, ISPROPSET = 350, CLASS_DEFAULT_PROPERTY = 351, PROPERTY_CATEGORY = 352, CLASS_DATA = 353, CLASS_PROPERTY = 354, SUBCLASS = 355, NAMESPACE = 356, NEW0OP = 357, RENEW0 = 358, VAARG = 359, DBTABLE = 360, DBFIELD = 361, DBINDEX = 362, DATABASE_OPEN = 363, ALIGNOF = 364, ATTRIB_DEP = 365, __ATTRIB = 366, BOOL = 367, _BOOL = 368, _COMPLEX = 369, _IMAGINARY = 370, RESTRICT = 371, THREAD = 372, WIDE_STRING_LITERAL = 373, BUILTIN_OFFSETOF = 374
 };
 
 extern unsigned int internalValueCounter;
@@ -109,8 +109,6 @@ extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
 
 struct Enumerator;
 
-struct Pointer;
-
 struct Attrib;
 
 struct ExtDecl;
@@ -184,8 +182,6 @@ void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameS
 
 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(struct __ecereNameSpace__ecere__sys__OldList * this, void *  prevItem, void *  item);
 
-extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
-
 struct Location
 {
 struct CodePosition start;
@@ -277,6 +273,8 @@ extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__Ol
 
 extern struct Expression * QMkExpId(const char *  id);
 
+extern void CheckTemplateTypes(struct Expression * exp);
+
 extern struct Expression * MkExpConstant(const char *  string);
 
 extern struct Expression * MkExpString(const char *  string);
@@ -287,10 +285,10 @@ extern struct Expression * MkExpCall(struct Expression * expression, struct __ec
 
 extern void ProcessExpressionType(struct Expression * exp);
 
-extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
-
 extern struct Expression * MkExpExtensionCompound(struct Statement * compound);
 
+extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
+
 extern void ProcessExpressionInstPass(struct Expression * exp);
 
 extern struct Expression * MoveExpContents(struct Expression * exp);
@@ -301,12 +299,14 @@ extern struct Declarator * SpecDeclFromString(const char *  string, struct __ece
 
 extern struct Declarator * MkDeclaratorBrackets(struct Declarator * declarator);
 
-extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
-
 extern struct Declarator * GetFuncDecl(struct Declarator * decl);
 
 extern struct Declarator * QMkPtrDecl(const char *  id);
 
+extern struct Declarator * CopyDeclarator(struct Declarator * declarator);
+
+extern struct Declarator * PlugDeclarator(struct Declarator * decl, struct Declarator * baseDecl);
+
 extern void FreeDeclarator(struct Declarator * decl);
 
 extern char *  StringFromSpecDecl(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Declarator * decl);
@@ -317,8 +317,6 @@ struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
 struct Declarator * decl;
 } ecere_gcc_struct;
 
-extern struct Declarator * CopyDeclarator(struct Declarator * declarator);
-
 struct Specifier;
 
 extern struct Specifier * MkSpecifierName(const char *  name);
@@ -327,10 +325,10 @@ extern void FreeSpecifier(struct Specifier * spec);
 
 extern struct Specifier * MkSpecifier(int specifier);
 
-extern struct Expression * MkExpClassSize(struct Specifier * _class);
-
 extern struct Specifier * CopySpecifier(struct Specifier * spec);
 
+extern struct Expression * MkExpClassSize(struct Specifier * _class);
+
 struct Symbol;
 
 extern struct Symbol * FindClass(const char *  name);
@@ -341,43 +339,6 @@ extern void FreeSymbol(struct Symbol * symbol);
 
 struct Identifier;
 
-struct Declarator
-{
-struct Declarator * prev;
-struct Declarator * next;
-struct Location loc;
-int type;
-struct Symbol * symbol;
-struct Declarator * declarator;
-union
-{
-struct Identifier * identifier;
-struct
-{
-struct Expression * exp;
-struct Expression * posExp;
-struct Attrib * attrib;
-} ecere_gcc_struct structDecl;
-struct
-{
-struct Expression * exp;
-struct Specifier * enumClass;
-} ecere_gcc_struct array;
-struct
-{
-struct __ecereNameSpace__ecere__sys__OldList * parameters;
-} ecere_gcc_struct function;
-struct
-{
-struct Pointer * pointer;
-} ecere_gcc_struct pointer;
-struct
-{
-struct ExtDecl * extended;
-} ecere_gcc_struct extended;
-} ecere_gcc_struct __anon1;
-} ecere_gcc_struct;
-
 extern void FreeIdentifier(struct Identifier * id);
 
 extern struct Expression * MkExpPointer(struct Expression * expression, struct Identifier * member);
@@ -433,6 +394,8 @@ unsigned int isWatchable;
 
 extern struct Type * MkClassType(const char *  name);
 
+extern void modifyPassAsTemplate(struct Type **  typePtr, unsigned int value);
+
 extern void FreeType(struct Type * type);
 
 extern struct Type * ProcessTypeString(const char *  string, unsigned int staticMethod);
@@ -489,6 +452,58 @@ extern struct TypeName * QMkType(const char *  spec, struct Declarator * decl);
 
 extern void FreeTypeName(struct TypeName * typeName);
 
+struct Pointer;
+
+extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
+
+extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
+
+struct Declarator
+{
+struct Declarator * prev;
+struct Declarator * next;
+struct Location loc;
+int type;
+struct Symbol * symbol;
+struct Declarator * declarator;
+union
+{
+struct Identifier * identifier;
+struct
+{
+struct Expression * exp;
+struct Expression * posExp;
+struct Attrib * attrib;
+} ecere_gcc_struct structDecl;
+struct
+{
+struct Expression * exp;
+struct Specifier * enumClass;
+} ecere_gcc_struct array;
+struct
+{
+struct __ecereNameSpace__ecere__sys__OldList * parameters;
+} ecere_gcc_struct function;
+struct
+{
+struct Pointer * pointer;
+} ecere_gcc_struct pointer;
+struct
+{
+struct ExtDecl * extended;
+} ecere_gcc_struct extended;
+} ecere_gcc_struct __anon1;
+} ecere_gcc_struct;
+
+struct Pointer
+{
+struct Pointer * prev;
+struct Pointer * next;
+struct Location loc;
+struct __ecereNameSpace__ecere__sys__OldList *  qualifiers;
+struct Pointer * pointer;
+} ecere_gcc_struct;
+
 struct Declaration;
 
 struct Statement
@@ -704,6 +719,11 @@ struct
 struct Expression * exp;
 struct TypeName * typeName;
 } ecere_gcc_struct vaArg;
+struct
+{
+struct TypeName * typeName;
+struct Identifier * id;
+} ecere_gcc_struct offset;
 } ecere_gcc_struct __anon1;
 unsigned int debugValue;
 struct __ecereNameSpace__ecere__com__DataValue val;
@@ -719,6 +739,9 @@ unsigned int addedThis;
 unsigned int needCast;
 unsigned int thisPtr;
 unsigned int opDestType;
+unsigned int usedInComparison;
+unsigned int ambiguousUnits;
+unsigned int parentOpDestType;
 unsigned int needTemplateCast;
 } ecere_gcc_struct;
 
@@ -1975,8 +1998,11 @@ struct __ecereNameSpace__ecere__com__Class * c = memberExp->__anon1.index.exp->e
 
 if(strcmp((c->templateClass ? c->templateClass : c)->name, "Array"))
 {
-exp->__anon1.op.exp2 = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2)));
-exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2)))));
+if(exp->__anon1.op.exp2 && exp->__anon1.op.op == '=')
+{
+modifyPassAsTemplate(&exp->__anon1.op.exp2->destType, 1);
+CheckTemplateTypes(exp->__anon1.op.exp2);
+}
 isIndexedContainerAssignment = 1;
 }
 ProcessExpression(memberExp);
@@ -2168,6 +2194,20 @@ exp2 = (((void *)0));
 value->expType = memberExp->expType;
 memberExp->expType->refCount++;
 value->usage = (value->usage & ~0x4) | (((unsigned int)(1)) << 2);
+if(isIndexedContainerAssignment)
+{
+value->__anon1.op.exp1->usage = (value->__anon1.op.exp1->usage & ~0x1) | (((unsigned int)(1)) << 0);
+value->__anon1.op.exp2->usage = (value->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
+modifyPassAsTemplate(&value->__anon1.op.exp1->destType, 0);
+modifyPassAsTemplate(&value->__anon1.op.exp2->destType, 0);
+CheckTemplateTypes(value->__anon1.op.exp1);
+CheckTemplateTypes(value->__anon1.op.exp2);
+modifyPassAsTemplate(&value->expType, 0);
+value->destType = value->expType;
+value->expType->refCount++;
+modifyPassAsTemplate(&value->destType, 1);
+CheckTemplateTypes(value);
+}
 }
 else if(value)
 {
@@ -2177,7 +2217,10 @@ if(value)
 value->usage = (value->usage & ~0x4) | (((unsigned int)(1)) << 2);
 DeclareProperty(curExternal, prop, setName, getName);
 if(memberExp->__anon1.member.exp)
+{
 ProcessExpression(memberExp->__anon1.member.exp);
+CheckTemplateTypes(memberExp->__anon1.member.exp);
+}
 if(((unsigned int)((exp->usage & 0x1) >> 0)) && ((!convertTo && prop->Get) || (convertTo && prop->Set)))
 {
 int __simpleStruct0, __simpleStruct1;
@@ -2364,7 +2407,10 @@ else if(exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class
 {
 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
 struct __ecereNameSpace__ecere__com__Class * _class;
+struct Statement * stmt;
 struct Expression * o;
+struct Statement * compound = MkCompoundStmt(MkListOne(MkDeclaration(MkListOne(MkSpecifier(VOID)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("__ecerePtrToDelete"))), MkInitializerAssignment(MkExpBrackets(args)))))), MkListOne(stmt = MkExpressionStmt(list)));
+struct Expression * stmtExp = MkExpExtensionCompound(compound);
 
 for(_class = exp->expType->__anon1._class->__anon1.registered; _class && _class->type == 5; _class = _class->base)
 {
@@ -2377,15 +2423,15 @@ FullClassNameCat(className, _class->fullName, 0);
 if(!_class->symbol)
 _class->symbol = FindClass(_class->fullName);
 DeclareClass(curExternal, _class->symbol, className);
-ListAdd(list, MkExpCondition(MkExpPointer(QMkExpId(className), MkIdentifier("Destructor")), MkListOne(MkExpCall(MkExpPointer(QMkExpId(className), MkIdentifier("Destructor")), MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl((((void *)0)))), CopyExpression((*args).first))))), MkExpConstant("0")));
+ListAdd(list, MkExpCondition(MkExpPointer(QMkExpId(className), MkIdentifier("Destructor")), MkListOne(MkExpCall(MkExpPointer(QMkExpId(className), MkIdentifier("Destructor")), MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl((((void *)0)))), MkExpIdentifier(MkIdentifier("__ecerePtrToDelete")))))), MkExpConstant("0")));
 }
-ListAdd(list, MkExpCall(QMkExpId("ecere::com::eSystem_Delete"), args));
+ListAdd(list, MkExpCall(QMkExpId("ecere::com::eSystem_Delete"), MkListOne(MkExpIdentifier(MkIdentifier("__ecerePtrToDelete")))));
 DeclareFunctionUtil(curExternal, "eSystem_Delete");
 o = CopyExpression(object);
 ProcessExpressionType(o);
 o->usage = (o->usage & ~0x1) | (((unsigned int)(1)) << 0);
 ProcessExpression(o);
-ListAdd(exp->__anon1.list, MkExpBrackets(MkListOne(MkExpCondition(o, MkListOne(MkExpBrackets(list)), MkExpConstant("0")))));
+ListAdd(exp->__anon1.list, MkExpBrackets(MkListOne(MkExpCondition(o, MkListOne(stmtExp), MkExpConstant("0")))));
 }
 else if(exp->expType && exp->expType->kind == 20)
 {
@@ -2538,7 +2584,11 @@ FreeType(exp->destType);
 *exp = *refExp;
 exp->prev = prev;
 exp->next = next;
-((refExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)refExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(refExp)) : 0), refExp = 0);
+((refExp ? __extension__ ({
+void * __ecerePtrToDelete = (refExp);
+
+__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
+}) : 0), refExp = 0);
 }
 if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && exp->__anon1.op.exp2->expType->kind == 20 && !exp->__anon1.op.exp2->expType->passAsTemplate)
 {
@@ -2718,10 +2768,14 @@ struct Expression * e;
 unsigned int typedObject = 0;
 struct Type * ellipsisDestType = (((void *)0));
 unsigned int usedEllipsis = 0;
+struct Expression * expCallExp = exp->__anon1.call.exp;
+struct __ecereNameSpace__ecere__sys__OldList * arguments = exp->__anon1.call.arguments;
+unsigned int handleNullVMethod = 0;
+struct TypeName * typeName = (((void *)0));
 
-if(exp->__anon1.call.arguments)
+if(arguments)
 {
-for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
+for(e = (*arguments).first; e; e = e->next)
 {
 int __simpleStruct2, __simpleStruct3;
 int __simpleStruct0, __simpleStruct1;
@@ -2733,22 +2787,21 @@ ProcessExpression(e);
 exp->tempCount = (__simpleStruct2 = exp->tempCount, __simpleStruct3 = e->tempCount, (__simpleStruct2 > __simpleStruct3) ? __simpleStruct2 : __simpleStruct3);
 }
 }
-exp->__anon1.call.exp->usage = (exp->__anon1.call.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
-exp->__anon1.call.exp->usage = (exp->__anon1.call.exp->usage & ~0x8) | (((unsigned int)(1)) << 3);
-exp->__anon1.call.exp->tempCount = exp->tempCount;
-ProcessExpression(exp->__anon1.call.exp);
-if(exp->__anon1.call.exp->expType && exp->__anon1.call.exp->expType->kind == 16)
+expCallExp->usage = (expCallExp->usage & ~0x1) | (((unsigned int)(1)) << 0);
+expCallExp->usage = (expCallExp->usage & ~0x8) | (((unsigned int)(1)) << 3);
+expCallExp->tempCount = exp->tempCount;
+ProcessExpression(expCallExp);
+if(expCallExp->expType && expCallExp->expType->kind == 16)
 {
 unsigned int nullMemberExp = 0;
-struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * _class = exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass;
-struct __ecereNameSpace__ecere__com__Class * argClass = exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass;
-struct __ecereNameSpace__ecere__com__Method * method = exp->__anon1.call.exp->expType->__anon1.__anon3.method;
+struct Expression * memberExp = (expCallExp->type == 8) ? expCallExp : (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * _class = expCallExp->expType->__anon1.__anon3.methodClass;
+struct __ecereNameSpace__ecere__com__Class * argClass = expCallExp->expType->__anon1.__anon3.methodClass;
+struct __ecereNameSpace__ecere__com__Method * method = expCallExp->expType->__anon1.__anon3.method;
 
 if(method->type == 1)
 {
 char name[1024];
-struct TypeName * typeName;
 struct Declarator * decl;
 struct Context * back;
 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
@@ -2846,7 +2899,7 @@ struct Type * type = memberExp ? memberExp->__anon1.member.exp->expType : (((voi
 struct __ecereNameSpace__ecere__com__Class * regClass = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
 char className[1024];
 
-if(!exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass && !_class && type && type->classObjectType)
+if(!expCallExp->expType->__anon1.__anon3.methodClass && !_class && type && type->classObjectType)
 strcpy(className, "class");
 else
 {
@@ -2858,7 +2911,7 @@ if(!cl)
 cl = regClass;
 if(!cl)
 cl = __ecereClass_int;
-if(cl->templateClass && !_class && exp->__anon1.call.exp->expType->__anon1._class && !exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass && (type->kind == 19 || (regClass && regClass->type == 0 && strcmp(regClass->dataTypeString, "char *"))))
+if(cl->templateClass && !_class && expCallExp->expType->__anon1._class && !expCallExp->expType->__anon1.__anon3.methodClass && (type->kind == 19 || (regClass && regClass->type == 0 && strcmp(regClass->dataTypeString, "char *"))))
 cl = cl->templateClass;
 strcpy(className, "__ecereClass_");
 FullClassNameCat(className, cl->fullName, 1);
@@ -2866,29 +2919,34 @@ if(!cl->symbol)
 cl->symbol = FindClass(cl->fullName);
 DeclareClass(curExternal, cl->symbol, className);
 }
-if(type && type->kind == 19 && !_class && !exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass && memberExp)
+if(type && type->kind == 19 && !_class && !expCallExp->expType->__anon1.__anon3.methodClass && memberExp)
 {
-exp->__anon1.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(CopyExpression(memberExp->__anon1.member.exp), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+expCallExp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(CopyExpression(memberExp->__anon1.member.exp), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+handleNullVMethod = 1;
 }
-else if(_class || exp->__anon1.call.exp->expType->__anon1.__anon3.methodClass || !memberExp || !regClass || regClass->type != 0 || !strcmp(regClass->dataTypeString, "char *"))
+else if(_class || expCallExp->expType->__anon1.__anon3.methodClass || !memberExp || !regClass || regClass->type != 0 || !strcmp(regClass->dataTypeString, "char *"))
 {
 if(!memberExp)
-FreeExpression(exp->__anon1.call.exp);
-exp->__anon1.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+FreeExpression(expCallExp);
+expCallExp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+handleNullVMethod = 1;
 }
 else
 {
-struct Expression * c;
+struct Expression * vTblExp;
 struct Context * context = PushContext();
 struct __ecereNameSpace__ecere__sys__OldList * specs;
+struct __ecereNameSpace__ecere__sys__OldList * declList = MkListOne(MkDeclaration((specs = MkListOne(MkSpecifierName("Instance"))), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_ClassInst")), MkInitializerAssignment(CopyExpression(memberExp->__anon1.member.exp))))));
+struct __ecereNameSpace__ecere__sys__OldList * stmtList = MkListOne(MkExpressionStmt(MkListOne(MkExpCondition(MkExpIdentifier(MkIdentifier("__internal_ClassInst")), MkListOne(MkExpPointer(MkExpIdentifier(MkIdentifier("__internal_ClassInst")), MkIdentifier("_vTbl"))), MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl"))))));
 
-c = MkExpExtensionCompound(MkCompoundStmt(MkListOne(MkDeclaration((specs = MkListOne(MkSpecifierName("Instance"))), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_ClassInst")), MkInitializerAssignment(CopyExpression(memberExp->__anon1.member.exp)))))), MkListOne(MkExpressionStmt(MkListOne(MkExpCondition(MkExpIdentifier(MkIdentifier("__internal_ClassInst")), MkListOne(MkExpPointer(MkExpIdentifier(MkIdentifier("__internal_ClassInst")), MkIdentifier("_vTbl"))), MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl"))))))));
+vTblExp = MkExpExtensionCompound(MkCompoundStmt(declList, stmtList));
 if(__ecereProp_Type_Get_specConst(type))
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specs), (((void *)0)), MkSpecifier(CONST));
-c->loc = exp->loc;
-c->__anon1.compound->__anon1.compound.context = context;
+vTblExp->loc = exp->loc;
+vTblExp->__anon1.compound->__anon1.compound.context = context;
 PopContext(context);
-exp->__anon1.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(c, MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+expCallExp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(vTblExp, MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
+handleNullVMethod = 1;
 }
 }
 }
@@ -2901,12 +2959,12 @@ FullClassNameCat(name, method->_class->fullName, 0);
 strcat(name, "_");
 strcat(name, method->name);
 if(!memberExp)
-FreeExpression(exp->__anon1.call.exp);
-exp->__anon1.call.exp = MkExpIdentifier(MkIdentifier(name));
+FreeExpression(expCallExp);
+expCallExp = MkExpIdentifier(MkIdentifier(name));
 DeclareMethod(curExternal, method, name);
 if(memberExp && memberExp->expType && method->dataType)
 {
-exp->__anon1.call.exp->expType = method->dataType;
+expCallExp->expType = method->dataType;
 method->dataType->refCount++;
 }
 }
@@ -2914,32 +2972,39 @@ if(memberExp && (!memberExp->__anon1.member.exp || !memberExp->__anon1.member.ex
 {
 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod && !method->dataType->extraParam)
 {
-if(!exp->__anon1.call.arguments)
-exp->__anon1.call.arguments = MkList();
+if(!arguments)
+arguments = MkList();
 if(typedObject && memberExp->__anon1.member.exp && memberExp->__anon1.member.exp->expType)
 {
 unsigned int changeReference = 0;
+unsigned int stillAddReferenceOp = 0;
 struct Expression * memberExpMemberExp = CopyExpression(memberExp->__anon1.member.exp);
+struct Type * expType = memberExp->__anon1.member.exp->expType;
+struct __ecereNameSpace__ecere__com__Class * c = expType->kind == 8 && expType->__anon1._class ? expType->__anon1._class->__anon1.registered : (((void *)0));
 
 if(argClass && (argClass->type == 4 || argClass->type == 3 || argClass->type == 2 || argClass->type == 1000) && strcmp(argClass->fullName, "class") && strcmp(argClass->fullName, "uintptr") && strcmp(argClass->fullName, "intptr"))
 changeReference = 1;
-if(!memberExp->__anon1.member.exp->expType->classObjectType && ((((memberExp->__anon1.member.exp->expType->kind != 13 && (memberExp->__anon1.member.exp->expType->kind != 8 || !memberExp->__anon1.member.exp->expType->__anon1._class || !memberExp->__anon1.member.exp->expType->__anon1._class->__anon1.registered || memberExp->__anon1.member.exp->expType->__anon1._class->__anon1.registered->type == 1)))) || method->dataType->byReference))
+if(!expType->classObjectType && (((expType->kind != 13 && (!c || c->type == 1))) || method->dataType->byReference))
+{
+if(c && (c->type == 0 || c->type == 5))
+stillAddReferenceOp = 1;
 changeReference = 1;
-if(typedObject && memberExp->__anon1.member.exp->expType->classObjectType && memberExp->__anon1.member.exp->expType->byReference != method->dataType->byReference)
+}
+if(typedObject && expType->classObjectType && expType->byReference != method->dataType->byReference)
 changeReference = 1;
 if(changeReference)
 {
 if(memberExp->__anon1.member.exp->type == 5 && memberExp->__anon1.member.exp->__anon1.list && (*memberExp->__anon1.member.exp->__anon1.list).count == 1 && ((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->type == 4 && ((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->__anon1.op.op == '*' && !((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->__anon1.op.exp1)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), ((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->__anon1.op.exp2);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), ((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->__anon1.op.exp2);
 ((struct Expression *)(*memberExp->__anon1.member.exp->__anon1.list).first)->__anon1.op.exp2 = (((void *)0));
 }
 else if(memberExp->__anon1.member.exp->type == 4 && memberExp->__anon1.member.exp->__anon1.op.op == '*' && !memberExp->__anon1.member.exp->__anon1.op.exp1)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), memberExp->__anon1.member.exp->__anon1.op.exp2);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), memberExp->__anon1.member.exp->__anon1.op.exp2);
 memberExp->__anon1.member.exp->__anon1.op.exp2 = (((void *)0));
 }
-else if(!memberExp->__anon1.member.exp->byReference)
+else if(!memberExp->__anon1.member.exp->byReference || stillAddReferenceOp)
 {
 struct Expression * checkedExp = memberExp->__anon1.member.exp;
 struct Expression * parentExp = (((void *)0));
@@ -2970,7 +3035,13 @@ disconnected = 1;
 }
 if(!parentExp)
 nullMemberExp = 1;
-newExp = (typedObject && !memberExp->__anon1.member.exp->expType->classObjectType) ? checkedExp : MkExpOp((((void *)0)), '&', checkedExp);
+if(typedObject && !expType->classObjectType && !stillAddReferenceOp)
+newExp = checkedExp;
+else
+{
+newExp = MkExpOp((((void *)0)), '&', checkedExp);
+newExp->byReference = 1;
+}
 if(parentExp && (parentExp->type == 5 || parentExp->type == 32))
 {
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*parentExp->__anon1.list), checkedExp);
@@ -2982,7 +3053,7 @@ parentExp->__anon1.cast.exp = newExp;
 if(newExp->expType && newExp->expType->classObjectType)
 parentExp->__anon1.cast.typeName->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), parentExp->__anon1.cast.typeName->declarator);
 }
-if(typedObject && !memberExp->__anon1.member.exp->expType->classObjectType)
+if(typedObject && !expType->classObjectType)
 {
 struct Type * destType = (destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), destType->refCount = 1, destType->kind = 8, destType->classObjectType = 3, destType);
 
@@ -2993,17 +3064,17 @@ FreeType((parentExp ? parentExp : newExp)->destType);
 if(checkedExp->expType)
 checkedExp->expType->refCount++;
 }
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), parentExp ? parentExp : newExp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), parentExp ? parentExp : newExp);
 }
 else
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), memberExp->__anon1.member.exp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), memberExp->__anon1.member.exp);
 nullMemberExp = 1;
 }
 }
 else
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), memberExp->__anon1.member.exp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), memberExp->__anon1.member.exp);
 nullMemberExp = 1;
 }
 {
@@ -3036,11 +3107,11 @@ c->__anon1.compound->__anon1.compound.context = context;
 PopContext(context);
 if(__ecereProp_Type_Get_specConst(type))
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specs), (((void *)0)), MkSpecifier(CONST));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), c);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), c);
 memberExpMemberExp = (((void *)0));
 }
 else
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), MkExpIdentifier(MkIdentifier(className)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), MkExpIdentifier(MkIdentifier(className)));
 }
 }
 if(memberExpMemberExp)
@@ -3048,7 +3119,7 @@ FreeExpression(memberExpMemberExp);
 }
 else
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (((void *)0)), memberExp->__anon1.member.exp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (((void *)0)), memberExp->__anon1.member.exp);
 nullMemberExp = 1;
 }
 }
@@ -3060,9 +3131,9 @@ memberExp->__anon1.member.exp = (((void *)0));
 FreeExpression(memberExp);
 }
 }
-if(exp->__anon1.call.arguments)
+if(arguments)
 {
-for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
+for(e = (*arguments).first; e; e = e->next)
 {
 struct Type * destType = (e->destType && e->destType->kind == 14) ? ellipsisDestType : e->destType;
 
@@ -3144,8 +3215,8 @@ newExp = MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecif
 }
 if(parentExp->type == 7)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), e->prev, newExp);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.call.arguments), e);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), e->prev, newExp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arguments), e);
 e = newExp;
 }
 else if(parentExp->type == 5 || parentExp->type == 32)
@@ -3170,7 +3241,11 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*((struct Statement *)
 e->byReference = 1;
 FreeType(checkedExp->expType);
 FreeType(checkedExp->destType);
-((checkedExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)checkedExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(checkedExp)) : 0), checkedExp = 0);
+((checkedExp ? __extension__ ({
+void * __ecerePtrToDelete = (checkedExp);
+
+__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
+}) : 0), checkedExp = 0);
 }
 else if((!e->byReference && (!e->expType || !e->expType->classObjectType)) || (_class && _class->type == 5))
 {
@@ -3199,6 +3274,19 @@ newExp->expType = (((void *)0));
 PrintTypeNoConst(e->expType, typeString, 0, 1);
 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
 newExp->destType = ProcessType(specs, decl);
+if(newExp->destType && e->expType && e->expType->passAsTemplate)
+{
+struct Expression * nbExp = GetNonBracketsExp(newExp);
+
+if(nbExp->type == 11)
+{
+FreeTypeName(nbExp->__anon1.cast.typeName);
+nbExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
+}
+newExp->expType = newExp->destType;
+newExp->destType->refCount++;
+modifyPassAsTemplate(&newExp->expType, 1);
+}
 curContext = context;
 e->type = 23;
 if(curCompound)
@@ -3212,6 +3300,7 @@ curCompound->__anon1.compound.declarations = MkList();
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
+CheckTemplateTypes(newExp);
 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
 }
 else
@@ -3247,8 +3336,8 @@ newExp->byReference = 1;
 }
 if(parentExp->type == 7)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), e->prev, newExp);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.call.arguments), e);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), e->prev, newExp);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arguments), e);
 e = newExp;
 }
 else if(parentExp->type == 5 || parentExp->type == 32)
@@ -3293,7 +3382,7 @@ struct Context * context = PushContext();
 
 if(_class->templateClass && !strcmp(_class->templateClass->name, "Container") && e->__anon1.list && (*e->__anon1.list).first && ((struct Expression *)(*e->__anon1.list).first)->type == 11 && ((struct Expression *)(*e->__anon1.list).first)->__anon1.cast.exp && ((struct Expression *)(*e->__anon1.list).first)->__anon1.cast.exp->type == 4 && ((struct Expression *)(*e->__anon1.list).first)->__anon1.cast.exp->__anon1.op.op == '&' && ((struct Expression *)(*e->__anon1.list).first)->__anon1.cast.exp->__anon1.op.exp2 && ((struct Expression *)(*e->__anon1.list).first)->__anon1.cast.exp->__anon1.op.exp2->type == 33)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), e->prev, MkExpIdentifier(MkIdentifier(className)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), e->prev, MkExpIdentifier(MkIdentifier(className)));
 }
 else
 {
@@ -3304,11 +3393,11 @@ c->__anon1.compound->__anon1.compound.context = context;
 PopContext(context);
 if(__ecereProp_Type_Get_specConst(type))
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specs), (((void *)0)), MkSpecifier(CONST));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), e->prev, c);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), e->prev, c);
 }
 }
 else
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), e->prev, MkExpIdentifier(MkIdentifier(className)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), e->prev, MkExpIdentifier(MkIdentifier(className)));
 }
 }
 }
@@ -3318,11 +3407,59 @@ FixReference(e, !destType || !destType->declaredWithStruct);
 }
 if(ellipsisDestType)
 {
-if(usedEllipsis || (exp->__anon1.call.exp->expType && exp->__anon1.call.exp->expType->kind == 11 && exp->__anon1.call.exp->expType->__anon1.__anon2.params.last && ((struct Type *)exp->__anon1.call.exp->expType->__anon1.__anon2.params.last)->kind == 14))
+if(usedEllipsis || (expCallExp->expType && expCallExp->expType->kind == 11 && expCallExp->expType->__anon1.__anon2.params.last && ((struct Type *)expCallExp->expType->__anon1.__anon2.params.last)->kind == 14))
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*arguments), (*arguments).last, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpConstant("0")));
+}
+}
+}
+if(handleNullVMethod)
+{
+struct Expression * compoundExp;
+struct Context * context = PushContext();
+struct __ecereNameSpace__ecere__sys__OldList * declList = MkList();
+struct __ecereNameSpace__ecere__sys__OldList * stmtList = MkList();
+struct TypeName * castTypeName;
+struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
+struct Specifier * spec;
+
+for(spec = typeName->qualifiers ? (*typeName->qualifiers).first : (((void *)0)); spec; spec = spec->next)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->__anon1.call.arguments), (*exp->__anon1.call.arguments).last, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpConstant("0")));
+if(spec->type != 5)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specs), CopySpecifier(spec));
+}
+if(typeName->declarator->type == 5)
+{
+struct Pointer * p = typeName->declarator->__anon1.pointer.pointer->pointer;
+
+castTypeName = MkTypeName(specs, CopyDeclarator(typeName->declarator->declarator->declarator->declarator));
+while(p)
+{
+struct Pointer * pp;
+
+for(pp = castTypeName->declarator->__anon1.pointer.pointer; pp->pointer; pp = pp->pointer)
+;
+pp->pointer = MkPointer((((void *)0)), (((void *)0)));
+pp->qualifiers = CopyList(p->qualifiers, (void *)(CopySpecifier));
+p = p->pointer;
 }
 }
+else
+castTypeName = MkTypeName(specs, CopyDeclarator(typeName->declarator->declarator->declarator->declarator));
+compoundExp = MkExpExtensionCompound(MkCompoundStmt(declList, stmtList));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*declList), MkDeclaration(CopyList(typeName->qualifiers, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(PlugDeclarator(CopyDeclarator(typeName->declarator), MkDeclaratorIdentifier(MkIdentifier("__internal_VirtualMethod"))), (((void *)0))))));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*stmtList), MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier("__internal_VirtualMethod")), '=', expCallExp))));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*stmtList), MkExpressionStmt(MkListOne(MkExpCondition(MkExpIdentifier(MkIdentifier("__internal_VirtualMethod")), MkListOne(MkExpCall(MkExpIdentifier(MkIdentifier("__internal_VirtualMethod")), arguments)), MkExpCast(castTypeName, MkExpConstant("1"))))));
+compoundExp->loc = exp->loc;
+compoundExp->__anon1.compound->__anon1.compound.context = context;
+PopContext(context);
+exp->type = 5;
+exp->__anon1.list = MkListOne(compoundExp);
+}
+else
+{
+exp->__anon1.call.exp = expCallExp;
+exp->__anon1.call.arguments = arguments;
 }
 break;
 }