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;