| // 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>; | |
| namespace LateParsedAttrs { | |
| template <class> | |
| void f(int a) __attribute__((__diagnose_if__(a > 0, "foo", "error"))) {} | |
| // expected-note@-1 {{from 'diagnose_if' attribute on 'f<int>'}} | |
| void g() { | |
| f<int>(1); // expected-error {{foo}} | |
| } | |
| } // namespace LateParsedAttrs |