[Ada] Failure to detect illegal parens in static predicate

Message ID 20140718095330.GA30486@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet July 18, 2014, 9:53 a.m.
The rules for static predicates do not allow the type name to be
parenthesized. This was not checked, but is now fixed, the following
test now gives the error indicated (compiled with -gnatld7 -gnatj55)
(it used to compile without errors).

     1. package BadParenSP is
     2.    subtype r is integer with
     3.      static_predicate => (r) < 2;
        >>> expression does not have required form for
            static predicate

     4. end;

Tested on x86_64-pc-linux-gnu, committed on trunk

2014-07-18  Robert Dewar  <dewar@adacore.com>

	* sem_ch13.adb (Is_Type_Ref): Check that type name is not


Index: sem_ch13.adb
--- sem_ch13.adb	(revision 212797)
+++ sem_ch13.adb	(working copy)
@@ -6247,7 +6247,8 @@ 
       pragma Inline (Is_Type_Ref);
       --  Returns if True if N is a reference to the type for the predicate in
       --  the expression (i.e. if it is an identifier whose Chars field matches
-      --  the Nam given in the call).
+      --  the Nam given in the call). N must not be parenthesized, if the type
+      --  name appears in parens, this routine will return False.
       function Lo_Val (N : Node_Id) return Uint;
       --  Given static expression or static range from a Static_Predicate list,
@@ -6770,7 +6771,9 @@ 
       function Is_Type_Ref (N : Node_Id) return Boolean is
-         return Nkind (N) = N_Identifier and then Chars (N) = Nam;
+         return Nkind (N) = N_Identifier
+           and then Chars (N) = Nam
+           and then Paren_Count (N) = 0;
       end Is_Type_Ref;