diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2020-11-27 14:55:17 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-12-16 08:01:01 -0500 |
commit | bee916bcc70293a06c42cc11a3682b7663caa7a7 (patch) | |
tree | 2d6bccea8a4e391d74282f63356dbaeb8740dcb5 | |
parent | be19b8662bd2601ea761fe5adec3a7ce3940dd7c (diff) | |
download | gcc-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.adb | 16 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 42 |
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. |