59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++11 %s -verify
 | |
| 
 | |
| // expected-no-diagnostics
 | |
| 
 | |
| namespace PR15757 {
 | |
|   struct S {
 | |
|   };
 | |
| 
 | |
|   template<typename X, typename Y> struct T {
 | |
|     template<typename A> T(X x, A &&a) {}
 | |
| 
 | |
|     template<typename A> explicit T(A &&a)
 | |
|         noexcept(noexcept(T(X(), static_cast<A &&>(a))))
 | |
|       : T(X(), static_cast<A &&>(a)) {}
 | |
|   };
 | |
| 
 | |
|   template<typename X, typename Y> struct U : T<X, Y> {
 | |
|     using T<X, Y>::T;
 | |
|   };
 | |
| 
 | |
|   U<S, char> foo(char ch) { return U<S, char>(ch); }
 | |
| 
 | |
|   int main() {
 | |
|     U<S, int> a(42);
 | |
|     U<S, char> b('4');
 | |
|     return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace WrongIdent {
 | |
|   struct A {};
 | |
|   struct B : A {};
 | |
|   struct C : B {
 | |
|     using B::A;
 | |
|   };
 | |
| }
 | |
| 
 | |
| namespace DefaultCtorConflict {
 | |
|   struct A { A(int = 0); };
 | |
|   struct B : A {
 | |
|     using A::A;
 | |
|   } b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor
 | |
|   struct C {
 | |
|     B b;
 | |
|   } c;
 | |
| }
 | |
| 
 | |
| namespace InvalidConstruction {
 | |
|   struct A { A(int); };
 | |
|   struct B { B() = delete; };
 | |
|   struct C : A, B { using A::A; };
 | |
|   // Initialization here is performed as if by a defaulted default constructor,
 | |
|   // which would be ill-formed (in the immediate context) in this case because
 | |
|   // it would be defined as deleted.
 | |
|   template<typename T> void f(decltype(T(0))*);
 | |
|   template<typename T> int &f(...);
 | |
|   int &r = f<C>(0);
 | |
| }
 |