// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s // C++03 requires that we check for a copy constructor when binding a // reference to a reference-compatible rvalue, since we are allowed to // make a copy. C++0x does not permit the copy, so ensure that we // don't diagnose cases where the copy constructor is unavailable. struct X1 { X1(); explicit X1(const X1&); }; struct X2 { X2(); private: X2(const X2&); }; struct X3 { X3(); private: X3(X3&); }; template T get_value_badly() { double *dp = 0; T *tp = dp; return T(); } template struct X4 { X4(); X4(const X4&, T = get_value_badly()); }; struct X5 { X5(); X5(const X5&, const X5& = X5()); }; void g1(const X1&); void g2(const X2&); void g3(const X3&); void g4(const X4&); void g5(const X5&); void test() { g1(X1()); g2(X2()); g3(X3()); g4(X4()); g5(X5()); } // Check that unavailable copy constructors do not cause SFINAE failures. template struct int_c { }; template T f(const T&); template int &g(int_c * = 0); // expected-note{{candidate function [with T = X3]}} template float &g(); // expected-note{{candidate function [with T = X3]}} void h() { float &fp = g(); // expected-error{{call to 'g' is ambiguous}} }