When compiling with an assertion-enabled compiler, Assert_Failure can be
raised when expanded an extended_return_statement whose enclosing scope
is not a function (such as when it's a block_statement). The simple fix
is to change the Assert to test Current_Subprogram rather than Current_Scope.
Three such Assert pragmas are corrected in this way.

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

2018-07-31  Gary Dismukes  <dismu...@adacore.com>

gcc/ada/

        * exp_ch6.adb (Expand_N_Extended_Return_Statement): Replace
        calls to Current_Scope in three assertions with calls to
        Current_Subprogram.

gcc/testsuite/

        * gnat.dg/block_ext_return_assert_failure.adb: New testcase.
--- gcc/ada/exp_ch6.adb
+++ gcc/ada/exp_ch6.adb
@@ -4763,7 +4763,7 @@ package body Exp_Ch6 is
       --  the pointer to the object) they are always handled by means of
       --  simple return statements.
 
-      pragma Assert (not Is_Thunk (Current_Scope));
+      pragma Assert (not Is_Thunk (Current_Subprogram));
 
       if Nkind (Ret_Obj_Decl) = N_Object_Declaration then
          Exp := Expression (Ret_Obj_Decl);
@@ -4772,9 +4772,9 @@ package body Exp_Ch6 is
          --  then F and G are both b-i-p, or neither b-i-p.
 
          if Nkind (Exp) = N_Function_Call then
-            pragma Assert (Ekind (Current_Scope) = E_Function);
+            pragma Assert (Ekind (Current_Subprogram) = E_Function);
             pragma Assert
-              (Is_Build_In_Place_Function (Current_Scope) =
+              (Is_Build_In_Place_Function (Current_Subprogram) =
                Is_Build_In_Place_Function_Call (Exp));
             null;
          end if;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/block_ext_return_assert_failure.adb
@@ -0,0 +1,24 @@
+--  { dg-do compile }
+
+--  This test used to crash a compiler with assertions enabled
+
+procedure Block_Ext_Return_Assert_Failure is
+
+   function Return_Int return Integer is
+   begin
+      return 123;
+   end Return_Int;
+
+   function F return Integer is
+   begin
+      declare
+      begin
+         return Result : constant Integer := Return_Int do
+            null;
+         end return;
+      end;
+   end F;
+
+begin
+   null;
+end Block_Ext_Return_Assert_Failure;

Reply via email to