compiler/libec: Fixed warnings calling OnCompare from uintptr type
[sdk] / compiler / libec / src / pass3.ec
index f578601..6b637c4 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,7 @@ static void AddPointerCast(Expression e)
                   if(!dest.passAsTemplate && dest.kind == classType && dest._class && dest._class.registered)
                   {
                      Class dc = dest._class.registered;
+
                      if(sc.templateClass) sc = sc.templateClass;
                      if(dc.templateClass) dc = dc.templateClass;
                      if(dc.base && sc != dc)
@@ -512,6 +517,16 @@ static void AddPointerCast(Expression e)
          FreeType(src);
       }
    }
+   else if(src && src.kind == intPtrType && e.destType && e.destType.classObjectType)
+   {
+      Expression nbExp = GetNonBracketsExp(e);
+      if(nbExp.type != castExp || !IsVoidPtrCast(nbExp.cast.typeName))
+      {
+         e.cast.exp = MkExpBrackets(MkListOne(MoveExpContents(e)));
+         e.type = castExp;
+         e.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl(null));
+      }
+   }
 }
 
 static void InstDeclPassExpression(Expression exp)
@@ -575,12 +590,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;