| // 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<typename T> |
| T get_value_badly() { |
| double *dp = 0; |
| T *tp = dp; |
| return T(); |
| } |
| |
| template<typename T> |
| struct X4 { |
| X4(); |
| X4(const X4&, T = get_value_badly<T>()); |
| }; |
| |
| void g1(const X1&); |
| void g2(const X2&); |
| void g3(const X3&); |
| void g4(const X4<int>&); |
| |
| void test() { |
| g1(X1()); |
| g2(X2()); |
| g3(X3()); |
| g4(X4<int>()); |
| } |
| |
| // Check that unavailable copy constructors do not cause SFINAE failures. |
| template<int> struct int_c { }; |
| |
| template<typename T> T f(const T&); |
| |
| template<typename T> |
| int &g(int_c<sizeof(f(T()))> * = 0); // expected-note{{candidate function [with T = X3]}} |
| |
| template<typename T> float &g(); // expected-note{{candidate function [with T = X3]}} |
| |
| void h() { |
| float &fp = g<X3>(); // expected-error{{call to 'g' is ambiguous}} |
| } |