1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 3 // C++03 requires that we check for a copy constructor when binding a 4 // reference to a reference-compatible rvalue, since we are allowed to 5 // make a copy. C++0x does not permit the copy, so ensure that we 6 // don't diagnose cases where the copy constructor is unavailable. 7 8 struct X1 { 9 X1(); 10 explicit X1(const X1&); 11 }; 12 13 struct X2 { 14 X2(); 15 16 private: 17 X2(const X2&); 18 }; 19 20 struct X3 { 21 X3(); 22 23 private: 24 X3(X3&); 25 }; 26 27 template<typename T> 28 T get_value_badly() { 29 double *dp = 0; 30 T *tp = dp; 31 return T(); 32 } 33 34 template<typename T> 35 struct X4 { 36 X4(); 37 X4(const X4&, T = get_value_badly<T>()); 38 }; 39 40 void g1(const X1&); 41 void g2(const X2&); 42 void g3(const X3&); 43 void g4(const X4<int>&); 44 45 void test() { 46 g1(X1()); 47 g2(X2()); 48 g3(X3()); 49 g4(X4<int>()); 50 } 51 52 // Check that unavailable copy constructors do not cause SFINAE failures. 53 template<int> struct int_c { }; 54 55 template<typename T> T f(const T&); 56 57 template<typename T> 58 int &g(int_c<sizeof(f(T()))> * = 0); // expected-note{{candidate function [with T = X3]}} 59 60 template<typename T> float &g(); // expected-note{{candidate function [with T = X3]}} 61 62 void h() { 63 float &fp = g<X3>(); // expected-error{{call to 'g' is ambiguous}} 64 } 65