diff options
author | Ed Schonberg <schonberg@adacore.com> | 2019-07-03 08:13:41 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-03 08:13:41 +0000 |
commit | f51e316c7c7d0b2aad8b8444253369f2e819aee5 (patch) | |
tree | 3191fdef35b109604d0e104514166bfd0e0bf582 /gcc | |
parent | 07ec36eed91154bd164081aed2dcb59d05910dc7 (diff) | |
download | gcc-f51e316c7c7d0b2aad8b8444253369f2e819aee5.zip gcc-f51e316c7c7d0b2aad8b8444253369f2e819aee5.tar.gz gcc-f51e316c7c7d0b2aad8b8444253369f2e819aee5.tar.bz2 |
[Ada] Spurious error on predicate of subtype in generic
This patch fixes a spurious error on a dynamic predicate of a record
subtype when the expression for the predicate includes a selected
component that denotes a component of the subtype.
2019-07-03 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch8.adb (Find_Selected_Component): If the prefix is the
current instance of a type or subtype, complete the resolution
of the name by finding the component of the type denoted by the
selector name.
gcc/testsuite/
* gnat.dg/predicate4.adb, gnat.dg/predicate4_pkg.ads: New
testcase.
From-SVN: r272961
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/sem_ch8.adb | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/predicate4.adb | 19 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/predicate4_pkg.ads | 16 |
5 files changed, 67 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 96c16bd..b236063 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2019-07-03 Ed Schonberg <schonberg@adacore.com> + + * sem_ch8.adb (Find_Selected_Component): If the prefix is the + current instance of a type or subtype, complete the resolution + of the name by finding the component of the type denoted by the + selector name. + 2019-07-03 Eric Botcazou <ebotcazou@adacore.com> * doc/gnat_rm/interfacing_to_other_languages.rst (Interfacing to C): diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index a5e821d..8f2d245 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -7418,10 +7418,28 @@ package body Sem_Ch8 is -- It is not an error if the prefix is the current instance of -- type name, e.g. the expression of a type aspect, when it is - -- analyzed for ASIS use. + -- analyzed for ASIS use, or within a generic unit. We still + -- have to verify that a component of that name exists, and + -- decorate the node accordingly. elsif Is_Entity_Name (P) and then Is_Current_Instance (P) then - null; + declare + Comp : Entity_Id; + + begin + Comp := First_Entity (Entity (P)); + while Present (Comp) loop + if Chars (Comp) = Chars (Selector_Name (N)) then + Set_Entity (N, Comp); + Set_Etype (N, Etype (Comp)); + Set_Entity (Selector_Name (N), Comp); + Set_Etype (Selector_Name (N), Etype (Comp)); + return; + end if; + + Next_Entity (Comp); + end loop; + end; elsif Ekind (P_Name) = E_Void then Premature_Usage (P); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b2c4cc3..925e8b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-07-03 Ed Schonberg <schonberg@adacore.com> + + * gnat.dg/predicate4.adb, gnat.dg/predicate4_pkg.ads: New + testcase. + 2019-07-03 Jakub Jelinek <jakub@redhat.com> * c-c++-common/gomp/scan-3.c (f1): Don't expect a sorry message. diff --git a/gcc/testsuite/gnat.dg/predicate4.adb b/gcc/testsuite/gnat.dg/predicate4.adb new file mode 100644 index 0000000..ce4ddf8 --- /dev/null +++ b/gcc/testsuite/gnat.dg/predicate4.adb @@ -0,0 +1,19 @@ +-- { dg-do compile } +-- { dg-options "-gnata" } + +with System.Assertions; use System.Assertions; +with Predicate4_Pkg; +procedure Predicate4 is + type V is new Float; + package MXI2 is new Predicate4_Pkg (V); + use MXI2; + OK : Lt := (Has => False); +begin + declare + Wrong : Lt := (Has => True, MX => 3.14); + begin + raise Program_Error; + end; +exception + when Assert_Failure => null; +end; diff --git a/gcc/testsuite/gnat.dg/predicate4_pkg.ads b/gcc/testsuite/gnat.dg/predicate4_pkg.ads new file mode 100644 index 0000000..1b2e62d --- /dev/null +++ b/gcc/testsuite/gnat.dg/predicate4_pkg.ads @@ -0,0 +1,16 @@ +generic + type Value_Type is private; +package Predicate4_Pkg is + type MT (Has : Boolean := False) is record + case Has is + when False => + null; + when True => + MX : Value_Type; + end case; + end record; + + function Foo (M : MT) return Boolean is (not M.Has); + subtype LT is MT with Dynamic_Predicate => not LT.Has; + function Bar (M : MT) return Boolean is (Foo (M)); +end; |