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(); // { dg-warning "deprecated" "" { target c++2a } } 29 const volatile A cv_source(); // { dg-warning "deprecated" "" { target c++2a } } 30 31 // 6 at a time 32 33 one sink_6_123456( A&); // { dg-message "one sink_6_123456|no known conversion" } 34 two sink_6_123456(const A&); 35 three sink_6_123456(volatile A&); 36 four sink_6_123456(const volatile A&); 37 five sink_6_123456( A&&); 38 six sink_6_123456(const A&&); 39 40 int test6_123456() 41 { 42 A a; 43 const A ca = a; // { dg-error "deleted" } 44 volatile A va; 45 const volatile A cva = a; // { dg-error "deleted" } 46 sink_6_123456(v_source()); // { dg-error "" } 47 sink_6_123456(cv_source()); // { dg-error "" } 48 return 0; 49 } 50 51 one sink_6_123457( A&); // { dg-message "one sink_6_123457|no known conversion" } 52 two sink_6_123457(const A&); 53 three sink_6_123457(volatile A&); 54 four sink_6_123457(const volatile A&); 55 five sink_6_123457( A&&); 56 seven sink_6_123457(volatile A&&); 57 58 int test6_123457() 59 { 60 A a; 61 const A ca = a; // { dg-error "deleted" } 62 volatile A va; 63 const volatile A cva = a; // { dg-error "deleted" } 64 sink_6_123457(cv_source()); // { dg-error "" } 65 return 0; 66 } 67 68 two sink_6_235678(const A&); 69 three sink_6_235678(volatile A&); 70 five sink_6_235678( A&&); 71 six sink_6_235678(const A&&); 72 seven sink_6_235678(volatile A&&); 73 eight sink_6_235678(const volatile A&&); // { dg-message "" } 74 75 int test6_235678() 76 { 77 A a; 78 const A ca = a; // { dg-error "deleted" } 79 volatile A va; 80 const volatile A cva = a; // { dg-error "deleted" } 81 sink_6_235678(a); // { dg-error "" } 82 sink_6_235678(cva); // { dg-error "" } 83 return 0; 84 } 85 86 two sink_6_234678(const A&); 87 three sink_6_234678(volatile A&); 88 four sink_6_234678(const volatile A&); 89 six sink_6_234678(const A&&); 90 seven sink_6_234678(volatile A&&); 91 eight sink_6_234678(const volatile A&&); 92 93 int test6_234678() 94 { 95 A a; 96 const A ca = a; // { dg-error "deleted" } 97 volatile A va; 98 const volatile A cva = a; // { dg-error "deleted" } 99 sink_6_234678(a); // { dg-error "" } 100 sink_6_234678(source()); // { dg-error "" } 101 return 0; 102 } 103 104 two sink_6_234578(const A&); 105 three sink_6_234578(volatile A&); 106 four sink_6_234578(const volatile A&); 107 five sink_6_234578( A&&); 108 seven sink_6_234578(volatile A&&); 109 eight sink_6_234578(const volatile A&&); 110 111 int test6_234578() 112 { 113 A a; 114 const A ca = a; // { dg-error "deleted" } 115 volatile A va; 116 const volatile A cva = a; // { dg-error "deleted" } 117 sink_6_234578(a); // { dg-error "" } 118 return 0; 119 } 120 121 two sink_6_234568(const A&); 122 three sink_6_234568(volatile A&); 123 four sink_6_234568(const volatile A&); 124 five sink_6_234568( A&&); 125 six sink_6_234568(const A&&); 126 eight sink_6_234568(const volatile A&&); 127 128 int test6_234568() 129 { 130 A a; 131 const A ca = a; // { dg-error "deleted" } 132 volatile A va; 133 const volatile A cva = a; // { dg-error "deleted" } 134 sink_6_234568(a); // { dg-error "" } 135 return 0; 136 } 137 138 two sink_6_234567(const A&); // { dg-message "two sink_6_234567|no known conversion" } 139 three sink_6_234567(volatile A&); 140 four sink_6_234567(const volatile A&); 141 five sink_6_234567( A&&); 142 six sink_6_234567(const A&&); 143 seven sink_6_234567(volatile A&&); 144 145 int test6_234567() 146 { 147 A a; 148 const A ca = a; // { dg-error "deleted" } 149 volatile A va; 150 const volatile A cva = a; // { dg-error "deleted" } 151 sink_6_234567(a); // { dg-error "" } 152 sink_6_234567(cv_source()); // { dg-error "" } 153 return 0; 154 } 155 156 one sink_6_134678( A&); 157 three sink_6_134678(volatile A&); 158 four sink_6_134678(const volatile A&); 159 six sink_6_134678(const A&&); 160 seven sink_6_134678(volatile A&&); 161 eight sink_6_134678(const volatile A&&); 162 163 int test6_134678() 164 { 165 A a; 166 const A ca = a; // { dg-error "deleted" } 167 volatile A va; 168 const volatile A cva = a; // { dg-error "deleted" } 169 sink_6_134678(source()); // { dg-error "" } 170 return 0; 171 } 172 173 one sink_6_124678( A&); 174 two sink_6_124678(const A&); 175 four sink_6_124678(const volatile A&); 176 six sink_6_124678(const A&&); 177 seven sink_6_124678(volatile A&&); 178 eight sink_6_124678(const volatile A&&); 179 180 int test6_124678() 181 { 182 A a; 183 const A ca = a; // { dg-error "deleted" } 184 volatile A va; 185 const volatile A cva = a; // { dg-error "deleted" } 186 sink_6_124678(source()); // { dg-error "" } 187 return 0; 188 } 189 190 one sink_6_123678( A&); 191 two sink_6_123678(const A&); 192 three sink_6_123678(volatile A&); 193 six sink_6_123678(const A&&); 194 seven sink_6_123678(volatile A&&); 195 eight sink_6_123678(const volatile A&&); // { dg-message "" } 196 197 int test6_123678() 198 { 199 A a; 200 const A ca = a; // { dg-error "deleted" } 201 volatile A va; 202 const volatile A cva = a; // { dg-error "deleted" } 203 sink_6_123678(cva); // { dg-error "" } 204 sink_6_123678(source()); // { dg-error "" } 205 return 0; 206 } 207 208 one sink_6_123567( A&); // { dg-message "one sink_6_123567|no known conversion" } 209 two sink_6_123567(const A&); 210 three sink_6_123567(volatile A&); 211 five sink_6_123567( A&&); 212 six sink_6_123567(const A&&); 213 seven sink_6_123567(volatile A&&); 214 215 int test6_123567() 216 { 217 A a; 218 const A ca = a; // { dg-error "deleted" } 219 volatile A va; 220 const volatile A cva = a; // { dg-error "deleted" } 221 sink_6_123567(cva); // { dg-error "" } 222 sink_6_123567(cv_source()); // { dg-error "" } 223 return 0; 224 } 225 226 one sink_6_123568( A&); 227 two sink_6_123568(const A&); 228 three sink_6_123568(volatile A&); 229 five sink_6_123568( A&&); 230 six sink_6_123568(const A&&); 231 eight sink_6_123568(const volatile A&&); // { dg-message "" } 232 233 int test6_123568() 234 { 235 A a; 236 const A ca = a; // { dg-error "deleted" } 237 volatile A va; 238 const volatile A cva = a; // { dg-error "deleted" } 239 sink_6_123568(cva); // { dg-error "" } 240 return 0; 241 } 242 243 one sink_6_123578( A&); 244 two sink_6_123578(const A&); 245 three sink_6_123578(volatile A&); 246 five sink_6_123578( A&&); 247 seven sink_6_123578(volatile A&&); 248 eight sink_6_123578(const volatile A&&); // { dg-message "" } 249 250 int test6_123578() 251 { 252 A a; 253 const A ca = a; // { dg-error "deleted" } 254 volatile A va; 255 const volatile A cva = a; // { dg-error "deleted" } 256 sink_6_123578(cva); // { dg-error "" } 257 return 0; 258 } 259 260 one sink_6_123467( A&); // { dg-message "one sink_6_123467|no known conversion" } 261 two sink_6_123467(const A&); 262 three sink_6_123467(volatile A&); 263 four sink_6_123467(const volatile A&); 264 six sink_6_123467(const A&&); 265 seven sink_6_123467(volatile A&&); 266 267 int test6_123467() 268 { 269 A a; 270 const A ca = a; // { dg-error "deleted" } 271 volatile A va; 272 const volatile A cva = a; // { dg-error "deleted" } 273 sink_6_123467(source()); // { dg-error "" } 274 sink_6_123467(cv_source()); // { dg-error "" } 275 return 0; 276 } 277 278 one sink_6_124567( A&); // { dg-message "one sink_6_124567|no known conversion" } 279 two sink_6_124567(const A&); 280 four sink_6_124567(const volatile A&); 281 five sink_6_124567( A&&); 282 six sink_6_124567(const A&&); 283 seven sink_6_124567(volatile A&&); 284 285 int test6_124567() 286 { 287 A a; 288 const A ca = a; // { dg-error "deleted" } 289 volatile A va; 290 const volatile A cva = a; // { dg-error "deleted" } 291 sink_6_124567(cv_source()); // { dg-error "" } 292 return 0; 293 } 294 295 one sink_6_125678( A&); 296 two sink_6_125678(const A&); 297 five sink_6_125678( A&&); 298 six sink_6_125678(const A&&); 299 seven sink_6_125678(volatile A&&); // { dg-message "" } 300 eight sink_6_125678(const volatile A&&); // { dg-message "" } 301 302 int test6_125678() 303 { 304 A a; 305 const A ca = a; // { dg-error "deleted" } 306 volatile A va; 307 const volatile A cva = a; // { dg-error "deleted" } 308 sink_6_125678(va); // { dg-error "" } 309 sink_6_125678(cva); // { dg-error "" } 310 return 0; 311 } 312 313 one sink_6_134567( A&); // { dg-message "one sink_6_134567|no known conversion" } 314 three sink_6_134567(volatile A&); 315 four sink_6_134567(const volatile A&); 316 five sink_6_134567( A&&); 317 six sink_6_134567(const A&&); 318 seven sink_6_134567(volatile A&&); 319 320 int test6_134567() 321 { 322 A a; 323 const A ca = a; // { dg-error "deleted" } 324 volatile A va; 325 const volatile A cva = a; // { dg-error "deleted" } 326 sink_6_134567(cv_source()); // { dg-error "" } 327 return 0; 328 } 329 330 one sink_6_135678( A&); 331 three sink_6_135678(volatile A&); 332 five sink_6_135678( A&&); 333 six sink_6_135678(const A&&); // { dg-message "" } 334 seven sink_6_135678(volatile A&&); 335 eight sink_6_135678(const volatile A&&); // { dg-message "" } 336 337 int test6_135678() 338 { 339 A a; 340 const A ca = a; // { dg-error "deleted" } 341 volatile A va; 342 const volatile A cva = a; // { dg-error "deleted" } 343 sink_6_135678(ca); // { dg-error "" } 344 sink_6_135678(cva); // { dg-error "" } 345 return 0; 346 } 347 348 int main() 349 { 350 return test6_235678() + test6_234678() + test6_234578() + test6_234568() + 351 test6_234567() + test6_134678() + test6_124678() + test6_123678() + 352 test6_123567(); 353 } 354