diff options
author | Hristian Kirtchev <kirtchev@adacore.com> | 2019-07-11 08:02:07 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-11 08:02:07 +0000 |
commit | f9e5da46f7708d7eaf5a080e51dd6d5553bdf37a (patch) | |
tree | e87479117811cf69184b7a5c1865a5904fcf1744 /gcc | |
parent | 29c64a0f6d13bf413cf338da23580e8a94ead23c (diff) | |
download | gcc-f9e5da46f7708d7eaf5a080e51dd6d5553bdf37a.zip gcc-f9e5da46f7708d7eaf5a080e51dd6d5553bdf37a.tar.gz gcc-f9e5da46f7708d7eaf5a080e51dd6d5553bdf37a.tar.bz2 |
[Ada] Infinite loop on illegal declaration
This patch updates predicate Null_Status to prevent an infinite
recursion when the argument is an illegal object declaration of an
access type.
2019-07-11 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_util.adb (Null_Status): Assume that an erroneous construct
has an undefined null status.
gcc/testsuite/
* gnat.dg/self_ref1.adb: New testcase.
From-SVN: r273389
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/self_ref1.adb | 11 |
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a17ab7e..0a1bd24 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + * sem_util.adb (Null_Status): Assume that an erroneous construct + has an undefined null status. + +2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + * checks.adb, exp_ch6.adb, gnat1drv.adb, sem_aux.adb, sem_ch2.adb, sem_ch8.adb, sem_res.adb: Minor reformatting. diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 147c281..04d981a6 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -22367,9 +22367,15 @@ package body Sem_Util is -- Start of processing for Null_Status begin + -- Prevent cascaded errors or infinite loops when trying to determine + -- the null status of an erroneous construct. + + if Error_Posted (N) then + return Unknown; + -- An allocator always creates a non-null value - if Nkind (N) = N_Allocator then + elsif Nkind (N) = N_Allocator then return Is_Non_Null; -- Taking the 'Access of something yields a non-null value diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bbfada2..f0d066d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + + * gnat.dg/self_ref1.adb: New testcase. + 2019-07-11 Ed Schonberg <schonberg@adacore.com> * gnat.dg/predicate11.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/self_ref1.adb b/gcc/testsuite/gnat.dg/self_ref1.adb new file mode 100644 index 0000000..a65dbd9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/self_ref1.adb @@ -0,0 +1,11 @@ +-- { dg-do compile } + +procedure Self_Ref1 is + type Integer_Ptr is access all Integer; + Ptr : constant Integer_Ptr := Integer_Ptr (Ptr); -- { dg-error "object \"Ptr\" cannot be used before end of its declaration" } + +begin + if Ptr /= null then + null; + end if; +end Self_Ref1; |