Commit 76ed5f08 by Gary Dismukes Committed by Pierre-Marie de Rodat

[Ada] Compiler failure on an extended_return_statement in a block

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.

2018-07-31  Gary Dismukes  <dismukes@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.

From-SVN: r263096
parent c4a2e585
2018-07-31 Gary Dismukes <dismukes@adacore.com>
* exp_ch6.adb (Expand_N_Extended_Return_Statement): Replace
calls to Current_Scope in three assertions with calls to
Current_Subprogram.
2018-07-31 Ed Schonberg <schonberg@adacore.com> 2018-07-31 Ed Schonberg <schonberg@adacore.com>
* sem_eval.adb (Check_Non_Static_Context): Do not warn on an * sem_eval.adb (Check_Non_Static_Context): Do not warn on an
......
...@@ -4763,7 +4763,7 @@ package body Exp_Ch6 is ...@@ -4763,7 +4763,7 @@ package body Exp_Ch6 is
-- the pointer to the object) they are always handled by means of -- the pointer to the object) they are always handled by means of
-- simple return statements. -- 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 if Nkind (Ret_Obj_Decl) = N_Object_Declaration then
Exp := Expression (Ret_Obj_Decl); Exp := Expression (Ret_Obj_Decl);
...@@ -4772,9 +4772,9 @@ package body Exp_Ch6 is ...@@ -4772,9 +4772,9 @@ package body Exp_Ch6 is
-- then F and G are both b-i-p, or neither b-i-p. -- then F and G are both b-i-p, or neither b-i-p.
if Nkind (Exp) = N_Function_Call then if Nkind (Exp) = N_Function_Call then
pragma Assert (Ekind (Current_Scope) = E_Function); pragma Assert (Ekind (Current_Subprogram) = E_Function);
pragma Assert pragma Assert
(Is_Build_In_Place_Function (Current_Scope) = (Is_Build_In_Place_Function (Current_Subprogram) =
Is_Build_In_Place_Function_Call (Exp)); Is_Build_In_Place_Function_Call (Exp));
null; null;
end if; end if;
......
2018-07-31 Gary Dismukes <dismukes@adacore.com>
* gnat.dg/block_ext_return_assert_failure.adb: New testcase.
2018-07-31 Ed Schonberg <schonberg@adacore.com> 2018-07-31 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/iter3.adb: New testcase. * gnat.dg/iter3.adb: New testcase.
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment