]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] Undefined master in task with limited class-wide aliased entry formal
authorpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Aug 2019 08:30:17 +0000 (08:30 +0000)
committerpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Aug 2019 08:30:17 +0000 (08:30 +0000)
In the case of a task declaring an entry with an aliased formal
parameter of a limited class-wide type, the front end was creating a
master object (_master) for the access type generated for such an entry
formal inside the task specification, even though such access types
don't need an associated master.  The master object wasn't being copied
into the procedure expanded for the task body, but a renaming for the
master appeared in the statements of the task body, and the LLVM back
end rejects this since the master object doesn't appear in the expanded
task procedure (for some reason, gigi doesn't complain). This is fixed
by suppressing the creation of the master object in the case where the
access-to-limited-class-wide access type is the type of a component in
an entry's parameter block.  This is similar to the suppression done for
the master object in other cases, where the access type designates a
type explicitly containing tasks (though the suppression involves
testing Comes_From_Source in that case).

No simple test (and this only affects the LLVM-based compiler).

2019-08-21  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

* exp_ch3.adb (Build_Master): Suppress call to
Build_Class_Wide_Master in the case where the
access-to-limited-class-wide type was created for a component in
an entry's formal parameter
block (Is_Parameter_Block_Component_Type), to prevent a master
from being created for such access types generated by the front
end in a task spec for entry formals in a parameter block.  Add
a ??? about whether this suppression should be done more
generally (such as by using Comes_From_Source).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@274783 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb

index c27e6e550232efae33d45b35a7b333b97e4d8120..29617b0c7ba9e5788dbe77cb3a8e0d090598ef9d 100644 (file)
@@ -1,3 +1,15 @@
+2019-08-21  Gary Dismukes  <dismukes@adacore.com>
+
+       * exp_ch3.adb (Build_Master): Suppress call to
+       Build_Class_Wide_Master in the case where the
+       access-to-limited-class-wide type was created for a component in
+       an entry's formal parameter
+       block (Is_Parameter_Block_Component_Type), to prevent a master
+       from being created for such access types generated by the front
+       end in a task spec for entry formals in a parameter block.  Add
+       a ??? about whether this suppression should be done more
+       generally (such as by using Comes_From_Source).
+
 2019-08-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * exp_ch6.adb (Expand_N_Extended_Return_Statement): In the case
index 1901ea573983d4ae4eff8dbd4d3a3db850582adf..87636002aa08202262135715a0a02dcdf771b468 100644 (file)
@@ -5518,7 +5518,14 @@ package body Exp_Ch3 is
          --  Note: This code covers access-to-limited-interfaces because they
          --        can be used to reference tasks implementing them.
 
-         elsif Is_Limited_Class_Wide_Type (Desig_Typ)
+         --  Suppress the master creation for access types created for entry
+         --  formal parameters (parameter block component types). Seems like
+         --  suppression should be more general for compiler-generated types,
+         --  but testing Comes_From_Source, like the code above does, may be
+         --  too general in this case (affects some test output)???
+
+         elsif not Is_Param_Block_Component_Type (Ptr_Typ)
+           and then Is_Limited_Class_Wide_Type (Desig_Typ)
            and then Tasking_Allowed
          then
             Build_Class_Wide_Master (Ptr_Typ);