// RUN: %clang_cc1 -std=c++11 -verify  -emit-llvm-only %s
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only  -fdelayed-template-parsing %s 
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only  -fms-extensions %s 
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only  -fdelayed-template-parsing -fms-extensions %s 

template<class T, class U> struct is_same { enum { value = false }; };
template<class T> struct is_same<T, T> { enum { value = true }; };

namespace test_sfinae_and_delete {

namespace ns1 {
template<class T> double f(T) = delete; //expected-note{{candidate}}
char f(...); //expected-note{{candidate}}

static_assert(is_same<decltype(f(3)),char>::value, ""); //expected-error{{call to deleted function}} expected-error{{static assertion failed}}

template<class T> decltype(f(T{})) g(T); // this one sfinae's out.
template<class T> int *g(T);
void foo() {
  int *ip = g(3);
}
} //end ns1

namespace ns2 {
template<class T> double* f(T);
template<> double* f(double) = delete;

template<class T> decltype(f(T{})) g(T); // expected-note{{candidate}}
template<class T> int *g(T); //expected-note{{candidate}}
void foo() {
  double *dp = g(3); //expected-error{{ambiguous}}
  int *ip = g(3.14); // this is OK - because the explicit specialization is deleted and sfinae's out one of the template candidates
}

} // end ns2

namespace ns3 {
template<class T> double* f(T) = delete;
template<> double* f(double);

template<class T> decltype(f(T{})) g(T); // expected-note{{candidate}}
template<class T> int *g(T); //expected-note{{candidate}}

void foo() {
  int *dp = g(3); // this is OK - because the non-double specializations are deleted and sfinae's out one of the template candidates
  double *ip = g(3.14); //expected-error{{ambiguous}}
}

} // end ns3
} // end ns test_sfinae_and_delete

namespace test_explicit_specialization_of_member {
namespace ns1 {
template<class T> struct X {
  int* f(T) = delete;
}; 
template<> int* X<int>::f(int) { }

template<class T> decltype(X<T>{}.f(T{})) g(T); // expected-note{{candidate}}
template<class T> int *g(T); //expected-note{{candidate}}

void foo() {
  int *ip2 = g(3.14); // this is OK - because the non-int specializations are deleted and sfinae's out one of the template candidates
  int *ip = g(3); //expected-error{{ambiguous}}
}

} // end ns1

namespace ns2 {
struct X {
template<class T> double* f(T) = delete;
}; 
template<> double* X::f(int);

template<class T> decltype(X{}.f(T{})) g(T); // expected-note{{candidate}}
template<class T> int *g(T); //expected-note{{candidate}}

void foo() {
  int *ip2 = g(3.14); // this is OK - because the non-int specializations are deleted and sfinae's out one of the template candidates
  int *ip = g(3); //expected-error{{ambiguous}}
}

} // end ns2

namespace ns3 {
template<class T> struct X {
  template<class U> double *f1(U, T) = delete;
  template<class U> double *f2(U, T) = delete;
};
template<> template<> double* X<int>::f1(int, int);
template<> template<class U> double* X<int>::f2(U, int);

template<class T, class U> decltype(X<T>{}.f1(U{}, T{})) g1(U, T); // expected-note{{candidate}}
template<class T, class U> int *g1(U, T); //expected-note{{candidate}}

template<class T, class U> decltype(X<T>{}.f2(U{}, T{})) g2(U, T); // expected-note2{{candidate}}
template<class T, class U> int *g2(U, T); //expected-note2{{candidate}}


void foo() {
  int *ip2 = g1(3.14, 3); // this is OK - because the non-int specializations are deleted and sfinae's out one of the template candidates
  int *ip = g1(3, 3); //expected-error{{ambiguous}}
  {
   int *ip3 = g2(3.14, 3); //expected-error{{ambiguous}}
   int *ip4 = g2(3, 3); //expected-error{{ambiguous}}
  }
  {
   int *ip3 = g2(3.14, 3.14); 
   int *ip4 = g2(3, 3.14); 
  }
}


} // end ns3

namespace ns4 {
template < typename T> T* foo (T);
template <> int* foo(int) = delete;
template <> int* foo(int); //expected-note{{candidate}}

int *IP = foo(2); //expected-error{{deleted}}
double *DP = foo(3.14);
} //end ns4

namespace ns5 {
template < typename T> T* foo (T);
template <> int* foo(int); //expected-note{{previous}}
template <> int* foo(int) = delete; //expected-error{{deleted definition must be first declaration}}

} //end ns5


} // end test_explicit_specializations_and_delete
