https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78066

            Bug ID: 78066
           Summary: Misleading error message about redundant
                    Dynamic_Predicate incorrectly mentions "Valid"
           Product: gcc
           Version: 6.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
          Assignee: unassigned at gcc dot gnu.org
          Reporter: georggcc at googlemail dot com
  Target Milestone: ---
              Host: x86_64-apple-darwin15
            Target: x86_64-apple-darwin15
             Build: x86_64-apple-darwin15

The exact repetition of the range constraint on type T
in its Dynamic_Predicate leads to infinite recursion.
This is as predicted by a warning. However, the warning mentions
attribute Valid, whereas the source has a membership test.

Also, the workaround shown in the commented line seems to be
checking membership in the same set of values, but compilation
and program do not exhibit the same behavior.

(Is infinite recursion acceptable behavior when constraint
and Dynamic_Predicate are identical?)

procedure Test_Redundant_Predicate is

    type T is range 1 .. 10
    with
      Dynamic_Predicate => T in 1 .. 10;
    --  Dynamic_Predicate => T = 1 or T in 2 .. 10;

    X : T;
begin
    X := 3;
end Test_Redundant_Predicate;

gcc -c -gnatwa -gnata -gnat2012 test_redundant_predicate.adb
test_redundant_predicate.adb:5:30: warning: attribute Valid requires a
predicate check
test_redundant_predicate.adb:5:30: warning: and will result in infinite
recursion

(Confirming that it does raise:
$ ./test_redundant_predicate 

raised STORAGE_ERROR : stack overflow)

Reply via email to