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

            Bug ID: 90675
           Summary: [concepts] expressions in compound requirements not
                    correctly treated as unevaluated operands
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Casey at Carter dot net
  Target Milestone: ---

Created attachment 46430
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46430&action=edit
Minimal repro

Compiling this well-formed TU:

  template<class>
  constexpr bool always_false = false;

  template<class T>
  struct S {
    void f() {
      static_assert(always_false<T>);
    }
  };

  template<class>
  concept True = true;

  template<class T>
  concept C = requires(T t) {
  #ifndef WORKAROUND
      { t.f() } -> True;
  #else
      t.f();
      requires True<decltype(t.f())>;
  #endif
  };

  int main() {
      static_assert(C<S<void>>);
  }

with "g++ -std=c++2a -fconcepts" (same behavior for all versions from 6.1 to
today's trunk) diagnoses (https://godbolt.org/z/cHC8PE):

  <source>: In instantiation of 'void S<T>::f() [with T = void]':
  <source>:25:19:   required from here
  <source>:7:19: error: static assertion failed
      7 |     static_assert(always_false<T>);
        |                   ^~~~~~~~~~~~~~~
  Compiler returned: 1

Defining "WORKAROUND" allows the program to compile correctly, since the
expression appears in a simple-requirement rather than a compound-requirement.

Reply via email to