diff mbox series

[Ada] Assertion errors on concurrent types with -gnatc and extensions enabled

Message ID 20210707162546.GA2543285@adacore.com
State New
Headers show
Series [Ada] Assertion errors on concurrent types with -gnatc and extensions enabled | expand

Commit Message

Pierre-Marie de Rodat July 7, 2021, 4:25 p.m. UTC
When expansion is disabled (such as with -gnatc), there are cases where
uses of concurrent types can lead to an Assertion_Failure when
extensions are enabled (by use of -gnatX, or due to instantiation of a
predefined library generic, such as Unchecked_Conversion), because
Primitive_Operations can return No_Elist and support for the object.op
feature for untagged types can lead to checking that list. This is fixed
by ensuring that the Direct_Primitive_Operations list is always
initialized to an empty list (No_Elmt_List) for concurrent types and by
having function Primitive_Oopeation return that list rather than
No_Elist.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* einfo-utils.adb (Primitive_Operations): Default to returning
	Direct_Primitive_Operations in the case of concurrent types
	(when Corresponding_Record_Type not present).
	* sem_ch9.adb (Analyze_Protected_Type_Declaration): Initialize
	Direct_Primitive_Operations to an empty element list.
	(Analyze_Task_Type_Declaration): Initialize
	Direct_Primitive_Operations to an empty element list.
diff mbox series

Patch

diff --git a/gcc/ada/einfo-utils.adb b/gcc/ada/einfo-utils.adb
--- a/gcc/ada/einfo-utils.adb
+++ b/gcc/ada/einfo-utils.adb
@@ -2493,15 +2493,15 @@  package body Einfo.Utils is
             return Direct_Primitive_Operations
               (Corresponding_Record_Type (Id));
 
-         --  If expansion is disabled the corresponding record type is absent,
-         --  but if the type has ancestors it may have primitive operations.
-
-         elsif Is_Tagged_Type (Id) then
-            return Direct_Primitive_Operations (Id);
+         --  When expansion is disabled, the corresponding record type is
+         --  absent, but if this is a tagged type with ancestors, or if the
+         --  extension of prefixed calls for untagged types is enabled, then
+         --  it may have associated primitive operations.
 
          else
-            return No_Elist;
+            return Direct_Primitive_Operations (Id);
          end if;
+
       else
          return Direct_Primitive_Operations (Id);
       end if;


diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb
--- a/gcc/ada/sem_ch9.adb
+++ b/gcc/ada/sem_ch9.adb
@@ -2031,6 +2031,12 @@  package body Sem_Ch9 is
       Set_Has_Delayed_Freeze (T);
       Set_Stored_Constraint  (T, No_Elist);
 
+      --  Initialize type's primitive operations list, for possible use when
+      --  the extension of prefixed call notation for untagged types is enabled
+      --  (such as by use of -gnatX).
+
+      Set_Direct_Primitive_Operations (T, New_Elmt_List);
+
       --  Mark this type as a protected type for the sake of restrictions,
       --  unless the protected type is declared in a private part of a package
       --  of the runtime. With this exception, the Suspension_Object from
@@ -3152,6 +3158,12 @@  package body Sem_Ch9 is
       Set_Has_Delayed_Freeze (T, True);
       Set_Stored_Constraint  (T, No_Elist);
 
+      --  Initialize type's primitive operations list, for possible use when
+      --  the extension of prefixed call notation for untagged types is enabled
+      --  (such as by use of -gnatX).
+
+      Set_Direct_Primitive_Operations (T, New_Elmt_List);
+
       --  Set the SPARK_Mode from the current context (may be overwritten later
       --  with an explicit pragma).