// { dg-additional-options "-fmodules-ts -std=c++20" }

export module M;
// { dg-module-cmi M }

export template <typename T0>
struct traits
{
  static constexpr int variant = 0;
};

// #2
template <typename T2>
requires requires { typename T2::element_type; }
struct traits<T2 *>
{
  using type = typename T2::element_type;
  static constexpr int variant = 2;
};


// #1
template <typename T1>
struct traits<T1 *>
{
  using type = T1;
  static constexpr int variant = 1;
};


// #3
template <typename T3>
requires requires { typename T3::value_type; }
struct traits<T3 *>
{
  using type = typename T3::value_type;
  static constexpr int variant = 3;
};