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

            Bug ID: 94126
           Summary: [concepts] suboptimal diagnostic when type after
                    substitution is ill-formed
           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 disj.cc
template<typename T>
  using blah = T::type;

template<typename T>
  concept C = requires (T t) { t + 0; };

template<typename T>
  concept D = C<T> || C<const T>;

template<typename T>
  concept E = D<blah<T>>;

static_assert(E<int>);
$ g++ -std=c++2a disj.cc
disj.cc:13:15: error: static assertion failed
   13 | static_assert(E<int>);
      |               ^~~~~~
disj.cc:13:15: note: constraints not satisfied
disj.cc:8:11:   required for the satisfaction of ‘D<typename T::type>’
disj.cc:8:20: note: neither operand of the disjunction is satisfied
    8 |   concept D = C<T> || C<const T>;
      |               ~~~~~^~~~~~~~~~~~~


What the diagnostic should really say is that blah<int> is ill-formed.  Maybe
something like:

disj.cc:13:15: error: static assertion failed
   13 | static_assert(E<int>);
      |               ^~~~~~
disj.cc:13:15: note: constraints not satisfied
disj.cc:5:11:   required for the satisfaction of ‘C<T>’
disj.cc:8:11:   required for the satisfaction of ‘D<typename T::type>’
disj.cc:13:15: error: ‘int’ is not a class, struct, or union type

Reply via email to