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

template <class T>
class A {
   void foo() {
       undeclared();
   }
   void foo2();
};

template <class T>
class B {
   void foo4() { } // expected-note {{previous definition is here}}
   void foo4() { } // expected-error {{class member cannot be redeclared}}
   void foo5() { } // expected-note {{previous definition is here}}

   friend void foo3() {
       undeclared();
   }
};


template <class T>
void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}}
}

template <class T>
void A<T>::foo2() {
    undeclared();
}


template <class T>
void foo3() {
   undeclared();
}

template void A<int>::foo2();


void undeclared()
{

}

template <class T> void foo5() {} //expected-note {{previous definition is here}} 
template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}}

              


namespace PR11931 {

template <typename RunType>
struct BindState;

  template<>
struct BindState<void(void*)> {
  static void Run() { }
};

class Callback {
public:
  typedef void RunType();

  template <typename RunType>
  Callback(BindState<RunType> bind_state) {
    BindState<RunType>::Run();
  }
};


Callback Bind() {
  return Callback(BindState<void(void*)>());
}

}

namespace rdar11700604 {
  template<typename T> void foo() = delete;

  struct X {
    X() = default;

    template<typename T> void foo() = delete;
  };
}

namespace PR17334 {

template <typename = void> struct ArrayRef {
  constexpr ArrayRef() {}
};
template <typename = void> void CreateConstInBoundsGEP2_32() {
  ArrayRef<> IdxList;
}
void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); }

}

namespace PR17661 {
template <typename T>
constexpr T Fun(T A) { return T(0); }

constexpr int Var = Fun(20);
}

template <typename T>
auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}

namespace PR19613 {

struct HeapTypeConfig {
  static void from_bitset();
};

template <class Config>
struct TypeImpl  {
  struct BitsetType;

  static void Any() {
    BitsetType::New();
  }
};

template<class Config>
struct TypeImpl<Config>::BitsetType {
  static void New() {
    Config::from_bitset();
  }
};

static void f() {
  TypeImpl<HeapTypeConfig>::Any();
}

template<typename A> struct S {
  template<typename B> struct T;
};
template<typename A> template<typename B> struct S<A>::T {
  template<typename C, typename D> struct U;
  template<typename C> struct U<C, C> {
    template<typename E> static int f() {
      return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E);
    }
  };
};

static void g() {
  S<int>::T<int>::U<int,int>::f<int>();
}

template<typename T> struct SS {
  template<typename U> struct X;
  template<typename U> struct X<U*>;
};
template<typename T> template<typename U> struct SS<T>::X<U*> {
  static int f() {
    return sizeof(T) + sizeof(U);
  }
};

static void h() {
  SS<int>::X<int*>::f();
}

}

struct PR38460 {
  template <typename>
  struct T {
    static void foo() {
      struct U {
        void dummy() {
          use_delayed_identifier();
        }
      };
    }
  };
};
void use_delayed_identifier();
void trigger_PR38460() {
  PR38460::T<int>::foo();
}

template <typename> struct PR38460_2 {
  struct p {
    struct G {
      bool operator()(int) {}
    };
  };
  static void as() {
    typename p::G g;
    g(0);
  }
};
template struct PR38460_2<int>;
