// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1z -triple=x86_64-linux-gnu

template <typename U, typename V>
struct S1 {
  static constexpr const bool value = false;
};

template <typename U, typename V>
inline constexpr bool global_inline_var = S1<U, V>::value;

template <typename T>
struct S2 {
  template <typename U, typename V>
  static inline constexpr bool var = global_inline_var<U, V>;
};

template <typename U, typename V>
inline constexpr bool constexpr_return_false() {
  return false;
}

template <typename U, typename V>
void foo() {
  static_assert(S1<U, V>::value);
  // expected-error@-1{{static_assert failed due to requirement 'S1<int, float>::value'}}
}
template void foo<int, float>();
// expected-note@-1{{in instantiation of function template specialization 'foo<int, float>' requested here}}

template <typename U, typename V>
void foo2() {
  static_assert(global_inline_var<U, V>);
  // expected-error@-1{{static_assert failed due to requirement 'global_inline_var<int, float>'}}
}
template void foo2<int, float>();
// expected-note@-1{{in instantiation of function template specialization 'foo2<int, float>' requested here}}

template <typename T, typename U, typename V>
void foo3() {
  static_assert(T::template var<U, V>);
  // expected-error@-1{{static_assert failed due to requirement 'S2<long>::var<int, float>'}}
}
template void foo3<S2<long>, int, float>();
// expected-note@-1{{in instantiation of function template specialization 'foo3<S2<long>, int, float>' requested here}}

template <typename T>
void foo4() {
  static_assert(S1<T[sizeof(T)], int[4]>::value, "");
  // expected-error@-1{{static_assert failed due to requirement 'S1<float [4], int [4]>::value'}}
};
template void foo4<float>();
// expected-note@-1{{in instantiation of function template specialization 'foo4<float>' requested here}}


template <typename U, typename V>
void foo5() {
  static_assert(!!(global_inline_var<U, V>));
  // expected-error@-1{{static_assert failed due to requirement '!!(global_inline_var<int, float>)'}}
}
template void foo5<int, float>();
// expected-note@-1{{in instantiation of function template specialization 'foo5<int, float>' requested here}}

struct ExampleTypes {
  explicit ExampleTypes(int);
  using T = int;
  using U = float;
};

template <class T>
struct X {
  int i = 0;
  int j = 0;
  constexpr operator bool() const { return false; }
};

template <class T>
void foo6() {
  static_assert(X<typename T::T>());
  // expected-error@-1{{static_assert failed due to requirement 'X<int>()'}}
  static_assert(X<typename T::T>{});
  // expected-error@-1{{static_assert failed due to requirement 'X<int>{}'}}
  static_assert(X<typename T::T>{1, 2});
  // expected-error@-1{{static_assert failed due to requirement 'X<int>{1, 2}'}}
  static_assert(X<typename T::T>({1, 2}));
  // expected-error@-1{{static_assert failed due to requirement 'X<int>({1, 2})'}}
  static_assert(typename T::T{0});
  // expected-error@-1{{static_assert failed due to requirement 'int{0}'}}
  static_assert(typename T::T(0));
  // expected-error@-1{{static_assert failed due to requirement 'int(0)'}}
  static_assert(sizeof(X<typename T::T>) == 0);
  // expected-error@-1{{static_assert failed due to requirement 'sizeof(X<int>) == 0'}}
  static_assert((const X<typename T::T> *)nullptr);
  // expected-error@-1{{static_assert failed due to requirement '(const X<int> *)nullptr'}}
  static_assert(static_cast<const X<typename T::T> *>(nullptr));
  // expected-error@-1{{static_assert failed due to requirement 'static_cast<const X<int> *>(nullptr)'}}
  static_assert((const X<typename T::T>[]){} == nullptr);
  // expected-error@-1{{static_assert failed due to requirement '(X<int> const[0]){} == nullptr'}}
  static_assert(sizeof(X<decltype(X<typename T::T>().X<typename T::T>::~X())>) == 0);
  // expected-error@-1{{static_assert failed due to requirement 'sizeof(X<void>) == 0'}}
  static_assert(constexpr_return_false<typename T::T, typename T::U>());
  // expected-error@-1{{static_assert failed due to requirement 'constexpr_return_false<int, float>()'}}
}
template void foo6<ExampleTypes>();
// expected-note@-1{{in instantiation of function template specialization 'foo6<ExampleTypes>' requested here}}
