forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
 | |
| // RUN: %clang_cc1 -S -triple %itanium_abi_triple -std=c++11 -emit-llvm %s -o - | FileCheck %s
 | |
| // expected-no-diagnostics
 | |
| 
 | |
| namespace PR10856 {
 | |
|   template<typename T> class C;
 | |
| 
 | |
|   template<typename S, typename R = S> C<R> operator - (C<S> m0, C<S> m1);
 | |
|   template<typename T> class C {
 | |
|     public:
 | |
|       template<typename S, typename R> friend C<R> operator - (C<S> m0, C<S> m1);
 | |
|   };
 | |
| 
 | |
|   template<typename S, typename R> inline C<R> operator - (C<S> m0, C<S> m1) {
 | |
|     C<R> ret;
 | |
|     return ret;
 | |
|   }
 | |
| };
 | |
| 
 | |
| int PR10856_main(int argc, char** argv) {
 | |
|   using namespace PR10856;
 | |
|   C<int> a;
 | |
|   a-a;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| // PR10856::C<int> PR10856::operator-<int, int>(PR10856::C<int>, PR10856::C<int>)
 | |
| // CHECK: define {{.*}} @_ZN7PR10856miIiiEENS_1CIT0_EENS1_IT_EES5_
 | |
| 
 | |
| namespace PR10856_Root {
 | |
|   template<typename Value, typename Defaulted = void>
 | |
|   bool g(Value value);
 | |
| 
 | |
|   template<typename ClassValue> class MyClass {
 | |
|   private:
 | |
|     template<typename Value, typename Defaulted>
 | |
|     friend bool g(Value value);
 | |
|   };
 | |
| }
 | |
| 
 | |
| namespace PR10856_Root {
 | |
|   void f() {
 | |
|     MyClass<int> value;
 | |
|     g(value);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // bool PR10856_Root::g<PR10856_Root::MyClass<int>, void>(PR10856_Root::MyClass<int>)
 | |
| // CHECK: call {{.*}} @_ZN12PR10856_Root1gINS_7MyClassIiEEvEEbT_
 | |
| 
 | |
| namespace PR43400 {
 | |
|   template<typename T> struct X {
 | |
|     friend void f() = delete;
 | |
|   };
 | |
|   X<int> xi;
 | |
| }
 |