From 76ed5f08f4462d7d22bc6cda3624e131e65bdd52 Mon Sep 17 00:00:00 2001 From: Gary Dismukes Date: Tue, 31 Jul 2018 09:55:53 +0000 Subject: [PATCH] [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 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 --- gcc/ada/ChangeLog | 6 +++++ gcc/ada/exp_ch6.adb | 6 ++--- gcc/testsuite/ChangeLog | 4 ++++ .../block_ext_return_assert_failure.adb | 24 +++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/block_ext_return_assert_failure.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 8b286057c1c..f8da47c8fde 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-07-31 Gary Dismukes + + * 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 * sem_eval.adb (Check_Non_Static_Context): Do not warn on an diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index 2ac5db67d54..f71cdab4703 100644 --- a/gcc/ada/exp_ch6.adb +++ b/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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd3079cf907..2258aa25a0f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-07-31 Gary Dismukes + + * gnat.dg/block_ext_return_assert_failure.adb: New testcase. + 2018-07-31 Ed Schonberg * gnat.dg/iter3.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/block_ext_return_assert_failure.adb b/gcc/testsuite/gnat.dg/block_ext_return_assert_failure.adb new file mode 100644 index 00000000000..afd66b30902 --- /dev/null +++ b/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; -- 2.30.2