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>
|
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
|
||||||
-- 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
|
||||||
-- 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;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2018-07-31 Ed Schonberg <schonberg@adacore.com>
|
||||||
|
|
||||||
* gnat.dg/iter3.adb: New testcase.
|
* 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