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>
get_value_badly()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 
test()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 
h()62 void h() {
63   float &fp = g<X3>();  // expected-error{{call to 'g' is ambiguous}}
64 }
65