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++;
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)
{
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;