[fpc-devel] Procedural types returning file types

Blaise at blaise.ru Blaise at blaise.ru
Fri Dec 18 10:01:45 CET 2020


The patch http://hg.blaise.ru/public/fpc/rev/698389953e49 (attached) fixes the following:
-------8<-------
// EXPECTED: 'Error: Illegal function result type'
// ACTUAL: gets compiled
type M = function : file;

begin
end.
-------8<-------

-- 
βþ
-------------- next part --------------
# HG changeset patch
# User Blaise.ru
# Date 1608281477 -10800
! procvar_dec: reject file types as result types of procedural types

diff -r a4ade871efd2 -r ac2ef7649638 pdecsub.pas
--- a/pdecsub.pas	Thu Dec 17 10:58:01 2020 +0300
+++ b/pdecsub.pas	Fri Dec 18 11:51:17 2020 +0300
@@ -1344,7 +1344,7 @@
             parse_generic:=(df_generic in pd.defoptions);
             if pd.is_generic or pd.is_specialization then
               symtablestack.push(pd.parast);
-            single_type(pd.returndef,[stoAllowSpecialization]);
+            pd.returndef:=result_type([stoAllowSpecialization]);
 
             // Issue #24863, enabled only for the main progra commented out for now because it breaks building of RTL and needs extensive
 // testing and/or RTL patching.
@@ -1555,10 +1555,6 @@
             include(pd.procoptions,po_variadic);
           end;
 
-        { file types can't be function results }
-        if assigned(pd) and
-           (pd.returndef.typ=filedef) then
-          message(parser_e_illegal_function_result);
         { support procedure proc stdcall export; }
         if not(check_proc_directive(false)) then
           begin
diff -r a4ade871efd2 -r ac2ef7649638 ptype.pas
--- a/ptype.pas	Thu Dec 17 10:58:01 2020 +0300
+++ b/ptype.pas	Fri Dec 18 11:51:17 2020 +0300
@@ -41,7 +41,9 @@
     procedure resolve_forward_types;
 
     { reads a string, file type or a type identifier }
-    procedure single_type(var def:tdef;options:TSingleTypeOptions);
+    procedure single_type(out def:tdef;options:TSingleTypeOptions);
+    { ... but rejects types that cannot be returned from functions }
+    function result_type(options:TSingleTypeOptions):tdef;
 
     { reads any type declaration, where the resulting type will get name as type identifier }
     procedure read_named_type(var def:tdef;const newsym:tsym;genericdef:tstoreddef;genericlist:tfphashobjectlist;parseprocvardir:boolean;var hadtypetoken:boolean);
@@ -454,7 +456,7 @@
       end;
 
 
-    procedure single_type(var def:tdef;options:TSingleTypeOptions);
+    procedure single_type(out def:tdef;options:TSingleTypeOptions);
        var
          t2 : tdef;
          isspecialize,
@@ -645,6 +647,14 @@
       end;
 
 
+    function result_type(options:TSingleTypeOptions):tdef;
+      begin
+        single_type(result,options);
+        { file types cannot be function results }
+        if result.typ=filedef then
+          message(parser_e_illegal_function_result);
+      end;
+
     procedure parse_record_members(recsym:tsym);
 
       function IsAnonOrLocal: Boolean;
@@ -1587,7 +1597,7 @@
             if is_func then
               begin
                 consume(_COLON);
-                single_type(pd.returndef,[stoAllowSpecialization]);
+                pd.returndef:=result_type([stoAllowSpecialization]);
               end;
             if try_to_consume(_OF) then
               begin


More information about the fpc-devel mailing list