From b70c6cc344c0eac108513be06fac0d09586ff658 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Wed, 16 Oct 2019 10:15:32 +0000 Subject: [PATCH] fcl-passrc: resolver: started generic type overload git-svn-id: trunk@43206 - --- packages/fcl-passrc/src/pasresolver.pp | 16 +++++++++---- .../fcl-passrc/tests/tcresolvegenerics.pas | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 4106d9fae6..1b8e920bed 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -5428,8 +5428,16 @@ function TPasResolver.AddIdentifier(Scope: TPasIdentifierScope; while Identifier<>nil do begin CurEl:=Identifier.Element; - if not (CurEl is TPasGenericType) then break; - if GetTypeParameterCount(TPasGenericType(CurEl))=TypeParamCnt then break; + if CurEl is TPasGenericType then + begin + if GetTypeParameterCount(TPasGenericType(CurEl))=TypeParamCnt then + break; + end + else + begin + if TypeParamCnt=0 then + break; + end; Identifier:=Identifier.NextSameIdentifier; end; Result:=Identifier; @@ -5506,7 +5514,7 @@ begin // check duplicate in current scope OlderIdentifier:=Identifier.NextSameIdentifier; - if IsGeneric then + if IsGeneric and (msDelphi in CurrentParser.CurrentModeswitches) then OlderIdentifier:=SkipGenericTypes(OlderIdentifier,TypeParamCnt); if OlderIdentifier<>nil then begin @@ -20387,7 +20395,7 @@ begin else NeedPop:=false; - if (TypeParamCount>0) and (RightPath='') then + if (RightPath='') and (TypeParamCount>0) then begin NextEl:=FindGenericEl(CurName,TypeParamCount,FindData,ErrorEl); if (FindData.StartScope<>nil) and (FindData.StartScope.ClassType=ScopeClass_WithExpr) diff --git a/packages/fcl-passrc/tests/tcresolvegenerics.pas b/packages/fcl-passrc/tests/tcresolvegenerics.pas index 75e8257d66..3b3dcd11c0 100644 --- a/packages/fcl-passrc/tests/tcresolvegenerics.pas +++ b/packages/fcl-passrc/tests/tcresolvegenerics.pas @@ -58,6 +58,7 @@ type // generic class procedure TestGen_Class; procedure TestGen_ClassDelphi; + procedure TestGen_ClassDelphi_TypeOverload; // ToDo procedure TestGen_ClassObjFPC; procedure TestGen_ClassObjFPC_OverloadFail; procedure TestGen_ClassForward; @@ -756,6 +757,29 @@ begin ParseProgram; end; +procedure TTestResolveGenerics.TestGen_ClassDelphi_TypeOverload; +begin + exit; + + StartProgram(false); + Add([ + '{$mode delphi}', + 'type', + ' TObject = class end;', + ' TBird = word;', + ' TBird = class', + ' v: T;', + ' end;', + ' TEagle = TBird;', + 'var', + ' b: TBird;', + ' w: TBird;', + 'begin', + ' b.v:=w;', + '']); + ParseProgram; +end; + procedure TTestResolveGenerics.TestGen_ClassObjFPC; begin StartProgram(false);