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-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } } 7 // { dg-additional-options "-fno-ipa-icf" } 8 9 template <bool> struct sa; 10 template <> struct sa<true> {}; 11 12 struct one {long x[1];}; 13 struct two {long x[2];}; 14 struct three {long x[3];}; 15 struct four {long x[4];}; 16 struct five {long x[5];}; 17 struct six {long x[6];}; 18 struct seven {long x[7];}; 19 struct eight {long x[8];}; 20 21 struct A 22 { 23 A(); 24 A(const volatile A&&); 25 }; 26 27 A source(); 28 const A c_source(); 29 volatile A v_source(); // { dg-warning "deprecated" "" { target c++2a } } 30 const volatile A cv_source(); // { dg-warning "deprecated" "" { target c++2a } } 31 32 // 1 at a time 33 34 one sink_1_1( A&); 35 36 int test1_1() 37 { 38 A a; 39 const A ca; 40 volatile A va; 41 const volatile A cva; 42 sa<sizeof(sink_1_1(a)) == 1 * sizeof(long)> t1; 43 return 0; 44 } 45 46 two sink_1_2(const A&); 47 48 int test1_2() 49 { 50 A a; 51 const A ca; 52 volatile A va; 53 const volatile A cva; 54 sa<sizeof(sink_1_2(a)) == 2 * sizeof(long)> t1; 55 sa<sizeof(sink_1_2(ca)) == 2 * sizeof(long)> t2; 56 sa<sizeof(sink_1_2(source())) == 2 * sizeof(long)> t5; 57 sa<sizeof(sink_1_2(c_source())) == 2 * sizeof(long)> t6; 58 return 0; 59 } 60 61 three sink_1_3(volatile A&); 62 63 int test1_3() 64 { 65 A a; 66 const A ca; 67 volatile A va; 68 const volatile A cva; 69 sa<sizeof(sink_1_3(a)) == 3 * sizeof(long)> t1; 70 sa<sizeof(sink_1_3(va)) == 3 * sizeof(long)> t3; 71 return 0; 72 } 73 74 four sink_1_4(const volatile A&); 75 76 int test1_4() 77 { 78 A a; 79 const A ca; 80 volatile A va; 81 const volatile A cva; 82 sa<sizeof(sink_1_4(a)) == 4 * sizeof(long)> t1; 83 sa<sizeof(sink_1_4(ca)) == 4 * sizeof(long)> t2; 84 sa<sizeof(sink_1_4(va)) == 4 * sizeof(long)> t3; 85 sa<sizeof(sink_1_4(cva)) == 4 * sizeof(long)> t4; 86 return 0; 87 } 88 89 five sink_1_5( A&&); 90 91 int test1_5() 92 { 93 A a; 94 const A ca; 95 volatile A va; 96 const volatile A cva; 97 sa<sizeof(sink_1_5(source())) == 5 * sizeof(long)> t5; 98 return 0; 99 } 100 101 six sink_1_6(const A&&); 102 103 int test1_6() 104 { 105 A a; 106 const A ca; 107 volatile A va; 108 const volatile A cva; 109 sa<sizeof(sink_1_6(source())) == 6 * sizeof(long)> t5; 110 sa<sizeof(sink_1_6(c_source())) == 6 * sizeof(long)> t6; 111 return 0; 112 } 113 114 seven sink_1_7(volatile A&&); 115 116 int test1_7() 117 { 118 A a; 119 const A ca; 120 volatile A va; 121 const volatile A cva; 122 sa<sizeof(sink_1_7(source())) == 7 * sizeof(long)> t5; 123 sa<sizeof(sink_1_7(v_source())) == 7 * sizeof(long)> t7; 124 return 0; 125 } 126 127 eight sink_1_8(const volatile A&&); 128 129 int test1_8() 130 { 131 A a; 132 const A ca; 133 volatile A va; 134 const volatile A cva; 135 sa<sizeof(sink_1_8(source())) == 8 * sizeof(long)> t5; 136 sa<sizeof(sink_1_8(c_source())) == 8 * sizeof(long)> t6; 137 sa<sizeof(sink_1_8(v_source())) == 8 * sizeof(long)> t7; 138 sa<sizeof(sink_1_8(cv_source())) == 8 * sizeof(long)> t8; 139 return 0; 140 } 141 142 int main() 143 { 144 return test1_1() + test1_2() + test1_3() + test1_4() + 145 test1_5() + test1_6() + test1_7() + test1_8(); 146 } 147