| // 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>; |