mirror of git://gcc.gnu.org/git/gcc.git
[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
This commit is contained in:
parent
c4a2e585d3
commit
76ed5f08f4
|
|
@ -1,3 +1,9 @@
|
|||
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>
|
||||
|
||||
* sem_eval.adb (Check_Non_Static_Context): Do not warn on an
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,7 @@
|
|||
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>
|
||||
|
||||
* gnat.dg/iter3.adb: New testcase.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
Loading…
Reference in New Issue