1 // I, Howard Hinnant, hereby place this code in the public domain. 2 3 // Test overload resolution among reference types 4 5 // { dg-do compile { target c++11 } } 6 // { dg-options "-fno-ipa-icf" } 7 8 template <bool> struct sa; 9 template <> struct sa<true> {}; 10 11 struct one {char x[1];}; 12 struct two {char x[2];}; 13 struct three {char x[3];}; 14 struct four {char x[4];}; 15 struct five {char x[5];}; 16 struct six {char x[6];}; 17 struct seven {char x[7];}; 18 struct eight {char x[8];}; 19 20 struct A 21 { 22 A(); 23 A(const volatile A&&); 24 }; 25 26 A source(); 27 const A c_source(); 28 volatile A v_source(); 29 const volatile A cv_source(); 30 31 // 7 at a time 32 33 one sink_7_1234567( A&); // { dg-message "one sink_7_1234567|no known conversion" } 34 two sink_7_1234567(const A&); 35 three sink_7_1234567(volatile A&); 36 four sink_7_1234567(const volatile A&); 37 five sink_7_1234567( A&&); 38 six sink_7_1234567(const A&&); 39 seven sink_7_1234567(volatile A&&); 40 41 int test7_1234567() 42 { 43 A a; 44 const A ca = a; // { dg-error "deleted" } 45 volatile A va; 46 const volatile A cva = a; // { dg-error "deleted" } 47 sink_7_1234567(cv_source()); // { dg-error "" } 48 return 0; 49 } 50 51 one sink_7_1235678( A&); 52 two sink_7_1235678(const A&); 53 three sink_7_1235678(volatile A&); 54 five sink_7_1235678( A&&); 55 six sink_7_1235678(const A&&); 56 seven sink_7_1235678(volatile A&&); 57 eight sink_7_1235678(const volatile A&&); // { dg-message "" } 58 59 int test7_1235678() 60 { 61 A a; 62 const A ca = a; // { dg-error "deleted" } 63 volatile A va; 64 const volatile A cva = a; // { dg-error "deleted" } 65 sink_7_1235678(cva); // { dg-error "" } 66 return 0; 67 } 68 69 two sink_7_2345678(const A&); 70 three sink_7_2345678(volatile A&); 71 four sink_7_2345678(const volatile A&); 72 five sink_7_2345678( A&&); 73 six sink_7_2345678(const A&&); 74 seven sink_7_2345678(volatile A&&); 75 eight sink_7_2345678(const volatile A&&); 76 77 int test7_2345678() 78 { 79 A a; 80 const A ca = a; // { dg-error "deleted" } 81 volatile A va; 82 const volatile A cva = a; // { dg-error "deleted" } 83 sink_7_2345678(a); // { dg-error "" } 84 return 0; 85 } 86 87 one sink_7_1234678( A&); 88 two sink_7_1234678(const A&); 89 three sink_7_1234678(volatile A&); 90 four sink_7_1234678(const volatile A&); 91 six sink_7_1234678(const A&&); 92 seven sink_7_1234678(volatile A&&); 93 eight sink_7_1234678(const volatile A&&); 94 95 int test7_1234678() 96 { 97 A a; 98 const A ca = a; // { dg-error "deleted" } 99 volatile A va; 100 const volatile A cva = a; // { dg-error "deleted" } 101 sink_7_1234678(source()); // { dg-error "" } 102 return 0; 103 } 104 105 int main() 106 { 107 return test7_2345678() + test7_1234678(); 108 } 109