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

            Bug ID: 92771
           Summary: [9/10 Regression] Concept won't use default template
                    argument
           Product: gcc
           Version: 9.2.1
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
                CC: paolo at gcc dot gnu.org
            Blocks: 67491
  Target Milestone: ---

template<typename P, typename Q, typename Arghhh = void>
concept three = sizeof(P) == sizeof(Q);

#ifdef WORKAROUND
template<typename P, typename Q>
concept two = three<P, Q>;
#define three two
#endif

template<typename T, typename U>
constexpr auto
foo(const T& t, const U& u)
{
  if constexpr (three<T, U>)
    return &t == &u;
  return false;
}

int main()
{
  return foo(1, 2);
}

Using -std=gnu++2a this fails to compile:

c3.cc: In function 'constexpr auto foo(const T&, const U&)':
c3.cc:14:17: error: expected 'auto' or 'decltype(auto)' after 'three<T, U>'
   14 |   if constexpr (three<T, U>)
      |                 ^~~~~~~~~~~
c3.cc:14:28: error: expected unqualified-id before ')' token
   14 |   if constexpr (three<T, U>)
      |                            ^

Defining WORKAROUND to add the indirection through 'two' fixes it.

This was accepted prior to r260482 (which was fixing PR c++/84588).


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67491
[Bug 67491] [meta-bug] concepts issues

Reply via email to