// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

// PR4607
template <class T> struct X {};

template <> struct X<char>
{
  static char* g();
};

template <class T> struct X2 {};

template <class U>
struct X2<U*> {
  static void f() {
    X<U>::g();
  }
};

void a(char *a, char *b) {X2<char*>::f();}

namespace WonkyAccess {
  template<typename T>
  struct X {
    int m;
  };

  template<typename U>
  class Y;

  template<typename U>
  struct Y<U*> : X<U> { };

  template<>
  struct Y<float*> : X<float> { };

  int f(Y<int*> y, Y<float*> y2) {
    return y.m + y2.m;
  }
}

// <rdar://problem/9169404>
namespace rdar9169404 {
  template<typename T, T N> struct X { };
  template<bool C> struct X<bool, C> {
    typedef int type;
  };

  X<bool, -1>::type value;
#if __cplusplus >= 201103L
  // expected-error@-2 {{non-type template argument evaluates to -1, which cannot be narrowed to type 'bool'}}
#endif
}

// rdar://problem/39524996
namespace rdar39524996 {
  template <typename T, typename U>
  struct enable_if_not_same
  {
    typedef void type;
  };
  template <typename T>
  struct enable_if_not_same<T, T>;

  template <typename T>
  struct Wrapper {
    // Assertion triggered on trying to set twice the same partial specialization
    // enable_if_not_same<int, int>
    template <class U>
    Wrapper(const Wrapper<U>& other,
            typename enable_if_not_same<U, T>::type* = 0) {}

    explicit Wrapper(int i) {}
  };

  template <class T>
  struct Container {
    // It is important that the struct has implicit copy and move constructors.
    Container() : x() {}

    template <class U>
    Container(const Container<U>& other) : x(static_cast<T>(other.x)) {}

    // Implicit constructors are member-wise, so the field triggers instantiation
    // of T constructors and we instantiate all of them for overloading purposes.
    T x;
  };

  void takesWrapperInContainer(const Container< Wrapper<int> >& c);
  void test() {
    // Type mismatch triggers initialization with conversion which requires
    // implicit constructors to be instantiated.
    Container<int> c;
    takesWrapperInContainer(c);
  }
}

namespace InstantiationDependent {
  template<typename> using ignore = void; // expected-warning 0-1{{extension}}
  template<typename T, typename = void> struct A {
    static const bool specialized = false;
  };
  template<typename T> struct Hide { typedef void type; };
  template<typename T> struct A<T, Hide<ignore<typename T::type> >::type> {
    static const bool specialized = true;
  };

  struct X {};
  struct Y { typedef int type; };
  _Static_assert(!A<X>::specialized, "");
  _Static_assert(A<Y>::specialized, "");
}

namespace IgnorePartialSubstitution {
  template <typename... T> struct tuple {}; // expected-warning 0-1{{extension}}
  template <typename> struct IsTuple {
    enum { value = false };
  };
  template <typename... Us> struct IsTuple<tuple<Us...> > { // expected-warning 0-1{{extension}}
    enum { value = true };
  };

  template <bool...> using ignore = void; // expected-warning 0-2{{extension}}
  template <class... Pred> ignore<Pred::value...> helper(); // expected-warning 0-1{{extension}}

  using S = IsTuple<tuple<int> >; // expected-warning 0-1{{extension}}

  // This used to pick the primary template, because we got confused and
  // thought that template parameter 0 was the current partially-substituted
  // pack (from `helper`) during the deduction for the partial specialization.
  void f() { helper<S>(); }

  _Static_assert(S::value, "");
}
