aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2013-04-11 13:38:22 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2013-04-11 15:38:22 +0200
commit6188f4bd60ffffedbc1d1d0f5e79610dc2b34779 (patch)
tree2d307df7c7e99e5f348221ed74ad868fb1794cbd
parentfce68ebe21414ddb666ea729f21b515c1dedd5e7 (diff)
downloadgcc-6188f4bd60ffffedbc1d1d0f5e79610dc2b34779.zip
gcc-6188f4bd60ffffedbc1d1d0f5e79610dc2b34779.tar.gz
gcc-6188f4bd60ffffedbc1d1d0f5e79610dc2b34779.tar.bz2
sem_prag.adb (Analyze_Pragma, [...]): pre-analyze expression with type Any_Priority.
2013-04-11 Ed Schonberg <schonberg@adacore.com> * sem_prag.adb (Analyze_Pragma, case Priority): pre-analyze expression with type Any_Priority. * exp_ch9.adb (Initialize_Protection): Check that the value of the priority expression is within the bounds of the proper priority type. From-SVN: r197799
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/exp_ch9.adb31
-rw-r--r--gcc/ada/sem_prag.adb2
3 files changed, 32 insertions, 9 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 5451d7c..a691ec2 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,11 @@
+2013-04-11 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_prag.adb (Analyze_Pragma, case Priority): pre-analyze
+ expression with type Any_Priority.
+ * exp_ch9.adb (Initialize_Protection): Check that the value
+ of the priority expression is within the bounds of the proper
+ priority type.
+
2013-04-11 Robert Dewar <dewar@adacore.com>
* sem_prag.adb, prj-env.adb: Minor reformatting.
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index 49e7efe..f292b96 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -13388,6 +13388,7 @@ package body Exp_Ch9 is
Args : List_Id;
L : constant List_Id := New_List;
Has_Entry : constant Boolean := Has_Entries (Ptyp);
+ Prio_Type : Entity_Id;
Restricted : constant Boolean := Restricted_Profile;
begin
@@ -13456,18 +13457,37 @@ package body Exp_Ch9 is
Expression
(First (Pragma_Argument_Associations (Prio_Clause)));
+ -- Get_Rep_Item returns either priority pragma.
+
+ if Pragma_Name (Prio_Clause) = Name_Priority then
+ Prio_Type := RTE (RE_Any_Priority);
+ else
+ Prio_Type := RTE (RE_Interrupt_Priority);
+ end if;
+
-- Attribute definition clause Priority
else
+ if Chars (Prio_Clause) = Name_Priority then
+ Prio_Type := RTE (RE_Any_Priority);
+ else
+ Prio_Type := RTE (RE_Interrupt_Priority);
+ end if;
+
Prio := Expression (Prio_Clause);
end if;
-- If priority is a static expression, then we can duplicate it
-- with no problem and simply append it to the argument list.
+ -- However, it has only be pre-analyzed, so we need to check
+ -- now that it is in the bounds of the priority type.
if Is_Static_Expression (Prio) then
+ Set_Analyzed (Prio, False);
Append_To (Args,
- Duplicate_Subexpr_No_Checks (Prio));
+ Make_Type_Conversion (Loc,
+ Subtype_Mark => New_Occurrence_Of (Prio_Type, Loc),
+ Expression => Duplicate_Subexpr (Prio)));
-- Otherwise, the priority may be a per-object expression, if
-- it depends on a discriminant of the type. In this case,
@@ -13477,18 +13497,13 @@ package body Exp_Ch9 is
-- appropriate approach, but that could generate declarations
-- improperly placed in the enclosing scope.
- -- Note: Use System.Any_Priority as the expected type for the
- -- non-static priority expression, in case the expression has
- -- not been analyzed yet (as occurs for example with pragma
- -- Interrupt_Priority).
-
else
Temp := Make_Temporary (Loc, 'R', Prio);
Append_To (L,
Make_Object_Declaration (Loc,
Defining_Identifier => Temp,
Object_Definition =>
- New_Occurrence_Of (RTE (RE_Any_Priority), Loc),
+ New_Occurrence_Of (Prio_Type, Loc),
Expression => Relocate_Node (Prio)));
Append_To (Args, New_Occurrence_Of (Temp, Loc));
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index c31056c..1d233e0 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -14521,7 +14521,7 @@ package body Sem_Prag is
-- described in "Handling of Default and Per-Object
-- Expressions" in sem.ads.
- Preanalyze_Spec_Expression (Arg, Standard_Integer);
+ Preanalyze_Spec_Expression (Arg, RTE (RE_Any_Priority));
if not Is_Static_Expression (Arg) then
Check_Restriction (Static_Priorities, Arg);