mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 22:03:57 +08:00
[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.
This commit is contained in:
parent
be19b8662b
commit
bee916bcc7
@ -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.
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user