aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/sem_ch13.adb44
-rw-r--r--gcc/ada/sem_util.adb22
-rw-r--r--gcc/ada/sem_util.ads6
3 files changed, 63 insertions, 9 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 4c8c650..476503c 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -2304,12 +2304,48 @@ package body Sem_Ch13 is
if Nkind (Expr) = N_Aggregate then
- -- Component associations are not allowed in the
- -- aspect expression aggregate.
+ -- Component associations in the aggregate must be a
+ -- parameter name followed by a static boolean
+ -- expression.
if Present (Component_Associations (Expr)) then
- Error_Msg_N ("illegal aspect % expression", Expr);
- else
+ declare
+ Assoc : Node_Id :=
+ First (Component_Associations (Expr));
+ begin
+ while Present (Assoc) loop
+ if List_Length (Choices (Assoc)) = 1 then
+ Analyze_Relaxed_Parameter
+ (E, First (Choices (Assoc)), Seen);
+
+ if Inside_A_Generic then
+ Preanalyze_And_Resolve
+ (Expression (Assoc), Any_Boolean);
+ else
+ Analyze_And_Resolve
+ (Expression (Assoc), Any_Boolean);
+ end if;
+
+ if not Is_OK_Static_Expression
+ (Expression (Assoc))
+ then
+ Error_Msg_N
+ ("expression of aspect %" &
+ "must be static", Aspect);
+ end if;
+
+ else
+ Error_Msg_N
+ ("illegal aspect % expression", Expr);
+ end if;
+ Next (Assoc);
+ end loop;
+ end;
+ end if;
+
+ -- Expressions of the aggregate are parameter names
+
+ if Present (Expressions (Expr)) then
declare
Param : Node_Id := First (Expressions (Expr));
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 2c9e274..7751be7 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -12525,6 +12525,7 @@ package body Sem_Util is
Subp_Id : Entity_Id;
Aspect_Expr : Node_Id;
Param_Expr : Node_Id;
+ Assoc : Node_Id;
begin
if Is_Formal (E) then
@@ -12538,13 +12539,30 @@ package body Sem_Util is
Find_Value_Of_Aspect
(Subp_Id, Aspect_Relaxed_Initialization);
- -- Aspect expression is either an aggregate, e.g.:
+ -- Aspect expression is either an aggregate with an optional
+ -- Boolean expression (which defaults to True), e.g.:
--
-- function F (X : Integer) return Integer
- -- with Relaxed_Initialization => (X, F'Result);
+ -- with Relaxed_Initialization => (X => True, F'Result);
if Nkind (Aspect_Expr) = N_Aggregate then
+ if Present (Component_Associations (Aspect_Expr)) then
+ Assoc := First (Component_Associations (Aspect_Expr));
+
+ while Present (Assoc) loop
+ if Denotes_Relaxed_Parameter
+ (First (Choices (Assoc)), E)
+ then
+ return
+ Is_True
+ (Static_Boolean (Expression (Assoc)));
+ end if;
+
+ Next (Assoc);
+ end loop;
+ end if;
+
Param_Expr := First (Expressions (Aspect_Expr));
while Present (Param_Expr) loop
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index fc8177c..817af3b 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -1383,9 +1383,9 @@ package Sem_Util is
function Has_Relaxed_Initialization (E : Entity_Id) return Boolean;
-- Returns True iff entity E is subject to the Relaxed_Initialization
- -- aspect. Entity E can be either type, variable, constant, function,
- -- or abstract state. For private types and deferred constants E should
- -- be the private view, because aspect can only be attached there.
+ -- aspect. Entity E can be either type, variable, constant, subprogram,
+ -- entry or an abstract state. For private types and deferred constants
+ -- E should be the private view, because aspect can only be attached there.
function Has_Signed_Zeros (E : Entity_Id) return Boolean;
-- Determines if the floating-point type E supports signed zeros.