[Ada] Reject illegal syntax in pragma Contract_Cases
authorPiotr Trojanek <trojanek@adacore.com>
Fri, 4 Sep 2020 12:51:02 +0000 (14:51 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 23 Oct 2020 08:25:04 +0000 (04:25 -0400)
gcc/ada/

* contracts.adb (Analyze_Entry_Or_Subprogram_Contract,
Analyze_Subprogram_Body_Stub_Contract): Fix missing references
to Subprogram_Variant where similar references to Contract_Cases
are present.
* sem_prag.adb (Analyze_Contract_Case, Analyze_Variant): Check
that aggregate parameter has no expressions.
(Analyze_Pragma): Replace Contract_Cases with Subprogram_Variant
in a copy-pasted comment.

gcc/ada/contracts.adb
gcc/ada/sem_prag.adb

index 20dafad5bff1dbeeb1b0523644d1b64621e75b3b..9e328e248dbc2e0f4cb0ab08f0e4fdc0938c9b11 100644 (file)
@@ -668,7 +668,7 @@ package body Contracts is
             end;
          end if;
 
-         --  Analyze contract-cases and test-cases
+         --  Analyze contract-cases, subprogram-variant and test-cases
 
          Prag := Contract_Test_Cases (Items);
          while Present (Prag) loop
@@ -1432,6 +1432,7 @@ package body Contracts is
       --    Global
       --    Postcondition
       --    Precondition
+      --    Subprogram_Variant
       --    Test_Case
 
       else
index 4edb67dff330a3a46c0c615f8241b6c0bd958788..1e1a279da2e95175aa2647470fede2d29162ccc2 100644 (file)
@@ -549,7 +549,11 @@ package body Sem_Prag is
 
       pragma Assert (Nkind (CCases) = N_Aggregate);
 
-      if Present (Component_Associations (CCases)) then
+      --  Only CASE_GUARD => CONSEQUENCE clauses are allowed
+
+      if Present (Component_Associations (CCases))
+        and then No (Expressions (CCases))
+      then
 
          --  Ensure that the formal parameters are visible when analyzing all
          --  clauses. This falls out of the general rule of aspects pertaining
@@ -23900,7 +23904,7 @@ package body Sem_Prag is
             Ensure_Aggregate_Form (Get_Argument (N, Spec_Id));
 
             --  Chain the pragma on the contract for further processing by
-            --  Analyze_Contract_Cases_In_Decl_Part.
+            --  Analyze_Subprogram_Variant_In_Decl_Part.
 
             Add_Contract_Item (N, Defining_Entity (Subp_Decl));
 
@@ -29048,7 +29052,11 @@ package body Sem_Prag is
 
       pragma Assert (Nkind (Variants) = N_Aggregate);
 
-      if Present (Component_Associations (Variants)) then
+      --  Only "change_direction => discrete_expression" clauses are allowed
+
+      if Present (Component_Associations (Variants))
+        and then No (Expressions (Variants))
+      then
 
          --  Ensure that the formal parameters are visible when analyzing all
          --  clauses. This falls out of the general rule of aspects pertaining