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

            Bug ID: 92102
           Summary: identical requires-expression not subsumed
           Product: gcc
           Version: 10.0
            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
            Blocks: 67491
  Target Milestone: ---

This fails to compile with -std=gnu++2a:


template<typename T, typename U> constexpr bool same = false;
template<typename T> constexpr bool same<T, T> = true;

template<typename T, typename U>
  concept same_same = same<T, U> && same<U, T>;

template<typename T>
  struct traits { using type = T; };

struct tag { };

template<typename T>
  struct category
  { };

template<typename T>
  requires requires { typename traits<T>::type; }
  struct category<T>
  { };

template<typename T>
  requires requires { typename traits<T>::type; }
      && same_same<typename traits<T>::type, tag>
  struct category<T>
  { using type = int; };

category<tag>::type t;


ambig.cc:27:14: error: ambiguous template instantiation for 'struct
category<tag>'
   27 | category<tag>::type t;
      |              ^~
ambig.cc:18:10: note: candidates are: 'template<class T>  requires
requires{typename traits<T>::type;} struct category<T> [with T = tag]'
   18 |   struct category<T>
      |          ^~~~~~~~~~~
ambig.cc:24:10: note:                 'template<class T>  requires
requires{typename traits<T>::type;} && (same_same<typename traits::type, tag>)
struct category<T> [with T = tag]'
   24 |   struct category<T>
      |          ^~~~~~~~~~~
ambig.cc:27:16: error: invalid use of incomplete type 'struct category<tag>'
   27 | category<tag>::type t;
      |                ^~~~
ambig.cc:13:10: note: declaration of 'struct category<tag>'
   13 |   struct category
      |          ^~~~~~~~



It compiles OK if the subsumed constraint is a concept instead of a
requires-expression, even though that should be equivalent:

template<typename T, typename U> constexpr bool same = false;
template<typename T> constexpr bool same<T, T> = true;

template<typename T, typename U>
  concept same_same = same<T, U> && same<U, T>;

template<typename T>
  struct traits { using type = T; };

template<typename T>
  concept traitsy = requires { typename traits<T>::type; };

struct tag { };

template<typename T>
  struct category
  { };

template<typename T>
  requires traitsy<T>
  struct category<T>
  { };

template<typename T>
  requires traitsy<T>
      && same_same<typename traits<T>::type, tag>
  struct category<T>
  { using type = int; };

category<tag>::type t;


Referenced Bugs:

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

Reply via email to