[Ada] Crash on object initialization that is call to expression function
authorEd Schonberg <schonberg@adacore.com>
Mon, 19 Aug 2019 08:37:18 +0000 (08:37 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 19 Aug 2019 08:37:18 +0000 (08:37 +0000)
This patch fixes a compiler abort on an object declaration for a
class-wide type whose expression is a call to an expression function
that returns type extension.

2019-08-19  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_Call): A call to an expression function
freezes when expander is active, unless the call appears within
the body of another expression function,

gcc/testsuite/

* gnat.dg/expr_func9.adb: New testcase.

From-SVN: r274662

gcc/ada/ChangeLog
gcc/ada/sem_res.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/expr_func9.adb [new file with mode: 0644]

index 932ff97f2c1fee5e26ab3097f8187fcf31aba2d8..1f490b3efe13a5d76087f22c04c8c551eecc2fde 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-19  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_res.adb (Resolve_Call): A call to an expression function
+       freezes when expander is active, unless the call appears within
+       the body of another expression function,
+
 2019-08-19  Dmitriy Anisimkov  <anisimko@adacore.com>
 
        * libgnat/s-os_lib.ads, libgnat/s-os_lib.adb (To_Ada, To_C): New
index 8f2e35894d4659c4b10778476294d2f04340d63a..7a52b90c98fabc13078a6bd374e4fd0dda896ad0 100644 (file)
@@ -6314,13 +6314,15 @@ package body Sem_Res is
       --  an expression function may appear when it is part of a default
       --  expression in a call to an initialization procedure, and must be
       --  frozen now, even if the body is inserted at a later point.
+      --  Otherwise, the call freezes the expression if expander is active,
+      --  for example as part of an object declaration.
 
       if Is_Entity_Name (Subp)
         and then not In_Spec_Expression
         and then not Is_Expression_Function_Or_Completion (Current_Scope)
         and then
           (not Is_Expression_Function_Or_Completion (Entity (Subp))
-            or else Scope (Entity (Subp)) = Current_Scope)
+            or else Expander_Active)
       then
          if Is_Expression_Function (Entity (Subp)) then
 
index 127a223f2389fbabe87ca054b8d3997caf5c7c6e..2dd707d36c665c85930d62c12449c2c46753201e 100644 (file)
@@ -1,3 +1,7 @@
+2019-08-19  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/expr_func9.adb: New testcase.
+
 2019-08-19  Bob Duff  <duff@adacore.com>
 
        * gnat.dg/valid_scalars2.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/expr_func9.adb b/gcc/testsuite/gnat.dg/expr_func9.adb
new file mode 100644 (file)
index 0000000..4bfa21d
--- /dev/null
@@ -0,0 +1,24 @@
+--  { dg-do compile }
+--  { dg-options "-gnatws" }
+
+procedure Expr_Func9 is
+
+   type Root is interface;
+
+   type Child1 is new Root with null record;
+
+   type Child2 is new Root with record
+      I2 : Integer;
+   end record;
+
+   function Create (I : Integer) return Child2 is (I2 => I);
+
+   I : Root'Class :=
+         (if False
+          then Child1'(null record)
+          else
+           Create (1));
+
+begin
+   null;
+end Expr_Func9;