Browse Source

fcl-passrc: resolver: emit nMethodHidesMethodOfBaseType only for virtuals

git-svn-id: trunk@37721 -
Mattias Gaertner 7 years ago
parent
commit
a423d6be91
2 changed files with 23 additions and 2 deletions
  1. 4 2
      packages/fcl-passrc/src/pasresolver.pp
  2. 19 0
      packages/fcl-passrc/tests/tcresolver.pas

+ 4 - 2
packages/fcl-passrc/src/pasresolver.pp

@@ -3187,12 +3187,14 @@ begin
                and not ProcHasGroupOverload(Data^.Proc)) then
                and not ProcHasGroupOverload(Data^.Proc)) then
           begin
           begin
           // give a hint, that proc is hiding a proc in other scope
           // give a hint, that proc is hiding a proc in other scope
-          if Data^.Kind=fopkMethod then
+          if (Data^.Kind=fopkMethod) and (Proc.IsVirtual or Proc.IsOverride) then
             LogMsg(20170216151712,mtWarning,nMethodHidesMethodOfBaseType,
             LogMsg(20170216151712,mtWarning,nMethodHidesMethodOfBaseType,
               sMethodHidesMethodOfBaseType,
               sMethodHidesMethodOfBaseType,
               [Data^.Proc.Name,Proc.Parent.Name,GetElementSourcePosStr(Proc)],Data^.Proc.ProcType)
               [Data^.Proc.Name,Proc.Parent.Name,GetElementSourcePosStr(Proc)],Data^.Proc.ProcType)
           else
           else
-            LogMsg(20171118214523,mtHint,nFunctionHidesIdentifier,sFunctionHidesIdentifier,
+            // Delphi/FPC do not give a message when hiding a non virtual method
+            // -> emit only an Info
+            LogMsg(20171118214523,mtInfo,nFunctionHidesIdentifier,sFunctionHidesIdentifier,
               [GetElementSourcePosStr(Proc)],Data^.Proc.ProcType);
               [GetElementSourcePosStr(Proc)],Data^.Proc.ProcType);
           Abort:=true;
           Abort:=true;
           end;
           end;

+ 19 - 0
packages/fcl-passrc/tests/tcresolver.pas

@@ -422,6 +422,7 @@ type
     Procedure TestClass_MethodOverloadMissingInDelphi;
     Procedure TestClass_MethodOverloadMissingInDelphi;
     Procedure TestClass_MethodOverloadAncestor;
     Procedure TestClass_MethodOverloadAncestor;
     Procedure TestClass_MethodOverloadUnit;
     Procedure TestClass_MethodOverloadUnit;
+    Procedure TestClass_MethodOverloadNonVirtualInfo;
     Procedure TestClass_MethodReintroduce;
     Procedure TestClass_MethodReintroduce;
     Procedure TestClass_MethodOverloadArrayOfTClass;
     Procedure TestClass_MethodOverloadArrayOfTClass;
     Procedure TestClass_ConstructorHidesAncestorWarning;
     Procedure TestClass_ConstructorHidesAncestorWarning;
@@ -6556,6 +6557,24 @@ begin
   CheckResolverUnexpectedHints;
   CheckResolverUnexpectedHints;
 end;
 end;
 
 
+procedure TTestResolver.TestClass_MethodOverloadNonVirtualInfo;
+begin
+  StartProgram(false);
+  Add([
+  'type',
+  '  TObject = class',
+  '    procedure DoIt(p: pointer);',
+  '  end;',
+  '  TBird = class',
+  '    procedure DoIt(i: longint);',
+  '  end;',
+  'procedure TObject.DoIt(p: pointer); begin end;',
+  'procedure TBird.DoIt(i: longint); begin end;',
+  'begin']);
+  ParseProgram;
+  CheckResolverHint(mtInfo,nFunctionHidesIdentifier,'function hides identifier at "afile.pp(4,19)"');
+end;
+
 procedure TTestResolver.TestClass_MethodReintroduce;
 procedure TTestResolver.TestClass_MethodReintroduce;
 begin
 begin
   StartProgram(false);
   StartProgram(false);