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 8 template <bool> struct sa; 9 template <> struct sa<true> {}; 10 11 struct one {long x[1];}; 12 struct two {long x[2];}; 13 struct three {long x[3];}; 14 struct four {long x[4];}; 15 struct five {long x[5];}; 16 struct six {long x[6];}; 17 struct seven {long x[7];}; 18 struct eight {long 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 // 2 at a time 32 33 one sink_2_12( A&); 34 two sink_2_12(const A&); 35 36 int test2_12() 37 { 38 A a; 39 const A ca; 40 volatile A va; 41 const volatile A cva; 42 sa<sizeof(sink_2_12(a)) == 1 * sizeof(long)> t1; 43 sa<sizeof(sink_2_12(ca)) == 2 * sizeof(long)> t2; 44 sa<sizeof(sink_2_12(source())) == 2 * sizeof(long)> t5; 45 sa<sizeof(sink_2_12(c_source())) == 2 * sizeof(long)> t6; 46 return 0; 47 } 48 49 one sink_2_13( A&); 50 three sink_2_13(volatile A&); 51 52 int test2_13() 53 { 54 A a; 55 const A ca; 56 volatile A va; 57 const volatile A cva; 58 sa<sizeof(sink_2_13(a)) == 1 * sizeof(long)> t1; 59 sa<sizeof(sink_2_13(va)) == 3 * sizeof(long)> t3; 60 return 0; 61 } 62 63 one sink_2_14( A&); 64 four sink_2_14(const volatile A&); 65 66 int test2_14() 67 { 68 A a; 69 const A ca; 70 volatile A va; 71 const volatile A cva; 72 sa<sizeof(sink_2_14(a)) == 1 * sizeof(long)> t1; 73 sa<sizeof(sink_2_14(ca)) == 4 * sizeof(long)> t2; 74 sa<sizeof(sink_2_14(va)) == 4 * sizeof(long)> t3; 75 sa<sizeof(sink_2_14(cva)) == 4 * sizeof(long)> t4; 76 return 0; 77 } 78 79 one sink_2_15( A&); 80 five sink_2_15( A&&); 81 82 int test2_15() 83 { 84 A a; 85 const A ca; 86 volatile A va; 87 const volatile A cva; 88 sa<sizeof(sink_2_15(a)) == 1 * sizeof(long)> t1; 89 sa<sizeof(sink_2_15(source())) == 5 * sizeof(long)> t5; 90 return 0; 91 } 92 93 one sink_2_16( A&); 94 six sink_2_16(const A&&); 95 96 int test2_16() 97 { 98 A a; 99 const A ca; 100 volatile A va; 101 const volatile A cva; 102 sa<sizeof(sink_2_16(a)) == 1 * sizeof(long)> t1; 103 sa<sizeof(sink_2_16(source())) == 6 * sizeof(long)> t5; 104 sa<sizeof(sink_2_16(c_source())) == 6 * sizeof(long)> t6; 105 return 0; 106 } 107 108 one sink_2_17( A&); 109 seven sink_2_17(volatile A&&); 110 111 int test2_17() 112 { 113 A a; 114 const A ca; 115 volatile A va; 116 const volatile A cva; 117 sa<sizeof(sink_2_17(a)) == 1 * sizeof(long)> t1; 118 sa<sizeof(sink_2_17(source())) == 7 * sizeof(long)> t5; 119 sa<sizeof(sink_2_17(v_source())) == 7 * sizeof(long)> t7; 120 return 0; 121 } 122 123 one sink_2_18( A&); 124 eight sink_2_18(const volatile A&&); 125 126 int test2_18() 127 { 128 A a; 129 const A ca; 130 volatile A va; 131 const volatile A cva; 132 sa<sizeof(sink_2_18(a)) == 1 * sizeof(long)> t1; 133 sa<sizeof(sink_2_18(source())) == 8 * sizeof(long)> t5; 134 sa<sizeof(sink_2_18(c_source())) == 8 * sizeof(long)> t6; 135 sa<sizeof(sink_2_18(v_source())) == 8 * sizeof(long)> t7; 136 sa<sizeof(sink_2_18(cv_source())) == 8 * sizeof(long)> t8; 137 return 0; 138 } 139 140 two sink_2_23(const A&); 141 three sink_2_23(volatile A&); 142 143 int test2_23() 144 { 145 A a; 146 const A ca; 147 volatile A va; 148 const volatile A cva; 149 sa<sizeof(sink_2_23(ca)) == 2 * sizeof(long)> t2; 150 sa<sizeof(sink_2_23(va)) == 3 * sizeof(long)> t3; 151 sa<sizeof(sink_2_23(source())) == 2 * sizeof(long)> t5; 152 sa<sizeof(sink_2_23(c_source())) == 2 * sizeof(long)> t6; 153 return 0; 154 } 155 156 two sink_2_24(const A&); 157 four sink_2_24(const volatile A&); 158 159 int test2_24() 160 { 161 A a; 162 const A ca; 163 volatile A va; 164 const volatile A cva; 165 sa<sizeof(sink_2_24(a)) == 2 * sizeof(long)> t1; 166 sa<sizeof(sink_2_24(ca)) == 2 * sizeof(long)> t2; 167 sa<sizeof(sink_2_24(va)) == 4 * sizeof(long)> t3; 168 sa<sizeof(sink_2_24(cva)) == 4 * sizeof(long)> t4; 169 sa<sizeof(sink_2_24(source())) == 2 * sizeof(long)> t5; 170 sa<sizeof(sink_2_24(c_source())) == 2 * sizeof(long)> t6; 171 // sa<sizeof(sink_2_24(v_source())) == 4 * sizeof(long)> t7; 172 // sa<sizeof(sink_2_24(cv_source())) == 4 * sizeof(long)> t8; 173 return 0; 174 } 175 176 two sink_2_25(const A&); 177 five sink_2_25( A&&); 178 179 int test2_25() 180 { 181 A a; 182 const A ca; 183 volatile A va; 184 const volatile A cva; 185 sa<sizeof(sink_2_25(a)) == 2 * sizeof(long)> t1; 186 sa<sizeof(sink_2_25(ca)) == 2 * sizeof(long)> t2; 187 sa<sizeof(sink_2_25(source())) == 5 * sizeof(long)> t5; 188 sa<sizeof(sink_2_25(c_source())) == 2 * sizeof(long)> t6; 189 return 0; 190 } 191 192 two sink_2_26(const A&); 193 six sink_2_26(const A&&); 194 195 int test2_26() 196 { 197 A a; 198 const A ca; 199 volatile A va; 200 const volatile A cva; 201 sa<sizeof(sink_2_26(a)) == 2 * sizeof(long)> t1; 202 sa<sizeof(sink_2_26(ca)) == 2 * sizeof(long)> t2; 203 sa<sizeof(sink_2_26(source())) == 6 * sizeof(long)> t5; 204 sa<sizeof(sink_2_26(c_source())) == 6 * sizeof(long)> t6; 205 return 0; 206 } 207 208 two sink_2_27(const A&); 209 seven sink_2_27(volatile A&&); 210 211 int test2_27() 212 { 213 A a; 214 const A ca; 215 volatile A va; 216 const volatile A cva; 217 sa<sizeof(sink_2_27(a)) == 2 * sizeof(long)> t1; 218 sa<sizeof(sink_2_27(ca)) == 2 * sizeof(long)> t2; 219 sa<sizeof(sink_2_27(source())) == 7 * sizeof(long)> t5; 220 sa<sizeof(sink_2_27(c_source())) == 2 * sizeof(long)> t6; 221 sa<sizeof(sink_2_27(v_source())) == 7 * sizeof(long)> t7; 222 return 0; 223 } 224 225 two sink_2_28(const A&); 226 eight sink_2_28(const volatile A&&); 227 228 int test2_28() 229 { 230 A a; 231 const A ca; 232 volatile A va; 233 const volatile A cva; 234 sa<sizeof(sink_2_28(a)) == 2 * sizeof(long)> t1; 235 sa<sizeof(sink_2_28(ca)) == 2 * sizeof(long)> t2; 236 sa<sizeof(sink_2_28(source())) == 8 * sizeof(long)> t5; 237 sa<sizeof(sink_2_28(c_source())) == 8 * sizeof(long)> t6; 238 sa<sizeof(sink_2_28(v_source())) == 8 * sizeof(long)> t7; 239 sa<sizeof(sink_2_28(cv_source())) == 8 * sizeof(long)> t8; 240 return 0; 241 } 242 243 three sink_2_34(volatile A&); 244 four sink_2_34(const volatile A&); 245 246 int test2_34() 247 { 248 A a; 249 const A ca; 250 volatile A va; 251 const volatile A cva; 252 sa<sizeof(sink_2_34(a)) == 3 * sizeof(long)> t1; 253 sa<sizeof(sink_2_34(ca)) == 4 * sizeof(long)> t2; 254 sa<sizeof(sink_2_34(va)) == 3 * sizeof(long)> t3; 255 sa<sizeof(sink_2_34(cva)) == 4 * sizeof(long)> t4; 256 // sa<sizeof(sink_2_34(source())) == 4 * sizeof(long)> t5; 257 // sa<sizeof(sink_2_34(c_source())) == 4 * sizeof(long)> t6; 258 // sa<sizeof(sink_2_34(v_source())) == 4 * sizeof(long)> t7; 259 // sa<sizeof(sink_2_34(cv_source())) == 4 * sizeof(long)> t8; 260 return 0; 261 } 262 263 three sink_2_35(volatile A&); 264 five sink_2_35( A&&); 265 266 int test2_35() 267 { 268 A a; 269 const A ca; 270 volatile A va; 271 const volatile A cva; 272 sa<sizeof(sink_2_35(a)) == 3 * sizeof(long)> t1; 273 sa<sizeof(sink_2_35(va)) == 3 * sizeof(long)> t3; 274 sa<sizeof(sink_2_35(source())) == 5 * sizeof(long)> t5; 275 return 0; 276 } 277 278 three sink_2_36(volatile A&); 279 six sink_2_36(const A&&); 280 281 int test2_36() 282 { 283 A a; 284 const A ca; 285 volatile A va; 286 const volatile A cva; 287 sa<sizeof(sink_2_36(a)) == 3 * sizeof(long)> t1; 288 sa<sizeof(sink_2_36(va)) == 3 * sizeof(long)> t3; 289 sa<sizeof(sink_2_36(source())) == 6 * sizeof(long)> t5; 290 sa<sizeof(sink_2_36(c_source())) == 6 * sizeof(long)> t6; 291 return 0; 292 } 293 294 three sink_2_37(volatile A&); 295 seven sink_2_37(volatile A&&); 296 297 int test2_37() 298 { 299 A a; 300 const A ca; 301 volatile A va; 302 const volatile A cva; 303 sa<sizeof(sink_2_37(a)) == 3 * sizeof(long)> t1; 304 sa<sizeof(sink_2_37(va)) == 3 * sizeof(long)> t3; 305 sa<sizeof(sink_2_37(source())) == 7 * sizeof(long)> t5; 306 sa<sizeof(sink_2_37(v_source())) == 7 * sizeof(long)> t7; 307 return 0; 308 } 309 310 three sink_2_38(volatile A&); 311 eight sink_2_38(const volatile A&&); 312 313 int test2_38() 314 { 315 A a; 316 const A ca; 317 volatile A va; 318 const volatile A cva; 319 sa<sizeof(sink_2_38(a)) == 3 * sizeof(long)> t1; 320 sa<sizeof(sink_2_38(va)) == 3 * sizeof(long)> t3; 321 sa<sizeof(sink_2_38(source())) == 8 * sizeof(long)> t5; 322 sa<sizeof(sink_2_38(c_source())) == 8 * sizeof(long)> t6; 323 sa<sizeof(sink_2_38(v_source())) == 8 * sizeof(long)> t7; 324 sa<sizeof(sink_2_38(cv_source())) == 8 * sizeof(long)> t8; 325 return 0; 326 } 327 328 four sink_2_45(const volatile A&); 329 five sink_2_45( A&&); 330 331 int test2_45() 332 { 333 A a; 334 const A ca; 335 volatile A va; 336 const volatile A cva; 337 sa<sizeof(sink_2_45(a)) == 4 * sizeof(long)> t1; 338 sa<sizeof(sink_2_45(ca)) == 4 * sizeof(long)> t2; 339 sa<sizeof(sink_2_45(va)) == 4 * sizeof(long)> t3; 340 sa<sizeof(sink_2_45(cva)) == 4 * sizeof(long)> t4; 341 sa<sizeof(sink_2_45(source())) == 5 * sizeof(long)> t5; 342 // sa<sizeof(sink_2_45(c_source())) == 4 * sizeof(long)> t6; 343 // sa<sizeof(sink_2_45(v_source())) == 4 * sizeof(long)> t7; 344 // sa<sizeof(sink_2_45(cv_source())) == 4 * sizeof(long)> t8; 345 return 0; 346 } 347 348 four sink_2_46(const volatile A&); 349 six sink_2_46(const A&&); 350 351 int test2_46() 352 { 353 A a; 354 const A ca; 355 volatile A va; 356 const volatile A cva; 357 sa<sizeof(sink_2_46(a)) == 4 * sizeof(long)> t1; 358 sa<sizeof(sink_2_46(ca)) == 4 * sizeof(long)> t2; 359 sa<sizeof(sink_2_46(va)) == 4 * sizeof(long)> t3; 360 sa<sizeof(sink_2_46(cva)) == 4 * sizeof(long)> t4; 361 sa<sizeof(sink_2_46(source())) == 6 * sizeof(long)> t5; 362 sa<sizeof(sink_2_46(c_source())) == 6 * sizeof(long)> t6; 363 // sa<sizeof(sink_2_46(v_source())) == 4 * sizeof(long)> t7; 364 // sa<sizeof(sink_2_46(cv_source())) == 4 * sizeof(long)> t8; 365 return 0; 366 } 367 368 four sink_2_47(const volatile A&); 369 seven sink_2_47(volatile A&&); 370 371 int test2_47() 372 { 373 A a; 374 const A ca; 375 volatile A va; 376 const volatile A cva; 377 sa<sizeof(sink_2_47(a)) == 4 * sizeof(long)> t1; 378 sa<sizeof(sink_2_47(ca)) == 4 * sizeof(long)> t2; 379 sa<sizeof(sink_2_47(va)) == 4 * sizeof(long)> t3; 380 sa<sizeof(sink_2_47(cva)) == 4 * sizeof(long)> t4; 381 sa<sizeof(sink_2_47(source())) == 7 * sizeof(long)> t5; 382 // sa<sizeof(sink_2_47(c_source())) == 4 * sizeof(long)> t6; 383 sa<sizeof(sink_2_47(v_source())) == 7 * sizeof(long)> t7; 384 // sa<sizeof(sink_2_47(cv_source())) == 4 * sizeof(long)> t8; 385 return 0; 386 } 387 388 four sink_2_48(const volatile A&); 389 eight sink_2_48(const volatile A&&); 390 391 int test2_48() 392 { 393 A a; 394 const A ca; 395 volatile A va; 396 const volatile A cva; 397 sa<sizeof(sink_2_48(a)) == 4 * sizeof(long)> t1; 398 sa<sizeof(sink_2_48(ca)) == 4 * sizeof(long)> t2; 399 sa<sizeof(sink_2_48(va)) == 4 * sizeof(long)> t3; 400 sa<sizeof(sink_2_48(cva)) == 4 * sizeof(long)> t4; 401 sa<sizeof(sink_2_48(source())) == 8 * sizeof(long)> t5; 402 sa<sizeof(sink_2_48(c_source())) == 8 * sizeof(long)> t6; 403 sa<sizeof(sink_2_48(v_source())) == 8 * sizeof(long)> t7; 404 sa<sizeof(sink_2_48(cv_source())) == 8 * sizeof(long)> t8; 405 return 0; 406 } 407 408 five sink_2_56( A&&); 409 six sink_2_56(const A&&); 410 411 int test2_56() 412 { 413 A a; 414 const A ca; 415 volatile A va; 416 const volatile A cva; 417 sa<sizeof(sink_2_56(source())) == 5 * sizeof(long)> t5; 418 sa<sizeof(sink_2_56(c_source())) == 6 * sizeof(long)> t6; 419 return 0; 420 } 421 422 five sink_2_57( A&&); 423 seven sink_2_57(volatile A&&); 424 425 int test2_57() 426 { 427 A a; 428 const A ca; 429 volatile A va; 430 const volatile A cva; 431 sa<sizeof(sink_2_57(source())) == 5 * sizeof(long)> t5; 432 sa<sizeof(sink_2_57(v_source())) == 7 * sizeof(long)> t7; 433 return 0; 434 } 435 436 five sink_2_58( A&&); 437 eight sink_2_58(const volatile A&&); 438 439 int test2_58() 440 { 441 A a; 442 const A ca; 443 volatile A va; 444 const volatile A cva; 445 sa<sizeof(sink_2_58(source())) == 5 * sizeof(long)> t5; 446 sa<sizeof(sink_2_58(c_source())) == 8 * sizeof(long)> t6; 447 sa<sizeof(sink_2_58(v_source())) == 8 * sizeof(long)> t7; 448 sa<sizeof(sink_2_58(cv_source())) == 8 * sizeof(long)> t8; 449 return 0; 450 } 451 452 six sink_2_67(const A&&); 453 seven sink_2_67(volatile A&&); 454 455 int test2_67() 456 { 457 A a; 458 const A ca; 459 volatile A va; 460 const volatile A cva; 461 sa<sizeof(sink_2_67(c_source())) == 6 * sizeof(long)> t6; 462 sa<sizeof(sink_2_67(v_source())) == 7 * sizeof(long)> t7; 463 return 0; 464 } 465 466 six sink_2_68(const A&&); 467 eight sink_2_68(const volatile A&&); 468 469 int test2_68() 470 { 471 A a; 472 const A ca; 473 volatile A va; 474 const volatile A cva; 475 sa<sizeof(sink_2_68(source())) == 6 * sizeof(long)> t5; 476 sa<sizeof(sink_2_68(c_source())) == 6 * sizeof(long)> t6; 477 sa<sizeof(sink_2_68(v_source())) == 8 * sizeof(long)> t7; 478 sa<sizeof(sink_2_68(cv_source())) == 8 * sizeof(long)> t8; 479 return 0; 480 } 481 482 seven sink_2_78(volatile A&&); 483 eight sink_2_78(const volatile A&&); 484 485 int test2_78() 486 { 487 A a; 488 const A ca; 489 volatile A va; 490 const volatile A cva; 491 sa<sizeof(sink_2_78(source())) == 7 * sizeof(long)> t5; 492 sa<sizeof(sink_2_78(c_source())) == 8 * sizeof(long)> t6; 493 sa<sizeof(sink_2_78(v_source())) == 7 * sizeof(long)> t7; 494 sa<sizeof(sink_2_78(cv_source())) == 8 * sizeof(long)> t8; 495 return 0; 496 } 497 498 int main() 499 { 500 return test2_12() + test2_13() + test2_14() + test2_15() + 501 test2_16() + test2_17() + test2_18() + test2_23() + 502 test2_24() + test2_25() + test2_26() + test2_27() + 503 test2_28() + test2_34() + test2_35() + test2_36() + 504 test2_37() + test2_38() + test2_45() + test2_46() + 505 test2_47() + test2_48() + test2_56() + test2_57() + 506 test2_58() + test2_67() + test2_68() + test2_78(); 507 } 508