Browse Source

fcl-passrc: useanalyzer: fixed p^.x:=

git-svn-id: trunk@39937 -
Mattias Gaertner 6 years ago
parent
commit
0e13bac228

+ 10 - 1
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1316,6 +1316,7 @@ var
   Bin: TBinaryExpr;
   Bin: TBinaryExpr;
   Params: TParamsExpr;
   Params: TParamsExpr;
   ValueResolved: TPasResolverResult;
   ValueResolved: TPasResolverResult;
+  Unary: TUnaryExpr;
 begin
 begin
   C:=Expr.ClassType;
   C:=Expr.ClassType;
   if C=TBinaryExpr then
   if C=TBinaryExpr then
@@ -1353,6 +1354,14 @@ begin
       UseElement(Ref.Declaration,Access,UseFull);
       UseElement(Ref.Declaration,Access,UseFull);
       end;
       end;
     end
     end
+  else if C=TUnaryExpr then
+    begin
+    Unary:=TUnaryExpr(Expr);
+    if Unary.OpCode in [eopAdd,eopSubtract,eopAddress,eopDeref,eopMemAddress] then
+      UseExprRef(El,Unary.Operand,rraRead,false)
+    else
+      RaiseNotSupported(20181015193334,Expr,OpcodeStrings[Unary.OpCode]);
+    end
   else if (Access=rraRead)
   else if (Access=rraRead)
       and ((C=TPrimitiveExpr) // Kind<>pekIdent
       and ((C=TPrimitiveExpr) // Kind<>pekIdent
         or (C=TNilExpr)
         or (C=TNilExpr)
@@ -1364,7 +1373,7 @@ begin
     {$IFDEF VerbosePasResolver}
     {$IFDEF VerbosePasResolver}
     writeln('TPasResolver.UseExprRef Expr=',GetObjName(Expr),' Access=',Access,' Declaration="',Expr.GetDeclaration(false),'"');
     writeln('TPasResolver.UseExprRef Expr=',GetObjName(Expr),' Access=',Access,' Declaration="',Expr.GetDeclaration(false),'"');
     {$ENDIF}
     {$ENDIF}
-    RaiseNotSupported(20170306102158,Expr);
+    RaiseNotSupported(20170306102159,Expr);
     end;
     end;
 end;
 end;
 
 

+ 35 - 0
packages/fcl-passrc/tests/tcuseanalyzer.pas

@@ -67,6 +67,7 @@ type
     procedure TestM_Const;
     procedure TestM_Const;
     procedure TestM_ResourceString;
     procedure TestM_ResourceString;
     procedure TestM_Record;
     procedure TestM_Record;
+    procedure TestM_PointerTyped_Record;
     procedure TestM_Array;
     procedure TestM_Array;
     procedure TestM_NestedFuncResult;
     procedure TestM_NestedFuncResult;
     procedure TestM_Enums;
     procedure TestM_Enums;
@@ -870,6 +871,40 @@ begin
   AnalyzeProgram;
   AnalyzeProgram;
 end;
 end;
 
 
+procedure TTestUseAnalyzer.TestM_PointerTyped_Record;
+begin
+  StartProgram(false);
+  Add([
+  'procedure {#DoIt_used}DoIt;',
+  'type',
+  '  {#prec_used}PRec = ^TRec;',
+  '  {#trec_used}TRec = record',
+  '    {#a_used}a: longint;',
+  '    {#b_notused}b: longint;',
+  '    {#c_used}c: longint;',
+  '    {#d_used}d: longint;',
+  '    {#e_used}e: longint;',
+  '  end;',
+  'var',
+  '  r: TRec;',
+  '  p: PRec;',
+  '  i: longint;',
+  'begin',
+  '  p:=@r;',
+  '  i:=p^.a;',
+  '  p^.c:=i;',
+  '  if i=p^.d then;',
+  '  if p^.e=i then;',
+  'end;',
+  'begin',
+  '  DoIt;']);
+  AnalyzeProgram;
+  CheckUseAnalyzerHint(mtHint,nPALocalVariableNotUsed,'Local variable "b" not used');
+  CheckUseAnalyzerHint(mtHint,nPALocalVariableIsAssignedButNeverUsed,
+    'Local variable "c" is assigned but never used');
+  CheckUseAnalyzerUnexpectedHints;
+end;
+
 procedure TTestUseAnalyzer.TestM_Array;
 procedure TTestUseAnalyzer.TestM_Array;
 begin
 begin
   StartProgram(false);
   StartProgram(false);