diff options
author | Ed Schonberg <schonberg@adacore.com> | 2018-05-21 14:52:00 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-05-21 14:52:00 +0000 |
commit | def6e435f48990bcf8aebe9432b9b1aea593e4e9 (patch) | |
tree | e821f59a8417f74b5874e7b640cc4c83286cb6eb /gcc/ada | |
parent | 0d8b6803b9abafea59b08702a582605316544245 (diff) | |
download | gcc-def6e435f48990bcf8aebe9432b9b1aea593e4e9.zip gcc-def6e435f48990bcf8aebe9432b9b1aea593e4e9.tar.gz gcc-def6e435f48990bcf8aebe9432b9b1aea593e4e9.tar.bz2 |
[Ada] Exit statement in loops over iterable objects
This patch fixes an omission in the expansion of loops over GNAT-specific
iterable objects. If the source includes an explicit name for the loop,
that name has to be preserved in the expanded code to allow exit statements
to mention it.
2018-05-21 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* exp_ch5.adb (Build_Formal_Container_Iteration): If source has
explicit name for iterator loop, preserve that name in expanded
construct, for possible use in exit statements.
gcc/testsuite/
* gnat.dg/exit1.adb: New testcase.
From-SVN: r260465
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/exp_ch5.adb | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d21a5d9..b29b3ab 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-05-21 Ed Schonberg <schonberg@adacore.com> + + * exp_ch5.adb (Build_Formal_Container_Iteration): If source has + explicit name for iterator loop, preserve that name in expanded + construct, for possible use in exit statements. + 2018-04-04 Javier Miranda <miranda@adacore.com> * sem_ch4.adb (Analyze_Membership_Op): Avoid compiler crash when the diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 3407e85..ff6bcc6 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -237,6 +237,15 @@ package body Exp_Ch5 is New_Occurrence_Of (Cursor, Loc)))), Statements => Stats, End_Label => Empty); + + -- If the contruct has a specified loop name, preserve it in the + -- new loop, for possible use in exit statements. + + if Present (Identifier (N)) + and then Comes_From_Source (Identifier (N)) + then + Set_Identifier (New_Loop, Identifier (N)); + end if; end Build_Formal_Container_Iteration; ------------------------------ |