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

            Bug ID: 94332
           Summary: [concepts] requires-expression that contains a
                    requires-expression incorrectly evaluates to false
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ppalka at gcc dot gnu.org
  Target Milestone: ---

$ cat requires-requires.C
template<bool B>
  requires B
  struct X { };

template<typename T>
  concept C = requires { X<requires { true; }>{}; };

static_assert(C<int>);  // should succeed
$ g++ -std=c++2a requires-requires.C
requires-requires.C:8:15: error: static assertion failed
    8 | static_assert(C<int>);  // should succeed
      |               ^~~~~~
requires-requires.C:8:15: note: constraints not satisfied
requires-requires.C:6:11:   required by the constraints of ‘template<class T>
concept C’
requires-requires.C:6:15:   in requirements 
requires-requires.C:6:26: note: the required expression ‘X<requires{true;}>{}’
is invalid
    6 |   concept C = requires { X<requires { true; }>{}; };
      |                          ^~~~~~~~~~~~~~~~~~~~~~~

If we let the compiler elaborate further, we get:

requires-requires.C:6:26: note: the required expression ‘X<requires{true;}>{}’
is invalid, because
    6 |   concept C = requires { X<requires { true; }>{}; };
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
requires-requires.C:6:26: error: invalid use of incomplete type ‘struct
X<requires{true;}>’
requires-requires.C:3:10: note: declaration of ‘struct X<requires{true;}>’
    3 |   struct X { };

Reply via email to