Browse Source

fcl-passrc: useanalyzer: fixed WPO for record constants

git-svn-id: trunk@39919 -
Mattias Gaertner 6 years ago
parent
commit
80c12f56b7

+ 5 - 0
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1295,6 +1295,11 @@ begin
     for i:=0 to length(Params)-1 do
     for i:=0 to length(Params)-1 do
       UseExpr(Params[i]);
       UseExpr(Params[i]);
     end
     end
+  else if C=TRecordValues then
+    begin
+    for i:=0 to length(TRecordValues(El).Fields)-1 do
+      UseExpr(TRecordValues(El).Fields[i].ValueExp);
+    end
   else if C=TInheritedExpr then
   else if C=TInheritedExpr then
     UseInheritedExpr(TInheritedExpr(El))
     UseInheritedExpr(TInheritedExpr(El))
   else
   else

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

@@ -7244,6 +7244,13 @@ begin
   'type',
   'type',
   '  TPoint = record x, y: longint; end;',
   '  TPoint = record x, y: longint; end;',
   'const r: TPoint = (x:1; y:2);',
   'const r: TPoint = (x:1; y:2);',
+  'type',
+  '  TPasSourcePos = Record',
+  '    FileName: String;',
+  '    Row, Column: LongWord;',
+  '  end;',
+  'const',
+  '  DefPasSourcePos: TPasSourcePos = (Filename:''''; Row:0; Column:0);',
   'begin',
   'begin',
   '']);
   '']);
   ParseProgram;
   ParseProgram;

+ 36 - 28
packages/fcl-passrc/tests/tcuseanalyzer.pas

@@ -845,22 +845,27 @@ end;
 procedure TTestUseAnalyzer.TestM_Record;
 procedure TTestUseAnalyzer.TestM_Record;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
-  Add('procedure {#DoIt_used}DoIt;');
-  Add('type');
-  Add('  {#integer_used}integer = longint;');
-  Add('  {#trec_used}TRec = record');
-  Add('    {#a_used}a: integer;');
-  Add('    {#b_notused}b: integer;');
-  Add('    {#c_used}c: integer;');
-  Add('  end;');
-  Add('var');
-  Add('  {#r_used}r: TRec;');
-  Add('begin');
-  Add('  r.a:=3;');
-  Add('  with r do c:=4;');
-  Add('end;');
-  Add('begin');
-  Add('  DoIt;');
+  Add([
+  'procedure {#DoIt_used}DoIt;',
+  'type',
+  '  {#integer_used}integer = longint;',
+  '  {#trec_used}TRec = record',
+  '    {#a_used}a: integer;',
+  '    {#b_notused}b: integer;',
+  '    {#c_used}c: integer;',
+  '  end;',
+  'var',
+  '  {#r_used}r: TRec;',
+  'const',
+  '  ci = 2;',
+  '  cr: TRec = (a:0;b:ci;c:2);',
+  'begin',
+  '  r.a:=3;',
+  '  with r do c:=4;',
+  '  r:=cr;',
+  'end;',
+  'begin',
+  '  DoIt;']);
   AnalyzeProgram;
   AnalyzeProgram;
 end;
 end;
 
 
@@ -2437,18 +2442,21 @@ end;
 procedure TTestUseAnalyzer.TestWP_PublishedRecordType;
 procedure TTestUseAnalyzer.TestWP_PublishedRecordType;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
-  Add('type');
-  Add('  {#trec_used}TRec = record');
-  Add('    {treci_used}i: longint;');
-  Add('  end;');
-  Add('  {#tobject_used}TObject = class');
-  Add('  published');
-  Add('    {#fielda_used}FieldA: TRec;');
-  Add('  end;');
-  Add('var');
-  Add('  {#o_used}o: TObject;');
-  Add('begin');
-  Add('  o:=nil;');
+  Add([
+  'type',
+  '  {#trec_used}TRec = record',
+  '    {treci_used}i: longint;',
+  '  end;',
+  'const c: TRec = (i:1);',
+  'type',
+  '  {#tobject_used}TObject = class',
+  '  published',
+  '    {#fielda_used}FieldA: TRec;',
+  '  end;',
+  'var',
+  '  {#o_used}o: TObject;',
+  'begin',
+  '  o:=nil;']);
   AnalyzeWholeProgram;
   AnalyzeWholeProgram;
 end;
 end;