124 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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}}  expected-note {{previous definition is here}}
 | |
|    void foo4() { } // expected-error {{class member cannot be redeclared}} expected-error {{redefinition of 'foo4'}}
 | |
|    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 Inner_Outer_same_template_param_name {              
 | |
| 
 | |
| template <class T>
 | |
| class Outmost {
 | |
| public:
 | |
|     template <class T>
 | |
|     class Inner {
 | |
|     public:
 | |
|         void f() {
 | |
|             T* var;
 | |
|         }
 | |
|    };
 | |
| };
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 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);
 | |
| }
 | |
| 
 | 
