From 1cc31e73da4d17e0a1c1910c7913efa86e75210e Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 28 Dec 2020 16:51:02 +0000 Subject: [PATCH] fcl-passrc: fixed typecast specialized array to specialized type git-svn-id: trunk@47870 - --- packages/fcl-passrc/src/pasresolveeval.pas | 5 +++-- packages/fcl-passrc/src/pasresolver.pp | 15 ++++++++++----- packages/fcl-passrc/tests/tcresolvegenerics.pas | 4 ++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolveeval.pas b/packages/fcl-passrc/src/pasresolveeval.pas index f013855798..609b5c32ce 100644 --- a/packages/fcl-passrc/src/pasresolveeval.pas +++ b/packages/fcl-passrc/src/pasresolveeval.pas @@ -4337,8 +4337,8 @@ var begin // split into two dec(u,$10000); - ValueUTF16.S:=ValueUTF16.S+WideChar($D800+(u shr 10)); - ValueUTF16.S:=ValueUTF16.S+WideChar($DC00+(u and $3ff)); + ValueUTF16.S:=ValueUTF16.S + +WideChar($D800+(u shr 10))+WideChar($DC00+(u and $3ff)); end else ValueUTF16.S:=ValueUTF16.S+WideChar(u); @@ -4401,6 +4401,7 @@ begin Result:=TResEvalUTF16.Create; {$endif} p:=1; + //writeln('TResExprEvaluator.EvalPrimitiveExprString ',GetObjPath(Expr),' ',Expr.SourceFilename,' ',Expr.SourceLinenumber div 2048,' S=[',S,']'); while p<=l do case S[p] of {$ifdef UsePChar} diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 2bc195b644..fef050ce41 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -10993,7 +10993,7 @@ begin FoundEl:=GetSpecializedEl(NameExpr,FoundEl,TemplParams); if FoundEl is TPasProcedure then begin - // check if params fit the implicit specialized function + // check if params fit the explicit specialized function, e.g. Run() CheckCallProcCompatibility(TPasProcedure(FoundEl).ProcType,Params,true); end; end @@ -11007,7 +11007,7 @@ begin try CheckTemplParams(GenTemplates,InferenceParams); FoundEl:=GetSpecializedEl(NameExpr,FoundEl,InferenceParams); - // check if params fit the implicit specialized function + // check if params fit the implicit specialized function, e.g. Run() CheckCallProcCompatibility(TPasProcedure(FoundEl).ProcType,Params,true); finally ReleaseElementList(InferenceParams{$IFDEF CheckPasTreeRefCount},RefIdInferenceParamsExpr{$ENDIF}); @@ -11034,13 +11034,12 @@ begin else begin // typecast to user type - CheckTypeCast(TypeEl,Params,true); // emit warnings + CheckTypeCast(TypeEl,Params,true); // emit warnings, and errors for specializations end; end; // FoundEl compatible element -> create reference Ref:=CreateReference(FoundEl,NameExpr,rraRead); - if FindCallData.StartScope.ClassType=ScopeClass_WithExpr then Ref.WithExprScope:=TPasWithExprScope(FindCallData.StartScope); FindData:=Default(TPRFindData); @@ -27255,6 +27254,11 @@ begin {$IFDEF VerbosePasResolver} writeln('TPasResolver.CheckTypeCastArray From=',GetTypeDescription(FromType),' ToType=',GetTypeDescription(ToType)); {$ENDIF} + if not RaiseOnError then + begin + if (ToType.GenericTemplateTypes<>nil) and (ToType.GenericTemplateTypes.Count>0) then + exit(cCompatible); // is later checked when specialized + end; StartFromType:=FromType; StartToType:=ToType; Result:=cIncompatible; @@ -27284,10 +27288,11 @@ begin break; // ToType has more dimensions end; // have same dimension -> check ElType + Include(FromElTypeRes.Flags,rrfReadable); + FromElTypeRes.IdentEl:=nil; {$IFDEF VerbosePasResolver} writeln('TPasResolver.CheckTypeCastArray check ElType From=',GetResolverResultDbg(FromElTypeRes),' To=',GetResolverResultDbg(ToElTypeRes)); {$ENDIF} - Include(FromElTypeRes.Flags,rrfReadable); Result:=CheckTypeCastRes(FromElTypeRes,ToElTypeRes,ErrorEl,false); break; end diff --git a/packages/fcl-passrc/tests/tcresolvegenerics.pas b/packages/fcl-passrc/tests/tcresolvegenerics.pas index 233db8ecc1..8a9b967c82 100644 --- a/packages/fcl-passrc/tests/tcresolvegenerics.pas +++ b/packages/fcl-passrc/tests/tcresolvegenerics.pas @@ -2991,6 +2991,7 @@ begin 'interface', 'type', ' TObject = class end;', + ' TAnt = class end;', ' TArray = array of T;', ' TBird = class', ' F: TArray;', @@ -3002,6 +3003,9 @@ begin ' a:=TArray(a);', ' F:=TArray(a);', 'end;', + 'var B: TBird;', + 'initialization', + ' B.Run(nil);', '']); ParseUnit; end;