Browse Source

+ more fixes to mark symbols used by preprocessor expressions properly
+ made MarkSymbolAsUsed more fail safe
+ tests

florian 9 months ago
parent
commit
397293f09f
6 changed files with 80 additions and 6 deletions
  1. 15 6
      compiler/scanner.pas
  2. 13 0
      tests/test/tpreproc2.pp
  3. 13 0
      tests/test/tpreproc3.pp
  4. 13 0
      tests/test/tpreproc4.pp
  5. 13 0
      tests/test/tpreproc5.pp
  6. 13 0
      tests/test/tpreproc6.pp

+ 15 - 6
compiler/scanner.pas

@@ -1875,7 +1875,9 @@ type
         procedure MarkSymbolAsUsed(sym: tsym);
           begin
            tabstractvarsym(sym).IncRefCount;
-           inc(current_module.unitmap[sym.owner.moduleid].refs);
+           { do we know an owner? }
+           if Assigned(current_module) and Assigned(current_module.unitmap) and Assigned(sym.owner) then
+             inc(current_module.unitmap[sym.owner.moduleid].refs);
           end;
 
         function preproc_factor(eval: Boolean):texprvalue;
@@ -2107,9 +2109,15 @@ type
                               staticvarsym,
                               localvarsym,
                               paravarsym :
-                                hdef:=tabstractvarsym(srsym).vardef;
+                                begin
+                                  hdef:=tabstractvarsym(srsym).vardef;
+                                  MarkSymbolAsUsed(srsym);
+                                end;
                               typesym:
-                                hdef:=ttypesym(srsym).typedef;
+                                begin
+                                  hdef:=ttypesym(srsym).typedef;
+                                  MarkSymbolAsUsed(srsym);
+                                end;
                               else
                                 Message(scan_e_error_in_preproc_expr);
                             end;
@@ -2206,6 +2214,7 @@ type
                               result:=texprvalue.create_bool(false)
                             else
                               result:=texprvalue.create_bool(true);
+                            MarkSymbolAsUsed(srsym);
                           end
                         else
                           result:=texprvalue.create_bool(false);
@@ -2303,7 +2312,7 @@ type
                                       begin
                                         result.free;
                                         result:=texprvalue.create_const(tconstsym(srsym));
-                                        tconstsym(srsym).IncRefCount;
+                                        MarkSymbolAsUsed(tconstsym(srsym));
                                       end;
                                   end;
                                 enumsym:
@@ -2322,11 +2331,11 @@ type
                                       begin
                                         result.free;
                                         result:=texprvalue.create_int(tenumsym(srsym).value);
-                                        tenumsym(srsym).IncRefCount;
+                                        MarkSymbolAsUsed(tenumsym(srsym));
                                       end;
                                   end;
                                 else
-                                  ;
+                                  MarkSymbolAsUsed(tconstsym(srsym));
                               end;
                           end
                         { the id must be belong to the set type }

+ 13 - 0
tests/test/tpreproc2.pp

@@ -0,0 +1,13 @@
+{ %opt=-vh -Seh }
+program unused;
+
+uses
+	ctypes;
+
+begin
+	{$IF HIGH(cint) >255 )}
+		Writeln('cint is larger than one byte')
+	{$ELSE}
+		Writeln('cint is one byte')
+	{$ENDIF}
+end.

+ 13 - 0
tests/test/tpreproc3.pp

@@ -0,0 +1,13 @@
+{ %opt=-vh -Seh }
+program unused;
+
+uses
+	types;
+
+begin
+	{$IF CurveKappa > 1 )}
+		Writeln('CurveKappa > 1');
+	{$ELSE}
+		Writeln('CurveKappa <= 1');
+	{$ENDIF}
+end.

+ 13 - 0
tests/test/tpreproc4.pp

@@ -0,0 +1,13 @@
+{ %opt=-vh -Seh }
+program unused;
+
+uses
+	types;
+
+begin
+	{$IF Epsilon > '1' )}
+		Writeln('Epsilon > 1');
+	{$ELSE}
+		Writeln('Epsilon <= 1');
+	{$ENDIF}
+end.

+ 13 - 0
tests/test/tpreproc5.pp

@@ -0,0 +1,13 @@
+{ %opt=-vh -Seh }
+program unused;
+
+uses
+	types;
+
+begin
+	{$IF FromBeginning > 1 )}
+		Writeln('FromBeginning > 1');
+	{$ELSE}
+		Writeln('FromBeginning <= 1');
+	{$ENDIF}
+end.

+ 13 - 0
tests/test/tpreproc6.pp

@@ -0,0 +1,13 @@
+{ %opt=-vh -Seh }
+program unused;
+
+uses
+	types;
+
+begin
+	{$IF Declared(Epsilon)}
+		Writeln('Epsilon declared');
+	{$ELSE}
+		Writeln('Epsilon not declared');
+	{$ENDIF}
+end.