Browse Source

* do not throw messages on potentially uninitialized internal symbols, resolves #39744

florian 3 years ago
parent
commit
98ec81896e

+ 4 - 2
compiler/optdfa.pas

@@ -729,8 +729,10 @@ unit optdfa;
                    ((vo_is_funcret in sym.varoptions) and
                    ((vo_is_funcret in sym.varoptions) and
                     (current_procinfo.procdef.parast.symtablelevel=sym.owner.symtablelevel)
                     (current_procinfo.procdef.parast.symtablelevel=sym.owner.symtablelevel)
                    )
                    )
-                  ) and not(vo_is_external in sym.varoptions) and
-                  not sym.inparentfpstruct;
+                  ) and
+                  not(vo_is_external in sym.varoptions) and
+                  not sym.inparentfpstruct and
+                  not(vo_is_internal in sym.varoptions);
         end;
         end;
 
 
       var
       var

+ 4 - 4
compiler/procdefutil.pas

@@ -465,17 +465,17 @@ implementation
             end;}
             end;}
 
 
           if st.symtabletype=localsymtable then
           if st.symtabletype=localsymtable then
-            result:=clocalvarsym.create('$'+capturer_var_name,vs_value,def,[])
+            result:=clocalvarsym.create('$'+capturer_var_name,vs_value,def,[vo_is_internal])
           else
           else
-            result:=cstaticvarsym.create('$'+capturer_var_name,vs_value,def,[]);
+            result:=cstaticvarsym.create('$'+capturer_var_name,vs_value,def,[vo_is_internal]);
           result.fileinfo:=pd.fileinfo;
           result.fileinfo:=pd.fileinfo;
           st.insertsym(result);
           st.insertsym(result);
           addsymref(result);
           addsymref(result);
 
 
           if st.symtabletype=localsymtable then
           if st.symtabletype=localsymtable then
-            keepalive:=clocalvarsym.create('$'+capturer_var_name+keepalive_suffix,vs_value,interface_iunknown,[])
+            keepalive:=clocalvarsym.create('$'+capturer_var_name+keepalive_suffix,vs_value,interface_iunknown,[vo_is_internal])
           else
           else
-            keepalive:=cstaticvarsym.create('$'+capturer_var_name+keepalive_suffix,vs_value,interface_iunknown,[]);
+            keepalive:=cstaticvarsym.create('$'+capturer_var_name+keepalive_suffix,vs_value,interface_iunknown,[vo_is_internal]);
           keepalive.fileinfo:=pd.fileinfo;
           keepalive.fileinfo:=pd.fileinfo;
           st.insertsym(keepalive);
           st.insertsym(keepalive);
           addsymref(keepalive);
           addsymref(keepalive);

+ 2 - 1
compiler/symconst.pas

@@ -640,7 +640,8 @@ type
     { i8086 'external far' (can only be used in combination with vo_is_external) }
     { i8086 'external far' (can only be used in combination with vo_is_external) }
     vo_is_far,
     vo_is_far,
     { a static symbol that is referenced from a global function }
     { a static symbol that is referenced from a global function }
-    vo_has_global_ref
+    vo_has_global_ref,
+    vo_is_internal
   );
   );
   tvaroptions=set of tvaroption;
   tvaroptions=set of tvaroption;
 
 

+ 2 - 1
compiler/utils/ppuutils/ppudump.pp

@@ -3137,7 +3137,8 @@ const
      (mask:vo_force_finalize;  str:'ForceFinalize'),
      (mask:vo_force_finalize;  str:'ForceFinalize'),
      (mask:vo_is_default_var;  str:'DefaultIntrinsicVar'),
      (mask:vo_is_default_var;  str:'DefaultIntrinsicVar'),
      (mask:vo_is_far;          str:'IsFar'),
      (mask:vo_is_far;          str:'IsFar'),
-     (mask:vo_has_global_ref;  str:'HasGlobalRef')
+     (mask:vo_has_global_ref;  str:'HasGlobalRef'),
+     (mask:vo_is_internal;     str:'IsInternal')
   );
   );
 type
 type
   tvaraccessdesc=record
   tvaraccessdesc=record

+ 26 - 0
tests/webtbs/tw39744.pp

@@ -0,0 +1,26 @@
+{ %OPT=-Oodfa -Sew }
+program project2;
+
+{$mode delphi}
+{$modeswitch anonymousfunctions}
+{$modeswitch functionreferences}
+
+type
+  TFuncRef = reference to function (A, B: Integer): Integer;
+
+function CallFunc(const F: TFuncRef; A, B: Integer): Integer; //overload;
+begin
+  Result := F(A*100, B*100);
+end;
+
+function TestRef(A, B, C: Integer): Integer; noinline;
+begin
+  Result := CallFunc(function (A, B: Integer): Integer begin
+      Result := A + B + C;
+    end, A, B);
+end;
+
+begin
+  if TestRef(1, 2, 3) <> 303 then
+    Halt(1);
+end.