compiler/libec: Fix for thisclass related warnings in Map.ec
[sdk] / compiler / libec / src / pass3.ec
index f578601..1308387 100644 (file)
@@ -473,9 +473,13 @@ static void AddPointerCast(Expression e)
          if(src && src.kind == classType && src._class)
          {
             Class sc = src._class.registered;
+            if(src.thisClassFrom)
+               sc = src.thisClassFrom;
+
             if(sc && (sc.type == structClass || sc.type == noHeadClass))
             {
                Type dest = e.destType;
+
                if(dest && (dest.kind == templateType || dest.kind == classType))
                {
                   if(dest) dest.refCount++;
@@ -496,6 +500,9 @@ static void AddPointerCast(Expression e)
                   if(!dest.passAsTemplate && dest.kind == classType && dest._class && dest._class.registered)
                   {
                      Class dc = dest._class.registered;
+                     if(dest.thisClassFrom)
+                        dc = dest.thisClassFrom;
+
                      if(sc.templateClass) sc = sc.templateClass;
                      if(dc.templateClass) dc = dc.templateClass;
                      if(dc.base && sc != dc)
@@ -575,12 +582,19 @@ static void InstDeclPassExpression(Expression exp)
          {
             for(e = exp.call.arguments->first; e; e = e.next)
             {
+               bool addCast = false;
                InstDeclPassExpression(e);
                AddPointerCast(e);
 
                if(e.expType && e.expType.kind == pointerType && e.expType.type && (e.expType.type.kind == classType || (e.expType.type.kind == pointerType && e.expType.type.type && e.expType.type.type.kind != voidType)) &&
-                  e.destType && e.destType.kind == pointerType && e.destType.type && e.destType.type.kind == pointerType && e.destType.type.type && e.destType.type.type.kind == voidType &&
-                  (e.type != castExp || !IsVoidPtrCast(e.cast.typeName)))
+                  e.destType && e.destType.kind == pointerType && e.destType.type && e.destType.type.kind == pointerType && e.destType.type.type && e.destType.type.type.kind == voidType)
+                  addCast = true;
+               // Fix for adding a cast to Unserialize with a struct passed as a parameter:
+               else if(e.expType && e.expType.kind == classType && e.expType._class && e.expType._class.registered && e.expType._class.registered.type == structClass && e.byReference &&
+                  e.destType && e.destType.kind == classType && e.destType.classObjectType && e.destType.byReference)
+                  addCast = true;
+
+               if(addCast && (e.type != castExp || !IsVoidPtrCast(e.cast.typeName)))
                {
                   e.cast.exp = MkExpBrackets(MkListOne(MoveExpContents(e)));
                   e.type = castExp;