[Ada] Crash on membership test in expression function
authorEd Schonberg <schonberg@adacore.com>
Wed, 9 Sep 2020 12:40:25 +0000 (08:40 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 26 Oct 2020 08:58:52 +0000 (04:58 -0400)
gcc/ada/

* freeze.adb (Freeze_Type_Refs): When an entity in an expression
function is a type, freeze the entity and not just its type,
which would be incomplete when the type is derived and/or
tagged.

gcc/ada/freeze.adb

index f3abba1538d15dbd0c0016ebb68b9d1579e8cad7..05a43c741a6a679fc63941ac1c7e83dedafe951b 100644 (file)
@@ -7978,7 +7978,16 @@ package body Freeze is
          --  Check that a type referenced by an entity can be frozen
 
          if Is_Entity_Name (Node) and then Present (Entity (Node)) then
-            Check_And_Freeze_Type (Etype (Entity (Node)));
+            --  The entity itself may be a type, as in a membership test
+            --  or an attribute reference. Freezing its own type would be
+            --  incomplete if the entity is derived or an extension.
+
+            if Is_Type (Entity (Node)) then
+               Check_And_Freeze_Type (Entity (Node));
+
+            else
+               Check_And_Freeze_Type (Etype (Entity (Node)));
+            end if;
 
             --  Check that the enclosing record type can be frozen