aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2020-11-27 14:55:17 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2020-12-16 08:01:01 -0500
commitbee916bcc70293a06c42cc11a3682b7663caa7a7 (patch)
tree2d6bccea8a4e391d74282f63356dbaeb8740dcb5
parentbe19b8662bd2601ea761fe5adec3a7ce3940dd7c (diff)
downloadgcc-bee916bcc70293a06c42cc11a3682b7663caa7a7.zip
gcc-bee916bcc70293a06c42cc11a3682b7663caa7a7.tar.gz
gcc-bee916bcc70293a06c42cc11a3682b7663caa7a7.tar.bz2
[Ada] Reject junk syntax for Contract_Cases/Test_Case/Subprogram_Variant
gcc/ada/ * sem_ch13.adb (Analyze_Aspect_Specifications): Add a codefix for extra parentheses around aspect Annotate expression; reject "(null record)" aggregate and extra parentheses around aspect Test_Case expression. * sem_prag.adb (Analyze_Pragma): Reject "null", "(null record)" and extra parentheses around pragma Contract_Cases; likewise for pragma Subprogram_Variant.
-rw-r--r--gcc/ada/sem_ch13.adb16
-rw-r--r--gcc/ada/sem_prag.adb42
2 files changed, 50 insertions, 8 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 1327d31..4120a47 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -4145,7 +4145,8 @@ package body Sem_Ch13 is
-- Must not be parenthesized
if Paren_Count (Expr) /= 0 then
- Error_Msg_F ("extra parentheses ignored", Expr);
+ Error_Msg -- CODEFIX
+ ("redundant parentheses", First_Sloc (Expr));
end if;
-- List of arguments is list of aggregate expressions
@@ -4426,13 +4427,24 @@ package body Sem_Ch13 is
goto Continue;
end if;
- if Nkind (Expr) /= N_Aggregate then
+ if Nkind (Expr) /= N_Aggregate
+ or else Null_Record_Present (Expr)
+ then
Error_Msg_Name_1 := Nam;
Error_Msg_NE
("wrong syntax for aspect `%` for &", Id, E);
goto Continue;
end if;
+ -- Check that the expression is a proper aggregate (no
+ -- parentheses).
+
+ if Paren_Count (Expr) /= 0 then
+ Error_Msg -- CODEFIX
+ ("redundant parentheses", First_Sloc (Expr));
+ goto Continue;
+ end if;
+
-- Create the list of arguments for building the Test_Case
-- pragma.
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 1a2d2a2..1a25f03 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -545,16 +545,31 @@ package body Sem_Prag is
-- Single and multiple contract cases must appear in aggregate form. If
-- this is not the case, then either the parser or the analysis of the
- -- pragma failed to produce an aggregate.
+ -- pragma failed to produce an aggregate, e.g. when the contract is
+ -- "null" or a "(null record)".
- pragma Assert (Nkind (CCases) = N_Aggregate);
+ pragma Assert
+ (if Nkind (CCases) = N_Aggregate
+ then Null_Record_Present (CCases)
+ xor (Present (Component_Associations (CCases))
+ or
+ Present (Expressions (CCases)))
+ else Nkind (CCases) = N_Null);
-- Only CASE_GUARD => CONSEQUENCE clauses are allowed
- if Present (Component_Associations (CCases))
+ if Nkind (CCases) = N_Aggregate
+ and then Present (Component_Associations (CCases))
and then No (Expressions (CCases))
then
+ -- Check that the expression is a proper aggregate (no parentheses)
+
+ if Paren_Count (CCases) /= 0 then
+ Error_Msg -- CODEFIX
+ ("redundant parentheses", First_Sloc (CCases));
+ end if;
+
-- Ensure that the formal parameters are visible when analyzing all
-- clauses. This falls out of the general rule of aspects pertaining
-- to subprogram declarations.
@@ -29170,16 +29185,31 @@ package body Sem_Prag is
-- Single and multiple contract cases must appear in aggregate form. If
-- this is not the case, then either the parser of the analysis of the
- -- pragma failed to produce an aggregate.
+ -- pragma failed to produce an aggregate, e.g. when the contract is
+ -- "null" or a "(null record)".
- pragma Assert (Nkind (Variants) = N_Aggregate);
+ pragma Assert
+ (if Nkind (Variants) = N_Aggregate
+ then Null_Record_Present (Variants)
+ xor (Present (Component_Associations (Variants))
+ or
+ Present (Expressions (Variants)))
+ else Nkind (Variants) = N_Null);
-- Only "change_direction => discrete_expression" clauses are allowed
- if Present (Component_Associations (Variants))
+ if Nkind (Variants) = N_Aggregate
+ and then Present (Component_Associations (Variants))
and then No (Expressions (Variants))
then
+ -- Check that the expression is a proper aggregate (no parentheses)
+
+ if Paren_Count (Variants) /= 0 then
+ Error_Msg -- CODEFIX
+ ("redundant parentheses", First_Sloc (Variants));
+ end if;
+
-- Ensure that the formal parameters are visible when analyzing all
-- clauses. This falls out of the general rule of aspects pertaining
-- to subprogram declarations.