aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2019-09-19 08:13:20 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-09-19 08:13:20 +0000
commit890cde5319470afab7e96e3b7953075681c015f5 (patch)
tree60fde4523f7cb6c05caebbd1cc2f664e7ba1b76c /gcc/ada
parentf56add9cb032cb4b22abbb33a7b867bfcbbc5f0d (diff)
downloadgcc-890cde5319470afab7e96e3b7953075681c015f5.zip
gcc-890cde5319470afab7e96e3b7953075681c015f5.tar.gz
gcc-890cde5319470afab7e96e3b7953075681c015f5.tar.bz2
[Ada] Crash on predicate in full view in a generic unit
This patch fixes a compiler abort on a dynamic predicate applied to the full view of a type in a generic package declaration, when the expression for the predicate is a conditionql expression that contains references to components of the full view of the type. 2019-09-19 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_ch13.adb (Check_Aspect_At_End_Of_Declarations): Simplify handling of expressions in predicates when the context is a generic unit. gcc/testsuite/ * gnat.dg/predicate14.adb, gnat.dg/predicate14.ads: New testcase. From-SVN: r275939
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/sem_ch13.adb32
2 files changed, 30 insertions, 8 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index b3e94db..2caf52d 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-19 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch13.adb (Check_Aspect_At_End_Of_Declarations): Simplify
+ handling of expressions in predicates when the context is a
+ generic unit.
+
2019-09-19 Bob Duff <duff@adacore.com>
* sem_attr.adb (Resolve_Attribute): Make sure the secondary
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index ef9f965..354d068 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -9374,17 +9374,22 @@ package body Sem_Ch13 is
else
-- In a generic context freeze nodes are not always generated, so
- -- analyze the expression now. If the aspect is for a type, this
- -- makes its potential components accessible.
+ -- analyze the expression now. If the aspect is for a type, we must
+ -- also make its potential components accessible.
if not Analyzed (Freeze_Expr) and then Inside_A_Generic then
if A_Id = Aspect_Dynamic_Predicate
or else A_Id = Aspect_Predicate
- or else A_Id = Aspect_Priority
then
Push_Type (Ent);
- Preanalyze_Spec_Expression (Freeze_Expr, T);
+ Preanalyze_Spec_Expression (Freeze_Expr, Standard_Boolean);
+ Pop_Type (Ent);
+
+ elsif A_Id = Aspect_Priority then
+ Push_Type (Ent);
+ Preanalyze_Spec_Expression (Freeze_Expr, Any_Integer);
Pop_Type (Ent);
+
else
Preanalyze (Freeze_Expr);
end if;
@@ -9395,12 +9400,23 @@ package body Sem_Ch13 is
Set_Parent (End_Decl_Expr, ASN);
- -- In a generic context the aspect expressions have not been
- -- preanalyzed, so do it now. There are no conformance checks
- -- to perform in this case.
+ -- In a generic context the original aspect expressions have not
+ -- been preanalyzed, so do it now. There are no conformance checks
+ -- to perform in this case. As before, we have to make components
+ -- visible for aspects that may reference them.
if No (T) then
- Check_Aspect_At_Freeze_Point (ASN);
+ if A_Id = Aspect_Dynamic_Predicate
+ or else A_Id = Aspect_Predicate
+ or else A_Id = Aspect_Priority
+ then
+ Push_Type (Ent);
+ Check_Aspect_At_Freeze_Point (ASN);
+ Pop_Type (Ent);
+
+ else
+ Check_Aspect_At_Freeze_Point (ASN);
+ end if;
return;
-- The default values attributes may be defined in the private part,