aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/20090107-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/20090121-1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/README40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/align1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/anon1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/anon2.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/anon3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_rtti1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.h4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield10.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield12.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield3.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield4.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/cookie1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/cookie2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant3.C85
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant4.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant5.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/covariant6.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/dcast1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/dtor1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/dtor2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty10.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty11.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty4.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty8.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/empty9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/enum1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/forced.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/guard1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/guard2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/guard3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/inline1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/key1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/key2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/layout1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/layout2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/layout3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/layout4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/local1-a.cc14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/local1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/local2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/macro0.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/macro1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/macro2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/main.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon-aarch64.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle11.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle12.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle13.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle15.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle16.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle17.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle21.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle22.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle23.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle24.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle25.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle26.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle27.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle28.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle29.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle30.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle31.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle32.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle33.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle34.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle35.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle36.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle37.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle39.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle40.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle41.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle42.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle43.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle44.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle45.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle46.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle47.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle48.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle49.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle50.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle51.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle52.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle53.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle54.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle55.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle56.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle57.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle58.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle59.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle60.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle61.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62a.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle7.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/mangle9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/offsetof.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/packed1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/param1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/param2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1.h11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1a.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1b.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2.h12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2a.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2b.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3.h11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3a.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3b.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/pragma-pack1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/regparm1.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/rtti1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/rtti2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/rtti3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/structret1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/thunk1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/thunk2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/thunk3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/thunk4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/thunk5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vague1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase1.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase11.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase12.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase13.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase14.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase15.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-10.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-21.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-22.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-4.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vbase9.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vcall1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/abi/vtt1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan.exp38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test-wrapper.cc2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test.cc43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_mem_test.cc231
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_oob_test.cc126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_str_test.cc570
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.cc1179
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_config.h58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_utils.h109
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/deep-stack-uaf-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/deep-tail-call-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/default-options-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/dejagnu-gtest.h120
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/dlclose-test-1-so.cc32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/interception-failure-test-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/interception-malloc-test-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/interception-test-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/large-func-test-1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/pr55617.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/shared-lib-test-1-so.cc20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/asan/symbolize-callback-1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/bprob/bprob.exp68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C234
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cdce3.C235
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/asm1.c14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/asm2.c33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/asm3.c10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/asm4.c8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/asm5.c13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/attribute1.c10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/attribute2.c8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/charset.exp44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/extern1.cc15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/extern2.cc5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/extern3.cc11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/function.cc10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/charset/string.c5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test1_tplt.cc118
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test2_tplt.cc141
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test_ND_tplt.cc115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/braced_list.cc13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_custom_tplt.cc126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_mutating_tplt.cc134
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/fp_triplet_values_tplt.c36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/postincr_test.cc107
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/preincr_test.cc106
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/catch_exc.cc67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/const_spawn.cc78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-opr-overload.cc94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-tplt.cc53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns.cc237
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns_tplt.cc174
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/ef_test.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for2.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1.h10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2.h10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/README18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5.h11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7.h3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_x.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_y.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10.h12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_x.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_y.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11.h12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_x.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_y.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/compat.exp129
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/compat-common.h55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_x.h151
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_y.h89
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_x.h90
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_y.h67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1.h10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2.h22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_main.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_x.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_y.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_x.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_y.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_main.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_x.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_y.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_x.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_y.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1.h15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_x.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_y.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_main.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_x.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_y.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1.h6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_main.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_x.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_y.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1.h30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_main.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_x.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_y.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_main.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_x.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_y.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.exp166
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.h502
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c1666
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/constexpr-null1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/_Pragma1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/limits.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/paste1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/paste2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/pedantic-errors.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/string-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/string-2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/stringop-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/truefalse.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/ucn-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/ucnid-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp/weak.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C162
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C123
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C93
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C106
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C132
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C101
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C107
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C104
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C74
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C130
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C87
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C707
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C708
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C224
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C221
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C102
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C116
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C174
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C168
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C145
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C544
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C507
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C951
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C1070
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C1072
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C1448
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C806
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C1256
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C372
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C687
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C111
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C233
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C146
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C91
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C115
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C135
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C118
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C133
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C475
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C72
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C95
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C293
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C410
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-neg.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-dtor1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn11.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn12.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn13.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn14.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn15.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn16.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn17.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn18.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn19.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn20.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn21.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn22.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn24.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn7.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn9.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-mangle1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-neg1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/complex_literals.h12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/context-conv1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/cplusplus.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/fn-generic-member-ool.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init7.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/mangle1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57640.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58500.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58533.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58534.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58535.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58536.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58548.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58549.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58637.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58708.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59110.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59112.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59113.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59629.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59635.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59636.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59638.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60033.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60052.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60053.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60064.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60065.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60190.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60311.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60332.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60376.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60377.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60384.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60390.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60391.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60393.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60627.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/regress1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template-neg.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-empty-string-neg.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-enc-prefix-neg.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-userdef-string.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla-initlist1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla13.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla8.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla9.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/anonunion1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/const1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/const2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/const3.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/const4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/const5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/crash1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug.exp30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug1.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug3.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug8.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/debug9.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/auto1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/block.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/cdtor-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/icf.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lambda1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/non-virtual-thunk.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/omp-fesdr.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr52260.C133
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C193
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C193
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/thunk1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/enum-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/enum-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/localclass1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/minimal1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/namespace1.C258
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/namespace2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/nullptr01.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr15736.cc12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr16792.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr22514.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr27657.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr29906.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr30898.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr34895.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr43010.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr44178.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr44182.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr45660.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr46123.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr46240.cc172
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr46241.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr46338.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr46583.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr47106.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr47209.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr47283.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr53466.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr53860.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr54499.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr54828.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr54831.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr56294.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/pr56819.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/ra1.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/static1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/template1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/template2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/trivial.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/typedef1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/typedef2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/typedef3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using5.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/using6.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/debug/vartrack1.C99
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-1.C122
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/base.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/dfp.exp67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-4.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-mode.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/nofields.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dfp/typeid1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/dg.exp71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/aka1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bindings1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/expr1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/method1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/parm1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr58979.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr59838.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/variadic1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/080514-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/alias1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/anon1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/anon1a.cc10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/anon2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/array1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind1.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind2.C255
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/builtin1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/builtin2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/builtin3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/builtin4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cast1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/catch1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/catch2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/catch3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/catch4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/catch5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/check-vect.h23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup1.C417
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/comdat1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond1.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond4.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond5.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/cond6.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/crash1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/crossjump1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ctor1.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ctor2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ctor3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/dead1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/defarg1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/delayslot1.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/div.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/dtor1.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/dtor2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/dtor3.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ehopt1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/elide1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/elide2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/filter1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/filter2.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/forced1.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/forced2.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/forced3.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/forced4.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/fp-regs.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/gcsec1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/goto1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/goto2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-1.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp1.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/loop1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/loop2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/nested-try.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/new1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/nrv1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/partial1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/ppc64-sighandle-cr.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr29166.C197
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr38662.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr41819.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr42859.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr43365.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/pr45569.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C138
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/scope1.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/shadow1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/sighandle.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/simd-1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/simd-2.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/simd-3.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/simd-4.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/simd-5.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spbp.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec10.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec11.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec6.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec7.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/spec9.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/stabilize.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/subreg-1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/synth1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/synth2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/table.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/template1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/template2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/terminate1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/throw1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/throw2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/throw3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught1.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught2.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught3.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/unexpected1.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/unwind-direct.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/unwind1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/unwind2.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/weak1-a.cc3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/eh/weak1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/anew1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/anew2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/anew3.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/anew4.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/assign1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield11.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield8.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield9.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bool1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bool2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bool3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bool4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/bound-mem-fun.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/call1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/call2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/call3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/call4.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/call5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast10.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cast9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/comma1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/compound-asn1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond6.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/cond9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/const1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/copy1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/crash-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/crash2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/dtor1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/dtor2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/dtor3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/dtor4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/enum1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/for1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/for2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/incomplete1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/lval1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/lval2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/lval3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/lval4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/minmax.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/overflow1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/pmf-1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/pr19355-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/pr29066.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6a.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem7.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/return1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/stmt-expr-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/string-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/string-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/unary1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/unary2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/unary3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/expr/volatile1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon2.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alias-mangle.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/align1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/align2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alignof1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/alignof2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-13.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-15.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-16.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-17.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-3.C137
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-6.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-7.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-8.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-9.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-1.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-2.C141
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-3.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-4.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-1.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-2.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-5.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct3.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h135
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/array1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/array2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm1.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm11.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm12.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm4.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm5.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asm9.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asmgoto1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asmspec1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecInvalid.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecValid.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/atomic-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-2.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-aligned01.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attr-used-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib12.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib13.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib15.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib16.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib17.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib19.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib20.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib21.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib22.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib23.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib24.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib25.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib26.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib27.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib28.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib29.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib30.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib31.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib32.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib33.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib34.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib35.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib36.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib37.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib38.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib39.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib4.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib40.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib41.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib42.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib43.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib44.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib45.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib46.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib47.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib48.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib6.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib7.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attrib9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-2.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-3.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-4.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bases.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/boolcomplex-1.c3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-bswap1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-line1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size1.C435
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size2.C438
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin10.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin30.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/builtin9.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/c99struct1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/case-range1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/case-range2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/case-range3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-10.C117
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-11.C117
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-3.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-4.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-5.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-8.C100
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-9.C104
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-dtor.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex8.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complex9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit10.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit11.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit12.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit6.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit7.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/complit9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/cond1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/construct1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/conv1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/desig6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dll-MI1.h39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport-MI1.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2a.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4a.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5a.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport-MI1.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport11.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport12.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport13.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport4.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport5.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport6.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport7.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport8.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport9.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fixed1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fixed2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/flexary1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/flexary2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/flexary3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fnname1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fnname2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fnname3.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/forscope1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/forscope2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/fpreg1.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-common.h24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C152
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C106
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C140
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_assign.C106
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C98
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_copy.C105
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C89
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/init1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/injected-ttp.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/inline1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/int128-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.h10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/int128-3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/int128-4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.h10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface1a.cc4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface2a.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface2b.cc9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_abstract.C89
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_class.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_enum.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_final.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_literal_type1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_98.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_polymorphic.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/is_union.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/ivdep-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/java-1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/java-2.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label10.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label11.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label12.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label13.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label13a.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label14.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label3.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label6.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/label9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/lvaddr.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/lvalue1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/max.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/member-attr.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/ms-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv1.C132
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv10.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv11.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv12-aux.cc10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.h4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv13.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv14.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv15.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv16.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv2.C118
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv3.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv6.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/mv9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/offsetof1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/oper1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed11.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed4.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed6.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed8.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/packed9.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.h2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr27019.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr28291.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr34829.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr47213.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr53605.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr56790-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr57362.C198
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr57509.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr57548.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr57735.C145
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr58834.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr59378.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pr59706.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pragmaweak1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pretty1.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pretty2.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/pretty3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/restrict1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/selectany1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/selectany2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/sizeof-complit.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/spe1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/static1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr1.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr11.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr13.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr14.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr15.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr2.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr8.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/strncpy-chk1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/sync-1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/sync-2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/sync-3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/sync-4.C121
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/timevar1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/timevar2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr3.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr5.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr9.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/traits1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/transparent-union.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typedef-init.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typename1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof7.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/typeof9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type10.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type11.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type3.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type5.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type6.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type7.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type8.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type9.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/uow-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/uow-2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/uow-3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/uow-4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cvt.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx0x.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx98.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-mangle.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-rtti.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-type.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typespec.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-1.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-3.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-3.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C145
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C122
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector11.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector12.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector13.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector14.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector15.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector16.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector17.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector18.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector19.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector20.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector21.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector22.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector23.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector24.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector25.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector26.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector27.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector8.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vector9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon10.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon11.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon6.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon7.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon8.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon9.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm3.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/assign1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/class1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-4.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/guard1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/local1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/new1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/noPLT.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/overload-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/prop1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/redecl1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template1.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template11.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template4.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template7.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template8.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/virtual.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla10.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla12.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla13.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla7.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vla9.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vlm1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/vlm2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/weak1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/weak2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/weak3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/weak4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ext/weak5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/fstack-protector-strong.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/func-args-1.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-1.C313
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-10.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-11.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-12.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-13.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-14.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.h31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-4.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-5.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-6.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-7.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-8.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov.exp44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gcov/gcovpart-12b.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-14.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-5.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-0.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-10.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-11.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-3.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-6.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/block-9.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-2.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-3.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/copyin-1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-1.C243
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-2.C98
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-1.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-2.C87
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-10.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-12.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-13.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-14.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-15.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-16.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-17.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-18.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-19.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-20.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-3.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-7.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-8.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/for-9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/gomp.exp35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/master-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/master-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/master-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/method-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-1.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-2.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr24849.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25874.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25996.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26913.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27310.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27325.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27359.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27415.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27499.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-2.C98
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-3.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-4.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-5.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-6.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-7.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-8.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-9.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30494.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30558.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30696.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31598.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31748.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31769.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr32177.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33333.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33890.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34607.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34608.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34694.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34964.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35028.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35078.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35099.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35158.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35244.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35328.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35337.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35364.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35751.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36237.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36790.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37189.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37346.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37533.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38633.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38639.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-1.C95
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41429.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41967.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr42234.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr47963.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48632.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48716.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51360.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51669.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr56217.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58567.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58702.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58874.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59150.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59297.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/predetermined-1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/private-1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-1.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-2.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/simd-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/target-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/target-2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/task-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/taskgroup-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/teams-1.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-template1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrapper-cse.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-master-1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-1.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-2.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-3.C191
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-5.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-6.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/graphite.exp71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/id-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr39447.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41305.C332
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41562.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42130.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42681.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42930.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/graphite/pr43026.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/guality/guality.exp58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/guality/guality.h1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/guality/pr46815.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/guality/pr55665.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/guality/redeclaration1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/addr-const1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr10.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/aggr9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array10.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array11.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array12.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array13.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array14.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array15.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array16.C112
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array17.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array18.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array19.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array20.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array21.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array22.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array23.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array24.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array25.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array26.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array27.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array28.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array30.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array31.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array32.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array33.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array34.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array35.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array36.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array37.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array4.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array5.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/array9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/assign1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/attrib1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/bitfield1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/bitfield2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/bitfield3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/bitfield4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/bitfield5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace3.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/brace6.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/byval1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/call1.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/cleanup1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/cleanup2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/cleanup3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/complex1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/const9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/constant1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/copy6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor1.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor11.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor6.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor7.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ctor9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/delete1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/delete2.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dtor1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dtor2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dtor3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/dtor4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/elide1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/elide2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/empty1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/enum1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/enum2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/error1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/error2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/explicit1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/float1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/for1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/for2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/for3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/global1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/goto1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/goto2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/init-ref1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/init-ref2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/init-ref3.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/init-ref4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/inline1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/lifetime1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/lifetime2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/lifetime3.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/member1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/mutable1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new11.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new12.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new14.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new15.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new16.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new17.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new18.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new19.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new20.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new21.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new22.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new23.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new24.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new25.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new26.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new27.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new28.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new29.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new30.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new31.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new32.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new33.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new34.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new35.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new36.C153
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new37.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new38.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new39.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new4.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new40.C114
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new41.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new5.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new8.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/new9.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/no-elide1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/null1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/placement1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/placement2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/placement3.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/placement4.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/placement5.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pm1.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pm2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pm3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pmf1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr20039.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-3.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-4.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C195
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr29571.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr42556.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr42844.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C197
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr43890.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr48859.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr55497.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr58811.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/pr60572.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref11.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref12.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref13.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref15.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref16.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref17.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref18.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref19.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref20.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref21.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/ref9.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/reference1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/reference2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/reference3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/save1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/self1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static-init1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static-init2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static-init3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/static4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/string1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/struct1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/struct2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/struct3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/switch1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/synth1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/synth2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/synth3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/synth4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/union1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/union2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value10.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value4.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value7.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/value9.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/vbase1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/vector1.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/void1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/volatile1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/init/volatile2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/20090113-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C75
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C87
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C110
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C72
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-2.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-3.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C95
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-2.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43695.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43812.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr44372.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45565.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-1.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45875.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46053.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-1.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-2.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-3.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46984.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr50605.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51759.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51929.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr52939.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr55264.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr56310.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr57670.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr58371.C204
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59176.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59355.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59737.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60419.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60457.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-2.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon1.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/anon7.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-4.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/crash8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/decl1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/decl2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/delete1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/disamb1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/duperr1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/enum1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/error1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/exception1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend11.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend12.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend13.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend14.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend15.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend5.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/friend9.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class11.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class12.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class13.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class14.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class15.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class16.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class17.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class9.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-var1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/java1.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/java2.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig10.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig12.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig13.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig5.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig8.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig9.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/main1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/member1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/nested1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/nested2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/new1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/new2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ns1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ns2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ns3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ns4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/pr6936.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/pretty1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/ptrmem1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/redecl1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scope-operator1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped8.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-5.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/struct-hack1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/struct1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/struct2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/suggestions1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/template1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/template2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/template3.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/this1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/typedef1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/used-before-declaration.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using-10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using12.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using13.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using14.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using15.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using16.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using17.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using18.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using19.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using2.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using20.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using21.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using22.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using23.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using24.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using25.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using26.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using27.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using28.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using29.C81
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using30.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using31.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using32.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using33.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using34.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using35.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using36.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using37.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using38.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using39.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using40.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using41.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using42.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using44.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using45.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using46.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using47.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using48.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using49.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using50.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using51.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using52.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using53.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lookup/using9.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080709_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080829_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080904_0.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080907_0.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-1_0.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-2_0.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-3_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080909-1_0.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080910-1_0.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080912-1_0.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080912_0.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080915_0.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080916_0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080917_0.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080924_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20080926_0.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081008_0.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081022.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081023_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-1_0.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-2_0.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_0.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_0.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_0.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_0.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081125.h15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_0.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_0.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_0.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_0.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_0.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1.h6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_0.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-1_0.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-2_0.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_0.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090106_0.C203
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090112_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090128_0.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090221_0.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090303_0.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1.h22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_0.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090312.h2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_0.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-1_0.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-2_0.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-3_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_0.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_0.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_0.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-1_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-2_0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_a.h9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.h9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20091219_0.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100302.h9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-1_0.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-2_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-3_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100519-1_0.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_1.c2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100721-1_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100722-1_0.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100723-1_0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20100724-1_0.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101009-1_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-1_0.C109
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-2_0.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-3_0.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-4_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-1_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-2_0.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-1_0.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-2_0.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.h23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_0.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_1.c4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/20110311-1_0.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/README35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/lto.exp60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr40818_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_0.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_0.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_1.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_0.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_1.C100
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr45983_0.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr47333.C944
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48042_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-2_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-3_0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48354-1_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_0.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51564-1_0.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51567-1_0.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51572-2_0.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51573-1_0.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-1_0.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-2_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-3_0.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832.h6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_0.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr51992_0.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr52035_0.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr52400_0.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr52605_0.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr53470_0.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_0.c10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_0.c9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150.H20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_0.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/lto/v1-plugin-api-not-supported_0.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/20050511-1.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/alias1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/alias2.C74
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/alias3.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/alias4.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/anchor1.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/anonunion1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/array1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/array2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/asm1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/asm2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/bitfield1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/bool1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/builtins1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/builtins2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/call1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cfg1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cfg2.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cfg3.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cfg4.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cfg5.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cleanup1.C171
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/combine.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/complex6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/compound1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cond1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/conj1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/conj2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const1.C129
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const3.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/const6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/copysign-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/covariant1.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/crash1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/crossjump1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cse1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cse2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/cse3.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/declone1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/delay-slot-1.C111
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2-aux.cc16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.h29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4-aux.cc6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/dump1.C768
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/eh1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/eh2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/eh3.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/eh4.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/eh5.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/empty1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/empty2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/emptyunion.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/enum1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/enum2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/expect1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/expect2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/float1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/fold1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/fold2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/fold3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ice1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ifcvt1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/init1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/init2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline10.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline11.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline12.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline14.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline15.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline16.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline17.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline3.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline8.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/inline9.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/interface1-a.cc9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.h8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.h11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/life1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/local1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch2.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/loop1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/loop2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/memcpy1.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/mmx1.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/mmx2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/new1.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/noreturn-1.C87
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nothrow1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv10.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv11.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv12.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv13.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv14.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv15.C97
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv16.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv17.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv5.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv6.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv8.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/nrv9.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/operator1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/placeholder1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pmf1.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr13066-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr14029.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr14888.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054-2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr15551.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr16372-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17411-1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17624.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-6.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr17902.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr18084-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr18683-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr18968.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19108.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-3.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19650.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr19768.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr20931.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr20991.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr20995-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr22167.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23056.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23299.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23372.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454-2.C106
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23478.C211
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr23714.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr24665.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr24780.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr25005.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr25857.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr26179.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr27826.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr28116.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr30590.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr30965.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr32383.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr34036.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr36185.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr36187.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr36449.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr39607.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr40496.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr42295.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr42508.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr43655.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr44919.C253
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr45316.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr45412.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr46640.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr46649.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr46864.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47036.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47280.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47355.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47366.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47615.C711
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47632.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr47639.c17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr48272.C130
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr48273.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr48302.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr48549.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr48967.C98
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr49264.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr50682.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-1_0.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-2_0.C112
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51014.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51117.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51262.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51396.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51575.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51596.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr51895.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr52429.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr52582.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr52643.C64
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr52727.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55081.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55137.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55281.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55329.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55331.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr55717.C107
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr56381.C156
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C188
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr57411.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr57661.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr58006.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr58165.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr58864.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59470.C188
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-5.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59647.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr59947.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr60002.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr60597.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr6713.C117
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/pr7503-1.C148
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/preinc1.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrintsum1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem6.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-1.C216
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-2.C96
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reload1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reload2.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/reload3.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/return-slot1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/rtti1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/rtti2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/stack1.C135
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/stack2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static3.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/static6.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/strength-reduce.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/switch1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/switch2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/switch3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/switch4.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/temp1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/temp2.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/template1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/thunk1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/thunk2.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3-1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/thunk4.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/tmp1.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/unroll1.C420
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/unroll2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/value-init1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vrp2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3-aux.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.h9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vt1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vt2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vt3.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/opt/vt4.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/PR23205.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract1.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/abstract6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/access1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/access2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/access3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon-struct.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon-union.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon-union2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon-union3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/anon6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/arm-neon-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/armv7m-1.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/array7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/assign1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/big-struct.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/bitfield1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/bitfield2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/bitfield3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/bitfield4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/builtin1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/canon-31724.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/canon-33194.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/canon-37342.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/classkey1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/complex1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/component1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/const1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/const2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/const3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/constref1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/constref2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/conversion1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/copy1.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/copy2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-11.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-12.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-4.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-6.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-8.C110
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/crash-9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ctor1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ctor2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/cv_func.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/cv_func2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/cv_func3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/cxa-atexit1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/darwin-cfstring1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/darwin-minversion-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/datasec1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default3.C109
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default5.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/default8.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/do1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/dtor1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/dtor2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ellipsis1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/enum1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/enum2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/enum3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error12.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error13.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error14.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error15.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error16.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error17.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error18.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error19.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error20.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error21.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error22.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error23.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error24.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error25.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error26.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error27.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error28.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error29.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error30.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error31.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error32.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error33.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error34.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error6.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/error9.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/field1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/final1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/final2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/first-global.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/fold1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/friend1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/friend2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/friend3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/friend4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/friend5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/gc1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/gc2.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/gc3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/gc4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/gc5.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/i386-9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/incomplete1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/incomplete2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/incomplete3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/increment1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/infloop-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/init1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/init2.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/isnan.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/java1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/java2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/java3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/label1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/large-size-array.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/linkage1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/macro-1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/main1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/mmintrin.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/mult-stor1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern.cc1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/new-size-type.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/new1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/nontype-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ns1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof2.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof6.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/offsetof7.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/opaque-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/opaque-2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/opaque-3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/operator1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/operator2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/packed1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr20366.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr22003.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr22358.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr23205-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr24623.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr25632.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr27495.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr28114.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr28304.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr28432.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr29610.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr31078.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr33558-2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr33558.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr33601.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr34435.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr35011.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr35504.C159
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr36944.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr37394.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr37789.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr38706.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr39060.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr39496.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr40446.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr40561.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr42685.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr42806.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr43116.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr43631.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr47218-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.h33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr49133.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr49912.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr50212.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr50464.C170
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr52048.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr53811.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.cc4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pr59492.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-1.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/profile1.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem1.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem10.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem11.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem2.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem7.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem9.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/qual1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/redecl1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/redecl2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/return1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/s390-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/scope1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/semicolon.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/spu2vmx-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/static1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/static11.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/static2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/stdarg1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/stdarg2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/stdarg3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/struct-va_list.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/switch1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/switch2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/switch3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/synth1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/typedef1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/typedef2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/typedef3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/typedef4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/ucnid-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/unreachable1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/unused1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/var_copy-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vararg-1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vararg-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vararg-3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vararg-4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vector-compare.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/virtual1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/virtual2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/void1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/void2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vrp1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/vthunk1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/other/warning1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/VLA.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/addr1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/addr2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ambig1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ambig2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/arg1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/arg2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/arg3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/arg4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/arg5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/autoptr1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/builtin1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/builtin2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/builtin3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/cond1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/cond2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/conv-op1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/copy1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg4.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/defarg8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/error1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/error2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/error3.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/koenig1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/koenig2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/member1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/member2.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/new1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator-star-1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/operator6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/pmf1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/pmf2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/prom1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/ref1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/scope1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/template1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/template2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/template3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/template4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/template5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/unknown1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/using1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/using2.C92
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/using3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/virtual1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/virtual2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/overload/volatile1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access11.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access5.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access6.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/access9.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig3.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ambig9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/args1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/array-size1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/array-size2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/asm1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/asm2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/asm3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr-ctor1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/attr3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/break-in-for.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/builtin1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/builtin2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cast1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cast2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/catch1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/class1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/class2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/comma1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/comma2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/concat1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cond1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cond2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cond3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cond4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/cond5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/condexpr1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant4.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constant7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constructor1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constructor2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/constructor3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/conv_op1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash11.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash12.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash13.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash14.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash15.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash16.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash17.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash18.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash19.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash20.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash21.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash22.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash23.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash24.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash25.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash26.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash27.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash28.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash29.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash3.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash30.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash31.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash32.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash33.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash34.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash35.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash36.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash37.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash38.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash39.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash40.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash41.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash42.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash43.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash44.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash45.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash46.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash47.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash48.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash49.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash50.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash51.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash52.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash53.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash54.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash55.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash56.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash57.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash58.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash59.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash60.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash61.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash62.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash63.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash64.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash65.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash66.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/crash9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor8.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ctor9.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dce1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/decl-specifier-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg13.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg14.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg15.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg16.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg4.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg7.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/defarg9.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/direct-initialization-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dot1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor12.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor13.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor14.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor15.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor16.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor7.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dtor9.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/eh-decl.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/elab1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/elab2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/else-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/else.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum10.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum11.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/enum9.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error-column.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error10.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error11.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error13.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error14.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error15.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error16.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error17.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error18.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error19.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error20.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error21.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error22.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error23.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error24.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error25.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error26.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error27.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error28.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error29.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error30.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error31.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error32.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error33.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error34.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error35.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error36.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error37.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error38.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error39.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error40.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error41.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error42.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error43.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error44.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error45.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error47.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error48.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error49.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error50.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error51.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error52.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error53.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error8.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/error9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/explicit1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/expr1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/expr2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/expr3.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/extern-C-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/extern1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/for1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend-main.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend6.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend7.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/friend8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/func-def1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/funptr1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/fused-params1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/inline1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/int-as-enum1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/invalid-op1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ivdep.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/limits-initializer1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/linkage1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/linkage2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/linkage3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/local-class1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/local1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/long1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/lookup1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/lookup2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/lookup3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/lookup4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/lookup5.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/memfnquals1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/missing-template1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/mutable1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/named_ops.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-alias-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-definition.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace11.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace5.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace8.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/namespace9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new5.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/new6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/no-type-defn1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/no-typename1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/no-value1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent2.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/non-templ1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/nontype1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/octal1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof6.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof9.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator4.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator6.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/operator7.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parens1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parens2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse4.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse5.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse6.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parse7.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696-permissive.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr18770.C175
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr20118.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr26997.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr29234.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-2.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr34758.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr37862.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr43765.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr52071.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr56037.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr56239.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pr58705.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pragma1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pragma2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pragma3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/primary-expression-1.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem4.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/pure1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/qualified1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/qualified2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/qualified3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/qualified4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/redef1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/redef2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ref1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/register1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/repo1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/saved1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.h2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon3.C260
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon4.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/specialization1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/stack1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-5.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/struct-as-enum1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template10.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template11.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template12.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template13.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template14.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template15.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template16.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template17.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template18.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template19.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template20.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template21.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template22.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template23.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template24.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template25.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template26.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template27.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template6.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template7.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/template9.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/try-catch-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef7.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typedef9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename11.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename7.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typename9.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/typespec1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined3.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined5.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/undefined7.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/using1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/using2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/using3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/using4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/varmod1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/parse/wrong-inline1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.Hs4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/empty.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/empty.Hs0
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.Hs1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.Hs7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/pch.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/pch.Hs1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/pch.exp41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.Hs13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.Hs1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.Hs2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.Hs5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.Hs2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.C1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.Hs2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin.c71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/decl-plugin-test.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb_plugin.c161
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/header-plugin-test.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/header_plugin.c31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/plugin.exp70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin.c62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/plugin/selfassign.c402
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr37742.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr44328.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr44486.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45038.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45049-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45049-2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45056.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45112.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45310.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45330.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr45788.C108
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr46065.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr46852.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr46868.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr46890.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr47053.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr47589.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr48484.C105
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr48633.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr48660.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr48772.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr49718.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr49847.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr50672.C101
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr50763-3.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr50763-4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr51264-4.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr53055.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr54655.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr55106.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr55263.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr55513.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr55604.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr57175.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr57662.C339
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr57878.C227
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr58389.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr58438.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr58950.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr59445.C81
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr59477.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr59482.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr59510.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr59695.C125
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pr60518.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/prof-robust-1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/pubtypes.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/anon-ns1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/crash1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/crash2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/crash3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/crash4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/cv1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast3.C81
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast4.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast6.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/fn-quals.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/incomplete1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/repo1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/template1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/tinfo1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid10.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid4.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid6.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid7.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid8.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid9.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-1.C74
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields-2.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.exp39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.gdb1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.h1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2a.cc12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3a.cc11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3b.cc11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/conpr-4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/ecos.exp35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/initp1.C90
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/initpri1.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/special/initpri2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.h3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr101.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr108.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr127.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr128.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr135.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr137.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr142.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr147.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr152.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr159.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr161.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr164.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr166.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr176.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr179.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr185.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr188.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr193.C72
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr194.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr20.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr213.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr217.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr48.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr49.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr52.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr68.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr74.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr76.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr80.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr85.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr90.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tc1/dr94.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/abstract-dr337.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/abstract1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access11.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access13.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access14.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access15.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access16.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access17.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access18.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access19.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access20.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access21.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access22.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access23.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access24.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access25.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access26.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access27.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access28.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/access9.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/addr1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/aggr-init1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/alignof1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/alignof2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anon1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anon2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anon3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anon4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anon5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anonunion1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/anonunion2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arg9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array1-1.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array1-2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array10.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array13.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array14.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array15.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array16.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array17.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array18.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array19.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array2-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array2-2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array20.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array21.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array22.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array23.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array24.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array25.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array26.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array27.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/array9.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arrow1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arrow2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arrow3.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/arrow4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/asm1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/asmgoto1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/assign1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/bitfield1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/bitfield2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/builtin1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call4.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call6.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/call7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-10.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-11.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-12.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-13.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-6.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-7.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-8.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cast1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cast2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cast3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/char1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/class1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/class2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/class3.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/complit1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/complit2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/cond8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/condition1.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/const8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/constant1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/constant2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv10.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv12.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv13.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv3.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv4.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv6.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/conv9.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/copy1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash10.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash100.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash101.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash102.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash103.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash104.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash105.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash106.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash107.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash108.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash109.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash11.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash110.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash111.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash112.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash113.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash114.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash115.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash116.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash117.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash118.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash12.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash13.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash14.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash15.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash16.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash17.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash18.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash19.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash20.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash21.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash22.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash23.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash24.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash25.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash26.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash27.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash28.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash29.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash30.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash31.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash32.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash33.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash34.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash35.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash36.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash37.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash38.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash39.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash40.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash41.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash42.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash43.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash44.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash45.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash46.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash47.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash48.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash49.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash50.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash51.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash52.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash53.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash54.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash55.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash56.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash57.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash58.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash59.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash60.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash61.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash62.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash63.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash64.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash65.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash66.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash67.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash68.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash69.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash70.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash71.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash72.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash73.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash74.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash75.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash76.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash77.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash78.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash79.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash8.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash80.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash81.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash82.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash83.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash84.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash85.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash87.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash88.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash89.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash90.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash91.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash92.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash93.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash94.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash95.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash96.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/crash99.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor4.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor8.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ctor9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/current-inst1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/debug1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/decl1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/decl2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/decl3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/deduce1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/deduce2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/deduce3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg12.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg13.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg15.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg16.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg17.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/defarg9.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/delete1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/delete2.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-args1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr5.C130
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr6.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr7.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr8.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name5.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dr408.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor6.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor7.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor8.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/dtor9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/duplicate1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/eh1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/eh2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/elab1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum5.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/enum8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error10.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error11.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error12.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error13.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error14.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error15.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error16.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error17.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error18.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error19.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error20.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error21.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error22.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error23.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error24.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error25.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error26.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error27.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error28.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error29.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error30.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error31.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error32.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error33.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error34.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error35.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error36.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error37.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error38.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error39.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error40.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error41.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error42.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error43.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error44.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error45.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error46.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error47.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error48.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error49.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error5.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error50.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error51.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error52.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error53.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error54.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error7.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/error9.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args2.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit7.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/explicit8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/expr1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/field1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/fnspec1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/fntry1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/fntype1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/for1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend10.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend12.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend13.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend14.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend15.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend16.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend17.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend18.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend19.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend20.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend21.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend22.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend23.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend24.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend25.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend26.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend27.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend28.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend29.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend30.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend31.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend32.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend33.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend34.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend35.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend36.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend37.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend38.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend39.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend4.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend40.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend41.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend42.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend43.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend44.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend45.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend46.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend47.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend48.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend49.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend50.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend51.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend52.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend53.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend54.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend55.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend6.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend7.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend8.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/friend9.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/func1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/func2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/function1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/incomplete6.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit6.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inherit9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init-list.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init10.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init6.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init8.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/init9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/injected1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/injected2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/inline1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate10.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate11.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate6.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate8.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/instantiate9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/invalid1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig10.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig5.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig6.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig7.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig8.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/koenig9.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/linkage1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local2.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local6.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/local7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup8.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lookup9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/loop1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lvalue1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/lvalue2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/mangle1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/mem_func_ptr.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member5.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member6.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/member9.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memclass1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memclass2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memclass3.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memclass4.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memclass5.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend1.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend10.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend11.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend12.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend13.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend14.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend15.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend16.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend17.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend2.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend3.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend4.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend5.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend7.C133
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memfriend9.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/meminit1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/meminit2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/meminit3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nested1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nested2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nested3.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nested4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nested5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new10.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new11.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new12.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new7.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new8.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/new9.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-const1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-deducible1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent11.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent12.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent4.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent7.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent8.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent9.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/non-type1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype10.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype11.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype12.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype13.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype15.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype16.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype17.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype18.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype19.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype20.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype21.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype22.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype23.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype24.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype25.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype26.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype3.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype6.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype8.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/nontype9.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ntp1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ntp2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/offsetof1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/offsetof2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/op1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator1.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator11.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator12.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator6.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator7.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator8.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/operator9.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload10.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload11.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload12.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload13.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload5.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload6.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload7.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/overload9.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/param1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/param2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/param3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial10.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial11.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial12.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial13.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial14.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial15.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial6.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial8.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/partial9.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr17410.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr23510.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr28284.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr28301.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr29633.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr32519.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr35240.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr39425.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr4926-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr54858.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pr58878.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pretty1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor3.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor5.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor6.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem10.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem11.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem12.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem14.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem15.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem16.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem17.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem18.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem19.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem20.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem21.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem22.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem23.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem24.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem25.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem26.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem5.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem7.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem8.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem9.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/pure1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qual1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qual2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp11.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp12.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp13.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp14.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp15.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp16.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp17.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp18.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp19.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp20.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp21.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp22.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp3.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp5.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp8.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/qualttp9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/recurse.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/recurse1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/recurse2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/recurse3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/redecl1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/redecl2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/redecl3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/redecl4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ref8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo10.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo6.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo7.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo8.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/repo9.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/restrict1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/scope1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/scope2.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/scope3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/scope4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae-dr657.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae10.C180
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae11.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae12.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae13.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae14.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae15.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae16.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae17.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae19.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae20.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae21.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae22.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae23.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae24.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae25.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae26.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae27.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae28.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae4.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae5.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6_neg.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae7.C199
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae8.C182
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sfinae9.C207
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/shadow1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/shift1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof-template-argument.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof10.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof13.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof14.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof15.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof7.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof8.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/sizeof9.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec10.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec11.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec12.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec13.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec14.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec15.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec16.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec17.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec18.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec19.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec20.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec21.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec22.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec23.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec24.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec25.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec26.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec27.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec28.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec29.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec3.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec30.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec31.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec32.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec33.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec34.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec35.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec36.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec37.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec5.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec7.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/spec9.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static12.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static13.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static14.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static15.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static16.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static17.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static18.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static19.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static20.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static21-a.cc17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static21.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static22.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static23.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static24.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static25.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static26.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static27.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static28.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static29.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static3.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static30.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static31.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static32.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static33.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static34.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static35.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static8.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/static9.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/stdarg1.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr2.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/string1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/strlen1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/subst1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/template-id-1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/template-id-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/template-id-3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/template-id-4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/this-targ1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp10.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp11.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp12.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp13.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp14.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp15.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp16.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp17.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp18.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp19.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp20.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp21.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp22.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp23.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp24.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp25.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp26.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp27.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp28.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp6.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/ttp9.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/type1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/type2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef10.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef11.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef12.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef13.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef14.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef15.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef16.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef17.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef18.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef19.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef20.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef21.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef22.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef23.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef24.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef25.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef26.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef27.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef28.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef29.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef30.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef31.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef32.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef33.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef34.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef35.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef36.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef37.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef38.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef39.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef40.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef41.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef5.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef8.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typedef9.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typeid-template-argument.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typeid1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename12.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename13.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename14.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename15.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename16.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename17.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename18.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename19.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename2.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename20.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename4.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename7.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename8.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/typename9.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify10.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify11.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify4.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify8.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/unify9.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/union1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/union2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using14.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using15.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using16.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using17.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using18.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using19.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using20.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using21.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using22.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using23.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using24.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using25.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using26.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using27.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using28.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using29.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using3.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using4.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using7.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using8.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/using9.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/value-dep1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/varmod1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/virtual1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/virtual2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/virtual3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/virtual4.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/vla1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/vla2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void1.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void10.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void11.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void12.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void13.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void14.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void3.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void4.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void5.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void6.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/void9.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/vtable1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/vtable2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/warn1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/template/wrap1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/diag-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/diag-2.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/diag-3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/diag-4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/diag-5.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/init-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/init-2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/static-1.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/static-1a.cc20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/static2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-cse.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2g.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3g.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4g.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5g.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6g.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7g.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local8.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/tls.exp35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tls/trivial.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/20100429.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/20100727.C796
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/alias.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/asm-1.c22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-3.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-4.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/cgraph_edge.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/fatomic-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/nested-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/nested-2.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/nested-3.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-3.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-4.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-6.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/opt-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-2.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-3.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-4.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46269.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46270.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46300.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46567.C2676
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46646.C890
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46653.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46714.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr46941.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47340.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530-2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47554.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47573.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47746.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr47747.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr51212.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411-2.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr51516.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr51928.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr56419.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr58516.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/pr60004.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/template-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/template-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/tm.exp43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/vector-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tm/wrap-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20070621-1.C117
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20080625-1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20090329-1.C59
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20090706-1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20100702-1.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20100825.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20120420-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/20121105-1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/PR58294.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess1.C716
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess2.C730
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/builtin-location.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/covariant-1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/dg-torture.exp7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/ipa-cp-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr27218.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr30252.C226
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr30567.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-2.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr31579.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr31863.C778
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr32304.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr32563.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr32950.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33134.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33340.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33572.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33627.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33735.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33819.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-1.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-3.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34099.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34222.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34235.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34241.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34641.C177
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34651.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34850.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr34953.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-1.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-2.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr35400.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr35526.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr35634.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36191.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36444.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36445.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36745.C122
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36826.C166
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr36960.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-1.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-2.C67
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37343.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37345.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37354.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37421.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37456.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37716.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr37922.C502
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr38565.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr38705.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr38745.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr38747.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr38811.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39002.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39259.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39362.C105
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39417.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39678.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39713.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39732.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr39764.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40081.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40102.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40321.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40323.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40335.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40388.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40389.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40460.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40492.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40642.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40834.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40924.C111
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr40991.C113
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41144.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41183.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41186.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41273.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41680.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr41775.C284
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42110.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42183.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42357.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42450.C112
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42462.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42704.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42714.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42739.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42760.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42773.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42871.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42883.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr42890.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43068.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43257.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43611.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43784.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43801.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_0.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_1.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43880.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr43905.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44069.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44148.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44206.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44295.C170
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44357.C228
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44492.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44535.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44809.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44813.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44826.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44900.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44915.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr44972.C142
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45393.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45580.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45699.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45843.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45854.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45874.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45875.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45877.C141
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr45934.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46111.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46149.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46154.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46287.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46364.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46367.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46383.C252
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr46469.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47290.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47313.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47382.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47541.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47559.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr47714.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48165.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48271.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48600.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48661.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48695.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr48954.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49039.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49115.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49394.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49519.C135
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49615.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49628.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49644.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49720.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49770.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr49938.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr50189.C121
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr50672.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51198.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51344.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51436.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51482.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51600.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51737.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51903.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr51959.C80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr52582.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr52638.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr52772.C85
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-1.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-2.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53011.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53085.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53161.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53321.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53336.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53364.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53602.C364
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53693.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53752.C156
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr53970.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54563.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54647.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54684.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54735.C179
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54838.C102
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr54902.C131
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55355.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55740.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55789.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr55875.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56029.C126
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56302.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56398.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56403.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56635.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56694.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56768.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56817.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56837.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr56854.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr57107.C193
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr57140.C186
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr57190.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr57235.C156
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr57499.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201.h24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_0.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58252.C142
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58369.C109
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58380.C173
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58464.C268
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58552.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58555.C114
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr58585.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59163.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59208.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59226.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59265.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59775.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59822.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59882.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr59918.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr60058.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr60131.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pr60474.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/predcom-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/pushpop_macro.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/check.h36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C73
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h142
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/str_empty.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/type-generic-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-16.inc50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-2.inc22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-4.inc25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-8.inc56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-main.inc28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16hi.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16qi.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2df.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2di.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2sf.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2si.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4df.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4di.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4sf.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4si.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8hi.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8qi.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8si.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition1.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr51719.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr53460.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr57451.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr59255.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/block1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/builtin1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop.C739
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-1.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-2.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/new1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13146.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13954.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14703.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14814.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr16688.C273
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17153.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17400.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17517.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr18178.C47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19637.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19786.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19807.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19952.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20280.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20458.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20489.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20920.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20963.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21082.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21407.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21463.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22005.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22037.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22071.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22279.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22404.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22444.C141
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22488.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22550.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22615.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23046.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23164.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23624.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23948.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24172.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24238.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C101
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24439.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr25771.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26140.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26406.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26443.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26757.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27090.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27283.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27291.C363
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27548.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27549.C79
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27830.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27894.C82
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28003.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28238.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr29902.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr30738.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31307.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33593.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33604.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34063.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34355.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr35144.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr36766.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37084.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37284.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37337.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37356.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37393.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38104.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38572.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38632.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr40874.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41186.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41275.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41428.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41905.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41906.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41961.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr42337.C173
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr43411.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44706.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44914.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45453.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45605.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46228.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46734.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46987.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr47707.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49516.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49911.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50622.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50741.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr53844.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr54515.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr57380.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr58404.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr8781.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict2.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/sra-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C104
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C61
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/stabilize1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/benign_race.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/default_options.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan.exp47
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/div-by-zero-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59250.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59306.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59331.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59415.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59437.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr60569.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ubsan/ubsan.exp34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_a.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_b.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_a.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_b.C62
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_a.C77
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_b.C87
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-4.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr19951.cc19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr21218.cc18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_1.cc20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_2.cc16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr22543.cc38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-2.cc38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-3.cc25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-4.cc30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_1.cc50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_2.cc32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33835.cc50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860.cc25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860a.cc27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr36648.cc24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr37143.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr37174.cc23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr43771.cc14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr44861.cc34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-a.cc24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-b.cc52
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr50698.cc27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr51485.cc14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr58513.cc13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr60000.cc13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr60023.cc80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/pr60559.cc8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50413.cc165
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50819.cc53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr56812.cc21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/vect/vect.exp80
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wall-write-strings.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-1.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-2.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds.C92
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces3.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-integer.C94
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C78
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer-3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C112
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real.C0
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion2.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion3.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wctor-dtor.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C99
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wdtor1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Weff1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no-2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Winit-self.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-3.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-4.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-2.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Woverloaded-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-1.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-10.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-11.C101
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-12.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-13.C69
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-14.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-15.C68
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-16.C86
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-17.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-18.C122
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-19.C122
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-2.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-20.C104
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-21.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-22.C111
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-23.C121
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-24.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-25.C259
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-26.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-27.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-6.C65
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-7.C83
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-8.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-9.C119
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wpointer-arith-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreorder-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-3.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-4.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-10.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-8.C90
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-9.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-4.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-5.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-6.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-7.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-7.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion.C95
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wsizeof-pointer-memaccess-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-1.C63
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-2.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-3.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits.C84
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C53
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-10.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-12.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-13.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-14.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-15.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-16.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-17.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-4.C30
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-5.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-6.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-8.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-9.C38
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-1.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-3.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-3.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C146
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-10.C42
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-11.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-12.C36
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-13.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-14.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-15.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-16.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-17.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-18.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-19.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-2.C104
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-20.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-21.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-3.C110
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-4.C50
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-5.C227
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-6.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-7.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-8.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-9.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wuseless-cast.C129
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C100
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-2.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-3.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-6.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h1
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-6.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/changes-meaning.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/compare1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conv1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conv2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conv3.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conv4.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-function-1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-real-integer-3.h3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-init-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ctor1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/delete-array-1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/delete-non-virtual-dtor.C66
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-4.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-5.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-6.C110
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-7.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated.C117
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/do-empty.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/effc1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/effc2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/effc3.C58
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/empty-body.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format2.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format5.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format6.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format7.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/format8.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/forward-inner.C81
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/friend.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/huge-val1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/if-empty-1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ignored_typedef.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/inline1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/inline2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/main-2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/main-3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/main-4.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/main.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-1.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-3.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-4.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-5.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-6.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/new1.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/no-write-strings.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect2.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect4.C88
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect5.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect6.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect7.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect8.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/nonnull1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-1.C71
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-2.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-4.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-5.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-6.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/null4.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/oldcast1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-1.C128
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-3.C130
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-4.C133
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-5.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pmf1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pmf2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr11159.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr11492.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr12242.C57
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-2.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-3.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr16302.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr18016.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr21983.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr23075.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr26785.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr28943.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551-2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr30636.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246-2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr33160.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr33738.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr34985.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr35602.C28
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr35635.C89
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr35711.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr36069.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr36921.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr36954.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr36999.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr5310.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr5645.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr8570.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pr8715.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.h5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.h7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.h2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.h3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/private1.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/ref-temp1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference2.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/sentinel.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-1.C109
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-2.C46
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C54
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/skip-1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/skip-2.C37
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/string1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/switch1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/template-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/translate-ice-1.C45
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/undefined1.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/unit-1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/var-args1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/volatile1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/warn_unused.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/wdate-time.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/weak1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings-default.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings.C7
7565 files changed, 213077 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/20090107-1.C b/gcc-4.9/gcc/testsuite/g++.dg/20090107-1.C
new file mode 100644
index 000000000..ff586e817
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/20090107-1.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target lto } */
+/* { dg-options "-flto -Wuninitialized -O1" } */
+
+template <typename T> struct Q1 { typedef int x; };
+template <typename T> struct Q2 {
+ typename Q1<T>::x f() {
+ int k;
+ return k; /* { dg-warning "'k' is used uninitialized in this function" } */
+ }
+};
+int foo() { return Q2<int>().f(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/20090121-1.C b/gcc-4.9/gcc/testsuite/g++.dg/20090121-1.C
new file mode 100644
index 000000000..ddfa3ad05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/20090121-1.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-require-effective-target lto }
+// { dg-options "-flto -Wuninitialized -O2" }
+class A
+{
+private:
+ int y;
+
+public:
+ A () { int x; y = x + 1; } /* { dg-warning "'x' is used uninitialized in this function" } */
+ int get_y () { return y; }
+};
+
+int foo()
+{
+ A a;
+ return a.get_y ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/README b/gcc-4.9/gcc/testsuite/g++.dg/README
new file mode 100644
index 000000000..998f8ece6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/README
@@ -0,0 +1,40 @@
+Subdirectories:
+
+abi Tests for ABI compatibility -- mangling, object layout, etc.
+bprob Tests for functionality of profile-directed block ordering.
+charset Tests for input character set translation.
+compat Tests for binary compatibility (consistency, not ABI conformance).
+conversion Tests for correct type conversions.
+cpp Tests for the preprocessor.
+debug Tests for debugging options.
+eh Tests for exception handling.
+expr Tests for expressions.
+ext Tests for GNU language extensions.
+gcov Tests for GCOV (code coverage) support.
+inherit Tests for inheritance -- virtual functions, multiple inheritance, etc.
+init Tests for initialization semantics, constructors/destructors, etc.
+lookup Tests for lookup semantics, namespaces, using, etc.
+lto Tests for Link Time Optimization.
+opt Tests for fixes of bugs with particular optimizations.
+overload Tests for overload resolution and conversions.
+parse Tests for parsing.
+pch Tests for precompiled headers.
+plugin Tests for plugin support.
+rtti Tests for run-time type identification (typeid, dynamic_cast, etc.)
+template Tests for templates.
+tc1 Tests for Technical Corrigendum 1 conformance.
+tls Tests for support of thread-local data.
+tree-ssa Tests for Tree SSA optimizations.
+warn Tests for compiler warnings.
+
+other Tests that don't fit into one of the other categories.
+
+special Tests that need custom expect code to run them; see special/ecos.exp
+ for an example.
+
+
+Copyright (C) 2001-2014 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C
new file mode 100644
index 000000000..ca1778b87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C
@@ -0,0 +1,17 @@
+// Check that the initialization guard variable is an 8-byte aligned,
+// 8-byte doubleword and that only the least significant bit is used
+// for initialization guard variables.
+// { dg-do compile { target aarch64*-*-* } }
+// { dg-options "-O -fdump-tree-original -fno-section-anchors" }
+
+int bar();
+
+int *foo ()
+{
+ static int x = bar ();
+ return &x;
+}
+
+// { dg-final { scan-assembler _ZGVZ3foovE1x,8,8 } }
+// { dg-final { scan-tree-dump "_ZGVZ3foovE1x & 1" "original" } }
+// { dg-final { cleanup-tree-dump "original" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag1.C
new file mode 100644
index 000000000..942929cdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag1.C
@@ -0,0 +1,19 @@
+// { dg-options "-Wabi-tag" }
+
+// { dg-final { scan-assembler "_Z1fB3barB3fooi" } }
+void f(int) __attribute ((abi_tag ("foo","bar")));
+
+struct __attribute ((abi_tag ("bar"))) A { };
+
+struct B: A { }; // { dg-warning "bar. abi tag" }
+struct D { A* ap; }; // { dg-warning "bar. abi tag" }
+
+// { dg-final { scan-assembler "_Z1gB3baz1AB3bar" } }
+void g(A) __attribute ((abi_tag ("baz")));
+void g(A) __attribute ((abi_tag ("baz")));
+
+int main()
+{
+ f(42);
+ g(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag2.C
new file mode 100644
index 000000000..0e92dcc1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag2.C
@@ -0,0 +1,5 @@
+void f(int);
+void f(int) __attribute ((abi_tag ("foo"))); // { dg-error "adds abi tag" }
+
+struct C;
+struct __attribute ((abi_tag ("foo"))) C; // { dg-error "adds abi tag" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C
new file mode 100644
index 000000000..05fd58e94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C
@@ -0,0 +1,36 @@
+// An explicit specialization doesn't get the tag from its template unless
+// it is specified there, too.
+
+// { dg-final { scan-assembler "_ZN3FooB5cxx11IcE1fEv" } }
+template<typename T>
+struct __attribute ((abi_tag("cxx11"))) Foo
+{
+ int f();
+};
+
+// { dg-final { scan-assembler "_ZN3FooB5cxx11IiE1fEv" } }
+template<>
+struct
+__attribute ((abi_tag("cxx11")))
+Foo<int>
+{
+ int f();
+};
+
+// { dg-final { scan-assembler "_ZN3FooIdE1fEv" } }
+template<>
+struct
+Foo<double>
+{
+ int f();
+};
+
+int main()
+{
+ Foo<int> f;
+ f.f();
+ Foo<char> f1;
+ f1.f();
+ Foo<double> f2;
+ f2.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag4.C
new file mode 100644
index 000000000..3f8d7bfbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag4.C
@@ -0,0 +1,8 @@
+// { dg-options "-Wabi-tag" }
+
+struct __attribute ((abi_tag ("X"))) A { };
+
+struct B // { dg-warning "abi tag" }
+{
+ virtual void f(A); // { dg-message "declared here" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag5.C
new file mode 100644
index 000000000..95e367ef9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag5.C
@@ -0,0 +1,7 @@
+// { dg-options -Wabi-tag }
+// { dg-final { scan-assembler "_Z1f1BI1AB3fooE" } }
+
+struct __attribute__ ((abi_tag ("foo"))) A { };
+template <class T> struct B: T { };
+
+void f(B<A>) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/align1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/align1.C
new file mode 100644
index 000000000..2a70bce60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/align1.C
@@ -0,0 +1,27 @@
+// This was failuring on powerpc-darwin and powerpc-aix as
+// we were taking the embeded type as the first field decl.
+// This was PR target/18761.
+// { dg-do run }
+
+
+union A {
+ double d;
+};
+union B {
+ enum E { e };
+ double d;
+};
+struct AlignA {
+ char c;
+ A a;
+};
+struct AlignB {
+ char c;
+ B b;
+};
+extern "C" void abort ();
+int main () {
+ if ( __alignof__ (AlignA) != __alignof__ (AlignB))
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon1.C
new file mode 100644
index 000000000..c45917a1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon1.C
@@ -0,0 +1,5 @@
+// PR c++/54883
+
+namespace { enum E { E1 }; } void f(E e) { }
+
+// { dg-final { scan-assembler-not "globl" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon2.C
new file mode 100644
index 000000000..cee923710
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon2.C
@@ -0,0 +1,66 @@
+// PR c++/55877
+// { dg-require-weak "" }
+
+namespace N1 {
+ typedef struct {
+ typedef enum { X, Y } A;
+ typedef struct { } B;
+ struct C {
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN2N11D1C3fn1ENS0_1BE" { target c++11 } } }
+ static void fn1 (B) { }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN2N11D1C3fn2ES1_" { target c++11 } } }
+ static void fn2 (C) { }
+ };
+ } D;
+
+ void *p = (void *) D::C::fn1;
+ void *q = (void *) D::C::fn2;
+}
+
+namespace N2 {
+ typedef struct {
+ typedef enum { X, Y } A;
+ typedef struct { } B;
+ struct C {
+ // { dg-final { scan-assembler-not ".weak\(_definition\)?\[ \t\]_?_ZN2N23._31C3fn1ENS0_1BE" { target c++11 } } }
+ static void fn1 (B) { } // { dg-error "no linkage" "" { target { ! c++11 } } }
+ // { dg-final { scan-assembler-not ".weak\(_definition\)?\[ \t\]_?_ZN2N23._31C3fn2ES1_" { target c++11 } } }
+ static void fn2 (C) { } // { dg-error "no linkage" "" { target { ! c++11 } } }
+ };
+ } const D;
+
+ void *p = (void *) D::C::fn1;
+ void *q = (void *) D::C::fn2;
+}
+
+namespace N3 {
+ typedef struct {
+ typedef enum { X, Y } A;
+ typedef struct { } B;
+ template <class T> struct C {
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN2N31D1CIiE3fn1ENS0_1BE" { target c++11 } } }
+ static void fn1 (B) { }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN2N31D1CIiE3fn2ES2_" { target c++11 } } }
+ static void fn2 (C) { }
+ };
+ } D;
+
+ void *p = (void *) D::C<int>::fn1;
+ void *q = (void *) D::C<int>::fn2;
+}
+
+namespace N4 {
+ typedef struct {
+ typedef enum { X, Y } A;
+ typedef struct { } B;
+ template <class T> struct C {
+ // { dg-final { scan-assembler-not ".weak\(_definition\)?\[ \t\]_?_ZN2N43._91CIiE3fn1ENS0_1BE" { target c++11 } } }
+ static void fn1 (B) { } // { not-dg-error "no linkage" "" { target { ! c++11 } } }
+ // { dg-final { scan-assembler-not ".weak\(_definition\)?\[ \t\]_?_ZN2N43._91CIiE3fn2ES2_" { target c++11 } } }
+ static void fn2 (C) { } // { not-dg-error "no linkage" "" { target { ! c++11 } } }
+ };
+ } const D;
+
+ void *p = (void *) D::C<int>::fn1;
+ void *q = (void *) D::C<int>::fn2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/anon3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon3.C
new file mode 100644
index 000000000..623c7f5c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/anon3.C
@@ -0,0 +1,19 @@
+// { dg-require-weak "" }
+
+typedef struct {
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN4Heya4blahEv" } }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZTI4Heya" } }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZTV4Heya" } }
+ virtual const char *blah() {
+ return "Heya::blah";
+ }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZN4Heya1A1fEv" } }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZTIN4Heya1AE" } }
+ // { dg-final { scan-assembler ".weak\(_definition\)?\[ \t\]_?_ZTVN4Heya1AE" } }
+ struct A {
+ virtual void f() { }
+ };
+} Heya;
+
+Heya h;
+Heya::A a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C
new file mode 100644
index 000000000..4c462d5f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C
@@ -0,0 +1,34 @@
+// Check that __cxa_vec_[c]ctor returns a pointer to the array
+// { dg-do run { target arm*-*-* } }
+
+#include <cxxabi.h>
+
+#ifdef __ARM_EABI__
+using namespace __cxxabiv1;
+static __cxa_cdtor_return_type cctor (void * a, void * b)
+{
+ *(char *) a = *(char *) b;
+ return a;
+}
+
+int main()
+{
+ char data;
+ char data2;
+ char *p;
+
+ p = (char *) __cxa_vec_ctor (&data, 1, 1, NULL, NULL);
+ if (p != &data)
+ return 1;
+ p = (char *) __cxa_vec_cctor (&data2, &data, 1, 1, cctor, NULL);
+ if (p != &data2)
+ return 1;
+
+ return 0;
+}
+#else
+int main()
+{
+ return 0;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C
new file mode 100644
index 000000000..76f327aca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C
@@ -0,0 +1,41 @@
+// Check that ARM vector delete functions accept NULL pointers as
+// inputs.
+// { dg-do run { target arm*-*-* } }
+
+#ifdef __ARM_EABI__
+#include <cxxabi.h>
+
+typedef void *(dtor_type)(void *);
+
+extern "C" {
+ void abort();
+ void *__aeabi_vec_dtor_cookie(void *, dtor_type);
+ void __aeabi_vec_delete(void *, dtor_type);
+ void __aeabi_vec_delete3(void *,
+ dtor_type,
+ void (*)(void *, __SIZE_TYPE__));
+ void __aeabi_vec_delete3_nodtor(void *,
+ void (*)(void *, __SIZE_TYPE__));
+}
+
+// These functions should never be called.
+void* dtor(void *)
+{
+ abort ();
+}
+
+void dealloc(void *, size_t) {
+ abort ();
+}
+
+int main () {
+ if (__aeabi_vec_dtor_cookie (NULL, &dtor) != NULL)
+ return 1;
+ // These do not return values, but should not crash.
+ __aeabi_vec_delete (NULL, &dtor);
+ __aeabi_vec_delete3 (NULL, &dtor, &dealloc);
+ __aeabi_vec_delete3_nodtor (NULL, &dealloc);
+}
+#else
+int main () {}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_rtti1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_rtti1.C
new file mode 100644
index 000000000..a481bdd1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_rtti1.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } }
+// { dg-options "-O2" }
+// Check that, even when optimizing, we emit an out-of-line call to
+// the type-info comparison function.
+// { dg-final { scan-assembler _ZNKSt9type_infoeqERKS_ } }
+
+#include <typeinfo>
+
+extern const std::type_info& t1;
+extern const std::type_info& t2;
+
+bool f() {
+ return t1 == t2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list.C
new file mode 100644
index 000000000..4f6f3a46d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target { aarch64*-*-* arm*-*-* } } }
+// { dg-options "-Wno-abi" }
+// { dg-require-effective-target arm_eabi { target arm*-*-* } }
+
+// AAPCS \S 7.1.4 requires that va_list be a typedef for "struct
+// __va_list". The mangling is as if it were "std::__va_list".
+// AAPCS64 \S 7.1.4 has the same requirement for AArch64 targets.
+// #include <stdarg.h>
+typedef __builtin_va_list va_list;
+
+// { dg-final { scan-assembler "\n_Z1fPSt9__va_list:" } }
+void f(va_list*) {}
+
+// { dg-final { scan-assembler "\n_Z1gSt9__va_listS_:" } }
+void g(va_list, va_list) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.C
new file mode 100644
index 000000000..f5e4ca43d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wpsabi" }
+// { dg-require-effective-target arm_eabi }
+
+#include <stdarg.h>
+#include "arm_va_list2.h"
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.h b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.h
new file mode 100644
index 000000000..ebfb2deac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/arm_va_list2.h
@@ -0,0 +1,4 @@
+// The mangling of va_list changed in GCC 4.4. We want to warn about
+// that -- but not in a system header.
+#pragma GCC system_header
+void f(va_list) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield1.C
new file mode 100644
index 000000000..d5d04bcd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield1.C
@@ -0,0 +1,34 @@
+// { dg-do run }
+// { dg-options "-ansi -pedantic-errors -funsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
+
+int main ()
+{
+ A a;
+
+ a.bitS = 1; // { dg-warning "overflow" }
+ a.bitU = 1;
+ a.bit = 1;
+
+ if (a.bitS != -1)
+ return 1;
+ if (a.bitU != 1)
+ return 2;
+ if (a.bit != 1)
+ return 3;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield10.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield10.C
new file mode 100644
index 000000000..df40fa3f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield10.C
@@ -0,0 +1,5 @@
+// { dg-options "-w" }
+
+struct S {
+ int i : 64;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield11.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield11.C
new file mode 100644
index 000000000..e78ea121d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield11.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+struct S {
+ char c : 1024;
+};
+
+S s;
+
+int main () {
+ s.c = 1;
+ if (*(char *)&s != 1)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield12.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield12.C
new file mode 100644
index 000000000..6cfda5d47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield12.C
@@ -0,0 +1,5 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+struct S { // { dg-warning "ABI" }
+ char c : 1024; // { dg-warning "width" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield2.C
new file mode 100644
index 000000000..452861ec2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield2.C
@@ -0,0 +1,34 @@
+// { dg-do run }
+// { dg-options "-ansi -pedantic-errors -fsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
+
+int main ()
+{
+ A a;
+
+ a.bitS = 1; // { dg-warning "overflow" }
+ a.bitU = 1;
+ a.bit = 1; // { dg-warning "overflow" }
+
+ if (a.bitS != -1)
+ return 1;
+ if (a.bitU != 1)
+ return 2;
+ if (a.bit != -1)
+ return 3;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield3.C
new file mode 100644
index 000000000..6908ab6e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield3.C
@@ -0,0 +1,86 @@
+// Test for oversized bitfield alignment in structs on IA-32
+// { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-options "-O2" }
+// Cygwin and mingw default to MASK_ALIGN_DOUBLE. Override to ensure
+// 4-byte alignment.
+// { dg-additional-options "-mno-align-double" { target i?86-*-cygwin* i?86-*-mingw* } }
+// As for mingw target the ms-bitfield switch is activated by default,
+// make sure for this test that it is disabled.
+// { dg-additional-options "-mno-ms-bitfields" { target i?86-*-mingw* } }
+
+struct A
+{
+ char a;
+ int b : 224; // { dg-warning "exceeds its type" "" }
+ char c;
+} a, a4[4];
+
+struct B
+{
+ char d;
+ A e;
+ char f;
+} b;
+
+struct C
+{
+ char g;
+ long long h : 64;
+ char i;
+} c, c4[4];
+
+struct D
+{
+ char j;
+ C k;
+ char l;
+} d;
+
+struct E
+{
+ char m;
+ long long n : 160; // { dg-warning "exceeds its type" "" }
+ char o;
+} e, e4[4];
+
+struct F
+{
+ char p;
+ E q;
+ char r;
+} f;
+
+int main (void)
+{
+ if (&a.c - &a.a != 32)
+ return 1;
+ if (sizeof (a) != 36)
+ return 2;
+ if (sizeof (a4) != 4 * 36)
+ return 3;
+ if (sizeof (b) != 2 * 4 + 36)
+ return 4;
+ if (__alignof__ (b.e) != 4)
+ return 5;
+ if (&c.i - &c.g != 12)
+ return 6;
+ if (sizeof (c) != 16)
+ return 7;
+ if (sizeof (c4) != 4 * 16)
+ return 8;
+ if (sizeof (d) != 2 * 4 + 16)
+ return 9;
+ if (__alignof__ (d.k) != 4)
+ return 10;
+ if (&e.o - &e.m != 24)
+ return 11;
+ if (sizeof (e) != 28)
+ return 12;
+ if (sizeof (e4) != 4 * 28)
+ return 13;
+ if (sizeof (f) != 2 * 4 + 28)
+ return 14;
+ if (__alignof__ (f.q) != 4)
+ return 15;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield4.C
new file mode 100644
index 000000000..5434dd973
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield4.C
@@ -0,0 +1,41 @@
+/* { dg-do run { target { pcc_bitfield_type_matters || default_packed } } } */
+
+/* Check bitfields and non-bitfields are aligned & sized similarly.
+
+ Copyright (C) 2002 Free Software Foundation Inc
+ Contributed by Nathan Sidwell <nathan@codesourcery.com>
+*/
+
+#include <limits.h>
+#include <stdio.h>
+
+static int fail;
+
+#define CHECK1(N, T) do { \
+ typedef struct Field_##N { char c; T f; } Field_##N; \
+ typedef struct BitField_##N { char c; T f : sizeof (T) * CHAR_BIT; } BitField_##N; \
+ if (sizeof (Field_##N) != sizeof (BitField_##N)) { \
+ fail = 1; printf ("sizeof %s failed\n", #T); \
+ } \
+ if (__alignof__ (Field_##N) != __alignof__ (BitField_##N)) { \
+ fail = 1; printf ("__alignof__ %s failed\n", #T); \
+ } \
+} while (0)
+
+#define CHECK(N, T) do { \
+ CHECK1(N, T); \
+ CHECK1 (s##N, signed T); \
+ CHECK1 (u##N, unsigned T); \
+} while (0)
+
+int main ()
+{
+
+ CHECK (c, char);
+ CHECK (s, short);
+ CHECK (i, int);
+ CHECK (l, long);
+ CHECK (ll, long long);
+
+ return fail;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield5.C
new file mode 100644
index 000000000..531314014
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield5.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-Wabi -fabi-version=1" }
+// { dg-options "-Wabi -fabi-version=1 -mno-ms-bitfields" { target i?86-*-* x86_64-*-* } }
+
+struct A {
+ virtual void f();
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 1; // { dg-warning "ABI" }
+ int : 0;
+ int f3 : 4;
+ int f4 : 3;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield6.C
new file mode 100644
index 000000000..50f76ab82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield6.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+#include <limits>
+
+union U {
+ int i: 4096;
+};
+
+int main () {
+ if (sizeof (U) * std::numeric_limits<unsigned char>::digits != 4096)
+ return 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield7.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield7.C
new file mode 100644
index 000000000..b5b656ffa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield7.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wabi -fabi-version=1" }
+
+union U { // { dg-warning "ABI" }
+ int i: 4096; // { dg-warning "exceeds" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield8.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield8.C
new file mode 100644
index 000000000..58e74be08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield8.C
@@ -0,0 +1,22 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-options "-fabi-version=0" }
+// { dg-require-effective-target ilp32 }
+
+
+struct A {
+ virtual void f() {}
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 31;
+ int f3 : 4;
+ int f4 : 3;
+};
+
+int main ()
+{
+ if (sizeof (B) != 16)
+ return 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield9.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield9.C
new file mode 100644
index 000000000..0d3a8bf89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/bitfield9.C
@@ -0,0 +1,12 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options -w }
+
+struct X {
+ char : 45;
+};
+
+int main () {
+ if (__alignof__ (X) != 4)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie1.C
new file mode 100644
index 000000000..defc4887b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie1.C
@@ -0,0 +1,15 @@
+// { dg-options "-fabi-version=0" }
+
+void *operator new[](__SIZE_TYPE__, void *);
+
+struct A {
+ ~A(){}
+};
+
+int main()
+{
+ A * a = (A*) new char[20];
+ A * b = new(a) A[3];
+ if (a != b)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie2.C
new file mode 100644
index 000000000..dc180453b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/cookie2.C
@@ -0,0 +1,16 @@
+// { dg-options "-fabi-version=1" }
+
+void *operator new[](__SIZE_TYPE__, void *);
+
+struct A {
+ ~A(){}
+};
+
+int main()
+{
+ A * a = (A*) new char[20];
+ A * b = new(a) A[3];
+ // In the 3.2 ABI, a cookie was allocated in this case.
+ if (a == b)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant1.C
new file mode 100644
index 000000000..97737ddb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-w" }
+
+// If a covariant thunk is overriding a virtual primary base, we have to
+// use the vcall offset even though we know it will be 0.
+
+struct c4 {};
+
+struct c6 : c4 { virtual c4* f17(); };
+
+c4* c6::f17() { return 0; }
+
+struct c11 : virtual c6 { int i; };
+
+struct c12 : c11 { };
+
+struct c14 :
+ virtual c12,
+ virtual c11 { virtual void f(); c12* f17(); };
+
+void c14::f() { }
+
+// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N3c143f17Ev" { target { ilp32 && { ! { ia64-*-hpux* } } } } } }
+// { dg-final { scan-assembler-not "_ZTch0_v0_n16_N3c143f17Ev" } }
+// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N3c143f17Ev" { target { lp64 || { ia64-*-hpux* } } } } }
+// { dg-final { scan-assembler-not "_ZTch0_v0_n32_N3c143f17Ev" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant2.C
new file mode 100644
index 000000000..3231cc4c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant2.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Dec 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+
+// PR c++/12881. ICE in thunk generation
+
+struct c1 {};
+
+struct c3 : virtual c1
+{
+ virtual c1* f6() {}
+ int i;
+};
+
+struct c6 : virtual c3 { };
+
+struct c7 : c3
+{
+ virtual c3* f6() {}
+};
+
+struct c24 : virtual c7
+{
+ virtual c6* f6();
+};
+
+c6* c24::f6() { return 0; }
+
+struct c31 : c24 {};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant3.C
new file mode 100644
index 000000000..178157c58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant3.C
@@ -0,0 +1,85 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Dec 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+
+// PR c++/13118. Missing covariant thunk.
+
+struct c0 {};
+struct c1 : virtual c0 {
+ virtual c0* f6();
+};
+
+struct c5 {
+ virtual void foo();
+};
+
+struct c10 : virtual c1 {
+ virtual void foo();
+};
+
+struct c1a : c1 {}; // disambiguation
+
+struct c11 : virtual c10, c1a {
+ int i;
+ virtual c1* f6 () = 0;
+};
+
+struct c18 : c5, virtual c1 {
+ virtual void bar();
+};
+
+struct c28 : virtual c0, virtual c11 {
+ virtual c18* f6();
+};
+
+c0 *c1::f6 () {}
+void c5::foo () {}
+void c10::foo () {}
+void c18::bar () {}
+
+c18 ret;
+
+c18 *c28::f6 ()
+{
+ return &ret;
+}
+
+bool check_c1 (c1 *ptr)
+{
+ c0 *r = ptr->f6 ();
+ return r != &ret;
+}
+bool check_c10 (c10 *ptr)
+{
+ c0 *r = ptr->f6 ();
+ return r != &ret;
+}
+bool check_c11 (c11 *ptr)
+{
+ c1 *r = ptr->f6 ();
+ return r != &ret;
+}
+bool check_c28 (c28 *ptr)
+{
+ c18 *r = ptr->f6 ();
+ return r != &ret;
+}
+
+int main ()
+{
+ c28 obj;
+
+ if (check_c1 (static_cast<c1a *> (&obj)))
+ return 1;
+ if (check_c1 (static_cast<c10 *> (&obj)))
+ return 2;
+ if (check_c10 (&obj))
+ return 3;
+ if (check_c11 (&obj))
+ return 4;
+ if (check_c28 (&obj))
+ return 5;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant4.C
new file mode 100644
index 000000000..942b1686e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant4.C
@@ -0,0 +1,46 @@
+// { dg-do run }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 11 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: bredelin@ucla.edu
+// Bug 19891: Incorrect covariant vtables
+
+struct Model {
+ bool full_tree;
+ virtual Model* clone() const =0;
+ virtual const char *name() const =0;
+ virtual ~Model() {}
+};
+
+struct R: virtual public Model {
+ virtual R* clone() const =0;
+};
+struct A: virtual public Model {
+ virtual A* clone() const=0;
+};
+struct RA: public R, public A {
+ virtual RA* clone() const=0;
+};
+
+static const char *string = "EQU";
+
+struct EQU: public RA {
+ virtual EQU* clone() const {return new EQU(*this);}
+ const char *name() const {return string;}
+};
+
+int main() {
+ Model* M1 = new EQU();
+ Model* M2 = M1->clone();
+ Model* M3 = M2->clone();
+
+ if (M1->name () != string)
+ return 1;
+ if (M2->name () != string)
+ return 2;
+ if (M3->name () != string)
+ return 3;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant5.C
new file mode 100644
index 000000000..03e55583d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant5.C
@@ -0,0 +1,52 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Apr 2005 <nathan@codesourcery.com>
+
+// { dg-do run }
+
+// PR 20746: Covariant return pointer could be null.
+
+// Origin: yanliu@ca.ibm.com
+// nathan@codesourcery.com
+
+struct A {
+ virtual void One ();
+};
+struct B {
+ virtual B *Two ();
+ virtual B &Three ();
+};
+
+struct C : A, B
+{
+ virtual C *Two ();
+ virtual C &Three ();
+};
+void A::One () {}
+B *B::Two() {return this;}
+B &B::Three() {return *this;}
+C *C::Two () {return 0;}
+C &C::Three () {return *(C *)0;}
+
+B *Foo (B *b)
+{
+ return b->Two ();
+}
+
+B &Bar (B *b)
+{
+ return b->Three ();
+}
+
+int main ()
+{
+ C c;
+
+ /* We should not adjust a null pointer. */
+ if (Foo (&c))
+ return 1;
+ /* But we should adjust a (bogus) null reference. */
+ if (!&Bar (&c))
+ return 2;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant6.C
new file mode 100644
index 000000000..143b4ad36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/covariant6.C
@@ -0,0 +1,34 @@
+struct A
+{
+ virtual A* f();
+};
+
+struct B: virtual A
+{
+ virtual A* f();
+};
+
+struct C: B
+{
+ virtual C* f();
+};
+
+C* C::f() { return 0; }
+
+// When we emit C::f, we should emit both thunks: one for B and one for A.
+// { dg-final { scan-assembler "_ZTch0_v0_n16_N1C1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } }
+// { dg-final { scan-assembler "_ZTch0_v0_n32_N1C1fEv" { target { lp64 || { ia64-*-hpux* } } } } }
+// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N1C1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } }
+// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N1C1fEv" { target { lp64 || { ia64-*-hpux* } } } } }
+
+struct D: B
+{
+ virtual void dummy ();
+ virtual D* f();
+};
+
+void D::dummy() { }
+
+// When we emit the D vtable, it should refer to the thunk for B.
+// { dg-final { scan-assembler "_ZTch0_v0_n16_N1D1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } }
+// { dg-final { scan-assembler "_ZTch0_v0_n32_N1D1fEv" { target { lp64 || { ia64-*-hpux* } } } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/dcast1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/dcast1.C
new file mode 100644
index 000000000..99f678ff3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/dcast1.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9433. segfault at runtime.
+
+struct A { virtual void f() {} };
+struct B {int b;};
+struct C : A, B { virtual void f() {} int c;};
+struct D : C {int d;};
+struct E : C {int e;};
+struct F : protected D, E {int f;};
+struct H : virtual F {int h;};
+struct I : H {int i;};
+struct J : H {int j;};
+struct K : I, J { virtual void f() {} int k; };
+struct M : K {int m;};
+struct N : M {int n;};
+struct O : M {int o;};
+struct P : N, O { virtual void f() {} int p;};
+
+int main()
+{
+ P obj;
+ A* a1 = (D *) (&obj);
+ H* hp = dynamic_cast<H*>(a1);
+ return hp != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor1.C
new file mode 100644
index 000000000..f9425e013
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor1.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ virtual void a ();
+};
+
+struct B {
+ virtual ~B ();
+};
+
+struct C : public A, public B {
+ virtual void c ();
+};
+
+struct D : virtual public C {
+ virtual void d ();
+};
+
+void D::d () {}
+
+// { dg-final { scan-assembler _ZTv0_n20_N1DD1Ev } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor2.C
new file mode 100644
index 000000000..6b89cc8ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/dtor2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wabi -fabi-version=1" }
+
+struct A {
+ virtual void a ();
+};
+
+struct B {
+ virtual ~B ();
+};
+
+struct C : public A, public B { // { dg-warning "virtual" }
+ virtual void c ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty10.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty10.C
new file mode 100644
index 000000000..ae992944d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty10.C
@@ -0,0 +1,28 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0 -w" }
+
+struct E {};
+struct E2 : public E {};
+
+struct A {
+ int i;
+};
+
+struct B {
+ int j;
+};
+
+struct C :
+ public E,
+ public A,
+ public E2,
+ virtual public B {
+};
+
+C c;
+
+int main () {
+ if (((char*)(B*)&c - (char*)&c) != 8)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty11.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty11.C
new file mode 100644
index 000000000..b35363f5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty11.C
@@ -0,0 +1,19 @@
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+struct E {};
+struct E2 : public E {};
+struct E3 : public E, public E2 {};
+struct E4 : public E, public E2, public E3 { };
+struct E5 : public E, public E2, public E3, public E4 {};
+
+struct S : public virtual E5 {
+ E e;
+};
+
+S s;
+
+int main () {
+ if ((char*)(E4*)&s - (char*)&s == 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty4.C
new file mode 100644
index 000000000..d20a55cf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty4.C
@@ -0,0 +1,86 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Jul 2001 <nathan@codesourcery.com>
+
+// Bug 3820. We were bit copying empty bases including the
+// padding. Which clobbers whatever they overlay.
+
+struct Empty {};
+
+struct Inter : Empty {};
+
+long now = 0;
+
+struct NonPod
+{
+ long m;
+
+ NonPod () {m = 0x12345678;}
+ NonPod (long m_) {m = m_;}
+ NonPod &operator= (NonPod const &src) {now = m; m = src.m; return *this;}
+ NonPod (NonPod const &src) {m = src.m;}
+};
+
+struct A : Inter
+{
+ A (long c) {m = c;}
+
+ NonPod m;
+};
+
+struct B
+{
+ Inter empty;
+ NonPod m;
+
+ B (long c) {m = c;}
+};
+
+struct C : NonPod, Inter
+{
+ C (long c) : NonPod (c), Inter () {}
+};
+
+int main ()
+{
+ A a (0x12131415);
+
+ long was = a.m.m;
+
+ a = 0x22232425;
+
+ if (was != now)
+ return 1; // we copied the empty base which clobbered a.m.m's
+ // original value.
+
+ A b (0x32333435);
+ *(Inter *)&a = *(Inter *)&b;
+
+ if (a.m.m != 0x22232425)
+ return 2; // we copied padding, which clobbered a.m.m
+
+ A b2 (0x32333435);
+ (Inter &)b2 = Inter ();
+ if (b2.m.m != 0x32333435)
+ return 2; // we copied padding, which clobbered b2.m.m
+
+ B c (0x12131415);
+ was = c.m.m;
+ c = 0x22232425;
+ if (was != now)
+ return 3;
+
+ B d (0x32333435);
+ c.empty = d.empty;
+
+ if (c.m.m != 0x22232425)
+ return 4;
+
+ C e (0x32333435);
+
+ if (e.m != 0x32333435)
+ return 2; // we copied padding
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty5.C
new file mode 100644
index 000000000..c3717727e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty5.C
@@ -0,0 +1,17 @@
+// { dg-options "-fabi-version=0" }
+
+struct A {};
+
+struct B {
+ A a;
+ virtual void f () {}
+};
+
+struct C : public B, public A {};
+
+C c;
+
+int main () {
+ if ((void*) (A*) &c != &c)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty6.C
new file mode 100644
index 000000000..1b14a6d03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty6.C
@@ -0,0 +1,14 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+struct A {};
+
+struct B {
+ A a; // { dg-warning "empty" "" { xfail mmix-*-* } }
+ virtual void f () {}
+} __attribute__((aligned(2 * sizeof (void *))));
+/* The preceding attribute is necessary on targets with
+ BIGGEST_ALIGNMENT <= POINTER_SIZE to trigger the warning, as
+ otherwise the offset of 'a' (i.e. POINTER_SIZE) is split into a
+ non-zero DECL_FIELD_OFFSET and a zero DECL_FIELD_BIT_OFFSET,
+ and then there is no discrepancy between DECL_FIELD_OFFSET and
+ byte_position to warn about. */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty7.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty7.C
new file mode 100644
index 000000000..0a665a845
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty7.C
@@ -0,0 +1,19 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0" }
+
+struct S1 {};
+struct S2 { virtual void f () {} S1 s1[4]; };
+struct S3 : virtual public S2 {};
+struct S4 : virtual public S2 { int i; };
+struct S5 : public S3, virtual public S4 {};
+struct S6 { S5 s5; };
+struct S7 { S1 s1[5]; };
+struct S8 : public S1, public S6, virtual public S7 { };
+
+S8 s8;
+
+int main () {
+ if ((char *)(S7 *)&s8 - (char *)&s8 != 24)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty8.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty8.C
new file mode 100644
index 000000000..a5287b15f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty8.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-fabi-version=0" }
+
+struct E1 {};
+struct E2 : public E1 {};
+struct S1 { int i; };
+struct S2 : public S1, E2 {};
+
+S2 s2;
+
+int main () {
+ if ((char *)(E2*) &s2 != (char *)&s2)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/empty9.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty9.C
new file mode 100644
index 000000000..06e616adb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/empty9.C
@@ -0,0 +1,17 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-w -fabi-version=0" }
+
+struct E1 {};
+struct E2 : public E1 {
+ virtual void f ();
+};
+struct E3 : virtual public E1 {
+};
+struct S : public E2, virtual public E3 {
+};
+
+int main () {
+ if (sizeof (S) != 12)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/enum1.C
new file mode 100644
index 000000000..32e52fe0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/enum1.C
@@ -0,0 +1,16 @@
+// { dg-do run }
+
+#include <cstdlib>
+
+enum foo
+{
+ foo1 = 0,
+ foo2 = 0xffffffffffffffffULL,
+ foo3 = 0xf0fffffffffffffeULL
+};
+
+int main ()
+{
+ if (sizeof (enum foo) != sizeof (unsigned long long))
+ std::abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/forced.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/forced.C
new file mode 100644
index 000000000..0e6be28bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/forced.C
@@ -0,0 +1,24 @@
+// { dg-do run { target *-*-linux* *-*-gnu* } }
+// { dg-options "-pthread" }
+
+#include <pthread.h>
+#include <cxxabi.h>
+extern "C" int printf (const char *, ...);
+
+int main()
+{
+ try
+ {
+ pthread_exit (0);
+ }
+ catch (abi::__forced_unwind &)
+ {
+ printf ("caught forced unwind\n");
+ throw;
+ }
+ catch (...)
+ {
+ printf ("caught ...\n");
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/guard1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard1.C
new file mode 100644
index 000000000..76b43d30f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard1.C
@@ -0,0 +1,10 @@
+// PR c++/41611
+// { dg-final { scan-assembler-not "_ZGVZN1A1fEvE1i" } }
+
+struct A {
+ static int f()
+ {
+ static int &i = *new int();
+ return i;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/guard2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard2.C
new file mode 100644
index 000000000..c35fa7e1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard2.C
@@ -0,0 +1,16 @@
+// PR c++/41611
+// Test that the guard gets its own COMDAT group.
+// { dg-final { scan-assembler "_ZGVZN1A1fEvE1i,comdat" { target *-*-linux* *-*-gnu* } } }
+
+struct A {
+ static int f()
+ {
+ static int &i = *new int();
+ return i;
+ }
+};
+
+int main()
+{
+ return A::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/guard3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard3.C
new file mode 100644
index 000000000..fd9d00e27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/guard3.C
@@ -0,0 +1,14 @@
+// PR c++/45603
+
+extern "C" int __cxa_guard_acquire();
+
+struct A
+{
+ ~A();
+};
+
+A* f()
+{
+ static A a;
+ return &a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/inline1.C
new file mode 100644
index 000000000..97082aa73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/inline1.C
@@ -0,0 +1,6 @@
+struct S {
+ S() {}
+ virtual void g() {}
+};
+
+// { dg-final { scan-assembler-not "_ZTV1S" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/key1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/key1.C
new file mode 100644
index 000000000..6c0380926
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/key1.C
@@ -0,0 +1,26 @@
+// On ARM EABI platforms, key methods may never be inline.
+// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } }
+// { dg-final { scan-assembler-not _ZTV1S } }
+// { dg-final { scan-assembler-not _ZTV1T } }
+// { dg-final { scan-assembler _ZTV1U } }
+
+struct S {
+ virtual void f();
+};
+
+inline void S::f() {}
+
+struct T {
+ virtual void g();
+ virtual void h();
+};
+
+inline void T::g() {}
+
+struct U {
+ virtual void i();
+ virtual void j();
+};
+
+inline void U::i() {}
+void U::j () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/key2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/key2.C
new file mode 100644
index 000000000..0d1347aaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/key2.C
@@ -0,0 +1,16 @@
+// On Darwin, key methods that are inline result in comdat style things. */
+// PR darwin/25908
+
+// { dg-do compile { target *-*-darwin* } }
+// { dg-final { scan-assembler ".globl __ZTV1f\\n .weak_definition __ZTV1f(\\n .section __DATA,__const_coal,coalesced)?\\n .align" } }
+// { dg-final { scan-assembler ".globl __ZTS1f\\n .weak_definition __ZTS1f\\n .section __TEXT,__const_coal,coalesced" } }
+// { dg-final { scan-assembler ".globl __ZTI1f\\n .weak_definition __ZTI1f(\\n .section __DATA,__const_coal,coalesced)?\\n .align" } }
+
+class f
+{
+ virtual void g();
+ virtual void h();
+} c;
+inline void f::g() {}
+int sub(void)
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/layout1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout1.C
new file mode 100644
index 000000000..645ed6acf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout1.C
@@ -0,0 +1,31 @@
+// Red Hat bugzilla 64535
+// Bug: We are allocationg stuff into the tail padding of POD class "A".
+// { dg-do run }
+
+struct A
+{
+ int x;
+ char y;
+};
+
+struct B : public A {
+ virtual void f () {}
+ char z;
+};
+
+A a = { 21, 42 };
+B b;
+
+int
+main (void)
+{
+ b.x = 12;
+ b.y = 24;
+ b.z = 36;
+
+ A *ap = &b;
+
+ *ap = a;
+
+ return (b.z != 36);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/layout2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout2.C
new file mode 100644
index 000000000..fb4e1e5d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout2.C
@@ -0,0 +1,33 @@
+// Red Hat bugzilla 65210
+// { dg-do run }
+
+struct A {
+ int a;
+};
+
+struct B : public virtual A {};
+
+struct C {
+ long double c;
+};
+
+struct D : public virtual C {
+ int d;
+};
+
+struct E : public B, public D {
+ int e;
+};
+
+E e;
+
+/* The layout of E should begin with the B-in-E vtable pointer, followed by
+ the D-in-E vtable pointer. The bug was that we used to pad out the D
+ fields for long double alignment. */
+
+int main ()
+{
+ D* dp = &e;
+ unsigned long d_offset = ((char*)dp) - ((char*) &e);
+ return (d_offset != sizeof(void *));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/layout3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout3.C
new file mode 100644
index 000000000..a30a85219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout3.C
@@ -0,0 +1,27 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0 -w" }
+
+struct S {
+ virtual void f() {}
+};
+
+struct T : virtual public S { };
+
+struct U : public S, virtual public T {
+ char c[100];
+};
+
+struct V : public U, virtual public S {};
+
+struct W : public V {
+ int i;
+};
+
+int main () {
+ W w;
+
+ if ((char*) &w.i - (char *) &w != 104)
+ return 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/layout4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout4.C
new file mode 100644
index 000000000..da3c2f5d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/layout4.C
@@ -0,0 +1,19 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=1" }
+
+struct C4
+{
+ int b:30;
+ C4(){};
+};
+
+struct C1: virtual C4
+{
+ int i;
+};
+
+int main() {
+ if (sizeof (C1) != 12)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/local1-a.cc b/gcc-4.9/gcc/testsuite/g++.dg/abi/local1-a.cc
new file mode 100644
index 000000000..638479e74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/local1-a.cc
@@ -0,0 +1,14 @@
+struct B {
+ virtual void b() {}
+};
+
+static B* f() {
+ struct D : public B {
+ };
+
+ return new D;
+}
+
+B* g() {
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/local1.C
new file mode 100644
index 000000000..518193c89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/local1.C
@@ -0,0 +1,22 @@
+// { dg-do run }
+// { dg-additional-sources "local1-a.cc" }
+
+#include <typeinfo>
+
+struct B {
+ virtual void b() {}
+};
+
+static B* f() {
+ struct D : public B {
+ };
+
+ return new D;
+}
+
+extern B* g();
+
+int main () {
+ if (typeid (*f()) == typeid (*g()))
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/local2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/local2.C
new file mode 100644
index 000000000..f56701610
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/local2.C
@@ -0,0 +1,17 @@
+// PR c++/42010
+// { dg-final { scan-assembler "ZZN1A1fEvE1s" } }
+
+struct A {
+ static int f()
+ {
+ static struct {
+ int i;
+ } s;
+ return s.i;
+ }
+};
+
+int main()
+{
+ return A::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/macro0.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro0.C
new file mode 100644
index 000000000..6c391e689
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro0.C
@@ -0,0 +1,5 @@
+// { dg-options "-fabi-version=0" }
+
+#if __GXX_ABI_VERSION != 999999
+#error "Incorrect value of __GXX_ABI_VERSION"
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/macro1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro1.C
new file mode 100644
index 000000000..871208da3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro1.C
@@ -0,0 +1,5 @@
+// { dg-options "-fabi-version=1" }
+
+#if __GXX_ABI_VERSION != 102
+#error "Incorrect value of __GXX_ABI_VERSION"
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/macro2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro2.C
new file mode 100644
index 000000000..9f0af9cff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/macro2.C
@@ -0,0 +1,5 @@
+// { dg-options "-fabi-version=2" }
+
+#if __GXX_ABI_VERSION != 1002
+#error "Incorrect value of __GXX_ABI_VERSION"
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/main.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/main.C
new file mode 100644
index 000000000..4c5f1ea21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/main.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+/* Check if entry points get implicit C linkage. If they don't, compiler will
+ * error on incompatible declarations */
+
+int main();
+extern "C" int main();
+
+#ifdef __MINGW32__
+
+int wmain();
+extern "C" int wmain();
+
+int DllMain();
+extern "C" int DllMain();
+
+int WinMain();
+extern "C" int WinMain();
+
+int wWinMain();
+extern "C" int wWinMain();
+
+#endif
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon-aarch64.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon-aarch64.C
new file mode 100644
index 000000000..09540e841
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon-aarch64.C
@@ -0,0 +1,55 @@
+// Test that AArch64 AdvSIMD (NEON) vector types have their names mangled
+// correctly.
+
+// { dg-do compile { target { aarch64*-*-* } } }
+
+#include <arm_neon.h>
+
+void f0 (int8x8_t a) {}
+void f1 (int16x4_t a) {}
+void f2 (int32x2_t a) {}
+void f3 (uint8x8_t a) {}
+void f4 (uint16x4_t a) {}
+void f5 (uint32x2_t a) {}
+void f6 (float32x2_t a) {}
+void f7 (poly8x8_t a) {}
+void f8 (poly16x4_t a) {}
+
+void f9 (int8x16_t a) {}
+void f10 (int16x8_t a) {}
+void f11 (int32x4_t a) {}
+void f12 (int64x2_t a) {}
+void f13 (uint8x16_t a) {}
+void f14 (uint16x8_t a) {}
+void f15 (uint32x4_t a) {}
+void f16 (uint64x2_t a) {}
+void f17 (float32x4_t a) {}
+void f18 (float64x2_t a) {}
+void f19 (poly8x16_t a) {}
+void f20 (poly16x8_t a) {}
+
+void f21 (int8x16_t, int8x16_t) {}
+
+
+// { dg-final { scan-assembler "_Z2f010__Int8x8_t:" } }
+// { dg-final { scan-assembler "_Z2f111__Int16x4_t:" } }
+// { dg-final { scan-assembler "_Z2f211__Int32x2_t:" } }
+// { dg-final { scan-assembler "_Z2f311__Uint8x8_t:" } }
+// { dg-final { scan-assembler "_Z2f412__Uint16x4_t:" } }
+// { dg-final { scan-assembler "_Z2f512__Uint32x2_t:" } }
+// { dg-final { scan-assembler "_Z2f613__Float32x2_t:" } }
+// { dg-final { scan-assembler "_Z2f711__Poly8x8_t:" } }
+// { dg-final { scan-assembler "_Z2f812__Poly16x4_t:" } }
+// { dg-final { scan-assembler "_Z2f911__Int8x16_t:" } }
+// { dg-final { scan-assembler "_Z3f1011__Int16x8_t:" } }
+// { dg-final { scan-assembler "_Z3f1111__Int32x4_t:" } }
+// { dg-final { scan-assembler "_Z3f1211__Int64x2_t:" } }
+// { dg-final { scan-assembler "_Z3f1312__Uint8x16_t:" } }
+// { dg-final { scan-assembler "_Z3f1412__Uint16x8_t:" } }
+// { dg-final { scan-assembler "_Z3f1512__Uint32x4_t:" } }
+// { dg-final { scan-assembler "_Z3f1612__Uint64x2_t:" } }
+// { dg-final { scan-assembler "_Z3f1713__Float32x4_t:" } }
+// { dg-final { scan-assembler "_Z3f1813__Float64x2_t:" } }
+// { dg-final { scan-assembler "_Z3f1912__Poly8x16_t:" } }
+// { dg-final { scan-assembler "_Z3f2012__Poly16x8_t:" } }
+// { dg-final { scan-assembler "_Z3f2111__Int8x16_tS_:" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon.C
new file mode 100644
index 000000000..af1fe49f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle-neon.C
@@ -0,0 +1,49 @@
+// Test that ARM NEON vector types have their names mangled correctly.
+
+// { dg-do compile }
+// { dg-require-effective-target arm_neon_ok }
+// { dg-add-options arm_neon }
+
+#include <arm_neon.h>
+
+void f0 (int8x8_t a) {}
+void f1 (int16x4_t a) {}
+void f2 (int32x2_t a) {}
+void f3 (uint8x8_t a) {}
+void f4 (uint16x4_t a) {}
+void f5 (uint32x2_t a) {}
+void f6 (float32x2_t a) {}
+void f7 (poly8x8_t a) {}
+void f8 (poly16x4_t a) {}
+
+void f9 (int8x16_t a) {}
+void f10 (int16x8_t a) {}
+void f11 (int32x4_t a) {}
+void f12 (uint8x16_t a) {}
+void f13 (uint16x8_t a) {}
+void f14 (uint32x4_t a) {}
+void f15 (float32x4_t a) {}
+void f16 (poly8x16_t a) {}
+void f17 (poly16x8_t a) {}
+
+void f18 (int8x16_t, int8x16_t) {}
+
+// { dg-final { scan-assembler "_Z2f015__simd64_int8_t:" } }
+// { dg-final { scan-assembler "_Z2f116__simd64_int16_t:" } }
+// { dg-final { scan-assembler "_Z2f216__simd64_int32_t:" } }
+// { dg-final { scan-assembler "_Z2f316__simd64_uint8_t:" } }
+// { dg-final { scan-assembler "_Z2f417__simd64_uint16_t:" } }
+// { dg-final { scan-assembler "_Z2f517__simd64_uint32_t:" } }
+// { dg-final { scan-assembler "_Z2f618__simd64_float32_t:" } }
+// { dg-final { scan-assembler "_Z2f716__simd64_poly8_t:" } }
+// { dg-final { scan-assembler "_Z2f817__simd64_poly16_t:" } }
+// { dg-final { scan-assembler "_Z2f916__simd128_int8_t:" } }
+// { dg-final { scan-assembler "_Z3f1017__simd128_int16_t:" } }
+// { dg-final { scan-assembler "_Z3f1117__simd128_int32_t:" } }
+// { dg-final { scan-assembler "_Z3f1217__simd128_uint8_t:" } }
+// { dg-final { scan-assembler "_Z3f1318__simd128_uint16_t:" } }
+// { dg-final { scan-assembler "_Z3f1418__simd128_uint32_t:" } }
+// { dg-final { scan-assembler "_Z3f1519__simd128_float32_t:" } }
+// { dg-final { scan-assembler "_Z3f1617__simd128_poly8_t:" } }
+// { dg-final { scan-assembler "_Z3f1718__simd128_poly16_t:" } }
+// { dg-final { scan-assembler "_Z3f1816__simd128_int8_tS_:" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle1.C
new file mode 100644
index 000000000..ab377d13b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle1.C
@@ -0,0 +1,28 @@
+// Test for mangling of simple testcase involving construction vtables.
+
+// { dg-do compile }
+// { dg-options "-fno-inline" }
+
+struct A {
+ virtual void f () { }
+};
+
+struct B: public virtual A { };
+struct C: public B { };
+
+C c;
+
+// { dg-final { scan-assembler "\n_?_ZN1A1fEv\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZN1AC2Ev\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZN1BC2Ev\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZN1CC1Ev\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTC1C0_1B\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTI1A\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTI1B\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTI1C\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTS1A\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTS1B\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTS1C\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTT1C\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTV1A\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_ZTV1C\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle10.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle10.C
new file mode 100644
index 000000000..d5782ba6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle10.C
@@ -0,0 +1,13 @@
+// { dg-options "-fabi-version=0" }
+
+template <template <typename> class Q>
+void f (typename Q<int>::X) {}
+
+template <typename Q>
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int);
+
+// { dg-final { scan-assembler _Z1fI1SEvNT_IiE1XE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle11.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle11.C
new file mode 100644
index 000000000..722d43c85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle11.C
@@ -0,0 +1,10 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+template <typename Q>
+void f (typename Q::X) {} // { dg-warning "mangle" }
+
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle12.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle12.C
new file mode 100644
index 000000000..92f49c22f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle12.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+template <template <typename> class Q>
+void f (typename Q<int>::X) {} // { dg-warning "mangle" }
+
+template <typename Q>
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle13.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle13.C
new file mode 100644
index 000000000..716c4c36f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle13.C
@@ -0,0 +1,28 @@
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ template <typename T> int f ();
+ int operator+();
+ operator int ();
+ template <typename T>
+ int operator-();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+template <typename T> void g (S<&T::template f<int> >) {}
+template <typename T> void g (S<&T::operator+ >) {}
+template <typename T> void g (S<&T::operator int>) {}
+template <typename T> void g (S<&T::template operator- <double> >) {}
+
+template void g<A> (S<&A::f<int> >);
+template void g<A> (S<&A::operator+>);
+template void g<A> (S<&A::operator int>);
+template void g<A> (S<&A::operator-<double> >);
+
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_1fIiEEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_plEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_cviEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_miIdEEE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle14.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle14.C
new file mode 100644
index 000000000..2b38255ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle14.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Wabi -fabi-version=1" }
+// { dg-final { scan-assembler "_Z1g1SIXadsr1ANS0_1fIiEEivEE" } }
+
+struct A {
+ template <typename T> int f ();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+void g (S<&A::f<int> >) {} // { dg-warning "mangle" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle15.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle15.C
new file mode 100644
index 000000000..3c112e263
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle15.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ template <typename T> int f ();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+void g (S<&A::f<int> >) {}
+
+// { dg-final { scan-assembler _Z1g1SIXadL_ZN1A1fIiEEivEEE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle16.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle16.C
new file mode 100644
index 000000000..1f3039f86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle16.C
@@ -0,0 +1,18 @@
+// { dg-options "-fabi-version=0" }
+
+enum E { e = 3 };
+
+template <int I> struct S {};
+
+template <int I> void f (S<e + 1>) {}
+template void f<7>(S<e + 1>);
+
+template <int I> void g (S<e>) {}
+template void g<7>(S<e>);
+
+template <int I> void h (S<I + 1>) {}
+template void h<7>(S<7 + 1>);
+
+// { dg-final { scan-assembler _Z1fILi7EEv1SILi4EE } }
+// { dg-final { scan-assembler _Z1gILi7EEv1SILi3EE } }
+// { dg-final { scan-assembler _Z1hILi7EEv1SIXplT_Li1EEE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle17.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle17.C
new file mode 100644
index 000000000..f98e2717d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle17.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+enum E { e = 3 };
+
+template <int I> struct S {};
+
+template <int I> void f (S<I + e + int (3.7)>) {} // { dg-warning "mangle" }
+template void f<7>(S<7 + e + int (3.7)>); // { dg-message "required" }
+
+template <int I> void g (S<I + e + int (3.7)>) {} // { dg-warning "mangle" }
+template void g<7>(S<7 + e + int (3.7)>); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-1.C
new file mode 100644
index 000000000..a1be5e48c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-1.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2003 <nathan@codesourcery.com>
+
+// PR 13241
+// mangled template arguments that are external objects incorrectly
+
+extern "C" void Foo ();
+namespace NMS
+{
+ extern "C" int V;
+}
+
+template <void (*)()> struct S {};
+template <int *> struct T {};
+
+void f (S<Foo>){}
+// { dg-final { scan-assembler "\n_?_Z1f1SIXadL_Z3FooEEE\[: \t\n\]" } }
+
+void g (T<&NMS::V>){}
+// { dg-final { scan-assembler "\n_?_Z1g1TIXadL_Z1VEEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-2.C
new file mode 100644
index 000000000..a231d495f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle18-2.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1 -Wabi" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2003 <nathan@codesourcery.com>
+
+// PR 13241
+// mangled template arguments that are external objects incorrectly
+
+extern "C" void Foo ();
+namespace NMS
+{
+ extern "C" int V;
+}
+
+template <void (*)()> struct S {};
+template <int *> struct T {};
+
+void f (S<Foo>){} // { dg-warning "mangled name" }
+// { dg-final { scan-assembler "\n_?_Z1f1SIXadL3FooEEE\[: \t\n\]" } }
+
+void g (T<&NMS::V>){} // { dg-warning "mangled name" }
+// { dg-final { scan-assembler "\n_?_Z1g1TIXadL_ZN3NMS1VEEEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-1.C
new file mode 100644
index 000000000..1463d03f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2 -Wno-abi" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
+
+// PR 13242
+// mangled template arguments that are external objects incorrectly
+
+extern int N;
+template <int &> struct S {};
+void n (S<N>) {}
+// { dg-final { scan-assembler "\n_?_Z1n1SILZ1NEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-2.C
new file mode 100644
index 000000000..f0855e69d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle19-2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1 -Wabi" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
+
+// PR 13242
+// mangled template arguments that are external objects incorrectly
+
+extern int N;
+template <int &> struct S {};
+void n (S<N>) {} // { dg-warning "mangled name" }
+// { dg-final { scan-assembler "\n_?_Z1n1SIXadL_Z1NEEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle2.C
new file mode 100644
index 000000000..e8b5f409d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle2.C
@@ -0,0 +1,19 @@
+// Test that we handle mangling of statics in inlines properly.
+// { dg-options -fno-weak }
+// { dg-do run }
+
+inline int f ()
+{
+ static int nested;
+ nested = 24;
+ {
+ static int nested;
+ nested = 42;
+ }
+ return (nested != 24);
+}
+
+int main()
+{
+ return f ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-1.C
new file mode 100644
index 000000000..1985fe3c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-1.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
+
+// PR 9043
+// mangled array types in templates
+
+template <int I> void f(int (*)[2]) {}
+template <int I> void g(int (*)[I+2]) {}
+
+static const int I=1;
+static const int J=2;
+
+template void f<1>(int (*)[2]);
+// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_i\[: \t\n\]" } }
+template void g<1>(int (*)[3]);
+// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_i\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-2.C
new file mode 100644
index 000000000..5ba6bac03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle20-2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1 -Wabi" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
+
+// PR 9043
+// mangled array types in templates
+
+template <int I> void f(int (*)[2]) {} // { dg-warning "mangled name" }
+template <int I> void g(int (*)[I+2]) {}
+
+template void f<1>(int (*)[2]); // { dg-message "required" }
+// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPALi2E_i\[: \t\n\]" } }
+template void g<1>(int (*)[3]);
+// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_i\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle21.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle21.C
new file mode 100644
index 000000000..f457d600c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle21.C
@@ -0,0 +1,13 @@
+// PR c++/14324
+// { dg-do assemble }
+
+extern "C" {
+
+void fun1(void)
+{
+ do { static int xyz __attribute__((unused)) = 1; } while (0);
+ do { static int xyz __attribute__((unused)) = 2; } while (0);
+ do { static int xyz __attribute__((unused)) = 3; } while (0);
+}
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle22.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle22.C
new file mode 100644
index 000000000..93ddd1e87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle22.C
@@ -0,0 +1,9 @@
+// PR c++/16240
+// { dg-options "-fabi-version=3" }
+
+void foo(char);
+template<void (&)(char)> struct CB {};
+
+void g(CB<foo> i) {}
+
+// { dg-final { scan-assembler "\n_?_Z1g2CBIL_Z3foocEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle23.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle23.C
new file mode 100644
index 000000000..f22347a04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle23.C
@@ -0,0 +1,9 @@
+// PR c++/16240
+// { dg-options "-fabi-version=2 -Wno-abi" }
+
+void foo(char);
+template<void (&)(char)> struct CB {};
+
+void g(CB<foo> i) {}
+
+// { dg-final { scan-assembler "\n_?_Z1g2CBILZ3foocEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle24.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle24.C
new file mode 100644
index 000000000..1f5c5c1c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle24.C
@@ -0,0 +1,12 @@
+// Test mangling of __float80.
+// The C++ ABI document says __float80 is mangled as "e". It
+// also says that "long double" is mangled as "e", so these conflict on
+// ia64-hpux where "long double" is "e" and __float80 is "u9__float80".
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile { target i?86-*-* x86_64-*-* ia64-*-* } }
+// { dg-options "" }
+// { dg-final { scan-assembler "_Z1fe" { target i?86-*-* x86_64-*-* } } }
+// { dg-final { scan-assembler "_Z1fe" { target { ia64-*-* && { ! "ia64-*-hpux*" } } } } }
+// { dg-final { scan-assembler "_Z1fu9__float80" { target ia64-*-hpux* } } }
+
+int f(__float80 x) { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle25.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle25.C
new file mode 100644
index 000000000..74397f778
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle25.C
@@ -0,0 +1,13 @@
+// Test mangling of __float128.
+// The C++ ABI document says __float128 is mangled as "g". It
+// also says that "long double" is mangled as "e", so these conflict on
+// ia64-hpux where "long double" is "e" and __float128 is synonymous with
+// "long double".
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile { target ia64-*-* i?86-*-* x86_64-*-* } }
+// { dg-options "" }
+// { dg-final { scan-assembler "_Z1fg" { target i?86-*-* x86_64-*-* } } }
+// { dg-final { scan-assembler "_Z1fg" { target { ia64-*-* && { ! "ia64-*-hpux*" } } } } }
+// { dg-final { scan-assembler "_Z1fe" { target ia64-*-hpux* } } }
+
+int f(__float128 x) { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle26.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle26.C
new file mode 100644
index 000000000..5d1609596
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle26.C
@@ -0,0 +1,14 @@
+// Test of std mangling
+
+// { dg-do compile }
+// { dg-options "-fno-inline" }
+
+namespace std {
+ struct A {
+ A() { }
+ };
+}
+
+std::A a;
+
+// { dg-final { scan-assembler "\n_?_ZNSt1AC\[12\]Ev\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle27.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle27.C
new file mode 100644
index 000000000..2d15abbf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle27.C
@@ -0,0 +1,14 @@
+// Test of std::basic_iostream<char, std::char_traits<char> > mangling
+
+// { dg-do compile }
+// { dg-options "-fno-inline" }
+
+namespace std {
+ template<typename> struct char_traits;
+
+ template<typename, typename> struct basic_iostream { basic_iostream(){} };
+}
+
+std::basic_iostream<char,std::char_traits<char> > s1;
+
+// { dg-final { scan-assembler "\n_?_ZNSdC\[12\]Ev\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle28.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle28.C
new file mode 100644
index 000000000..bea8ce019
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle28.C
@@ -0,0 +1,14 @@
+// Test of std::basic_istream<char, std::char_traits<char> > mangling
+
+// { dg-do compile }
+// { dg-options "-fno-inline" }
+
+namespace std {
+ template<typename> struct char_traits;
+
+ template<typename, typename> struct basic_istream { basic_istream(){} };
+}
+
+std::basic_istream<char,std::char_traits<char> > s1;
+
+// { dg-final { scan-assembler "\n_?_ZNSiC\[12\]Ev\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle29.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle29.C
new file mode 100644
index 000000000..aaff2b4eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle29.C
@@ -0,0 +1,14 @@
+// Test of std::basic_ostream<char, std::char_traits<char> > mangling
+
+// { dg-do compile }
+// { dg-options "-fno-inline" }
+
+namespace std {
+ template<typename> struct char_traits;
+
+ template<typename, typename> struct basic_ostream { basic_ostream(){} };
+}
+
+std::basic_ostream<char,std::char_traits<char> > s1;
+
+// { dg-final { scan-assembler "\n_?_ZNSoC\[12\]Ev\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3-2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3-2.C
new file mode 100644
index 000000000..ac85fb045
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3-2.C
@@ -0,0 +1,20 @@
+// Test mangling of type casts
+// { dg-options "-fabi-version=0" }
+// { dg-do compile }
+
+template<int i> class A {};
+template<bool b> class B {};
+
+template<int i> void f(A<i> &, B<bool(i)> &) {}
+template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {}
+
+int main()
+{
+ A<1> a;
+ B<true> b;
+ f(a, b);
+ g(a, b);
+}
+
+// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3.C
new file mode 100644
index 000000000..5f44f7677
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle3.C
@@ -0,0 +1,20 @@
+// Test mangling of type casts
+// { dg-options "-fabi-version=2" }
+// { dg-do compile }
+
+template<int i> class A {};
+template<bool b> class B {};
+
+template<int i> void f(A<i> &, B<bool(i)> &) {}
+template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {}
+
+int main()
+{
+ A<1> a;
+ B<true> b;
+ f(a, b);
+ g(a, b);
+}
+
+// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle30.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle30.C
new file mode 100644
index 000000000..f0b83dbe9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle30.C
@@ -0,0 +1,22 @@
+// Test for mangling of template args in a typename type.
+
+struct A
+{
+ template <class T>
+ struct B
+ {
+ typedef T myT;
+ };
+};
+
+struct C {};
+
+template <class T>
+void f (T t, typename T::template B<C>::myT u, typename T::template B<int>::myT v);
+
+int main()
+{
+ f (A(), C(), 1);
+}
+
+// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BI1CE3myTENS2_IiE3myTE" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle31.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle31.C
new file mode 100644
index 000000000..4be2e0b03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle31.C
@@ -0,0 +1,35 @@
+// PR c++/39095
+// { dg-do compile }
+
+struct B
+{
+ int b;
+};
+
+struct A
+{
+ B *operator->();
+ A ();
+ B b;
+};
+
+A::A ()
+{
+}
+
+B *
+A::operator->()
+{
+ return &b;
+}
+
+A a;
+
+int
+foo ()
+{
+ return a->b;
+}
+
+// { dg-final { scan-assembler "_ZN1AptEv" } }
+// { dg-final { scan-assembler-not "_ZN1AdtEv" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle32.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle32.C
new file mode 100644
index 000000000..6ae0113a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle32.C
@@ -0,0 +1,44 @@
+// Testcase for mangling of unnamed types.
+
+// namespace-scope unnamed types have no linkage, so we only test that they
+// are distinct.
+
+// { dg-do compile { target c++11 } }
+
+typedef struct { } *A;
+typedef struct { } *B;
+
+void f(A) { }
+void f(B) { }
+
+struct C
+{
+ typedef struct { }* D;
+ typedef enum { e }* E;
+};
+
+// { dg-final { scan-assembler "_Z2g1PN1CUt_E" } }
+void g1(C::D) { }
+// { dg-final { scan-assembler "_Z2g2PN1CUt0_E" } }
+void g2(C::E) { }
+
+template <class T>
+void h1(T t) { }
+
+template <class T>
+void h2(T t) { }
+
+inline void j()
+{
+ typedef enum { f }* F;
+// { dg-final { scan-assembler "_Z2h1IPZ1jvEUt_EvT_" } }
+ h1(F());
+ typedef struct { }* G;
+// { dg-final { scan-assembler "_Z2h2IPZ1jvEUt0_EvT_" } }
+ h2(G());
+}
+
+int main()
+{
+ j();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle33.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle33.C
new file mode 100644
index 000000000..8c77f1f0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle33.C
@@ -0,0 +1,19 @@
+// Testcase for mangling very long names.
+
+#define N \
+abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm
+
+namespace N {
+ int i;
+}
+
+#undef N
+#define N \
+abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk
+
+namespace N {
+ int j;
+}
+
+// { dg-final { scan-assembler "_ZN4043(abcdefghijklmnopqrstuvwxyz){155}abcdefghijklm1iE" } }
+// { dg-final { scan-assembler "_ZN4041(abcdefghijklmnopqrstuvwxyz){155}abcdefghijk1jE" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle34.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle34.C
new file mode 100644
index 000000000..08c3bc0a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle34.C
@@ -0,0 +1,41 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40808
+// { dg-do compile }
+// This tests the mangling of empty template argument list in a template
+// id.
+// { dg-final { scan-assembler "_ZNK5DummyclI3GenEENT_3SigIE10ResultTypeERKS2_" } }
+
+
+struct Void {};
+
+template <class R> struct FunType {
+ typedef R ResultType;
+};
+
+struct WrongNumberOfSigArgs {};
+
+template <typename R> struct CFunType {
+ template <class Dummy1=Void, class Dummy2=Void> struct Sig : public
+FunType<WrongNumberOfSigArgs> {};
+ template <class Dummy> struct Sig<Void,Dummy> : public FunType<R> {};
+};
+
+struct Dummy {
+ template <typename F> typename F::template Sig<>::ResultType operator()(F
+const& f) const {
+ return typename F::template Sig<>::ResultType(0);
+ }
+};
+
+struct Gen: public CFunType<int> {
+ int operator()() const {return 0;}
+ Gen() {}
+};
+
+int myfunction() {
+ return Dummy()(Gen());
+}
+
+int main() {
+ myfunction();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle35.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle35.C
new file mode 100644
index 000000000..78d993344
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle35.C
@@ -0,0 +1,13 @@
+// PR c++/38600
+// { dg-final { scan-assembler "_Z3barIiE1AIX3fooIT_EEEv" } }
+
+template<void (*)()> struct A {};
+
+template<typename> void foo();
+
+template<typename T> A<foo<T> > bar();
+
+void baz()
+{
+ bar<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle36.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle36.C
new file mode 100644
index 000000000..aaace6570
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle36.C
@@ -0,0 +1,9 @@
+// PR c++/41959
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-mavx -fabi-version=4" }
+// { dg-final { scan-assembler "_Z1fDv4_f" } }
+// { dg-final { scan-assembler "_Z1fDv8_f" } }
+
+#include <x86intrin.h>
+void f(__m128) { }
+void f(__m256) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle37.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle37.C
new file mode 100644
index 000000000..691566b38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle37.C
@@ -0,0 +1,35 @@
+// Testcase for mangling of expressions involving operator names.
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_Z1fI1AEDTclonplfp_fp_EET_" } }
+// { dg-final { scan-assembler "_Z1gI1AEDTclonplIT_Efp_fp_EES1_" } }
+// { dg-final { scan-assembler "_Z1hI1AEDTcldtfp_miEET_" } }
+// { dg-final { scan-assembler "_Z1iI1AEDTcldtfp_srT_miEES1_" } }
+// { dg-final { scan-assembler "_Z1jI1AEDTcldtfp_cvPT_EES1_" } }
+
+struct A {
+ void operator-();
+ template <class T>
+ operator T();
+};
+template <class T>
+T operator+(T,T);
+
+template <class T>
+auto f (T t) -> decltype(operator+(t,t));
+template <class T>
+auto g (T t) -> decltype(operator+<T>(t,t));
+template <class T>
+auto h (T t) -> decltype(t.operator-());
+template <class T>
+auto i (T t) -> decltype(t.T::operator-());
+template <class T>
+auto j (T t) -> decltype(t.operator T*());
+
+int main()
+{
+ f(A());
+ g(A());
+ h(A());
+ i(A());
+ j(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle39.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle39.C
new file mode 100644
index 000000000..a36f98127
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle39.C
@@ -0,0 +1,29 @@
+// PR c++/42338
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5" }
+// { dg-final { scan-assembler "_Z1fIPiEDTcmppfp_Li0EET_" } }
+// { dg-final { scan-assembler "_Z1gIiEvRK1AIT_EDTixfL0p_Li0EE" } }
+
+template<typename T>
+auto f(T t) -> decltype(++t, 0)
+{
+ ++t;
+ return 0;
+}
+
+template <class T>
+struct A
+{
+ T operator[](int) const { return 0; }
+};
+
+template< typename T >
+void g(const A<T> &a, decltype(a[0]) t) { }
+
+int main()
+{
+ f((int*)0);
+
+ A<int> a;
+ g(a,1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle40.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle40.C
new file mode 100644
index 000000000..2b8300bff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle40.C
@@ -0,0 +1,28 @@
+// PR c++/12909
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-weak "" }
+// { dg-require-alias "" }
+// { dg-options "-mavx -Wabi -fabi-version=2" }
+// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z1fIDv4_fEvT_" } }
+// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z1fIU8__vectorfEvT_" } }
+// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_ZN1AIDv4_fE1tE" } }
+// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_ZN1AIU8__vectorfE1tE" } }
+
+#include <x86intrin.h>
+
+template <class T>
+struct A
+{
+ static T t;
+};
+
+template <class T>
+T A<T>::t; // { dg-warning "mangled name" }
+
+template <class T>
+void f (T t) { } // { dg-warning "mangled name" }
+
+int main()
+{
+ f (A<__m128>::t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle41.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle41.C
new file mode 100644
index 000000000..4c0d0038e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle41.C
@@ -0,0 +1,8 @@
+// PR c++/41959
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-mavx -fabi-version=2" }
+
+#include <x86intrin.h>
+void f(__m128) { } // { dg-message "previous declaration" }
+void f(__m256) { } // { dg-error "conflicts" }
+// { dg-message "mangling" "" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle42.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle42.C
new file mode 100644
index 000000000..c7cce5e7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle42.C
@@ -0,0 +1,16 @@
+// Origin: PR c++/43375
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target c++11 }
+// { dg-options "-msse2" }
+// { dg-require-effective-target sse2 }
+
+typedef float __v4sf __attribute__ ((__vector_size__ (16)));
+typedef int __v4si __attribute__ ((__vector_size__ (16)));
+__v4sf my_asin(__v4sf x)
+{
+ static const __v4si g_Mask{0x7fffffff,
+ 0x00000000,
+ 0x7fffffff,
+ 0x7fffffff };
+ return __builtin_ia32_andnps ((__v4sf) g_Mask, x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle43.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle43.C
new file mode 100644
index 000000000..4dfa425f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle43.C
@@ -0,0 +1,43 @@
+// { dg-do compile { target int128 } }
+// { dg-options "" }
+
+struct S {
+ S(void) { m_i128 = 0; m_u128 = 0; }
+ ~S(void) { }
+ __int128 get1 (void) { return m_i128; }
+ unsigned __int128 get2 (void) { return m_u128; }
+ void set1 (__int128 i) { m_i128 = i; }
+ void set2 (unsigned int i) { m_u128 = 1; }
+ __int128 m_i128;
+ unsigned __int128 m_u128;
+};
+
+struct S glb;
+
+__int128 fo1 (void) { return glb.get1 (); }
+unsigned __int128 fo2 (void) { return glb.get2 (); }
+__int128 fo3 (__int128 i) { __int128 v = fo1 (); glb.set1 (i); return v; }
+unsigned __int128 fo4 (unsigned __int128 i)
+{
+ unsigned __int128 v = fo2 (); glb.set2 (i);
+ return v;
+}
+
+__int128 fo5 (__int128 i)
+{
+ return fo3 (i);
+}
+
+__int128 fo5 (unsigned __int128 i)
+{
+ return (__int128) fo4 (i);
+}
+
+
+// { dg-final { scan-assembler "\n_?_Z3fo1v\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z3fo2v\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z3fo3n\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z3fo4o\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z3fo5n\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z3fo5o\[: \t\n\]" } }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle44.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle44.C
new file mode 100644
index 000000000..845414842
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle44.C
@@ -0,0 +1,19 @@
+// PR c++/45008
+
+template <typename T>
+struct A
+{
+ void fn1 () {
+ struct Nested {
+ static void fn2 () { }
+ };
+ Nested::fn2();
+ }
+};
+
+void fn3 () {
+ A<double> a;
+ a.fn1();
+}
+
+// { dg-final { scan-assembler-not "_ZZN1AIT_E3fn1EvEN6Nested3fn2Ev" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle45.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle45.C
new file mode 100644
index 000000000..5e202a2f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle45.C
@@ -0,0 +1,26 @@
+// Testcase for mangling of parameters used other than in a trailing return type
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5" }
+
+template<class T> void f(T p, decltype(p)) { } // L = 1
+template<class T> void g(T p, decltype(p) (*)()) { } // L = 1
+// G++ incorrectly rejects these currently.
+// template<class T> void h(T p, auto (*)()->decltype(p)); // L = 1
+// template<class T> void i(T p, auto (*)(T q)->decltype(q)); // L = 0
+// template<class T> void j(T p, auto (*)(decltype(p))->T); // L = 2
+template<class T> void k(T p, int (*(*)(T* p))[sizeof(p)]) {} // L = 1
+
+int garg();
+int (*karg (int*))[sizeof(int)];
+int main()
+{
+ // { dg-final { scan-assembler "_Z1fIiEvT_DtfL0p_E" } }
+ f (1,0);
+ // { dg-final { scan-assembler "_Z1gIiEvT_PFDtfL0p_EvE" } }
+ g (1,garg);
+ // h (1,0);
+ // i (1,0);
+ // j (1,0);
+ // { dg-final { scan-assembler "_Z1kIiEvT_PFPAszfL0p__iPS0_E" } }
+ k (1,karg);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle46.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle46.C
new file mode 100644
index 000000000..fddc88d0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle46.C
@@ -0,0 +1,15 @@
+// PR c++/48008
+// { dg-options -fabi-version=5 }
+// Test that we retain function-cv-quals in template argument mangling.
+
+template <class T>
+struct A
+{ };
+
+typedef void cfn(int) const;
+typedef void fn(int);
+
+// { dg-final { scan-assembler "_Z1f1AIFviEE" } }
+void f(A<fn>) { }
+// { dg-final { scan-assembler "_Z1f1AIKFviEE" } }
+void f(A<cfn>) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle47.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle47.C
new file mode 100644
index 000000000..3bb5e9ab7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle47.C
@@ -0,0 +1,11 @@
+// PR c++/47132
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_Z1fIiEDToRfp_Li1EET_" } }
+
+template <typename T>
+auto f (T t) -> decltype(t |= 1);
+
+int main()
+{
+ f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle48.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle48.C
new file mode 100644
index 000000000..f9afa1ad0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle48.C
@@ -0,0 +1,29 @@
+// Testcase for 'this' mangling
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ template <class U> U f();
+};
+
+struct A
+{
+ B b;
+ // { dg-final { scan-assembler "_ZN1A1fIiEEDTcldtdtdefpT1b1fIT_EEEv" } }
+ template <class U> auto f() -> decltype (b.f<U>());
+ // { dg-final { scan-assembler "_ZN1A1gIiEEDTcldtptfpT1b1fIT_EEEv" } }
+ template <class U> auto g() -> decltype (this->b.f<U>());
+ // { dg-final { scan-assembler "_ZN1A1hIiEEDTcldtdtdefpT1bsr1B1fIT_EEEv" } }
+ template <class U> auto h() -> decltype (b.B::f<U>());
+ // { dg-final { scan-assembler "_ZN1A1iIiEEDTcldtptfpT1bsr1B1fIT_EEEv" } }
+ template <class U> auto i() -> decltype (this->b.B::f<U>());
+};
+
+int main()
+{
+ A a;
+ a.f<int>();
+ a.g<int>();
+ a.h<int>();
+ a.i<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle49.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle49.C
new file mode 100644
index 000000000..3795c556d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle49.C
@@ -0,0 +1,23 @@
+// PR c++/49932
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+template < typename T >
+auto
+f1( T x ) // ICE on here
+ -> typename decltype( x )::type {}
+
+template < typename T >
+typename decltype( T() )::type
+f2( T x ) {} // ICE on here
+
+struct S { typedef void type; };
+
+void g()
+{
+ f1( S() );
+ f2( S() );
+}
+
+// { dg-final { scan-assembler "_Z2f1I1SENDtfp_E4typeET_" } }
+// { dg-final { scan-assembler "_Z2f2I1SENDTcvT__EE4typeES1_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle5.C
new file mode 100644
index 000000000..99a08730f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle5.C
@@ -0,0 +1,6 @@
+// Test mangling of pointers to cv-qualified member functions
+
+struct A;
+void f (void (A::*)() const) {}
+
+// { dg-final { scan-assembler "\n_?_Z1fM1AKFvvE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle50.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle50.C
new file mode 100644
index 000000000..90566c219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle50.C
@@ -0,0 +1,25 @@
+// DR 342, PR c++/48582
+// { dg-do compile { target c++11 } }
+
+struct A;
+template < void * = nullptr > void f() { }
+template < void (A::*)() = nullptr > void g() { }
+template < int A::* = nullptr > void h() { }
+
+int main()
+{
+ // { dg-final { scan-assembler "_Z1fILPv0EEvv" } }
+ f();
+ f<nullptr>();
+
+ // { dg-final { scan-assembler "_Z1gILM1AFvvE0EEvv" } }
+ g();
+ g<nullptr>();
+
+ // { dg-final { scan-assembler "_Z1fILPv0EEvv" } }
+ h();
+ h<nullptr>();
+
+ constexpr void * ptr = nullptr;
+ f<ptr>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle51.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle51.C
new file mode 100644
index 000000000..e7c2c747a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle51.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+void* operator new (__SIZE_TYPE__, void *p) { return p; }
+int i;
+
+template <unsigned int> struct helper {};
+// { dg-final { scan-assembler "_Z6check1IiEvP6helperIXsznw_T_EEE" } }
+template <class T> void check1( helper<sizeof(new T)> * ) { }
+// { dg-final { scan-assembler "_Z6check2IiEvP6helperIXszgsnw_T_piEEE" } }
+template <class T> void check2( helper<sizeof(::new T())> * ) { }
+// { dg-final { scan-assembler "_Z6check3IiEvP6helperIXsznwadL_Z1iE_T_piLi1EEEE" } }
+template <class T> void check3( helper<sizeof(new (&i) T(1))> * ) { }
+// { dg-final { scan-assembler "_Z7check3aIiEvP6helperIXsznw_T_ilLi1EEEE" } }
+template <class T> void check3a( helper<sizeof(new T{1})> * ) { }
+// { dg-final { scan-assembler "_Z6check4IiEvP6helperIXszna_A1_T_EEE" } }
+template <class T> void check4( helper<sizeof(new T[1])> * ) { }
+// { dg-final { scan-assembler "_Z6check5IiEvP6helperIXszna_A1_T_piEEE" } }
+template <class T> void check5( helper<sizeof(new T[1]())> * ) { }
+int main()
+{
+ check1<int>(0);
+ check2<int>(0);
+ check3<int>(0);
+ check3a<int>(0);
+ check4<int>(0);
+ check5<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle52.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle52.C
new file mode 100644
index 000000000..2c463415f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle52.C
@@ -0,0 +1,21 @@
+// { dg-options "-fabi-version=0" }
+
+template <unsigned int> struct helper {};
+// { dg-final { scan-assembler "_Z6check1IiEvP6helperIXszscT_Li1EEE" } }
+template <class T> void check1( helper<sizeof(static_cast<T>(1))> * ) { }
+// { dg-final { scan-assembler "_Z6check2IiXadL_Z1iEEEvP6helperIXszccPT_T0_EE" } }
+template <class T, T* p> void check2( helper<sizeof(const_cast<T*>(p))> * ) { }
+// { dg-final { scan-assembler "_Z6check3IiEvP6helperIXszrcPT_Li0EEE" } }
+template <class T> void check3( helper<sizeof(reinterpret_cast<T*>(0))> * ) { }
+// { dg-final { scan-assembler "_Z6check4I1AXadL_Z1aEEEvP6helperIXszdcPT_T0_EE" } }
+template <class T, T* p> void check4( helper<sizeof(dynamic_cast<T*>(p))> * ) { }
+
+struct A{} a;
+int i;
+int main()
+{
+ check1<int>(0);
+ check2<int,&i>(0);
+ check3<int>(0);
+ check4<A,&a>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle53.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle53.C
new file mode 100644
index 000000000..13f9e711c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle53.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+bool b;
+// { dg-final { scan-assembler "_Z1fIiEDTquL_Z1bEfp_twLi42EET_" } }
+template <class T> auto f (T t) -> decltype(b?t:throw 42) { return 0; }
+// { dg-final { scan-assembler "_Z2f2IiEDTquL_Z1bEfp_trET_" } }
+template <class T> auto f2 (T t) -> decltype(b?t:throw) { return 0; }
+
+int main()
+{
+ f(0);
+ f2(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle54.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle54.C
new file mode 100644
index 000000000..926275c8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle54.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+int i;
+// { dg-final { scan-assembler "_Z2f1IiEDTppfp_ET_" } }
+template <class T> auto f1 (T t) -> decltype(t++) { return i; }
+// { dg-final { scan-assembler "_Z2f2IiEDTpp_fp_ET_" } }
+template <class T> auto f2 (T t) -> decltype(++t) { return i; }
+// { dg-final { scan-assembler "_Z2f3IiEDTmmfp_ET_" } }
+template <class T> auto f3 (T t) -> decltype(t--) { return i; }
+// { dg-final { scan-assembler "_Z2f4IiEDTmm_fp_ET_" } }
+template <class T> auto f4 (T t) -> decltype(--t) { return i; }
+
+int main()
+{
+ f1(0);
+ f2(0);
+ f3(0);
+ f4(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle55.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle55.C
new file mode 100644
index 000000000..72ea83444
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle55.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+// { dg-final { scan-assembler "_Z2f1Ii1AEDTdsfp_fp0_ET0_MS2_T_" } }
+template <class T, class U> auto f1 (U u, T U::* p) -> decltype(u.*p) { return u.*p; }
+// { dg-final { scan-assembler "_Z2f2Ii1AEDTpmfp_fp0_EPT0_MS2_T_" } }
+template <class T, class U> auto f2 (U* u, T U::* p) -> decltype(u->*p) { return u->*p; }
+
+int main()
+{
+ A a = {};
+ f1(a, &A::i);
+ f2(&a, &A::i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle56.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle56.C
new file mode 100644
index 000000000..5c66db558
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle56.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> T g(T t1, T t2) { return t2; }
+// { dg-final { scan-assembler "_Z2f1IiEDTcl1gfp_ilEEET_" } }
+template <class T> auto f1 (T t) -> decltype(g(t,{})) { return g(t,{}); }
+// { dg-final { scan-assembler "_Z2f2IiEDTcl1gfp_tlT_EEES0_" } }
+template <class T> auto f2 (T t) -> decltype(g(t,T{})) { return g(t,T{}); }
+
+int main()
+{
+ f1(0);
+ f2(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle57.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle57.C
new file mode 100644
index 000000000..cd59cb87b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle57.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+template<typename T> int cmp1(T a, T b);
+int cmp2(char a, char b);
+template<typename T, int (*cmp)(T, T)> struct A { };
+// { dg-final { scan-assembler "_Z1fIcEvR1AIT_X4cmp1EE" } }
+template <typename T> void f (A<T,cmp1> &);
+// { dg-final { scan-assembler "_Z1fIcEvR1AIT_L_Z4cmp2ccEE" } }
+template <typename T> void f (A<T,cmp2> &);
+void g()
+{
+ A<char,cmp1> a;
+ f(a);
+ A<char,cmp2> a2;
+ f(a2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle58.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle58.C
new file mode 100644
index 000000000..abcb3ca47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle58.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+template<typename T, int (*cmp)(T, T)> struct A { };
+struct B {
+ template<typename T> static int cmp1(T a, T b);
+ static int cmp2(char a, char b);
+ // { dg-final { scan-assembler "_ZN1B1fIcEEvR1AIT_X4cmp1EE" } }
+ template <typename T> static void f (A<T,cmp1> &);
+ // { dg-final { scan-assembler "_ZN1B1gIcEEvR1AIT_XsrS_4cmp1EE" } }
+ template <typename T> static void g (A<T,B::cmp1> &);
+ // { dg-final { scan-assembler "_ZN1B1fIcEEvR1AIT_L_ZNS_4cmp2EccEE" } }
+ template <typename T> static void f (A<T,cmp2> &);
+ // { dg-final { scan-assembler "_ZN1B1gIcEEvR1AIT_L_ZNS_4cmp2EccEE" } }
+ template <typename T> static void g (A<T,B::cmp2> &);
+};
+
+void g()
+{
+ A<char,B::cmp1> a;
+ B::f(a);
+ B::g(a);
+ A<char,B::cmp2> a2;
+ B::f(a2);
+ B::g(a2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle59.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle59.C
new file mode 100644
index 000000000..ba0befddc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle59.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+// { dg-final { scan-assembler "_Z1fIiEDTcmdlfp_psfp_EPT_" } }
+template <class T> auto f (T* p) -> decltype(delete p, +p) { return p; }
+// { dg-final { scan-assembler "_Z1gIiEDTcmgsdlfp_psfp_EPT_" } }
+template <class T> auto g (T* p) -> decltype(::delete p, +p) { return p; }
+// { dg-final { scan-assembler "_Z1hIiEDTcmdafp_psfp_EPT_" } }
+template <class T> auto h (T* p) -> decltype(delete[] p, +p) { return p; }
+// { dg-final { scan-assembler "_Z1iIiEDTcmgsdafp_psfp_EPT_" } }
+template <class T> auto i (T* p) -> decltype(::delete[] p, +p) { return p; }
+
+int main()
+{
+ int x;
+ f(&x);
+ g(&x);
+ h(&x);
+ i(&x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle6.C
new file mode 100644
index 000000000..280fe2499
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle6.C
@@ -0,0 +1,23 @@
+/* Check that __int128 types are mangled. */
+/* { dg-do compile { target mips*-*-* } } */
+
+#ifdef __mips64
+typedef int int128 __attribute__ ((mode(TI)));
+typedef unsigned int uint128 __attribute__ ((mode(TI)));
+
+struct S
+{
+ int128 i;
+ int128 func1 (int128) const { return i; }
+ uint128 func2 (uint128) const { return i; }
+};
+
+int128 (S::*ptr1) (int128) const = &S::func1;
+uint128 (S::*ptr2) (uint128) const = &S::func2;
+#else
+const char *str1 = "_ZNK1S5func1En";
+const char *str2 = "_ZNK1S5func2Eo";
+#endif
+
+/* { dg-final { scan-assembler _ZNK1S5func1En } } */
+/* { dg-final { scan-assembler _ZNK1S5func2Eo } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle60.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle60.C
new file mode 100644
index 000000000..f7e893a55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle60.C
@@ -0,0 +1,20 @@
+// PR c++/51854
+// { dg-options "" }
+
+template <unsigned N> struct A;
+
+template <typename U, typename V>
+char foo(U, V);
+
+// { dg-final { scan-assembler "_Z3barIiEvP1AIXszcl3foocvT__ELCi0_42EEEE" } }
+template <typename U>
+void bar(A<sizeof(foo(U(), 42i))> *);
+
+// { dg-final { scan-assembler "_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE" } }
+template <typename U>
+void baz(A<sizeof(foo(U(), 0.0fj))> *);
+
+int main() {
+ bar<int>(0);
+ baz<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle61.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle61.C
new file mode 100644
index 000000000..2ae336e42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle61.C
@@ -0,0 +1,28 @@
+// PR c++/56237
+// { dg-do compile }
+
+void *p[4];
+
+void
+foo ()
+{
+ static union { } u;
+ p[0] = &u;
+ {
+ static union { } u;
+ p[1] = &u;
+ {
+ static union { } u;
+ p[2] = &u;
+ }
+ }
+ {
+ static union { } u;
+ p[3] = &u;
+ }
+}
+
+// { dg-final { scan-assembler "_ZZ3foovE1u\[^_\]" } }
+// { dg-final { scan-assembler "_ZZ3foovE1u_0" } }
+// { dg-final { scan-assembler "_ZZ3foovE1u_1" } }
+// { dg-final { scan-assembler "_ZZ3foovE1u_2" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62.C
new file mode 100644
index 000000000..6dbfd7865
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62.C
@@ -0,0 +1,11 @@
+// Before v8, we mistakenly treated an unqualified function type
+// as a substitution candidate for a function type with function-cv-quals.
+// Test for the conformant behavior.
+
+// { dg-options -fabi-version=0 }
+
+template <class T, class U> struct A { };
+// { dg-final { scan-assembler "_Z1fP1AIKFvvEFvvEE" } }
+void f (A<void()const, void()> *){}
+// { dg-final { scan-assembler "_Z1gP1AIFvvEKFvvEE" } }
+void g (A<void(), void()const> *){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62a.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62a.C
new file mode 100644
index 000000000..fca1cb6c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle62a.C
@@ -0,0 +1,11 @@
+// Before v8, we mistakenly treated an unqualified function type
+// as a substitution candidate for a function type with function-cv-quals.
+// Test for that for backward compatibility.
+
+// { dg-options -fabi-version=7 }
+
+template <class T, class U> struct A { };
+// { dg-final { scan-assembler "_Z1fP1AIKFvvES0_E" } }
+void f (A<void()const, void()> *){}
+// { dg-final { scan-assembler "_Z1gP1AIFvvEKS0_E" } }
+void g (A<void(), void()const> *){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle7.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle7.C
new file mode 100644
index 000000000..af178d3e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle7.C
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+
+typedef void *const t1[2];
+float const f1(t1 (&)[79], ...) {}
+
+/* { dg-final { scan-assembler _Z2f1RA79_A2_KPvz } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle8.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle8.C
new file mode 100644
index 000000000..6a073588a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle8.C
@@ -0,0 +1,16 @@
+// Red Hat bugzilla 65035
+// Bug: We were encoding the name of the instantiation as 'operator int'
+// rather than 'operator T'.
+// { dg-do compile }
+
+struct C {
+ template <class T>
+ operator T ();
+};
+
+template <class T>
+C::operator T () { return 0; }
+
+template C::operator int ();
+
+// { dg-final { scan-assembler _ZN1CcvT_IiEEv } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle9.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle9.C
new file mode 100644
index 000000000..f3ededfb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/mangle9.C
@@ -0,0 +1,12 @@
+// { dg-options "-fabi-version=0" }
+
+template <typename Q>
+void f (typename Q::X) {}
+
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int);
+
+// { dg-final { scan-assembler _Z1fI1SEvNT_1XE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn1.C
new file mode 100644
index 000000000..0532cf2f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn1.C
@@ -0,0 +1,14 @@
+// Test that attribute noreturn is not part of the mangled name.
+// { dg-options -fabi-version=0 }
+
+void baz (const char *fmt, ...);
+
+// { dg-final { scan-assembler "_Z3barPFvPKczE" } }
+void bar (void (*baz) (const char *fmt, ...)
+ __attribute__ ((noreturn, format (printf, 1, 2))));
+
+void
+foo ()
+{
+ bar (&baz);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn2.C
new file mode 100644
index 000000000..72accafe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/noreturn2.C
@@ -0,0 +1,14 @@
+// Test for buggy mangling of attribute noreturn in abi<=4
+// { dg-options -fabi-version=4 }
+
+void baz (const char *fmt, ...);
+
+// { dg-final { scan-assembler "_Z3barPVFvPKczE" } }
+void bar (void (*baz) (const char *fmt, ...)
+ __attribute__ ((noreturn, format (printf, 1, 2))));
+
+void
+foo ()
+{
+ bar (&baz);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/offsetof.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/offsetof.C
new file mode 100644
index 000000000..d6a53e6f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/offsetof.C
@@ -0,0 +1,22 @@
+// Test that we can refer to the address of a base member of a null pointer
+// to get its offset. The standard says that offsetof shall not be used on
+// non-POD classes, but there seems to be no such restriction on the common
+// implementation thereof.
+
+// Yes, this is bad, naughty, evil code. But it seems to be well-formed.
+// So we'll just warn.
+
+// { dg-do run }
+
+struct A { int i; };
+
+struct B: public A {
+ virtual void f ();
+};
+
+struct C: public B { };
+
+int main ()
+{
+ return ((__SIZE_TYPE__) &((C*)0)->i) != sizeof(void*); // { dg-warning "offsetof|invalid" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/packed1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/packed1.C
new file mode 100644
index 000000000..834537532
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/packed1.C
@@ -0,0 +1,24 @@
+// PR c++/41788
+// { dg-do run }
+// { dg-options "-Wpacked -Wno-attributes" }
+
+extern "C" void abort ();
+
+struct INNER {
+ virtual int foo() const { return 1; }
+} __attribute__ ((packed));
+
+struct OUTER {
+ char c;
+ INNER inner;
+} __attribute__ ((packed));
+
+int main()
+{
+ OUTER outer;
+ int s = sizeof(outer);
+ int o = (char *)&outer.inner - (char *)&outer;
+ if (s != sizeof (char) + sizeof (void*)
+ || o != sizeof (char))
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/param1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/param1.C
new file mode 100644
index 000000000..c438a1940
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/param1.C
@@ -0,0 +1,28 @@
+// { dg-do run }
+//
+
+// Failed on powerpc64-linux for structure sizes > 64 and with size not a
+// multiple of 8 after padding.
+struct object
+{
+ int i1;
+ char s1[60];
+ int i2;
+ char s2[64];
+};
+
+extern int subr (struct object obj);
+
+int main ()
+{
+ struct object obj;
+
+ obj.i1 = 1234;
+ obj.i2 = 5678;
+ return subr (obj);
+}
+
+int subr (struct object obj)
+{
+ return obj.i1 != 1234 || obj.i2 != 5678;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/param2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/param2.C
new file mode 100644
index 000000000..d28387ab3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/param2.C
@@ -0,0 +1,19 @@
+// PR target/20795
+// Test passing aligned empty aggregate
+// { dg-do compile }
+// { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+
+struct S { union {} a; } __attribute__((aligned));
+
+S
+foo (S arg)
+{
+ return arg;
+}
+
+void
+bar (void)
+{
+ S arg;
+ foo (arg);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1.h b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1.h
new file mode 100644
index 000000000..ece67daae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1.h
@@ -0,0 +1,11 @@
+inline int
+f (int x)
+{
+ static union
+ {
+ int i;
+ };
+ int j = i;
+ i = x;
+ return j;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1a.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1a.C
new file mode 100644
index 000000000..eb646696d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1a.C
@@ -0,0 +1,12 @@
+// PR c++/39188
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "pr39188-1b.C" }
+
+#include "pr39188-1.h"
+
+int
+x (int i)
+{
+ return f (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1b.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1b.C
new file mode 100644
index 000000000..71c992637
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-1b.C
@@ -0,0 +1,15 @@
+#include "pr39188-1.h"
+
+extern "C" void abort ();
+
+extern int x (int);
+
+int
+main (void)
+{
+ if (x (1) != 0)
+ abort ();
+ if (f (1) != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2.h b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2.h
new file mode 100644
index 000000000..6ff5f49db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2.h
@@ -0,0 +1,12 @@
+template<typename T>
+T
+f (T x)
+{
+ static union
+ {
+ T i;
+ };
+ T j = i;
+ i = x;
+ return j;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2a.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2a.C
new file mode 100644
index 000000000..071b585f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2a.C
@@ -0,0 +1,12 @@
+// PR c++/39188
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "pr39188-2b.C" }
+
+#include "pr39188-2.h"
+
+int
+x (int i)
+{
+ return f<int> (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2b.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2b.C
new file mode 100644
index 000000000..f91367ba2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-2b.C
@@ -0,0 +1,15 @@
+#include "pr39188-2.h"
+
+extern "C" void abort ();
+
+extern int x (int);
+
+int
+main (void)
+{
+ if (x (1) != 0)
+ abort ();
+ if (f<int> (1) != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3.h b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3.h
new file mode 100644
index 000000000..e0c9f619c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3.h
@@ -0,0 +1,11 @@
+static int
+f (int x)
+{
+ static union
+ {
+ int i;
+ };
+ int j = i;
+ i = x;
+ return j;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3a.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3a.C
new file mode 100644
index 000000000..5596d1241
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3a.C
@@ -0,0 +1,12 @@
+// PR c++/39188
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "pr39188-3b.C" }
+
+#include "pr39188-3.h"
+
+int
+x (int i)
+{
+ return f (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3b.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3b.C
new file mode 100644
index 000000000..84db157a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pr39188-3b.C
@@ -0,0 +1,15 @@
+#include "pr39188-3.h"
+
+extern "C" void abort ();
+
+extern int x (int);
+
+int
+main (void)
+{
+ if (x (1) != 0)
+ abort ();
+ if (f (1) != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/pragma-pack1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/pragma-pack1.C
new file mode 100644
index 000000000..9b76071c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/pragma-pack1.C
@@ -0,0 +1,37 @@
+// PR c++/7046
+
+extern "C" int printf (const char *, ...);
+
+#pragma pack(4)
+
+template <typename X >
+struct T
+{
+ char x1; /* Usually 3 padding bytes are added after x1 member. */
+ int x2;
+};
+
+template <class T>
+int f()
+{
+ struct A { char i1; int i2; };
+ return sizeof (A);
+}
+
+#pragma pack(1)
+template struct T<int>; /* T<int> is instantiated here */
+template int f<int>();
+
+#pragma pack(4)
+template struct T<float>; /* T<float> is required here */
+template int f<double>();
+
+int main()
+{
+ printf("sizeof T<int> = %d\n", sizeof(T<int>));
+ printf("sizeof T<float> = %d\n", sizeof(T<float>));
+ printf("f<int>() = %d\n", f<int>());
+ printf("f<float>() = %d\n", f<float>());
+ return (sizeof(T<int>) != sizeof(T<float>)
+ || f<int>() != f<float>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/regparm1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/regparm1.C
new file mode 100644
index 000000000..c4710464a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/regparm1.C
@@ -0,0 +1,51 @@
+// PR c++/29911 (9381)
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target c++11 }
+
+extern "C" int printf(const char *, ...);
+
+void *save_this;
+int *save_addr1, *save_addr2;
+
+int fail;
+
+struct Base
+{
+ __attribute((regparm(3))) void
+ set(int *addr1, int *addr2)
+ {
+ if (this != save_this)
+ {
+ ++fail;
+ printf("error! this == %p, should be %p\n", this, save_this);
+ }
+ if (addr1 != save_addr1)
+ {
+ ++fail;
+ printf("error! addr1 == %p, should be %p\n", addr1, save_addr1);
+ }
+ if (addr2 != save_addr2)
+ {
+ ++fail;
+ printf("error! addr2 == %p, should be %p\n", addr2, save_addr1);
+ }
+ }
+};
+
+int main()
+{
+ void (__attribute((regparm(3))) Base::* pfm)(int *, int *) = &Base::set;
+ __typeof (&Base::set) pfm2 = &Base::set;
+ decltype (&Base::set) pfm3 = &Base::set;
+ auto pfm4 = &Base::set;
+
+ Base obj; save_this = &obj;
+ int x, y; save_addr1 = &x; save_addr2 = &y;
+
+ (obj.* pfm) (&x, &y);
+ (obj.* pfm2) (&x, &y);
+ (obj.* pfm3) (&x, &y);
+ (obj.* pfm4) (&x, &y);
+
+ return fail;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti1.C
new file mode 100644
index 000000000..f17d88aad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti1.C
@@ -0,0 +1,13 @@
+// Test that we don't emit the type_info for a polymorphic class other than
+// with the vtable.
+
+struct A {
+ virtual ~A();
+};
+
+void f ()
+{
+ throw A();
+}
+
+// { dg-final { scan-assembler-dem-not {\ntypeinfo for A[: \t\n]} } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti2.C
new file mode 100644
index 000000000..eece8724a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti2.C
@@ -0,0 +1,12 @@
+// { dg-do run }
+
+#include <cxxabi.h>
+#include <typeinfo>
+
+int main () {
+ const std::type_info& ti = typeid (const int (*)[3]);
+ const abi::__pointer_type_info& pti
+ = static_cast<const abi::__pointer_type_info&>(ti);
+ if ((pti.__flags & pti.__const_mask) == 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti3.C
new file mode 100644
index 000000000..c03e4611c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/rtti3.C
@@ -0,0 +1,16 @@
+// PR 20647, we must emit the typeinfo's string as weak, but not the
+// necessarily the type info object
+
+// { dg-require-weak "" }
+// { dg-skip-if "Linkonce not weak" { *-*-mingw* *-*-cygwin } { "*" } { "" } }
+// { dg-final { scan-assembler ".weak\[ \t\]_?_ZTSPP1A" { target { ! { *-*-darwin* } } } } }
+// { dg-final { scan-assembler-not ".weak\[ \t\]_?_ZTIPP1A" { target { ! { *-*-darwin* } } } } }
+// { dg-final { scan-assembler ".weak_definition\[ \t\]_?_ZTSPP1A" { target { *-*-darwin* } } } }
+// { dg-final { scan-assembler-not ".weak_definition\[ \t\]_?_ZTIPP1A" { target { *-*-darwin* } } } }
+
+struct A;
+
+void Foo ()
+{
+ throw (A **)0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/structret1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/structret1.C
new file mode 100644
index 000000000..e9d4fd0ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/structret1.C
@@ -0,0 +1,31 @@
+// { dg-do run { target ia64-*-* } }
+// { dg-options "-fabi-version=0" }
+
+extern "C" void abort ();
+
+struct ConstructedObject {
+ ConstructedObject() {};
+ ~ConstructedObject() {};
+ ConstructedObject(const ConstructedObject &from) {};
+};
+
+struct FrameworkObject {
+ ConstructedObject action();
+};
+
+ConstructedObject FrameworkObject::action() {
+ void *r32, *r33;
+
+ asm("mov %0 = r32\nmov %1 = r33" : "=r"(r32), "=r"(r33) : );
+ if (this != r33) {
+ abort ();
+ }
+}
+
+int main()
+{
+ FrameworkObject slawa;
+ slawa.action();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk1.C
new file mode 100644
index 000000000..343a2aa6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk1.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+
+
+struct A {
+ virtual void f ();
+};
+
+struct B : public virtual A {
+ virtual void f ();
+};
+
+struct C {
+ virtual void g ();
+};
+
+struct D : public C, public B {
+ virtual void f ();
+};
+
+void D::f () {}
+
+// { dg-final { scan-assembler _ZThn4_N1D1fEv } }
+// { dg-final { scan-assembler _ZTv0_n12_N1D1fEv } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk2.C
new file mode 100644
index 000000000..e6b2924cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk2.C
@@ -0,0 +1,27 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options -w }
+
+struct A {
+ virtual void f2 ();
+ virtual void f3 ();
+};
+
+struct B : virtual public A {
+ virtual void f3 ();
+};
+
+struct C : public A, public B {
+ virtual void f4 ();
+};
+
+struct D : virtual public B, virtual public C, virtual public A
+{
+ virtual void f5 ();
+ virtual void f6 ();
+ virtual void f3 ();
+};
+
+void D::f3 () {}
+
+// { dg-final { scan-assembler _ZTvn4_n20_N1D2f3Ev } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk3.C
new file mode 100644
index 000000000..f2347f79e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk3.C
@@ -0,0 +1,22 @@
+// { dg-require-weak "" }
+// { dg-final { scan-assembler-not ".weak\[\t \]_?_ZThn._N7Derived3FooEv" { target { ! { *-*-darwin* } } } } }
+// { dg-final { scan-assembler-not ".weak_definition\[\t \]_?_ZThn._N7Derived3FooEv" { target { *-*-darwin* } } } }
+
+struct Base
+{
+ virtual void Foo ();
+};
+
+struct Filler
+{
+ virtual void Baz ();
+};
+
+struct Derived : Filler, Base
+{
+ virtual void Foo ();
+};
+
+void Derived::Foo ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk4.C
new file mode 100644
index 000000000..fa5fbd432
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk4.C
@@ -0,0 +1,25 @@
+// { dg-require-weak "" }
+// { dg-skip-if "Linkonce not weak" { *-*-mingw* *-*-cygwin } { "*" } { "" } }
+// { dg-final { scan-assembler ".weak\[ \t\]_?_ZThn._N7Derived3FooEv" { target { ! { *-*-darwin* } } } } }
+// { dg-final { scan-assembler ".weak_definition\[ \t\]_?_ZThn._N7Derived3FooEv" { target { *-*-darwin* } } } }
+
+struct Base
+{
+ virtual void Foo ();
+};
+
+struct Filler
+{
+ virtual void Baz ();
+};
+
+struct Derived : Filler, Base
+{
+ virtual void Foo ();
+};
+
+inline void Derived::Foo ()
+{
+}
+
+Derived f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk5.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk5.C
new file mode 100644
index 000000000..15526bf9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk5.C
@@ -0,0 +1,13 @@
+// PR c++/35067
+// The thunks should be weak even on targets without one-only support.
+// { dg-require-weak "" }
+// { dg-final { scan-assembler "weak.*ZTv" } }
+
+struct A
+{
+ virtual ~A() { }
+};
+
+struct B: virtual A { };
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vague1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vague1.C
new file mode 100644
index 000000000..02feee9e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vague1.C
@@ -0,0 +1,17 @@
+// Test that we don't emit unneeded copies of static data member template
+// instantiations.
+
+// Disable debug info so we don't get confused by the symbol name there.
+// { dg-options "-g0" }
+
+template <class T> struct A {
+ static const T t = 0;
+};
+
+template <class T> const T A<T>::t;
+
+int i;
+int main ()
+{
+ i = A<int>::t; // Should just use the value
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase1.C
new file mode 100644
index 000000000..39d8b8102
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase1.C
@@ -0,0 +1,60 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 3986. Another indirect primary base problem.
+
+struct Consts
+{
+};
+
+struct MathLib :
+ virtual Consts
+{
+};
+
+struct Parallel :
+ virtual Consts
+{
+};
+
+struct Particles :
+ virtual MathLib,
+ virtual Parallel
+{
+};
+
+struct Ring :
+ virtual Particles
+{
+};
+
+struct Injection :
+ virtual Particles,
+ virtual Ring
+{
+};
+
+struct LSpaceCharge :
+ virtual Ring,
+ virtual Injection
+{
+};
+
+struct Bump :
+ virtual Consts
+{
+};
+
+struct Output :
+ virtual Injection,
+ virtual Bump
+{
+};
+
+struct Plots :
+ virtual LSpaceCharge,
+ virtual Output
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase10.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase10.C
new file mode 100644
index 000000000..b6e7f88fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase10.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// -fpack-struct is necessary because the code below assumes the initial
+// packing is larger than 1, which cannot ge guaranteed for all targets.
+// { dg-options "-Wabi -fabi-version=1 -fpack-struct=8" }
+// On ARM processors, the alignment of B will be 4 even though it
+// contains only a single "char". That would avoids the situation
+// that the warning below is designed to catch. We therefore
+// explicitly set the default structure alignment to 1.
+// { dg-options "-Wabi -fabi-version=1 -mstructure-size-boundary=8" { target arm*-*-* } }
+
+struct A { virtual void f(); char c1; };
+struct B { B(); char c2; };
+struct C : public A, public virtual B {}; // { dg-warning "ABI" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase11.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase11.C
new file mode 100644
index 000000000..8c854b9c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase11.C
@@ -0,0 +1,13 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0" }
+
+struct A { virtual void f(); char c1; };
+struct B { B(); char c2; };
+struct C : public A, public virtual B { };
+
+int main () {
+ if (sizeof (C) != 8)
+ return 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase12.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase12.C
new file mode 100644
index 000000000..98b9054f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase12.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-fabi-version=0" }
+
+struct A {};
+struct B { A a; virtual void f () {} };
+struct C : public B, virtual public A {};
+struct D : public C, virtual public A {};
+
+D d;
+
+int main () {
+ if (((char*)(A*)&d - (char*)&d) != 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase13.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase13.C
new file mode 100644
index 000000000..6a0bff484
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase13.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+// { dg-options "-fabi-version=0 -w" }
+
+struct E1 {};
+struct E2 : public E1 {};
+struct E : public E1, public E2 {};
+struct N : public E { virtual void f () {} };
+
+struct X : virtual public N {
+};
+
+int main () {
+ X x;
+ /* N should not be the primary base of X; it is not nearly empty. */
+ if ((void*)&x == (void*)(N*)&x)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase14.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase14.C
new file mode 100644
index 000000000..320d5ba77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase14.C
@@ -0,0 +1,6 @@
+// { dg-options "-Wabi -fabi-version=1" }
+
+struct E1 {};
+struct E2 : public E1 {}; // { dg-warning "layout" }
+struct E : public E1, public E2 {}; // { dg-warning "layout|ambiguity" }
+struct N : public E { virtual void f () {} }; // { dg-warning "nearly" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase15.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase15.C
new file mode 100644
index 000000000..a0908f40e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase15.C
@@ -0,0 +1,30 @@
+ // { dg-do run }
+
+struct Spec
+
+{
+ virtual int id () const = 0;
+};
+class D1_1_Spec : public virtual Spec { };
+class D1_2_Spec : public virtual Spec { };
+class D1_3_Spec : public virtual Spec { };
+class D2_1_Spec : public D1_1_Spec, public D1_2_Spec { };
+class D2_Spec : public virtual D2_1_Spec, public virtual D1_3_Spec { };
+
+struct D3_Spec : public D2_Spec
+{
+ virtual int id () const { return 3; }
+
+};
+
+__attribute__((noinline)) void foo(D3_Spec* spec)
+{
+ spec->id();
+}
+
+int main()
+{
+ D3_Spec spec;
+ foo(&spec);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-10.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-10.C
new file mode 100644
index 000000000..81896ed64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-10.C
@@ -0,0 +1,75 @@
+// { dg-options -w }
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+class C0
+{};
+class C1
+ : public C0
+{};
+class C2
+ : public C1
+ , virtual public C0
+{};
+class C3
+ : public C1
+ , public C2
+ , virtual public C0
+{};
+class C4
+ : virtual public C1
+ , virtual public C0
+ , virtual public C3
+ , public C2
+{};
+class C5
+ : public C3
+ , virtual public C0
+ , virtual public C2
+{};
+class C6
+ : public C1
+ , public C2
+ , virtual public C5
+ , virtual public C3
+ , virtual public C0
+{};
+class C7
+ : public C1
+ , virtual public C5
+ , virtual public C4
+ , virtual public C2
+ , virtual public C0
+ , virtual public C6
+{};
+class C8
+ : virtual public C4
+ , public C3
+ , public C0
+ , virtual public C7
+ , virtual public C6
+{};
+class C9
+ : virtual public C0
+ , public C4
+ , public C8
+ , public C1
+ , public C6
+{};
+main() {
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-21.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-21.C
new file mode 100644
index 000000000..0da644625
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-21.C
@@ -0,0 +1,75 @@
+// { dg-options -w }
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+class C0
+{};
+class C1
+ : virtual public C0
+{};
+class C2
+ : virtual public C1
+ , virtual public C0
+{};
+class C3
+ : virtual public C2
+ , virtual public C1
+{};
+class C4
+ : virtual public C2
+ , public C0
+ , public C1
+{};
+class C5
+ : virtual public C0
+ , public C2
+ , virtual public C1
+ , virtual public C3
+ , virtual public C4
+{};
+class C6
+ : virtual public C1
+ , virtual public C3
+ , public C0
+ , public C2
+ , virtual public C4
+{};
+class C7
+ : virtual public C5
+ , public C2
+ , public C6
+ , virtual public C0
+ , public C3
+{};
+class C8
+ : virtual public C5
+ , public C7
+ , virtual public C0
+ , virtual public C2
+ , virtual public C6
+{};
+class C9
+ : virtual public C2
+ , virtual public C4
+ , public C1
+ , virtual public C0
+ , public C7
+ , public C5
+{};
+main() {
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-22.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-22.C
new file mode 100644
index 000000000..4edb2b47a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-22.C
@@ -0,0 +1,80 @@
+// { dg-options -w }
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Jul 2001 <nathan@codesourcery.com>
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 22. Horribly complicated class hierarchy
+
+class C0
+{};
+class C1
+ : public C0
+{};
+class C2
+ : public C1
+ , virtual public C0
+{};
+class C3
+ : virtual public C0
+ , virtual public C2
+ , virtual public C1
+{};
+class C4
+ : virtual public C2
+ , public C1
+ , virtual public C3
+ , public C0
+{};
+class C5
+ : virtual public C0
+ , virtual public C4
+ , public C1
+ , virtual public C2
+ , virtual public C3
+{};
+class C6
+ : public C0
+ , virtual public C1
+ , public C5
+ , public C2
+ , virtual public C3
+ , virtual public C4
+{};
+class C7
+ : virtual public C1
+ , public C5
+ , virtual public C6
+ , virtual public C4
+ , virtual public C3
+ , virtual public C0
+{};
+class C8
+ : virtual public C6
+ , virtual public C1
+ , virtual public C2
+ , public C3
+ , virtual public C4
+{};
+class C9
+ : public C4
+ , virtual public C2
+ , virtual public C8
+ , public C3
+ , public C1
+ , public C6
+ , public C5
+{};
+main() {
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-4.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-4.C
new file mode 100644
index 000000000..2e816f6a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase8-4.C
@@ -0,0 +1,78 @@
+// { dg-options -w }
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com>
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 4. Horribly complicated class hierarchy
+
+class C0
+{};
+class C1
+ : virtual public C0
+{};
+class C2
+ : public C0
+ , public C1
+{};
+class C3
+ : virtual public C0
+ , public C1
+ , public C2
+{};
+class C4
+ : public C2
+ , public C3
+ , virtual public C1
+ , virtual public C0
+{};
+class C5
+ : virtual public C2
+ , public C1
+ , public C0
+{};
+class C6
+ : virtual public C0
+ , virtual public C5
+ , public C1
+ , public C3
+ , public C4
+{};
+class C7
+ : public C6
+ , virtual public C0
+ , public C1
+ , public C2
+ , virtual public C4
+{};
+class C8
+ : public C2
+ , virtual public C6
+ , virtual public C7
+ , public C5
+ , public C3
+ , virtual public C4
+{};
+class C9
+ : public C5
+ , virtual public C3
+ , virtual public C8
+ , public C0
+ , public C2
+ , public C7
+ , public C6
+ , public C4
+{};
+main() {
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase9.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase9.C
new file mode 100644
index 000000000..4a0540d06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vbase9.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Mar 2002 <nathan@codesourcery.com>
+// Origin: Jakub Jelinek <jakub@redhat.com>
+
+// PR 5681. ICE in build_secondary_vtable
+
+struct A {
+ virtual int f1 ();
+};
+
+struct B : virtual A {};
+
+struct C {
+ virtual int f2 ();
+};
+
+struct E : A {};
+
+struct D : E, B {};
+
+struct F : virtual D {};
+
+struct G : virtual F, C {};
+
+struct H : virtual F {};
+
+struct I : G, H {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vcall1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vcall1.C
new file mode 100644
index 000000000..00830cd23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vcall1.C
@@ -0,0 +1,36 @@
+// { dg-do run }
+// { dg-options "-w" }
+
+extern "C" void abort ();
+
+struct B;
+
+B* b;
+
+struct A {
+ virtual void f () {}
+};
+
+struct B : virtual public A {
+ B () {
+ b = this;
+ ((A*) this)->f ();
+ }
+
+ virtual void f () {
+ if (this != b)
+ abort ();
+ }
+};
+
+struct C : public B {
+};
+
+struct D : public C, public B {
+ virtual void f () {}
+};
+
+int main () {
+ D d;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk1.C
new file mode 100644
index 000000000..73a0b13f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk1.C
@@ -0,0 +1,45 @@
+// { dg-do link }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Jul 2001 <nathan@codesourcery.com>
+
+// Origin snyder@fnal.gov
+// Bug 3631. We mis-calculated the non-virtual part of a virtual
+// thunk. Leading to a link failure, in this case.
+
+struct A { virtual ~A () {} };
+
+struct B : virtual public A
+{
+ virtual void destroy() {}
+};
+
+class C : virtual public B {};
+class D : virtual public C {};
+class E : public virtual A {};
+
+struct F : virtual public B, virtual public E
+{
+ virtual void destroy() = 0;
+};
+
+struct G : public virtual F
+{
+ virtual void destroy() {}
+};
+
+class H : virtual public C, virtual public F {};
+class I : virtual public D, virtual public H {};
+class J : public virtual G, public virtual H {};
+
+class K : public virtual I, public virtual J
+{
+ public:
+ virtual ~K();
+};
+K::~K() {}
+
+int main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk2.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk2.C
new file mode 100644
index 000000000..9b6f14c50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk2.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target i?86-*-* x86_64-*-*} }
+// { dg-require-effective-target ilp32 }
+
+struct c0 {
+ virtual void f ();
+};
+
+struct c1 : virtual public c0 {
+};
+
+struct c2 : virtual public c0, public c1 {
+ virtual void f ();
+};
+
+void c2::f () {}
+
+// { dg-final { scan-assembler _ZTv0_n12_N2c21fEv } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk3.C
new file mode 100644
index 000000000..59fbbdc4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vthunk3.C
@@ -0,0 +1,27 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ virtual void a ();
+};
+
+struct B : virtual public A {
+ virtual void b ();
+ virtual void a ();
+};
+
+struct C {
+ virtual void c ();
+};
+
+struct D : public C, public B {
+};
+
+struct E : virtual public D {
+ void b ();
+};
+
+void E::b () {}
+
+// { dg-final { scan-assembler _ZTvn4_n20_N1E1bEv } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/vtt1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/vtt1.C
new file mode 100644
index 000000000..8235c460b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/vtt1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+struct A {
+};
+
+struct B : virtual public A {
+};
+
+B b;
+
+// { dg-final { scan-assembler _ZTT1B } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan.exp b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan.exp
new file mode 100644
index 000000000..30fbb1d91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan.exp
@@ -0,0 +1,38 @@
+# Copyright (C) 2012-2014 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib asan-dg.exp
+
+if ![check_effective_target_faddress_sanitizer] {
+ return
+}
+
+# Initialize `dg'.
+dg-init
+if [asan_init] {
+
+# Main loop.
+gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/asan/*.c]] ""
+
+}
+
+# All done.
+asan_finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test-wrapper.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test-wrapper.cc
new file mode 100644
index 000000000..97f53123f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test-wrapper.cc
@@ -0,0 +1,2 @@
+#define DEJAGNU_GTEST_H 1
+#include "asan_globals_test.cc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test.cc
new file mode 100644
index 000000000..38e71360b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_globals_test.cc
@@ -0,0 +1,43 @@
+//===-- asan_globals_test.cc ----------------------------------------------===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+// Some globals in a separate file.
+//===----------------------------------------------------------------------===//
+#include "asan_test_utils.h"
+
+char glob1[1];
+char glob2[2];
+char glob3[3];
+char glob4[4];
+char glob5[5];
+char glob6[6];
+char glob7[7];
+char glob8[8];
+char glob9[9];
+char glob10[10];
+char glob11[11];
+char glob12[12];
+char glob13[13];
+char glob14[14];
+char glob15[15];
+char glob16[16];
+char glob17[17];
+char glob1000[1000];
+char glob10000[10000];
+char glob100000[100000];
+
+static char static10[10];
+
+int GlobalsTest(int zero) {
+ static char func_static15[15];
+ glob5[zero] = 0;
+ static10[zero] = 0;
+ func_static15[zero] = 0;
+ return glob5[1] + func_static15[2];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_mem_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_mem_test.cc
new file mode 100644
index 000000000..5656aab0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_mem_test.cc
@@ -0,0 +1,231 @@
+//===-- asan_mem_test.cc --------------------------------------------------===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+#include "asan_test_utils.h"
+
+template<typename T>
+void MemSetOOBTestTemplate(size_t length) {
+ if (length == 0) return;
+ size_t size = Ident(sizeof(T) * length);
+ T *array = Ident((T*)malloc(size));
+ int element = Ident(42);
+ int zero = Ident(0);
+ void *(*MEMSET)(void *s, int c, size_t n) = Ident(memset);
+ // memset interval inside array
+ MEMSET(array, element, size);
+ MEMSET(array, element, size - 1);
+ MEMSET(array + length - 1, element, sizeof(T));
+ MEMSET(array, element, 1);
+
+ // memset 0 bytes
+ MEMSET(array - 10, element, zero);
+ MEMSET(array - 1, element, zero);
+ MEMSET(array, element, zero);
+ MEMSET(array + length, 0, zero);
+ MEMSET(array + length + 1, 0, zero);
+
+ // try to memset bytes to the right of array
+ EXPECT_DEATH(MEMSET(array, 0, size + 1),
+ RightOOBWriteMessage(0));
+ EXPECT_DEATH(MEMSET((char*)(array + length) - 1, element, 6),
+ RightOOBWriteMessage(0));
+ EXPECT_DEATH(MEMSET(array + 1, element, size + sizeof(T)),
+ RightOOBWriteMessage(0));
+ // whole interval is to the right
+ EXPECT_DEATH(MEMSET(array + length + 1, 0, 10),
+ RightOOBWriteMessage(sizeof(T)));
+
+ // try to memset bytes to the left of array
+ EXPECT_DEATH(MEMSET((char*)array - 1, element, size),
+ LeftOOBWriteMessage(1));
+ EXPECT_DEATH(MEMSET((char*)array - 5, 0, 6),
+ LeftOOBWriteMessage(5));
+ if (length >= 100) {
+ // Large OOB, we find it only if the redzone is large enough.
+ EXPECT_DEATH(memset(array - 5, element, size + 5 * sizeof(T)),
+ LeftOOBWriteMessage(5 * sizeof(T)));
+ }
+ // whole interval is to the left
+ EXPECT_DEATH(MEMSET(array - 2, 0, sizeof(T)),
+ LeftOOBWriteMessage(2 * sizeof(T)));
+
+ // try to memset bytes both to the left & to the right
+ EXPECT_DEATH(MEMSET((char*)array - 2, element, size + 4),
+ LeftOOBWriteMessage(2));
+
+ free(array);
+}
+
+TEST(AddressSanitizer, MemSetOOBTest) {
+ MemSetOOBTestTemplate<char>(100);
+ MemSetOOBTestTemplate<int>(5);
+ MemSetOOBTestTemplate<double>(256);
+ // We can test arrays of structres/classes here, but what for?
+}
+
+// Try to allocate two arrays of 'size' bytes that are near each other.
+// Strictly speaking we are not guaranteed to find such two pointers,
+// but given the structure of asan's allocator we will.
+static bool AllocateTwoAdjacentArrays(char **x1, char **x2, size_t size) {
+ vector<char *> v;
+ bool res = false;
+ for (size_t i = 0; i < 1000U && !res; i++) {
+ v.push_back(new char[size]);
+ if (i == 0) continue;
+ sort(v.begin(), v.end());
+ for (size_t j = 1; j < v.size(); j++) {
+ assert(v[j] > v[j-1]);
+ if ((size_t)(v[j] - v[j-1]) < size * 2) {
+ *x2 = v[j];
+ *x1 = v[j-1];
+ res = true;
+ break;
+ }
+ }
+ }
+
+ for (size_t i = 0; i < v.size(); i++) {
+ if (res && v[i] == *x1) continue;
+ if (res && v[i] == *x2) continue;
+ delete [] v[i];
+ }
+ return res;
+}
+
+TEST(AddressSanitizer, LargeOOBInMemset) {
+ for (size_t size = 200; size < 100000; size += size / 2) {
+ char *x1, *x2;
+ if (!Ident(AllocateTwoAdjacentArrays)(&x1, &x2, size))
+ continue;
+ // fprintf(stderr, " large oob memset: %p %p %zd\n", x1, x2, size);
+ // Do a memset on x1 with huge out-of-bound access that will end up in x2.
+ EXPECT_DEATH(Ident(memset)(x1, 0, size * 2),
+ "is located 0 bytes to the right");
+ delete [] x1;
+ delete [] x2;
+ return;
+ }
+ assert(0 && "Did not find two adjacent malloc-ed pointers");
+}
+
+// Same test for memcpy and memmove functions
+template <typename T, class M>
+void MemTransferOOBTestTemplate(size_t length) {
+ if (length == 0) return;
+ size_t size = Ident(sizeof(T) * length);
+ T *src = Ident((T*)malloc(size));
+ T *dest = Ident((T*)malloc(size));
+ int zero = Ident(0);
+
+ // valid transfer of bytes between arrays
+ M::transfer(dest, src, size);
+ M::transfer(dest + 1, src, size - sizeof(T));
+ M::transfer(dest, src + length - 1, sizeof(T));
+ M::transfer(dest, src, 1);
+
+ // transfer zero bytes
+ M::transfer(dest - 1, src, 0);
+ M::transfer(dest + length, src, zero);
+ M::transfer(dest, src - 1, zero);
+ M::transfer(dest, src, zero);
+
+ // try to change mem to the right of dest
+ EXPECT_DEATH(M::transfer(dest + 1, src, size),
+ RightOOBWriteMessage(0));
+ EXPECT_DEATH(M::transfer((char*)(dest + length) - 1, src, 5),
+ RightOOBWriteMessage(0));
+
+ // try to change mem to the left of dest
+ EXPECT_DEATH(M::transfer(dest - 2, src, size),
+ LeftOOBWriteMessage(2 * sizeof(T)));
+ EXPECT_DEATH(M::transfer((char*)dest - 3, src, 4),
+ LeftOOBWriteMessage(3));
+
+ // try to access mem to the right of src
+ EXPECT_DEATH(M::transfer(dest, src + 2, size),
+ RightOOBReadMessage(0));
+ EXPECT_DEATH(M::transfer(dest, (char*)(src + length) - 3, 6),
+ RightOOBReadMessage(0));
+
+ // try to access mem to the left of src
+ EXPECT_DEATH(M::transfer(dest, src - 1, size),
+ LeftOOBReadMessage(sizeof(T)));
+ EXPECT_DEATH(M::transfer(dest, (char*)src - 6, 7),
+ LeftOOBReadMessage(6));
+
+ // Generally we don't need to test cases where both accessing src and writing
+ // to dest address to poisoned memory.
+
+ T *big_src = Ident((T*)malloc(size * 2));
+ T *big_dest = Ident((T*)malloc(size * 2));
+ // try to change mem to both sides of dest
+ EXPECT_DEATH(M::transfer(dest - 1, big_src, size * 2),
+ LeftOOBWriteMessage(sizeof(T)));
+ // try to access mem to both sides of src
+ EXPECT_DEATH(M::transfer(big_dest, src - 2, size * 2),
+ LeftOOBReadMessage(2 * sizeof(T)));
+
+ free(src);
+ free(dest);
+ free(big_src);
+ free(big_dest);
+}
+
+class MemCpyWrapper {
+ public:
+ static void* transfer(void *to, const void *from, size_t size) {
+ return Ident(memcpy)(to, from, size);
+ }
+};
+
+TEST(AddressSanitizer, MemCpyOOBTest) {
+ MemTransferOOBTestTemplate<char, MemCpyWrapper>(100);
+ MemTransferOOBTestTemplate<int, MemCpyWrapper>(1024);
+}
+
+class MemMoveWrapper {
+ public:
+ static void* transfer(void *to, const void *from, size_t size) {
+ return Ident(memmove)(to, from, size);
+ }
+};
+
+TEST(AddressSanitizer, MemMoveOOBTest) {
+ MemTransferOOBTestTemplate<char, MemMoveWrapper>(100);
+ MemTransferOOBTestTemplate<int, MemMoveWrapper>(1024);
+}
+
+
+TEST(AddressSanitizer, MemCmpOOBTest) {
+ size_t size = Ident(100);
+ char *s1 = MallocAndMemsetString(size);
+ char *s2 = MallocAndMemsetString(size);
+ // Normal memcmp calls.
+ Ident(memcmp(s1, s2, size));
+ Ident(memcmp(s1 + size - 1, s2 + size - 1, 1));
+ Ident(memcmp(s1 - 1, s2 - 1, 0));
+ // One of arguments points to not allocated memory.
+ EXPECT_DEATH(Ident(memcmp)(s1 - 1, s2, 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(memcmp)(s1, s2 - 1, 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(memcmp)(s1 + size, s2, 1), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(memcmp)(s1, s2 + size, 1), RightOOBReadMessage(0));
+ // Hit unallocated memory and die.
+ EXPECT_DEATH(Ident(memcmp)(s1 + 1, s2 + 1, size), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(memcmp)(s1 + size - 1, s2, 2), RightOOBReadMessage(0));
+ // Zero bytes are not terminators and don't prevent from OOB.
+ s1[size - 1] = '\0';
+ s2[size - 1] = '\0';
+ EXPECT_DEATH(Ident(memcmp)(s1, s2, size + 1), RightOOBReadMessage(0));
+ free(s1);
+ free(s2);
+}
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_oob_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_oob_test.cc
new file mode 100644
index 000000000..61d505537
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_oob_test.cc
@@ -0,0 +1,126 @@
+//===-- asan_oob_test.cc --------------------------------------------------===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+#include "asan_test_utils.h"
+
+NOINLINE void asan_write_sized_aligned(uint8_t *p, size_t size) {
+ EXPECT_EQ(0U, ((uintptr_t)p % size));
+ if (size == 1) asan_write((uint8_t*)p);
+ else if (size == 2) asan_write((uint16_t*)p);
+ else if (size == 4) asan_write((uint32_t*)p);
+ else if (size == 8) asan_write((uint64_t*)p);
+}
+
+template<typename T>
+NOINLINE void oob_test(int size, int off) {
+ char *p = (char*)malloc_aaa(size);
+ // fprintf(stderr, "writing %d byte(s) into [%p,%p) with offset %d\n",
+ // sizeof(T), p, p + size, off);
+ asan_write((T*)(p + off));
+ free_aaa(p);
+}
+
+template<typename T>
+void OOBTest() {
+ char expected_str[100];
+ for (int size = sizeof(T); size < 20; size += 5) {
+ for (int i = -5; i < 0; i++) {
+ const char *str =
+ "is located.*%d byte.*to the left";
+ sprintf(expected_str, str, abs(i));
+ EXPECT_DEATH(oob_test<T>(size, i), expected_str);
+ }
+
+ for (int i = 0; i < (int)(size - sizeof(T) + 1); i++)
+ oob_test<T>(size, i);
+
+ for (int i = size - sizeof(T) + 1; i <= (int)(size + 2 * sizeof(T)); i++) {
+ const char *str =
+ "is located.*%d byte.*to the right";
+ int off = i >= size ? (i - size) : 0;
+ // we don't catch unaligned partially OOB accesses.
+ if (i % sizeof(T)) continue;
+ sprintf(expected_str, str, off);
+ EXPECT_DEATH(oob_test<T>(size, i), expected_str);
+ }
+ }
+
+ EXPECT_DEATH(oob_test<T>(kLargeMalloc, -1),
+ "is located.*1 byte.*to the left");
+ EXPECT_DEATH(oob_test<T>(kLargeMalloc, kLargeMalloc),
+ "is located.*0 byte.*to the right");
+}
+
+// TODO(glider): the following tests are EXTREMELY slow on Darwin:
+// AddressSanitizer.OOB_char (125503 ms)
+// AddressSanitizer.OOB_int (126890 ms)
+// AddressSanitizer.OOBRightTest (315605 ms)
+// AddressSanitizer.SimpleStackTest (366559 ms)
+
+TEST(AddressSanitizer, OOB_char) {
+ OOBTest<U1>();
+}
+
+TEST(AddressSanitizer, OOB_int) {
+ OOBTest<U4>();
+}
+
+TEST(AddressSanitizer, OOBRightTest) {
+ for (size_t access_size = 1; access_size <= 8; access_size *= 2) {
+ for (size_t alloc_size = 1; alloc_size <= 8; alloc_size++) {
+ for (size_t offset = 0; offset <= 8; offset += access_size) {
+ void *p = malloc(alloc_size);
+ // allocated: [p, p + alloc_size)
+ // accessed: [p + offset, p + offset + access_size)
+ uint8_t *addr = (uint8_t*)p + offset;
+ if (offset + access_size <= alloc_size) {
+ asan_write_sized_aligned(addr, access_size);
+ } else {
+ int outside_bytes = offset > alloc_size ? (offset - alloc_size) : 0;
+ const char *str =
+ "is located.%d *byte.*to the right";
+ char expected_str[100];
+ sprintf(expected_str, str, outside_bytes);
+ EXPECT_DEATH(asan_write_sized_aligned(addr, access_size),
+ expected_str);
+ }
+ free(p);
+ }
+ }
+ }
+}
+
+#if ASAN_ALLOCATOR_VERSION == 2 // Broken with the asan_allocator1
+TEST(AddressSanitizer, LargeOOBRightTest) {
+ size_t large_power_of_two = 1 << 19;
+ for (size_t i = 16; i <= 256; i *= 2) {
+ size_t size = large_power_of_two - i;
+ char *p = Ident(new char[size]);
+ EXPECT_DEATH(p[size] = 0, "is located 0 bytes to the right");
+ delete [] p;
+ }
+}
+#endif // ASAN_ALLOCATOR_VERSION == 2
+
+TEST(AddressSanitizer, DISABLED_DemoOOBLeftLow) {
+ oob_test<U1>(10, -1);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoOOBLeftHigh) {
+ oob_test<U1>(kLargeMalloc, -1);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoOOBRightLow) {
+ oob_test<U1>(10, 10);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoOOBRightHigh) {
+ oob_test<U1>(kLargeMalloc, kLargeMalloc);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_str_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_str_test.cc
new file mode 100644
index 000000000..1b9805e8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_str_test.cc
@@ -0,0 +1,570 @@
+//=-- asan_str_test.cc ----------------------------------------------------===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+#include "asan_test_utils.h"
+
+// Used for string functions tests
+static char global_string[] = "global";
+static size_t global_string_length = 6;
+
+// Input to a test is a zero-terminated string str with given length
+// Accesses to the bytes to the left and to the right of str
+// are presumed to produce OOB errors
+void StrLenOOBTestTemplate(char *str, size_t length, bool is_global) {
+ // Normal strlen calls
+ EXPECT_EQ(strlen(str), length);
+ if (length > 0) {
+ EXPECT_EQ(length - 1, strlen(str + 1));
+ EXPECT_EQ(0U, strlen(str + length));
+ }
+ // Arg of strlen is not malloced, OOB access
+ if (!is_global) {
+ // We don't insert RedZones to the left of global variables
+ EXPECT_DEATH(Ident(strlen(str - 1)), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(strlen(str - 5)), LeftOOBReadMessage(5));
+ }
+ EXPECT_DEATH(Ident(strlen(str + length + 1)), RightOOBReadMessage(0));
+ // Overwrite terminator
+ str[length] = 'a';
+ // String is not zero-terminated, strlen will lead to OOB access
+ EXPECT_DEATH(Ident(strlen(str)), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(strlen(str + length)), RightOOBReadMessage(0));
+ // Restore terminator
+ str[length] = 0;
+}
+TEST(AddressSanitizer, StrLenOOBTest) {
+ // Check heap-allocated string
+ size_t length = Ident(10);
+ char *heap_string = Ident((char*)malloc(length + 1));
+ char stack_string[10 + 1];
+ break_optimization(&stack_string);
+ for (size_t i = 0; i < length; i++) {
+ heap_string[i] = 'a';
+ stack_string[i] = 'b';
+ }
+ heap_string[length] = 0;
+ stack_string[length] = 0;
+ StrLenOOBTestTemplate(heap_string, length, false);
+ // TODO(samsonov): Fix expected messages in StrLenOOBTestTemplate to
+ // make test for stack_string work. Or move it to output tests.
+ // StrLenOOBTestTemplate(stack_string, length, false);
+ StrLenOOBTestTemplate(global_string, global_string_length, true);
+ free(heap_string);
+}
+
+#ifndef __APPLE__
+TEST(AddressSanitizer, StrNLenOOBTest) {
+ size_t size = Ident(123);
+ char *str = MallocAndMemsetString(size);
+ // Normal strnlen calls.
+ Ident(strnlen(str - 1, 0));
+ Ident(strnlen(str, size));
+ Ident(strnlen(str + size - 1, 1));
+ str[size - 1] = '\0';
+ Ident(strnlen(str, 2 * size));
+ // Argument points to not allocated memory.
+ EXPECT_DEATH(Ident(strnlen(str - 1, 1)), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(strnlen(str + size, 1)), RightOOBReadMessage(0));
+ // Overwrite the terminating '\0' and hit unallocated memory.
+ str[size - 1] = 'z';
+ EXPECT_DEATH(Ident(strnlen(str, size + 1)), RightOOBReadMessage(0));
+ free(str);
+}
+#endif
+
+TEST(AddressSanitizer, StrDupOOBTest) {
+ size_t size = Ident(42);
+ char *str = MallocAndMemsetString(size);
+ char *new_str;
+ // Normal strdup calls.
+ str[size - 1] = '\0';
+ new_str = strdup(str);
+ free(new_str);
+ new_str = strdup(str + size - 1);
+ free(new_str);
+ // Argument points to not allocated memory.
+ EXPECT_DEATH(Ident(strdup(str - 1)), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(strdup(str + size)), RightOOBReadMessage(0));
+ // Overwrite the terminating '\0' and hit unallocated memory.
+ str[size - 1] = 'z';
+ EXPECT_DEATH(Ident(strdup(str)), RightOOBReadMessage(0));
+ free(str);
+}
+
+TEST(AddressSanitizer, StrCpyOOBTest) {
+ size_t to_size = Ident(30);
+ size_t from_size = Ident(6); // less than to_size
+ char *to = Ident((char*)malloc(to_size));
+ char *from = Ident((char*)malloc(from_size));
+ // Normal strcpy calls.
+ strcpy(from, "hello");
+ strcpy(to, from);
+ strcpy(to + to_size - from_size, from);
+ // Length of "from" is too small.
+ EXPECT_DEATH(Ident(strcpy(from, "hello2")), RightOOBWriteMessage(0));
+ // "to" or "from" points to not allocated memory.
+ EXPECT_DEATH(Ident(strcpy(to - 1, from)), LeftOOBWriteMessage(1));
+ EXPECT_DEATH(Ident(strcpy(to, from - 1)), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(strcpy(to, from + from_size)), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(strcpy(to + to_size, from)), RightOOBWriteMessage(0));
+ // Overwrite the terminating '\0' character and hit unallocated memory.
+ from[from_size - 1] = '!';
+ EXPECT_DEATH(Ident(strcpy(to, from)), RightOOBReadMessage(0));
+ free(to);
+ free(from);
+}
+
+TEST(AddressSanitizer, StrNCpyOOBTest) {
+ size_t to_size = Ident(20);
+ size_t from_size = Ident(6); // less than to_size
+ char *to = Ident((char*)malloc(to_size));
+ // From is a zero-terminated string "hello\0" of length 6
+ char *from = Ident((char*)malloc(from_size));
+ strcpy(from, "hello");
+ // copy 0 bytes
+ strncpy(to, from, 0);
+ strncpy(to - 1, from - 1, 0);
+ // normal strncpy calls
+ strncpy(to, from, from_size);
+ strncpy(to, from, to_size);
+ strncpy(to, from + from_size - 1, to_size);
+ strncpy(to + to_size - 1, from, 1);
+ // One of {to, from} points to not allocated memory
+ EXPECT_DEATH(Ident(strncpy(to, from - 1, from_size)),
+ LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(strncpy(to - 1, from, from_size)),
+ LeftOOBWriteMessage(1));
+ EXPECT_DEATH(Ident(strncpy(to, from + from_size, 1)),
+ RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(strncpy(to + to_size, from, 1)),
+ RightOOBWriteMessage(0));
+ // Length of "to" is too small
+ EXPECT_DEATH(Ident(strncpy(to + to_size - from_size + 1, from, from_size)),
+ RightOOBWriteMessage(0));
+ EXPECT_DEATH(Ident(strncpy(to + 1, from, to_size)),
+ RightOOBWriteMessage(0));
+ // Overwrite terminator in from
+ from[from_size - 1] = '!';
+ // normal strncpy call
+ strncpy(to, from, from_size);
+ // Length of "from" is too small
+ EXPECT_DEATH(Ident(strncpy(to, from, to_size)),
+ RightOOBReadMessage(0));
+ free(to);
+ free(from);
+}
+
+// Users may have different definitions of "strchr" and "index", so provide
+// function pointer typedefs and overload RunStrChrTest implementation.
+// We can't use macro for RunStrChrTest body here, as this macro would
+// confuse EXPECT_DEATH gtest macro.
+typedef char*(*PointerToStrChr1)(const char*, int);
+typedef char*(*PointerToStrChr2)(char*, int);
+
+USED static void RunStrChrTest(PointerToStrChr1 StrChr) {
+ size_t size = Ident(100);
+ char *str = MallocAndMemsetString(size);
+ str[10] = 'q';
+ str[11] = '\0';
+ EXPECT_EQ(str, StrChr(str, 'z'));
+ EXPECT_EQ(str + 10, StrChr(str, 'q'));
+ EXPECT_EQ(NULL, StrChr(str, 'a'));
+ // StrChr argument points to not allocated memory.
+ EXPECT_DEATH(Ident(StrChr(str - 1, 'z')), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrChr(str + size, 'z')), RightOOBReadMessage(0));
+ // Overwrite the terminator and hit not allocated memory.
+ str[11] = 'z';
+ EXPECT_DEATH(Ident(StrChr(str, 'a')), RightOOBReadMessage(0));
+ free(str);
+}
+USED static void RunStrChrTest(PointerToStrChr2 StrChr) {
+ size_t size = Ident(100);
+ char *str = MallocAndMemsetString(size);
+ str[10] = 'q';
+ str[11] = '\0';
+ EXPECT_EQ(str, StrChr(str, 'z'));
+ EXPECT_EQ(str + 10, StrChr(str, 'q'));
+ EXPECT_EQ(NULL, StrChr(str, 'a'));
+ // StrChr argument points to not allocated memory.
+ EXPECT_DEATH(Ident(StrChr(str - 1, 'z')), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrChr(str + size, 'z')), RightOOBReadMessage(0));
+ // Overwrite the terminator and hit not allocated memory.
+ str[11] = 'z';
+ EXPECT_DEATH(Ident(StrChr(str, 'a')), RightOOBReadMessage(0));
+ free(str);
+}
+
+TEST(AddressSanitizer, StrChrAndIndexOOBTest) {
+ RunStrChrTest(&strchr);
+ RunStrChrTest(&index);
+}
+
+TEST(AddressSanitizer, StrCmpAndFriendsLogicTest) {
+ // strcmp
+ EXPECT_EQ(0, strcmp("", ""));
+ EXPECT_EQ(0, strcmp("abcd", "abcd"));
+ EXPECT_GT(0, strcmp("ab", "ac"));
+ EXPECT_GT(0, strcmp("abc", "abcd"));
+ EXPECT_LT(0, strcmp("acc", "abc"));
+ EXPECT_LT(0, strcmp("abcd", "abc"));
+
+ // strncmp
+ EXPECT_EQ(0, strncmp("a", "b", 0));
+ EXPECT_EQ(0, strncmp("abcd", "abcd", 10));
+ EXPECT_EQ(0, strncmp("abcd", "abcef", 3));
+ EXPECT_GT(0, strncmp("abcde", "abcfa", 4));
+ EXPECT_GT(0, strncmp("a", "b", 5));
+ EXPECT_GT(0, strncmp("bc", "bcde", 4));
+ EXPECT_LT(0, strncmp("xyz", "xyy", 10));
+ EXPECT_LT(0, strncmp("baa", "aaa", 1));
+ EXPECT_LT(0, strncmp("zyx", "", 2));
+
+ // strcasecmp
+ EXPECT_EQ(0, strcasecmp("", ""));
+ EXPECT_EQ(0, strcasecmp("zzz", "zzz"));
+ EXPECT_EQ(0, strcasecmp("abCD", "ABcd"));
+ EXPECT_GT(0, strcasecmp("aB", "Ac"));
+ EXPECT_GT(0, strcasecmp("ABC", "ABCd"));
+ EXPECT_LT(0, strcasecmp("acc", "abc"));
+ EXPECT_LT(0, strcasecmp("ABCd", "abc"));
+
+ // strncasecmp
+ EXPECT_EQ(0, strncasecmp("a", "b", 0));
+ EXPECT_EQ(0, strncasecmp("abCD", "ABcd", 10));
+ EXPECT_EQ(0, strncasecmp("abCd", "ABcef", 3));
+ EXPECT_GT(0, strncasecmp("abcde", "ABCfa", 4));
+ EXPECT_GT(0, strncasecmp("a", "B", 5));
+ EXPECT_GT(0, strncasecmp("bc", "BCde", 4));
+ EXPECT_LT(0, strncasecmp("xyz", "xyy", 10));
+ EXPECT_LT(0, strncasecmp("Baa", "aaa", 1));
+ EXPECT_LT(0, strncasecmp("zyx", "", 2));
+
+ // memcmp
+ EXPECT_EQ(0, memcmp("a", "b", 0));
+ EXPECT_EQ(0, memcmp("ab\0c", "ab\0c", 4));
+ EXPECT_GT(0, memcmp("\0ab", "\0ac", 3));
+ EXPECT_GT(0, memcmp("abb\0", "abba", 4));
+ EXPECT_LT(0, memcmp("ab\0cd", "ab\0c\0", 5));
+ EXPECT_LT(0, memcmp("zza", "zyx", 3));
+}
+
+typedef int(*PointerToStrCmp)(const char*, const char*);
+void RunStrCmpTest(PointerToStrCmp StrCmp) {
+ size_t size = Ident(100);
+ int fill = 'o';
+ char *s1 = MallocAndMemsetString(size, fill);
+ char *s2 = MallocAndMemsetString(size, fill);
+ s1[size - 1] = '\0';
+ s2[size - 1] = '\0';
+ // Normal StrCmp calls
+ Ident(StrCmp(s1, s2));
+ Ident(StrCmp(s1, s2 + size - 1));
+ Ident(StrCmp(s1 + size - 1, s2 + size - 1));
+ s1[size - 1] = 'z';
+ s2[size - 1] = 'x';
+ Ident(StrCmp(s1, s2));
+ // One of arguments points to not allocated memory.
+ EXPECT_DEATH(Ident(StrCmp)(s1 - 1, s2), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrCmp)(s1, s2 - 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrCmp)(s1 + size, s2), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(StrCmp)(s1, s2 + size), RightOOBReadMessage(0));
+ // Hit unallocated memory and die.
+ s1[size - 1] = fill;
+ EXPECT_DEATH(Ident(StrCmp)(s1, s1), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(StrCmp)(s1 + size - 1, s2), RightOOBReadMessage(0));
+ free(s1);
+ free(s2);
+}
+
+TEST(AddressSanitizer, StrCmpOOBTest) {
+ RunStrCmpTest(&strcmp);
+}
+
+TEST(AddressSanitizer, StrCaseCmpOOBTest) {
+ RunStrCmpTest(&strcasecmp);
+}
+
+typedef int(*PointerToStrNCmp)(const char*, const char*, size_t);
+void RunStrNCmpTest(PointerToStrNCmp StrNCmp) {
+ size_t size = Ident(100);
+ char *s1 = MallocAndMemsetString(size);
+ char *s2 = MallocAndMemsetString(size);
+ s1[size - 1] = '\0';
+ s2[size - 1] = '\0';
+ // Normal StrNCmp calls
+ Ident(StrNCmp(s1, s2, size + 2));
+ s1[size - 1] = 'z';
+ s2[size - 1] = 'x';
+ Ident(StrNCmp(s1 + size - 2, s2 + size - 2, size));
+ s2[size - 1] = 'z';
+ Ident(StrNCmp(s1 - 1, s2 - 1, 0));
+ Ident(StrNCmp(s1 + size - 1, s2 + size - 1, 1));
+ // One of arguments points to not allocated memory.
+ EXPECT_DEATH(Ident(StrNCmp)(s1 - 1, s2, 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrNCmp)(s1, s2 - 1, 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(Ident(StrNCmp)(s1 + size, s2, 1), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(StrNCmp)(s1, s2 + size, 1), RightOOBReadMessage(0));
+ // Hit unallocated memory and die.
+ EXPECT_DEATH(Ident(StrNCmp)(s1 + 1, s2 + 1, size), RightOOBReadMessage(0));
+ EXPECT_DEATH(Ident(StrNCmp)(s1 + size - 1, s2, 2), RightOOBReadMessage(0));
+ free(s1);
+ free(s2);
+}
+
+TEST(AddressSanitizer, StrNCmpOOBTest) {
+ RunStrNCmpTest(&strncmp);
+}
+
+TEST(AddressSanitizer, StrNCaseCmpOOBTest) {
+ RunStrNCmpTest(&strncasecmp);
+}
+TEST(AddressSanitizer, StrCatOOBTest) {
+ // strcat() reads strlen(to) bytes from |to| before concatenating.
+ size_t to_size = Ident(100);
+ char *to = MallocAndMemsetString(to_size);
+ to[0] = '\0';
+ size_t from_size = Ident(20);
+ char *from = MallocAndMemsetString(from_size);
+ from[from_size - 1] = '\0';
+ // Normal strcat calls.
+ strcat(to, from);
+ strcat(to, from);
+ strcat(to + from_size, from + from_size - 2);
+ // Passing an invalid pointer is an error even when concatenating an empty
+ // string.
+ EXPECT_DEATH(strcat(to - 1, from + from_size - 1), LeftOOBAccessMessage(1));
+ // One of arguments points to not allocated memory.
+ EXPECT_DEATH(strcat(to - 1, from), LeftOOBAccessMessage(1));
+ EXPECT_DEATH(strcat(to, from - 1), LeftOOBReadMessage(1));
+ EXPECT_DEATH(strcat(to + to_size, from), RightOOBWriteMessage(0));
+ EXPECT_DEATH(strcat(to, from + from_size), RightOOBReadMessage(0));
+
+ // "from" is not zero-terminated.
+ from[from_size - 1] = 'z';
+ EXPECT_DEATH(strcat(to, from), RightOOBReadMessage(0));
+ from[from_size - 1] = '\0';
+ // "to" is not zero-terminated.
+ memset(to, 'z', to_size);
+ EXPECT_DEATH(strcat(to, from), RightOOBWriteMessage(0));
+ // "to" is too short to fit "from".
+ to[to_size - from_size + 1] = '\0';
+ EXPECT_DEATH(strcat(to, from), RightOOBWriteMessage(0));
+ // length of "to" is just enough.
+ strcat(to, from + 1);
+
+ free(to);
+ free(from);
+}
+
+TEST(AddressSanitizer, StrNCatOOBTest) {
+ // strncat() reads strlen(to) bytes from |to| before concatenating.
+ size_t to_size = Ident(100);
+ char *to = MallocAndMemsetString(to_size);
+ to[0] = '\0';
+ size_t from_size = Ident(20);
+ char *from = MallocAndMemsetString(from_size);
+ // Normal strncat calls.
+ strncat(to, from, 0);
+ strncat(to, from, from_size);
+ from[from_size - 1] = '\0';
+ strncat(to, from, 2 * from_size);
+ // Catenating empty string with an invalid string is still an error.
+ EXPECT_DEATH(strncat(to - 1, from, 0), LeftOOBAccessMessage(1));
+ strncat(to, from + from_size - 1, 10);
+ // One of arguments points to not allocated memory.
+ EXPECT_DEATH(strncat(to - 1, from, 2), LeftOOBAccessMessage(1));
+ EXPECT_DEATH(strncat(to, from - 1, 2), LeftOOBReadMessage(1));
+ EXPECT_DEATH(strncat(to + to_size, from, 2), RightOOBWriteMessage(0));
+ EXPECT_DEATH(strncat(to, from + from_size, 2), RightOOBReadMessage(0));
+
+ memset(from, 'z', from_size);
+ memset(to, 'z', to_size);
+ to[0] = '\0';
+ // "from" is too short.
+ EXPECT_DEATH(strncat(to, from, from_size + 1), RightOOBReadMessage(0));
+ // "to" is not zero-terminated.
+ EXPECT_DEATH(strncat(to + 1, from, 1), RightOOBWriteMessage(0));
+ // "to" is too short to fit "from".
+ to[0] = 'z';
+ to[to_size - from_size + 1] = '\0';
+ EXPECT_DEATH(strncat(to, from, from_size - 1), RightOOBWriteMessage(0));
+ // "to" is just enough.
+ strncat(to, from, from_size - 2);
+
+ free(to);
+ free(from);
+}
+
+static string OverlapErrorMessage(const string &func) {
+ return func + "-param-overlap";
+}
+
+TEST(AddressSanitizer, StrArgsOverlapTest) {
+ size_t size = Ident(100);
+ char *str = Ident((char*)malloc(size));
+
+// Do not check memcpy() on OS X 10.7 and later, where it actually aliases
+// memmove().
+#if !defined(__APPLE__) || !defined(MAC_OS_X_VERSION_10_7) || \
+ (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7)
+ // Check "memcpy". Use Ident() to avoid inlining.
+ memset(str, 'z', size);
+ Ident(memcpy)(str + 1, str + 11, 10);
+ Ident(memcpy)(str, str, 0);
+ EXPECT_DEATH(Ident(memcpy)(str, str + 14, 15), OverlapErrorMessage("memcpy"));
+ EXPECT_DEATH(Ident(memcpy)(str + 14, str, 15), OverlapErrorMessage("memcpy"));
+#endif
+
+ // We do not treat memcpy with to==from as a bug.
+ // See http://llvm.org/bugs/show_bug.cgi?id=11763.
+ // EXPECT_DEATH(Ident(memcpy)(str + 20, str + 20, 1),
+ // OverlapErrorMessage("memcpy"));
+
+ // Check "strcpy".
+ memset(str, 'z', size);
+ str[9] = '\0';
+ strcpy(str + 10, str);
+ EXPECT_DEATH(strcpy(str + 9, str), OverlapErrorMessage("strcpy"));
+ EXPECT_DEATH(strcpy(str, str + 4), OverlapErrorMessage("strcpy"));
+ strcpy(str, str + 5);
+
+ // Check "strncpy".
+ memset(str, 'z', size);
+ strncpy(str, str + 10, 10);
+ EXPECT_DEATH(strncpy(str, str + 9, 10), OverlapErrorMessage("strncpy"));
+ EXPECT_DEATH(strncpy(str + 9, str, 10), OverlapErrorMessage("strncpy"));
+ str[10] = '\0';
+ strncpy(str + 11, str, 20);
+ EXPECT_DEATH(strncpy(str + 10, str, 20), OverlapErrorMessage("strncpy"));
+
+ // Check "strcat".
+ memset(str, 'z', size);
+ str[10] = '\0';
+ str[20] = '\0';
+ strcat(str, str + 10);
+ EXPECT_DEATH(strcat(str, str + 11), OverlapErrorMessage("strcat"));
+ str[10] = '\0';
+ strcat(str + 11, str);
+ EXPECT_DEATH(strcat(str, str + 9), OverlapErrorMessage("strcat"));
+ EXPECT_DEATH(strcat(str + 9, str), OverlapErrorMessage("strcat"));
+ EXPECT_DEATH(strcat(str + 10, str), OverlapErrorMessage("strcat"));
+
+ // Check "strncat".
+ memset(str, 'z', size);
+ str[10] = '\0';
+ strncat(str, str + 10, 10); // from is empty
+ EXPECT_DEATH(strncat(str, str + 11, 10), OverlapErrorMessage("strncat"));
+ str[10] = '\0';
+ str[20] = '\0';
+ strncat(str + 5, str, 5);
+ str[10] = '\0';
+ EXPECT_DEATH(strncat(str + 5, str, 6), OverlapErrorMessage("strncat"));
+ EXPECT_DEATH(strncat(str, str + 9, 10), OverlapErrorMessage("strncat"));
+
+ free(str);
+}
+
+void CallAtoi(const char *nptr) {
+ Ident(atoi(nptr));
+}
+void CallAtol(const char *nptr) {
+ Ident(atol(nptr));
+}
+void CallAtoll(const char *nptr) {
+ Ident(atoll(nptr));
+}
+typedef void(*PointerToCallAtoi)(const char*);
+
+void RunAtoiOOBTest(PointerToCallAtoi Atoi) {
+ char *array = MallocAndMemsetString(10, '1');
+ // Invalid pointer to the string.
+ EXPECT_DEATH(Atoi(array + 11), RightOOBReadMessage(1));
+ EXPECT_DEATH(Atoi(array - 1), LeftOOBReadMessage(1));
+ // Die if a buffer doesn't have terminating NULL.
+ EXPECT_DEATH(Atoi(array), RightOOBReadMessage(0));
+ // Make last symbol a terminating NULL or other non-digit.
+ array[9] = '\0';
+ Atoi(array);
+ array[9] = 'a';
+ Atoi(array);
+ Atoi(array + 9);
+ // Sometimes we need to detect overflow if no digits are found.
+ memset(array, ' ', 10);
+ EXPECT_DEATH(Atoi(array), RightOOBReadMessage(0));
+ array[9] = '-';
+ EXPECT_DEATH(Atoi(array), RightOOBReadMessage(0));
+ EXPECT_DEATH(Atoi(array + 9), RightOOBReadMessage(0));
+ array[8] = '-';
+ Atoi(array);
+ free(array);
+}
+
+TEST(AddressSanitizer, AtoiAndFriendsOOBTest) {
+ RunAtoiOOBTest(&CallAtoi);
+ RunAtoiOOBTest(&CallAtol);
+ RunAtoiOOBTest(&CallAtoll);
+}
+
+void CallStrtol(const char *nptr, char **endptr, int base) {
+ Ident(strtol(nptr, endptr, base));
+}
+void CallStrtoll(const char *nptr, char **endptr, int base) {
+ Ident(strtoll(nptr, endptr, base));
+}
+typedef void(*PointerToCallStrtol)(const char*, char**, int);
+
+void RunStrtolOOBTest(PointerToCallStrtol Strtol) {
+ char *array = MallocAndMemsetString(3);
+ char *endptr = NULL;
+ array[0] = '1';
+ array[1] = '2';
+ array[2] = '3';
+ // Invalid pointer to the string.
+ EXPECT_DEATH(Strtol(array + 3, NULL, 0), RightOOBReadMessage(0));
+ EXPECT_DEATH(Strtol(array - 1, NULL, 0), LeftOOBReadMessage(1));
+ // Buffer overflow if there is no terminating null (depends on base).
+ Strtol(array, &endptr, 3);
+ EXPECT_EQ(array + 2, endptr);
+ EXPECT_DEATH(Strtol(array, NULL, 0), RightOOBReadMessage(0));
+ array[2] = 'z';
+ Strtol(array, &endptr, 35);
+ EXPECT_EQ(array + 2, endptr);
+ EXPECT_DEATH(Strtol(array, NULL, 36), RightOOBReadMessage(0));
+ // Add terminating zero to get rid of overflow.
+ array[2] = '\0';
+ Strtol(array, NULL, 36);
+ // Don't check for overflow if base is invalid.
+ Strtol(array - 1, NULL, -1);
+ Strtol(array + 3, NULL, 1);
+ // Sometimes we need to detect overflow if no digits are found.
+ array[0] = array[1] = array[2] = ' ';
+ EXPECT_DEATH(Strtol(array, NULL, 0), RightOOBReadMessage(0));
+ array[2] = '+';
+ EXPECT_DEATH(Strtol(array, NULL, 0), RightOOBReadMessage(0));
+ array[2] = '-';
+ EXPECT_DEATH(Strtol(array, NULL, 0), RightOOBReadMessage(0));
+ array[1] = '+';
+ Strtol(array, NULL, 0);
+ array[1] = array[2] = 'z';
+ Strtol(array, &endptr, 0);
+ EXPECT_EQ(array, endptr);
+ Strtol(array + 2, NULL, 0);
+ EXPECT_EQ(array, endptr);
+ free(array);
+}
+
+TEST(AddressSanitizer, StrtollOOBTest) {
+ RunStrtolOOBTest(&CallStrtoll);
+}
+TEST(AddressSanitizer, StrtolOOBTest) {
+ RunStrtolOOBTest(&CallStrtol);
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.C
new file mode 100644
index 000000000..e11531e07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.C
@@ -0,0 +1,16 @@
+// { dg-do run { target { { i?86-*-linux* x86_64-*-linux* } && sse2_runtime } } }
+// { dg-skip-if "" { *-*-* } { "*" } { "-O2" } }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+// { dg-additional-sources "asan_globals_test-wrapper.cc" }
+// { dg-options "-fsanitize=address -fno-builtin -Wall -Wno-format -Werror -g -DASAN_UAR=0 -DASAN_HAS_EXCEPTIONS=1 -DASAN_HAS_BLACKLIST=0 -DASAN_USE_DEJAGNU_GTEST=1 -lasan -lpthread -ldl" }
+// { dg-additional-options "-DASAN_NEEDS_SEGV=1" { target { ! arm*-*-* } } }
+// { dg-additional-options "-DASAN_LOW_MEMORY=1 -DASAN_NEEDS_SEGV=0" { target arm*-*-* } }
+// { dg-additional-options "-DASAN_AVOID_EXPENSIVE_TESTS=1" { target { ! run_expensive_tests } } }
+// { dg-additional-options "-msse2" { target { i?86-*-linux* x86_64-*-linux* } } }
+// { dg-additional-options "-D__NO_INLINE__" { target { *-*-linux-gnu } } }
+// { dg-final { asan-gtest } }
+
+#include "asan_test.cc"
+#include "asan_mem_test.cc"
+#include "asan_str_test.cc"
+#include "asan_oob_test.cc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.cc
new file mode 100644
index 000000000..2df8c62cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test.cc
@@ -0,0 +1,1179 @@
+//===-- asan_test.cc ------------------------------------------------------===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+#include "asan_test_utils.h"
+
+NOINLINE void *malloc_fff(size_t size) {
+ void *res = malloc/**/(size); break_optimization(0); return res;}
+NOINLINE void *malloc_eee(size_t size) {
+ void *res = malloc_fff(size); break_optimization(0); return res;}
+NOINLINE void *malloc_ddd(size_t size) {
+ void *res = malloc_eee(size); break_optimization(0); return res;}
+NOINLINE void *malloc_ccc(size_t size) {
+ void *res = malloc_ddd(size); break_optimization(0); return res;}
+NOINLINE void *malloc_bbb(size_t size) {
+ void *res = malloc_ccc(size); break_optimization(0); return res;}
+NOINLINE void *malloc_aaa(size_t size) {
+ void *res = malloc_bbb(size); break_optimization(0); return res;}
+
+#ifndef __APPLE__
+NOINLINE void *memalign_fff(size_t alignment, size_t size) {
+ void *res = memalign/**/(alignment, size); break_optimization(0); return res;}
+NOINLINE void *memalign_eee(size_t alignment, size_t size) {
+ void *res = memalign_fff(alignment, size); break_optimization(0); return res;}
+NOINLINE void *memalign_ddd(size_t alignment, size_t size) {
+ void *res = memalign_eee(alignment, size); break_optimization(0); return res;}
+NOINLINE void *memalign_ccc(size_t alignment, size_t size) {
+ void *res = memalign_ddd(alignment, size); break_optimization(0); return res;}
+NOINLINE void *memalign_bbb(size_t alignment, size_t size) {
+ void *res = memalign_ccc(alignment, size); break_optimization(0); return res;}
+NOINLINE void *memalign_aaa(size_t alignment, size_t size) {
+ void *res = memalign_bbb(alignment, size); break_optimization(0); return res;}
+#endif // __APPLE__
+
+
+NOINLINE void free_ccc(void *p) { free(p); break_optimization(0);}
+NOINLINE void free_bbb(void *p) { free_ccc(p); break_optimization(0);}
+NOINLINE void free_aaa(void *p) { free_bbb(p); break_optimization(0);}
+
+
+template<typename T>
+NOINLINE void uaf_test(int size, int off) {
+ char *p = (char *)malloc_aaa(size);
+ free_aaa(p);
+ for (int i = 1; i < 100; i++)
+ free_aaa(malloc_aaa(i));
+ fprintf(stderr, "writing %ld byte(s) at %p with offset %d\n",
+ (long)sizeof(T), p, off);
+ asan_write((T*)(p + off));
+}
+
+TEST(AddressSanitizer, HasFeatureAddressSanitizerTest) {
+#if defined(__has_feature) && __has_feature(address_sanitizer)
+ bool asan = 1;
+#elif defined(__SANITIZE_ADDRESS__)
+ bool asan = 1;
+#else
+ bool asan = 0;
+#endif
+ EXPECT_EQ(true, asan);
+}
+
+TEST(AddressSanitizer, SimpleDeathTest) {
+ EXPECT_DEATH(exit(1), "");
+}
+
+TEST(AddressSanitizer, VariousMallocsTest) {
+ int *a = (int*)malloc(100 * sizeof(int));
+ a[50] = 0;
+ free(a);
+
+ int *r = (int*)malloc(10);
+ r = (int*)realloc(r, 2000 * sizeof(int));
+ r[1000] = 0;
+ free(r);
+
+ int *b = new int[100];
+ b[50] = 0;
+ delete [] b;
+
+ int *c = new int;
+ *c = 0;
+ delete c;
+
+#if !defined(__APPLE__) && !defined(ANDROID) && !defined(__ANDROID__)
+ int *pm;
+ int pm_res = posix_memalign((void**)&pm, kPageSize, kPageSize);
+ EXPECT_EQ(0, pm_res);
+ free(pm);
+#endif
+
+#if !defined(__APPLE__)
+ int *ma = (int*)memalign(kPageSize, kPageSize);
+ EXPECT_EQ(0U, (uintptr_t)ma % kPageSize);
+ ma[123] = 0;
+ free(ma);
+#endif // __APPLE__
+}
+
+TEST(AddressSanitizer, CallocTest) {
+ int *a = (int*)calloc(100, sizeof(int));
+ EXPECT_EQ(0, a[10]);
+ free(a);
+}
+
+TEST(AddressSanitizer, VallocTest) {
+ void *a = valloc(100);
+ EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
+ free(a);
+}
+
+#ifndef __APPLE__
+TEST(AddressSanitizer, PvallocTest) {
+ char *a = (char*)pvalloc(kPageSize + 100);
+ EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
+ a[kPageSize + 101] = 1; // we should not report an error here.
+ free(a);
+
+ a = (char*)pvalloc(0); // pvalloc(0) should allocate at least one page.
+ EXPECT_EQ(0U, (uintptr_t)a % kPageSize);
+ a[101] = 1; // we should not report an error here.
+ free(a);
+}
+#endif // __APPLE__
+
+void *TSDWorker(void *test_key) {
+ if (test_key) {
+ pthread_setspecific(*(pthread_key_t*)test_key, (void*)0xfeedface);
+ }
+ return NULL;
+}
+
+void TSDDestructor(void *tsd) {
+ // Spawning a thread will check that the current thread id is not -1.
+ pthread_t th;
+ PTHREAD_CREATE(&th, NULL, TSDWorker, NULL);
+ PTHREAD_JOIN(th, NULL);
+}
+
+// This tests triggers the thread-specific data destruction fiasco which occurs
+// if we don't manage the TSD destructors ourselves. We create a new pthread
+// key with a non-NULL destructor which is likely to be put after the destructor
+// of AsanThread in the list of destructors.
+// In this case the TSD for AsanThread will be destroyed before TSDDestructor
+// is called for the child thread, and a CHECK will fail when we call
+// pthread_create() to spawn the grandchild.
+TEST(AddressSanitizer, DISABLED_TSDTest) {
+ pthread_t th;
+ pthread_key_t test_key;
+ pthread_key_create(&test_key, TSDDestructor);
+ PTHREAD_CREATE(&th, NULL, TSDWorker, &test_key);
+ PTHREAD_JOIN(th, NULL);
+ pthread_key_delete(test_key);
+}
+
+TEST(AddressSanitizer, UAF_char) {
+ const char *uaf_string = "AddressSanitizer:.*heap-use-after-free";
+ EXPECT_DEATH(uaf_test<U1>(1, 0), uaf_string);
+ EXPECT_DEATH(uaf_test<U1>(10, 0), uaf_string);
+ EXPECT_DEATH(uaf_test<U1>(10, 10), uaf_string);
+ EXPECT_DEATH(uaf_test<U1>(kLargeMalloc, 0), uaf_string);
+ EXPECT_DEATH(uaf_test<U1>(kLargeMalloc, kLargeMalloc / 2), uaf_string);
+}
+
+#if ASAN_HAS_BLACKLIST
+TEST(AddressSanitizer, IgnoreTest) {
+ int *x = Ident(new int);
+ delete Ident(x);
+ *x = 0;
+}
+#endif // ASAN_HAS_BLACKLIST
+
+struct StructWithBitField {
+ int bf1:1;
+ int bf2:1;
+ int bf3:1;
+ int bf4:29;
+};
+
+TEST(AddressSanitizer, BitFieldPositiveTest) {
+ StructWithBitField *x = new StructWithBitField;
+ delete Ident(x);
+ EXPECT_DEATH(x->bf1 = 0, "use-after-free");
+ EXPECT_DEATH(x->bf2 = 0, "use-after-free");
+ EXPECT_DEATH(x->bf3 = 0, "use-after-free");
+ EXPECT_DEATH(x->bf4 = 0, "use-after-free");
+}
+
+struct StructWithBitFields_8_24 {
+ int a:8;
+ int b:24;
+};
+
+TEST(AddressSanitizer, BitFieldNegativeTest) {
+ StructWithBitFields_8_24 *x = Ident(new StructWithBitFields_8_24);
+ x->a = 0;
+ x->b = 0;
+ delete Ident(x);
+}
+
+#if ASAN_NEEDS_SEGV
+namespace {
+
+const char kUnknownCrash[] = "AddressSanitizer: SEGV on unknown address";
+const char kOverriddenHandler[] = "ASan signal handler has been overridden\n";
+
+TEST(AddressSanitizer, WildAddressTest) {
+ char *c = (char*)0x123;
+ EXPECT_DEATH(*c = 0, kUnknownCrash);
+}
+
+void my_sigaction_sighandler(int, siginfo_t*, void*) {
+ fprintf(stderr, kOverriddenHandler);
+ exit(1);
+}
+
+void my_signal_sighandler(int signum) {
+ fprintf(stderr, kOverriddenHandler);
+ exit(1);
+}
+
+TEST(AddressSanitizer, SignalTest) {
+ struct sigaction sigact;
+ memset(&sigact, 0, sizeof(sigact));
+ sigact.sa_sigaction = my_sigaction_sighandler;
+ sigact.sa_flags = SA_SIGINFO;
+ // ASan should silently ignore sigaction()...
+ EXPECT_EQ(0, sigaction(SIGSEGV, &sigact, 0));
+#ifdef __APPLE__
+ EXPECT_EQ(0, sigaction(SIGBUS, &sigact, 0));
+#endif
+ char *c = (char*)0x123;
+ EXPECT_DEATH(*c = 0, kUnknownCrash);
+ // ... and signal().
+ EXPECT_EQ(0, signal(SIGSEGV, my_signal_sighandler));
+ EXPECT_DEATH(*c = 0, kUnknownCrash);
+}
+} // namespace
+#endif
+
+static void MallocStress(size_t n) {
+ uint32_t seed = my_rand();
+ for (size_t iter = 0; iter < 10; iter++) {
+ vector<void *> vec;
+ for (size_t i = 0; i < n; i++) {
+ if ((i % 3) == 0) {
+ if (vec.empty()) continue;
+ size_t idx = my_rand_r(&seed) % vec.size();
+ void *ptr = vec[idx];
+ vec[idx] = vec.back();
+ vec.pop_back();
+ free_aaa(ptr);
+ } else {
+ size_t size = my_rand_r(&seed) % 1000 + 1;
+#ifndef __APPLE__
+ size_t alignment = 1 << (my_rand_r(&seed) % 7 + 3);
+ char *ptr = (char*)memalign_aaa(alignment, size);
+#else
+ char *ptr = (char*) malloc_aaa(size);
+#endif
+ vec.push_back(ptr);
+ ptr[0] = 0;
+ ptr[size-1] = 0;
+ ptr[size/2] = 0;
+ }
+ }
+ for (size_t i = 0; i < vec.size(); i++)
+ free_aaa(vec[i]);
+ }
+}
+
+TEST(AddressSanitizer, MallocStressTest) {
+ MallocStress((ASAN_LOW_MEMORY) ? 20000 : 200000);
+}
+
+static void TestLargeMalloc(size_t size) {
+ char buff[1024];
+ sprintf(buff, "is located 1 bytes to the left of %lu-byte", (long)size);
+ EXPECT_DEATH(Ident((char*)malloc(size))[-1] = 0, buff);
+}
+
+TEST(AddressSanitizer, LargeMallocTest) {
+ for (int i = 113; i < (1 << 28); i = i * 2 + 13) {
+ TestLargeMalloc(i);
+ }
+}
+
+#if ASAN_LOW_MEMORY != 1
+TEST(AddressSanitizer, HugeMallocTest) {
+#ifdef __APPLE__
+ // It was empirically found out that 1215 megabytes is the maximum amount of
+ // memory available to the process under AddressSanitizer on 32-bit Mac 10.6.
+ // 32-bit Mac 10.7 gives even less (< 1G).
+ // (the libSystem malloc() allows allocating up to 2300 megabytes without
+ // ASan).
+ size_t n_megs = SANITIZER_WORDSIZE == 32 ? 500 : 4100;
+#else
+ size_t n_megs = SANITIZER_WORDSIZE == 32 ? 2600 : 4100;
+#endif
+ TestLargeMalloc(n_megs << 20);
+}
+#endif
+
+#ifndef __APPLE__
+void MemalignRun(size_t align, size_t size, int idx) {
+ char *p = (char *)memalign(align, size);
+ Ident(p)[idx] = 0;
+ free(p);
+}
+
+TEST(AddressSanitizer, memalign) {
+ for (int align = 16; align <= (1 << 23); align *= 2) {
+ size_t size = align * 5;
+ EXPECT_DEATH(MemalignRun(align, size, -1),
+ "is located 1 bytes to the left");
+ EXPECT_DEATH(MemalignRun(align, size, size + 1),
+ "is located 1 bytes to the right");
+ }
+}
+#endif
+
+TEST(AddressSanitizer, ThreadedMallocStressTest) {
+ const int kNumThreads = 4;
+ const int kNumIterations = (ASAN_LOW_MEMORY) ? 10000 : 100000;
+ pthread_t t[kNumThreads];
+ for (int i = 0; i < kNumThreads; i++) {
+ PTHREAD_CREATE(&t[i], 0, (void* (*)(void *x))MallocStress,
+ (void*)kNumIterations);
+ }
+ for (int i = 0; i < kNumThreads; i++) {
+ PTHREAD_JOIN(t[i], 0);
+ }
+}
+
+void *ManyThreadsWorker(void *a) {
+ for (int iter = 0; iter < 100; iter++) {
+ for (size_t size = 100; size < 2000; size *= 2) {
+ free(Ident(malloc(size)));
+ }
+ }
+ return 0;
+}
+
+TEST(AddressSanitizer, ManyThreadsTest) {
+ const size_t kNumThreads =
+ (SANITIZER_WORDSIZE == 32 || ASAN_AVOID_EXPENSIVE_TESTS) ? 30 : 1000;
+ pthread_t t[kNumThreads];
+ for (size_t i = 0; i < kNumThreads; i++) {
+ PTHREAD_CREATE(&t[i], 0, ManyThreadsWorker, (void*)i);
+ }
+ for (size_t i = 0; i < kNumThreads; i++) {
+ PTHREAD_JOIN(t[i], 0);
+ }
+}
+
+TEST(AddressSanitizer, ReallocTest) {
+ const int kMinElem = 5;
+ int *ptr = (int*)malloc(sizeof(int) * kMinElem);
+ ptr[3] = 3;
+ for (int i = 0; i < 10000; i++) {
+ ptr = (int*)realloc(ptr,
+ (my_rand() % 1000 + kMinElem) * sizeof(int));
+ EXPECT_EQ(3, ptr[3]);
+ }
+ free(ptr);
+ // Realloc pointer returned by malloc(0).
+ int *ptr2 = Ident((int*)malloc(0));
+ ptr2 = Ident((int*)realloc(ptr2, sizeof(*ptr2)));
+ *ptr2 = 42;
+ EXPECT_EQ(42, *ptr2);
+ free(ptr2);
+}
+
+TEST(AddressSanitizer, ZeroSizeMallocTest) {
+ // Test that malloc(0) and similar functions don't return NULL.
+ void *ptr = Ident(malloc(0));
+ EXPECT_TRUE(NULL != ptr);
+ free(ptr);
+#if !defined(__APPLE__) && !defined(ANDROID) && !defined(__ANDROID__)
+ int pm_res = posix_memalign(&ptr, 1<<20, 0);
+ EXPECT_EQ(0, pm_res);
+ EXPECT_TRUE(NULL != ptr);
+ free(ptr);
+#endif
+ int *int_ptr = new int[0];
+ int *int_ptr2 = new int[0];
+ EXPECT_TRUE(NULL != int_ptr);
+ EXPECT_TRUE(NULL != int_ptr2);
+ EXPECT_NE(int_ptr, int_ptr2);
+ delete[] int_ptr;
+ delete[] int_ptr2;
+}
+
+#ifndef __APPLE__
+static const char *kMallocUsableSizeErrorMsg =
+ "AddressSanitizer: attempting to call malloc_usable_size()";
+
+TEST(AddressSanitizer, MallocUsableSizeTest) {
+ const size_t kArraySize = 100;
+ char *array = Ident((char*)malloc(kArraySize));
+ int *int_ptr = Ident(new int);
+ EXPECT_EQ(0U, malloc_usable_size(NULL));
+ EXPECT_EQ(kArraySize, malloc_usable_size(array));
+ EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr));
+ EXPECT_DEATH(malloc_usable_size((void*)0x123), kMallocUsableSizeErrorMsg);
+ EXPECT_DEATH(malloc_usable_size(array + kArraySize / 2),
+ kMallocUsableSizeErrorMsg);
+ free(array);
+ EXPECT_DEATH(malloc_usable_size(array), kMallocUsableSizeErrorMsg);
+}
+#endif
+
+void WrongFree() {
+ int *x = (int*)malloc(100 * sizeof(int));
+ // Use the allocated memory, otherwise Clang will optimize it out.
+ Ident(x);
+ free(x + 1);
+}
+
+TEST(AddressSanitizer, WrongFreeTest) {
+ EXPECT_DEATH(WrongFree(),
+ "ERROR: AddressSanitizer: attempting free.*not malloc");
+}
+
+void DoubleFree() {
+ int *x = (int*)malloc(100 * sizeof(int));
+ fprintf(stderr, "DoubleFree: x=%p\n", x);
+ free(x);
+ free(x);
+ fprintf(stderr, "should have failed in the second free(%p)\n", x);
+ abort();
+}
+
+TEST(AddressSanitizer, DoubleFreeTest) {
+ EXPECT_DEATH(DoubleFree(), ASAN_PCRE_DOTALL
+ "ERROR: AddressSanitizer: attempting double-free"
+ ".*is located 0 bytes inside of 400-byte region"
+ ".*freed by thread T0 here"
+ ".*previously allocated by thread T0 here");
+}
+
+template<int kSize>
+NOINLINE void SizedStackTest() {
+ char a[kSize];
+ char *A = Ident((char*)&a);
+ for (size_t i = 0; i < kSize; i++)
+ A[i] = i;
+ EXPECT_DEATH(A[-1] = 0, "");
+ EXPECT_DEATH(A[-20] = 0, "");
+ EXPECT_DEATH(A[-31] = 0, "");
+ EXPECT_DEATH(A[kSize] = 0, "");
+ EXPECT_DEATH(A[kSize + 1] = 0, "");
+ EXPECT_DEATH(A[kSize + 10] = 0, "");
+ EXPECT_DEATH(A[kSize + 31] = 0, "");
+}
+
+TEST(AddressSanitizer, SimpleStackTest) {
+ SizedStackTest<1>();
+ SizedStackTest<2>();
+ SizedStackTest<3>();
+ SizedStackTest<4>();
+ SizedStackTest<5>();
+ SizedStackTest<6>();
+ SizedStackTest<7>();
+ SizedStackTest<16>();
+ SizedStackTest<25>();
+ SizedStackTest<34>();
+ SizedStackTest<43>();
+ SizedStackTest<51>();
+ SizedStackTest<62>();
+ SizedStackTest<64>();
+ SizedStackTest<128>();
+}
+
+TEST(AddressSanitizer, ManyStackObjectsTest) {
+ char XXX[10];
+ char YYY[20];
+ char ZZZ[30];
+ Ident(XXX);
+ Ident(YYY);
+ EXPECT_DEATH(Ident(ZZZ)[-1] = 0, ASAN_PCRE_DOTALL "XXX.*YYY.*ZZZ");
+}
+
+NOINLINE void LongJmpFunc1(jmp_buf buf) {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ longjmp(buf, 1);
+}
+
+NOINLINE void BuiltinLongJmpFunc1(jmp_buf buf) {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ __builtin_longjmp((void**)buf, 1);
+}
+
+NOINLINE void UnderscopeLongJmpFunc1(jmp_buf buf) {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ _longjmp(buf, 1);
+}
+
+NOINLINE void SigLongJmpFunc1(sigjmp_buf buf) {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ siglongjmp(buf, 1);
+}
+
+
+NOINLINE void TouchStackFunc() {
+ int a[100]; // long array will intersect with redzones from LongJmpFunc1.
+ int *A = Ident(a);
+ for (int i = 0; i < 100; i++)
+ A[i] = i*i;
+}
+
+// Test that we handle longjmp and do not report fals positives on stack.
+TEST(AddressSanitizer, LongJmpTest) {
+ static jmp_buf buf;
+ if (!setjmp(buf)) {
+ LongJmpFunc1(buf);
+ } else {
+ TouchStackFunc();
+ }
+}
+
+#if not defined(__ANDROID__)
+TEST(AddressSanitizer, BuiltinLongJmpTest) {
+ static jmp_buf buf;
+ if (!__builtin_setjmp((void**)buf)) {
+ BuiltinLongJmpFunc1(buf);
+ } else {
+ TouchStackFunc();
+ }
+}
+#endif // not defined(__ANDROID__)
+
+TEST(AddressSanitizer, UnderscopeLongJmpTest) {
+ static jmp_buf buf;
+ if (!_setjmp(buf)) {
+ UnderscopeLongJmpFunc1(buf);
+ } else {
+ TouchStackFunc();
+ }
+}
+
+TEST(AddressSanitizer, SigLongJmpTest) {
+ static sigjmp_buf buf;
+ if (!sigsetjmp(buf, 1)) {
+ SigLongJmpFunc1(buf);
+ } else {
+ TouchStackFunc();
+ }
+}
+
+#ifdef __EXCEPTIONS
+NOINLINE void ThrowFunc() {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ ASAN_THROW(1);
+}
+
+TEST(AddressSanitizer, CxxExceptionTest) {
+ if (ASAN_UAR) return;
+ // TODO(kcc): this test crashes on 32-bit for some reason...
+ if (SANITIZER_WORDSIZE == 32) return;
+ try {
+ ThrowFunc();
+ } catch(...) {}
+ TouchStackFunc();
+}
+#endif
+
+void *ThreadStackReuseFunc1(void *unused) {
+ // create three red zones for these two stack objects.
+ int a;
+ int b;
+
+ int *A = Ident(&a);
+ int *B = Ident(&b);
+ *A = *B;
+ pthread_exit(0);
+ return 0;
+}
+
+void *ThreadStackReuseFunc2(void *unused) {
+ TouchStackFunc();
+ return 0;
+}
+
+TEST(AddressSanitizer, ThreadStackReuseTest) {
+ pthread_t t;
+ PTHREAD_CREATE(&t, 0, ThreadStackReuseFunc1, 0);
+ PTHREAD_JOIN(t, 0);
+ PTHREAD_CREATE(&t, 0, ThreadStackReuseFunc2, 0);
+ PTHREAD_JOIN(t, 0);
+}
+
+#if defined(__i386__) || defined(__x86_64__)
+TEST(AddressSanitizer, Store128Test) {
+ char *a = Ident((char*)malloc(Ident(12)));
+ char *p = a;
+ if (((uintptr_t)a % 16) != 0)
+ p = a + 8;
+ assert(((uintptr_t)p % 16) == 0);
+ __m128i value_wide = _mm_set1_epi16(0x1234);
+ EXPECT_DEATH(_mm_store_si128((__m128i*)p, value_wide),
+ "AddressSanitizer: heap-buffer-overflow");
+ EXPECT_DEATH(_mm_store_si128((__m128i*)p, value_wide),
+ "WRITE of size 16");
+ EXPECT_DEATH(_mm_store_si128((__m128i*)p, value_wide),
+ "located 0 bytes to the right of 12-byte");
+ free(a);
+}
+#endif
+
+string RightOOBErrorMessage(int oob_distance, bool is_write) {
+ assert(oob_distance >= 0);
+ char expected_str[100];
+ sprintf(expected_str, ASAN_PCRE_DOTALL "%s.*located %d bytes to the right",
+ is_write ? "WRITE" : "READ", oob_distance);
+ return string(expected_str);
+}
+
+string RightOOBWriteMessage(int oob_distance) {
+ return RightOOBErrorMessage(oob_distance, /*is_write*/true);
+}
+
+string RightOOBReadMessage(int oob_distance) {
+ return RightOOBErrorMessage(oob_distance, /*is_write*/false);
+}
+
+string LeftOOBErrorMessage(int oob_distance, bool is_write) {
+ assert(oob_distance > 0);
+ char expected_str[100];
+ sprintf(expected_str, ASAN_PCRE_DOTALL "%s.*located %d bytes to the left",
+ is_write ? "WRITE" : "READ", oob_distance);
+ return string(expected_str);
+}
+
+string LeftOOBWriteMessage(int oob_distance) {
+ return LeftOOBErrorMessage(oob_distance, /*is_write*/true);
+}
+
+string LeftOOBReadMessage(int oob_distance) {
+ return LeftOOBErrorMessage(oob_distance, /*is_write*/false);
+}
+
+string LeftOOBAccessMessage(int oob_distance) {
+ assert(oob_distance > 0);
+ char expected_str[100];
+ sprintf(expected_str, "located %d bytes to the left", oob_distance);
+ return string(expected_str);
+}
+
+char* MallocAndMemsetString(size_t size, char ch) {
+ char *s = Ident((char*)malloc(size));
+ memset(s, ch, size);
+ return s;
+}
+
+char* MallocAndMemsetString(size_t size) {
+ return MallocAndMemsetString(size, 'z');
+}
+
+#if defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID__)
+#define READ_TEST(READ_N_BYTES) \
+ char *x = new char[10]; \
+ int fd = open("/proc/self/stat", O_RDONLY); \
+ ASSERT_GT(fd, 0); \
+ EXPECT_DEATH(READ_N_BYTES, \
+ ASAN_PCRE_DOTALL \
+ "AddressSanitizer: heap-buffer-overflow" \
+ ".* is located 0 bytes to the right of 10-byte region"); \
+ close(fd); \
+ delete [] x; \
+
+TEST(AddressSanitizer, pread) {
+ READ_TEST(pread(fd, x, 15, 0));
+}
+
+TEST(AddressSanitizer, pread64) {
+ READ_TEST(pread64(fd, x, 15, 0));
+}
+
+TEST(AddressSanitizer, read) {
+ READ_TEST(read(fd, x, 15));
+}
+#endif // defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID__)
+
+// This test case fails
+// Clang optimizes memcpy/memset calls which lead to unaligned access
+TEST(AddressSanitizer, DISABLED_MemIntrinsicUnalignedAccessTest) {
+ int size = Ident(4096);
+ char *s = Ident((char*)malloc(size));
+ EXPECT_DEATH(memset(s + size - 1, 0, 2), RightOOBWriteMessage(0));
+ free(s);
+}
+
+// TODO(samsonov): Add a test with malloc(0)
+// TODO(samsonov): Add tests for str* and mem* functions.
+
+NOINLINE static int LargeFunction(bool do_bad_access) {
+ int *x = new int[100];
+ x[0]++;
+ x[1]++;
+ x[2]++;
+ x[3]++;
+ x[4]++;
+ x[5]++;
+ x[6]++;
+ x[7]++;
+ x[8]++;
+ x[9]++;
+
+ x[do_bad_access ? 100 : 0]++; int res = __LINE__;
+
+ x[10]++;
+ x[11]++;
+ x[12]++;
+ x[13]++;
+ x[14]++;
+ x[15]++;
+ x[16]++;
+ x[17]++;
+ x[18]++;
+ x[19]++;
+
+ delete x;
+ return res;
+}
+
+// Test the we have correct debug info for the failing instruction.
+// This test requires the in-process symbolizer to be enabled by default.
+TEST(AddressSanitizer, DISABLED_LargeFunctionSymbolizeTest) {
+ int failing_line = LargeFunction(false);
+ char expected_warning[128];
+ sprintf(expected_warning, "LargeFunction.*asan_test.*:%d", failing_line);
+ EXPECT_DEATH(LargeFunction(true), expected_warning);
+}
+
+// Check that we unwind and symbolize correctly.
+TEST(AddressSanitizer, DISABLED_MallocFreeUnwindAndSymbolizeTest) {
+ int *a = (int*)malloc_aaa(sizeof(int));
+ *a = 1;
+ free_aaa(a);
+ EXPECT_DEATH(*a = 1, "free_ccc.*free_bbb.*free_aaa.*"
+ "malloc_fff.*malloc_eee.*malloc_ddd");
+}
+
+static bool TryToSetThreadName(const char *name) {
+#if defined(__linux__) && defined(PR_SET_NAME)
+ return 0 == prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0);
+#else
+ return false;
+#endif
+}
+
+void *ThreadedTestAlloc(void *a) {
+ EXPECT_EQ(true, TryToSetThreadName("AllocThr"));
+ int **p = (int**)a;
+ *p = new int;
+ return 0;
+}
+
+void *ThreadedTestFree(void *a) {
+ EXPECT_EQ(true, TryToSetThreadName("FreeThr"));
+ int **p = (int**)a;
+ delete *p;
+ return 0;
+}
+
+void *ThreadedTestUse(void *a) {
+ EXPECT_EQ(true, TryToSetThreadName("UseThr"));
+ int **p = (int**)a;
+ **p = 1;
+ return 0;
+}
+
+void ThreadedTestSpawn() {
+ pthread_t t;
+ int *x;
+ PTHREAD_CREATE(&t, 0, ThreadedTestAlloc, &x);
+ PTHREAD_JOIN(t, 0);
+ PTHREAD_CREATE(&t, 0, ThreadedTestFree, &x);
+ PTHREAD_JOIN(t, 0);
+ PTHREAD_CREATE(&t, 0, ThreadedTestUse, &x);
+ PTHREAD_JOIN(t, 0);
+}
+
+TEST(AddressSanitizer, ThreadedTest) {
+ EXPECT_DEATH(ThreadedTestSpawn(),
+ ASAN_PCRE_DOTALL
+ "Thread T.*created"
+ ".*Thread T.*created"
+ ".*Thread T.*created");
+}
+
+void *ThreadedTestFunc(void *unused) {
+ // Check if prctl(PR_SET_NAME) is supported. Return if not.
+ if (!TryToSetThreadName("TestFunc"))
+ return 0;
+ EXPECT_DEATH(ThreadedTestSpawn(),
+ ASAN_PCRE_DOTALL
+ "WRITE .*thread T. .UseThr."
+ ".*freed by thread T. .FreeThr. here:"
+ ".*previously allocated by thread T. .AllocThr. here:"
+ ".*Thread T. .UseThr. created by T.*TestFunc"
+ ".*Thread T. .FreeThr. created by T"
+ ".*Thread T. .AllocThr. created by T"
+ "");
+ return 0;
+}
+
+TEST(AddressSanitizer, ThreadNamesTest) {
+ // Run ThreadedTestFunc in a separate thread because it tries to set a
+ // thread name and we don't want to change the main thread's name.
+ pthread_t t;
+ PTHREAD_CREATE(&t, 0, ThreadedTestFunc, 0);
+ PTHREAD_JOIN(t, 0);
+}
+
+#if ASAN_NEEDS_SEGV
+TEST(AddressSanitizer, ShadowGapTest) {
+#if SANITIZER_WORDSIZE == 32
+ char *addr = (char*)0x22000000;
+#else
+ char *addr = (char*)0x0000100000080000;
+#endif
+ EXPECT_DEATH(*addr = 1, "AddressSanitizer: SEGV on unknown");
+}
+#endif // ASAN_NEEDS_SEGV
+
+extern "C" {
+NOINLINE static void UseThenFreeThenUse() {
+ char *x = Ident((char*)malloc(8));
+ *x = 1;
+ free_aaa(x);
+ *x = 2;
+}
+}
+
+TEST(AddressSanitizer, UseThenFreeThenUseTest) {
+ EXPECT_DEATH(UseThenFreeThenUse(), "freed by thread");
+}
+
+TEST(AddressSanitizer, StrDupTest) {
+ free(strdup(Ident("123")));
+}
+
+// Currently we create and poison redzone at right of global variables.
+static char static110[110];
+const char ConstGlob[7] = {1, 2, 3, 4, 5, 6, 7};
+static const char StaticConstGlob[3] = {9, 8, 7};
+
+TEST(AddressSanitizer, GlobalTest) {
+ static char func_static15[15];
+
+ static char fs1[10];
+ static char fs2[10];
+ static char fs3[10];
+
+ glob5[Ident(0)] = 0;
+ glob5[Ident(1)] = 0;
+ glob5[Ident(2)] = 0;
+ glob5[Ident(3)] = 0;
+ glob5[Ident(4)] = 0;
+
+ EXPECT_DEATH(glob5[Ident(5)] = 0,
+ "0 bytes to the right of global variable.*glob5.* size 5");
+ EXPECT_DEATH(glob5[Ident(5+6)] = 0,
+ "6 bytes to the right of global variable.*glob5.* size 5");
+ Ident(static110); // avoid optimizations
+ static110[Ident(0)] = 0;
+ static110[Ident(109)] = 0;
+ EXPECT_DEATH(static110[Ident(110)] = 0,
+ "0 bytes to the right of global variable");
+ EXPECT_DEATH(static110[Ident(110+7)] = 0,
+ "7 bytes to the right of global variable");
+
+ Ident(func_static15); // avoid optimizations
+ func_static15[Ident(0)] = 0;
+ EXPECT_DEATH(func_static15[Ident(15)] = 0,
+ "0 bytes to the right of global variable");
+ EXPECT_DEATH(func_static15[Ident(15 + 9)] = 0,
+ "9 bytes to the right of global variable");
+
+ Ident(fs1);
+ Ident(fs2);
+ Ident(fs3);
+
+ // We don't create left redzones, so this is not 100% guaranteed to fail.
+ // But most likely will.
+ EXPECT_DEATH(fs2[Ident(-1)] = 0, "is located.*of global variable");
+
+ EXPECT_DEATH(Ident(Ident(ConstGlob)[8]),
+ "is located 1 bytes to the right of .*ConstGlob");
+ EXPECT_DEATH(Ident(Ident(StaticConstGlob)[5]),
+ "is located 2 bytes to the right of .*StaticConstGlob");
+
+ // call stuff from another file.
+ GlobalsTest(0);
+}
+
+TEST(AddressSanitizer, GlobalStringConstTest) {
+ static const char *zoo = "FOOBAR123";
+ const char *p = Ident(zoo);
+ EXPECT_DEATH(Ident(p[15]), "is ascii string 'FOOBAR123'");
+}
+
+TEST(AddressSanitizer, FileNameInGlobalReportTest) {
+ static char zoo[10];
+ const char *p = Ident(zoo);
+ // The file name should be present in the report.
+ EXPECT_DEATH(Ident(p[15]), "zoo.*asan_test.");
+}
+
+int *ReturnsPointerToALocalObject() {
+ int a = 0;
+ return Ident(&a);
+}
+
+#if ASAN_UAR == 1
+TEST(AddressSanitizer, LocalReferenceReturnTest) {
+ int *(*f)() = Ident(ReturnsPointerToALocalObject);
+ int *p = f();
+ // Call 'f' a few more times, 'p' should still be poisoned.
+ for (int i = 0; i < 32; i++)
+ f();
+ EXPECT_DEATH(*p = 1, "AddressSanitizer: stack-use-after-return");
+ EXPECT_DEATH(*p = 1, "is located.*in frame .*ReturnsPointerToALocal");
+}
+#endif
+
+template <int kSize>
+NOINLINE static void FuncWithStack() {
+ char x[kSize];
+ Ident(x)[0] = 0;
+ Ident(x)[kSize-1] = 0;
+}
+
+static void LotsOfStackReuse() {
+ int LargeStack[10000];
+ Ident(LargeStack)[0] = 0;
+ for (int i = 0; i < 10000; i++) {
+ FuncWithStack<128 * 1>();
+ FuncWithStack<128 * 2>();
+ FuncWithStack<128 * 4>();
+ FuncWithStack<128 * 8>();
+ FuncWithStack<128 * 16>();
+ FuncWithStack<128 * 32>();
+ FuncWithStack<128 * 64>();
+ FuncWithStack<128 * 128>();
+ FuncWithStack<128 * 256>();
+ FuncWithStack<128 * 512>();
+ Ident(LargeStack)[0] = 0;
+ }
+}
+
+TEST(AddressSanitizer, StressStackReuseTest) {
+ LotsOfStackReuse();
+}
+
+TEST(AddressSanitizer, ThreadedStressStackReuseTest) {
+ const int kNumThreads = 20;
+ pthread_t t[kNumThreads];
+ for (int i = 0; i < kNumThreads; i++) {
+ PTHREAD_CREATE(&t[i], 0, (void* (*)(void *x))LotsOfStackReuse, 0);
+ }
+ for (int i = 0; i < kNumThreads; i++) {
+ PTHREAD_JOIN(t[i], 0);
+ }
+}
+
+static void *PthreadExit(void *a) {
+ pthread_exit(0);
+ return 0;
+}
+
+TEST(AddressSanitizer, PthreadExitTest) {
+ pthread_t t;
+ for (int i = 0; i < 1000; i++) {
+ PTHREAD_CREATE(&t, 0, PthreadExit, 0);
+ PTHREAD_JOIN(t, 0);
+ }
+}
+
+#ifdef __EXCEPTIONS
+NOINLINE static void StackReuseAndException() {
+ int large_stack[1000];
+ Ident(large_stack);
+ ASAN_THROW(1);
+}
+
+// TODO(kcc): support exceptions with use-after-return.
+TEST(AddressSanitizer, DISABLED_StressStackReuseAndExceptionsTest) {
+ for (int i = 0; i < 10000; i++) {
+ try {
+ StackReuseAndException();
+ } catch(...) {
+ }
+ }
+}
+#endif
+
+TEST(AddressSanitizer, MlockTest) {
+ EXPECT_EQ(0, mlockall(MCL_CURRENT));
+ EXPECT_EQ(0, mlock((void*)0x12345, 0x5678));
+ EXPECT_EQ(0, munlockall());
+ EXPECT_EQ(0, munlock((void*)0x987, 0x654));
+}
+
+struct LargeStruct {
+ int foo[100];
+};
+
+// Test for bug http://llvm.org/bugs/show_bug.cgi?id=11763.
+// Struct copy should not cause asan warning even if lhs == rhs.
+TEST(AddressSanitizer, LargeStructCopyTest) {
+ LargeStruct a;
+ *Ident(&a) = *Ident(&a);
+}
+
+ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
+static void NoAddressSafety() {
+ char *foo = new char[10];
+ Ident(foo)[10] = 0;
+ delete [] foo;
+}
+
+TEST(AddressSanitizer, AttributeNoAddressSafetyTest) {
+ Ident(NoAddressSafety)();
+}
+
+// It doesn't work on Android, as calls to new/delete go through malloc/free.
+#if !defined(ANDROID) && !defined(__ANDROID__)
+static string MismatchStr(const string &str) {
+ return string("AddressSanitizer: alloc-dealloc-mismatch \\(") + str;
+}
+
+TEST(AddressSanitizer, AllocDeallocMismatch) {
+ EXPECT_DEATH(free(Ident(new int)),
+ MismatchStr("operator new vs free"));
+ EXPECT_DEATH(free(Ident(new int[2])),
+ MismatchStr("operator new \\[\\] vs free"));
+ EXPECT_DEATH(delete (Ident(new int[2])),
+ MismatchStr("operator new \\[\\] vs operator delete"));
+ EXPECT_DEATH(delete (Ident((int*)malloc(2 * sizeof(int)))),
+ MismatchStr("malloc vs operator delete"));
+ EXPECT_DEATH(delete [] (Ident(new int)),
+ MismatchStr("operator new vs operator delete \\[\\]"));
+ EXPECT_DEATH(delete [] (Ident((int*)malloc(2 * sizeof(int)))),
+ MismatchStr("malloc vs operator delete \\[\\]"));
+}
+#endif
+
+// ------------------ demo tests; run each one-by-one -------------
+// e.g. --gtest_filter=*DemoOOBLeftHigh --gtest_also_run_disabled_tests
+TEST(AddressSanitizer, DISABLED_DemoThreadedTest) {
+ ThreadedTestSpawn();
+}
+
+void *SimpleBugOnSTack(void *x = 0) {
+ char a[20];
+ Ident(a)[20] = 0;
+ return 0;
+}
+
+TEST(AddressSanitizer, DISABLED_DemoStackTest) {
+ SimpleBugOnSTack();
+}
+
+TEST(AddressSanitizer, DISABLED_DemoThreadStackTest) {
+ pthread_t t;
+ PTHREAD_CREATE(&t, 0, SimpleBugOnSTack, 0);
+ PTHREAD_JOIN(t, 0);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoUAFLowIn) {
+ uaf_test<U1>(10, 0);
+}
+TEST(AddressSanitizer, DISABLED_DemoUAFLowLeft) {
+ uaf_test<U1>(10, -2);
+}
+TEST(AddressSanitizer, DISABLED_DemoUAFLowRight) {
+ uaf_test<U1>(10, 10);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoUAFHigh) {
+ uaf_test<U1>(kLargeMalloc, 0);
+}
+
+TEST(AddressSanitizer, DISABLED_DemoOOM) {
+ size_t size = SANITIZER_WORDSIZE == 64 ? (size_t)(1ULL << 40) : (0xf0000000);
+ printf("%p\n", malloc(size));
+}
+
+TEST(AddressSanitizer, DISABLED_DemoDoubleFreeTest) {
+ DoubleFree();
+}
+
+TEST(AddressSanitizer, DISABLED_DemoNullDerefTest) {
+ int *a = 0;
+ Ident(a)[10] = 0;
+}
+
+TEST(AddressSanitizer, DISABLED_DemoFunctionStaticTest) {
+ static char a[100];
+ static char b[100];
+ static char c[100];
+ Ident(a);
+ Ident(b);
+ Ident(c);
+ Ident(a)[5] = 0;
+ Ident(b)[105] = 0;
+ Ident(a)[5] = 0;
+}
+
+TEST(AddressSanitizer, DISABLED_DemoTooMuchMemoryTest) {
+ const size_t kAllocSize = (1 << 28) - 1024;
+ size_t total_size = 0;
+ while (true) {
+ char *x = (char*)malloc(kAllocSize);
+ memset(x, 0, kAllocSize);
+ total_size += kAllocSize;
+ fprintf(stderr, "total: %ldM %p\n", (long)total_size >> 20, x);
+ }
+}
+
+// http://code.google.com/p/address-sanitizer/issues/detail?id=66
+TEST(AddressSanitizer, BufferOverflowAfterManyFrees) {
+ for (int i = 0; i < 1000000; i++) {
+ delete [] (Ident(new char [8644]));
+ }
+ char *x = new char[8192];
+ EXPECT_DEATH(x[Ident(8192)] = 0, "AddressSanitizer: heap-buffer-overflow");
+ delete [] Ident(x);
+}
+
+
+// Test that instrumentation of stack allocations takes into account
+// AllocSize of a type, and not its StoreSize (16 vs 10 bytes for long double).
+// See http://llvm.org/bugs/show_bug.cgi?id=12047 for more details.
+TEST(AddressSanitizer, LongDoubleNegativeTest) {
+ long double a, b;
+ static long double c;
+ memcpy(Ident(&a), Ident(&b), sizeof(long double));
+ memcpy(Ident(&c), Ident(&b), sizeof(long double));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_config.h b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_config.h
new file mode 100644
index 000000000..b039dc8be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_config.h
@@ -0,0 +1,58 @@
+//===-- asan_test_config.h --------------------------------------*- C++ -*-===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+#if !defined(INCLUDED_FROM_ASAN_TEST_UTILS_H)
+# error "This file should be included into asan_test_utils.h only"
+#endif
+
+#ifndef ASAN_TEST_CONFIG_H
+#define ASAN_TEST_CONFIG_H
+
+#include <vector>
+#include <string>
+#include <map>
+
+#if ASAN_USE_DEJAGNU_GTEST
+# include "dejagnu-gtest.h"
+#else
+# include "gtest/gtest.h"
+#endif
+
+using std::string;
+using std::vector;
+using std::map;
+
+#ifndef ASAN_UAR
+# error "please define ASAN_UAR"
+#endif
+
+#ifndef ASAN_HAS_EXCEPTIONS
+# error "please define ASAN_HAS_EXCEPTIONS"
+#endif
+
+#ifndef ASAN_HAS_BLACKLIST
+# error "please define ASAN_HAS_BLACKLIST"
+#endif
+
+#ifndef ASAN_NEEDS_SEGV
+# error "please define ASAN_NEEDS_SEGV"
+#endif
+
+#ifndef ASAN_LOW_MEMORY
+# define ASAN_LOW_MEMORY 0
+#endif
+
+#ifndef ASAN_AVOID_EXPENSIVE_TESTS
+# define ASAN_AVOID_EXPENSIVE_TESTS 0
+#endif
+
+#define ASAN_PCRE_DOTALL ""
+
+#endif // ASAN_TEST_CONFIG_H
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_utils.h b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_utils.h
new file mode 100644
index 000000000..5ea7d4449
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/asan_test_utils.h
@@ -0,0 +1,109 @@
+//===-- asan_test_utils.h ---------------------------------------*- C++ -*-===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ASAN_TEST_UTILS_H
+#define ASAN_TEST_UTILS_H
+
+#if !defined(ASAN_EXTERNAL_TEST_CONFIG)
+# define INCLUDED_FROM_ASAN_TEST_UTILS_H
+# include "asan_test_config.h"
+# undef INCLUDED_FROM_ASAN_TEST_UTILS_H
+#endif
+
+#include "sanitizer_test_utils.h"
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <setjmp.h>
+#include <assert.h>
+#include <algorithm>
+#include <sys/mman.h>
+
+#ifdef __linux__
+# include <sys/prctl.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+#include <unistd.h>
+#endif
+
+#if defined(__i386__) || defined(__x86_64__)
+#include <emmintrin.h>
+#endif
+
+#ifndef __APPLE__
+#include <malloc.h>
+#endif
+
+// Check that pthread_create/pthread_join return success.
+#define PTHREAD_CREATE(a, b, c, d) ASSERT_EQ(0, pthread_create(a, b, c, d))
+#define PTHREAD_JOIN(a, b) ASSERT_EQ(0, pthread_join(a, b))
+
+#if ASAN_HAS_EXCEPTIONS
+# define ASAN_THROW(x) throw (x)
+#else
+# define ASAN_THROW(x)
+#endif
+
+typedef uint8_t U1;
+typedef uint16_t U2;
+typedef uint32_t U4;
+typedef uint64_t U8;
+
+static const int kPageSize = 4096;
+
+const size_t kLargeMalloc = 1 << 24;
+
+extern void free_aaa(void *p);
+extern void *malloc_aaa(size_t size);
+
+template<typename T>
+NOINLINE void asan_write(T *a) {
+ *a = 0;
+}
+
+string RightOOBErrorMessage(int oob_distance, bool is_write);
+string RightOOBWriteMessage(int oob_distance);
+string RightOOBReadMessage(int oob_distance);
+string LeftOOBErrorMessage(int oob_distance, bool is_write);
+string LeftOOBWriteMessage(int oob_distance);
+string LeftOOBReadMessage(int oob_distance);
+string LeftOOBAccessMessage(int oob_distance);
+char* MallocAndMemsetString(size_t size, char ch);
+char* MallocAndMemsetString(size_t size);
+
+extern char glob1[1];
+extern char glob2[2];
+extern char glob3[3];
+extern char glob4[4];
+extern char glob5[5];
+extern char glob6[6];
+extern char glob7[7];
+extern char glob8[8];
+extern char glob9[9];
+extern char glob10[10];
+extern char glob11[11];
+extern char glob12[12];
+extern char glob13[13];
+extern char glob14[14];
+extern char glob15[15];
+extern char glob16[16];
+extern char glob17[17];
+extern char glob1000[1000];
+extern char glob10000[10000];
+extern char glob100000[100000];
+extern int GlobalsTest(int x);
+
+#endif // ASAN_TEST_UTILS_H
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-stack-uaf-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-stack-uaf-1.C
new file mode 100644
index 000000000..6ffec4c4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-stack-uaf-1.C
@@ -0,0 +1,39 @@
+// Check that we can store lots of stack frames if asked to.
+
+// { dg-do run }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+// { dg-set-target-env-var ASAN_OPTIONS "malloc_context_size=120:redzone=512" }
+// { dg-options "-fno-omit-frame-pointer -fno-optimize-sibling-calls" }
+// { dg-additional-options "-mno-omit-leaf-frame-pointer" { target { i?86-*-* x86_64-*-* } } }
+// { dg-shouldfail "asan" }
+
+#include <stdlib.h>
+#include <stdio.h>
+
+template <int depth>
+struct DeepFree {
+ static void __attribute__((noinline))
+ free(char *x) {
+ DeepFree<depth - 1>::free(x);
+ }
+};
+
+template<>
+struct DeepFree<0> {
+ static void __attribute__((noinline))
+ free(char *x) {
+ ::free(x);
+ }
+};
+
+int main() {
+ char *x = (char*)malloc(10);
+ // deep_free(x);
+ DeepFree<200>::free(x);
+ return x[5];
+}
+
+// { dg-output "ERROR: AddressSanitizer:? heap-use-after-free on address.*(\n|\r\n|\r)" }
+// { dg-output " #37 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*36|\[(\]).*(\n|\r\n|\r)" }
+// { dg-output " #99 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*98|\[(\]).*(\n|\r\n|\r)" }
+// { dg-output " #116 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*115|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-tail-call-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-tail-call-1.C
new file mode 100644
index 000000000..5ac63f1d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-tail-call-1.C
@@ -0,0 +1,22 @@
+// { dg-do run }
+// { dg-options "-fno-omit-frame-pointer -fno-optimize-sibling-calls" }
+// { dg-additional-options "-mno-omit-leaf-frame-pointer" { target { i?86-*-* x86_64-*-* } } }
+// { dg-shouldfail "asan" }
+
+int global[10];
+void __attribute__((noinline)) call4(int i) { global[i+10]++; }
+void __attribute__((noinline)) call3(int i) { call4(i); }
+void __attribute__((noinline)) call2(int i) { call3(i); }
+void __attribute__((noinline)) call1(int i) { call2(i); }
+volatile int one = 1;
+int main() {
+ call1(one);
+ return global[0];
+}
+
+// { dg-output "AddressSanitizer:? global-buffer-overflow.*(\n|\r\n|\r)" }
+// { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*call4\[^\n\r]*|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #1 0x\[0-9a-f\]+ (in \[^\n\r]*call3\[^\n\r]*|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #2 0x\[0-9a-f\]+ (in \[^\n\r]*call2\[^\n\r]*|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #3 0x\[0-9a-f\]+ (in \[^\n\r]*call1\[^\n\r]*|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #4 0x\[0-9a-f\]+ (in \[^\n\r]*main\[^\n\r]*|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C
new file mode 100644
index 000000000..d5d85c42d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C
@@ -0,0 +1,56 @@
+// { dg-do run { target pthread } }
+// { dg-options "-lasan -lpthread" }
+// { dg-shouldfail "asan" }
+
+#include <pthread.h>
+
+int *x;
+
+void *AllocThread(void *arg) {
+ x = new int;
+ *x = 42;
+ return NULL;
+}
+
+void *FreeThread(void *arg) {
+ delete x;
+ return NULL;
+}
+
+void *AccessThread(void *arg) {
+ *x = 43; // BOOM
+ return NULL;
+}
+
+typedef void* (*callback_type)(void* arg);
+
+void *RunnerThread(void *function) {
+ pthread_t thread;
+ pthread_create(&thread, NULL, (callback_type)function, NULL);
+ pthread_join(thread, NULL);
+ return NULL;
+}
+
+void RunThread(callback_type function) {
+ pthread_t runner;
+ pthread_create(&runner, NULL, RunnerThread, (void*)function);
+ pthread_join(runner, NULL);
+}
+
+int main(int argc, char *argv[]) {
+ RunThread(AllocThread);
+ RunThread(FreeThread);
+ RunThread(AccessThread);
+ return (x != 0);
+}
+
+// { dg-output "ERROR: AddressSanitizer: heap-use-after-free.*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\2 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\8 created by T0 here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\4 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\11 created by T0 here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\6 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
+// { dg-output "Thread T\\14 created by T0 here:" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/default-options-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/default-options-1.C
new file mode 100644
index 000000000..cdcb370d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/default-options-1.C
@@ -0,0 +1,15 @@
+// { dg-do run }
+
+const char *kAsanDefaultOptions="verbosity=1 foo=bar";
+
+extern "C"
+__attribute__((no_sanitize_address))
+const char *__asan_default_options() {
+ return kAsanDefaultOptions;
+}
+
+int main() {
+ return 0;
+}
+
+// { dg-output "Using the defaults from __asan_default_options:.* foo=bar.*(\n|\r\n|\r)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/dejagnu-gtest.h b/gcc-4.9/gcc/testsuite/g++.dg/asan/dejagnu-gtest.h
new file mode 100644
index 000000000..2b4057c85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/dejagnu-gtest.h
@@ -0,0 +1,120 @@
+#ifndef DEJAGNU_GTEST_H
+#define DEJAGNU_GTEST_H 1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#ifdef __cplusplus
+#include <string>
+#endif
+
+struct dejagnu_gtest_test
+{
+ const char *name;
+ void (*fn) (void);
+ struct dejagnu_gtest_test *next;
+};
+struct dejagnu_gtest_test *dejagnu_gtest_test_first, *dejagnu_gtest_test_last;
+int dejagnu_gtest_test_death_num, dejagnu_gtest_test_death_cur_num;
+
+#define TEST(cond, name) \
+static void cond##_##name##_fn (void); \
+static struct dejagnu_gtest_test cond##_##name##_struct \
+ = { #cond "_" #name, cond##_##name##_fn, NULL }; \
+static __attribute__((__constructor__)) void \
+cond##_##name##_ctor (void) \
+{ \
+ if (strncmp (#name, "DISABLED_", 9) == 0) \
+ return; \
+ if (dejagnu_gtest_test_first == NULL) \
+ dejagnu_gtest_test_first = &cond##_##name##_struct; \
+ else \
+ dejagnu_gtest_test_last->next = &cond##_##name##_struct; \
+ dejagnu_gtest_test_last = &cond##_##name##_struct; \
+} \
+static void \
+cond##_##name##_fn (void)
+
+#ifndef __cplusplus
+# define DEJAGNU_GTEST_TOCSTR(regex) (regex)
+#else
+static inline const char *DEJAGNU_GTEST_TOCSTR(const char *x) { return x; }
+static inline const char *DEJAGNU_GTEST_TOCSTR(const std::string &x) { return x.c_str (); }
+#endif
+
+#define EXPECT_DEATH(statement, regex) \
+do \
+ { \
+ ++dejagnu_gtest_test_death_cur_num; \
+ if (dejagnu_gtest_test_death_num == 0) \
+ { \
+ fprintf (stderr, "DEJAGNU_GTEST_EXPECT_DEATH%d %s " \
+ "DEJAGNU_GTEST_EXPECT_DEATH%d %s " \
+ "DEJAGNU_GTEST_EXPECT_DEATH%d\n", \
+ dejagnu_gtest_test_death_cur_num, #statement, \
+ dejagnu_gtest_test_death_cur_num, \
+ DEJAGNU_GTEST_TOCSTR (regex), \
+ dejagnu_gtest_test_death_cur_num); \
+ } \
+ else if (dejagnu_gtest_test_death_cur_num \
+ == dejagnu_gtest_test_death_num) \
+ { \
+ statement; \
+ } \
+ } \
+while (0)
+
+#define EXPECT_TRUE(condition) \
+ if (!(condition)) \
+ { \
+ fprintf (stderr, "EXPECT_TRUE failed: " #condition "\n"); \
+ exit (1); \
+ }
+#define EXPECT_FALSE(condition) EXPECT_TRUE (!condition)
+#define EXPECT_EQ(expected, actual) EXPECT_TRUE ((expected) == (actual))
+#define EXPECT_NE(expected, actual) EXPECT_TRUE ((expected) != (actual))
+#define EXPECT_LT(expected, actual) EXPECT_TRUE ((expected) < (actual))
+#define EXPECT_LE(expected, actual) EXPECT_TRUE ((expected) <= (actual))
+#define EXPECT_GT(expected, actual) EXPECT_TRUE ((expected) > (actual))
+#define EXPECT_GE(expected, actual) EXPECT_TRUE ((expected) >= (actual))
+#define ASSERT_DEATH(statement, regex) EXPECT_DEATH (statement, regex)
+#define ASSERT_TRUE(condition) EXPECT_TRUE (condition)
+#define ASSERT_FALSE(condition) EXPECT_FALSE (condition)
+#define ASSERT_EQ(expected, actual) EXPECT_EQ (expected, actual)
+#define ASSERT_NE(expected, actual) EXPECT_NE (expected, actual)
+#define ASSERT_LT(expected, actual) EXPECT_LT (expected, actual)
+#define ASSERT_LE(expected, actual) EXPECT_LE (expected, actual)
+#define ASSERT_GT(expected, actual) EXPECT_GT (expected, actual)
+#define ASSERT_GE(expected, actual) EXPECT_GE (expected, actual)
+
+int
+main (int argc, const char **argv)
+{
+ const char *test = NULL;
+ struct dejagnu_gtest_test *t;
+ if (argc > 1)
+ test = argv[1];
+ else
+ test = getenv ("DEJAGNU_GTEST_ARG");
+ if (test == NULL)
+ for (t = dejagnu_gtest_test_first; t; t = t->next)
+ fprintf (stderr, "DEJAGNU_GTEST_TEST %s\n", t->name);
+ else
+ {
+ const char *p = strchr (test, ':');
+ if (p != NULL)
+ dejagnu_gtest_test_death_num = atoi (p + 1);
+ for (t = dejagnu_gtest_test_first; t; t = t->next)
+ if (p != NULL
+ ? (strncmp (test, t->name, p - test) == 0
+ && t->name[p - test] == '\0')
+ : (strcmp (test, t->name) == 0))
+ break;
+ EXPECT_TRUE (t != NULL);
+ t->fn ();
+ }
+ return 0;
+}
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/dlclose-test-1-so.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/dlclose-test-1-so.cc
new file mode 100644
index 000000000..99f00e230
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/dlclose-test-1-so.cc
@@ -0,0 +1,32 @@
+//===----------- dlclose-test-so.cc -----------------------------*- C++ -*-===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+// Regression test for
+// http://code.google.com/p/address-sanitizer/issues/detail?id=19
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+static int pad1;
+static int static_var;
+static int pad2;
+
+extern "C"
+int *get_address_of_static_var() {
+ return &static_var;
+}
+
+__attribute__((constructor))
+void at_dlopen() {
+ printf("%s: I am being dlopened\n", __FILE__);
+}
+__attribute__((destructor))
+void at_dlclose() {
+ printf("%s: I am being dlclosed\n", __FILE__);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-failure-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-failure-test-1.C
new file mode 100644
index 000000000..d326e56cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-failure-test-1.C
@@ -0,0 +1,22 @@
+// If user provides his own libc functions, ASan doesn't
+// intercept these functions.
+
+// { dg-do run }
+// { dg-options "-fno-builtin-malloc -fno-builtin-free" }
+// { dg-additional-options "-D__NO_INLINE__" { target { *-*-linux-gnu } } }
+
+#include <stdlib.h>
+#include <stdio.h>
+
+extern "C" long strtol(const char *nptr, char **endptr, int base) {
+ fprintf(stderr, "my_strtol_interceptor\n");
+ return 0;
+}
+
+int main() {
+ char *x = (char*)malloc(10);
+ free(x);
+ return (int)strtol(x, 0, 10);
+}
+
+// { dg-output "my_strtol_interceptor" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-malloc-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-malloc-test-1.C
new file mode 100644
index 000000000..e64c184a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-malloc-test-1.C
@@ -0,0 +1,25 @@
+// ASan interceptor can be accessed with __interceptor_ prefix.
+
+// { dg-do run { target *-*-linux* } }
+// { dg-options "-fno-builtin-free" }
+// { dg-additional-options "-D__NO_INLINE__" { target { *-*-linux-gnu } } }
+// { dg-shouldfail "asan" }
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" void *__interceptor_malloc(size_t size);
+extern "C" void *malloc(size_t size) {
+ write(2, "malloc call\n", sizeof("malloc call\n") - 1);
+ return __interceptor_malloc(size);
+}
+
+int main() {
+ char *x = (char*)malloc(10);
+ free(x);
+ return (int)strtol(x, 0, 10);
+}
+
+// { dg-output "malloc call.*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*heap-use-after-free" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-test-1.C
new file mode 100644
index 000000000..79248e06d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/interception-test-1.C
@@ -0,0 +1,25 @@
+// ASan interceptor can be accessed with __interceptor_ prefix.
+
+// { dg-do run }
+// { dg-options "-fno-builtin-malloc -fno-builtin-free" }
+// { dg-additional-options "-D__NO_INLINE__" { target { *-*-linux-gnu } } }
+// { dg-shouldfail "asan" }
+// { dg-skip-if "Darwin uses mac function interposition" { *-*-darwin* } }
+
+#include <stdlib.h>
+#include <stdio.h>
+
+extern "C" long __interceptor_strtol(const char *nptr, char **endptr, int base);
+extern "C" long strtol(const char *nptr, char **endptr, int base) {
+ fprintf(stderr, "my_strtol_interceptor\n");
+ return __interceptor_strtol(nptr, endptr, base);
+}
+
+int main() {
+ char *x = (char*)malloc(10);
+ free(x);
+ return (int)strtol(x, 0, 10);
+}
+
+// { dg-output "my_strtol_interceptor.*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*heap-use-after-free" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/large-func-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/large-func-test-1.C
new file mode 100644
index 000000000..9344c3bcf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/large-func-test-1.C
@@ -0,0 +1,45 @@
+// { dg-do run }
+// { dg-shouldfail "asan" }
+
+#include <stdlib.h>
+__attribute__((noinline))
+static void LargeFunction(int *x, int zero) {
+ x[0]++;
+ x[1]++;
+ x[2]++;
+ x[3]++;
+ x[4]++;
+ x[5]++;
+ x[6]++;
+ x[7]++;
+ x[8]++;
+ x[9]++;
+
+ x[zero + 111]++; // we should report this exact line
+
+ x[10]++;
+ x[11]++;
+ x[12]++;
+ x[13]++;
+ x[14]++;
+ x[15]++;
+ x[16]++;
+ x[17]++;
+ x[18]++;
+ x[19]++;
+}
+volatile int one = 1;
+int main() {
+ int *x = new int[100];
+ LargeFunction(x, one - 1);
+ delete x;
+}
+
+// { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" }
+// { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #0 0x\[0-9a-f\]+ (in \[^\n\r]*LargeFunction\[^\n\r]*(large-func-test-1.C:18|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" }
+// { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #0( 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
+// { dg-output " #1|) 0x\[0-9a-f\]+ (in (operator new|_*_Zn\[aw\]\[mj\])|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/pr55617.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/pr55617.C
new file mode 100644
index 000000000..02f0daea1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/pr55617.C
@@ -0,0 +1,8 @@
+// { dg-do run }
+
+struct c18 {
+ virtual void bar() { }
+};
+c18 ret;
+int main () {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h b/gcc-4.9/gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h
new file mode 100644
index 000000000..99720c354
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h
@@ -0,0 +1,78 @@
+//===-- sanitizer_test_utils.h ----------------------------------*- C++ -*-===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of *Sanitizer runtime.
+// Common unit tests utilities.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SANITIZER_TEST_UTILS_H
+#define SANITIZER_TEST_UTILS_H
+
+#if defined(_WIN32)
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+typedef __int8 int8_t;
+typedef __int16 int16_t;
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+# define NOINLINE __declspec(noinline)
+# define USED
+#else // defined(_WIN32)
+# define NOINLINE __attribute__((noinline))
+# define USED __attribute__((used))
+#include <stdint.h>
+#endif // defined(_WIN32)
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+
+#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
+ __attribute__((no_sanitize_address))
+#else
+# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
+#endif
+
+#if __LP64__ || defined(_WIN64)
+# define SANITIZER_WORDSIZE 64
+#else
+# define SANITIZER_WORDSIZE 32
+#endif
+
+// Make the compiler thinks that something is going on there.
+inline void break_optimization(void *arg) {
+ __asm__ __volatile__("" : : "r" (arg) : "memory");
+}
+
+// This function returns its parameter but in such a way that compiler
+// can not prove it.
+template<class T>
+NOINLINE
+static T Ident(T t) {
+ T ret = t;
+ break_optimization(&ret);
+ return ret;
+}
+
+// Simple stand-alone pseudorandom number generator.
+// Current algorithm is ANSI C linear congruential PRNG.
+static inline uint32_t my_rand_r(uint32_t* state) {
+ return (*state = *state * 1103515245 + 12345) >> 16;
+}
+
+static uint32_t global_seed = 0;
+
+static inline uint32_t my_rand() {
+ return my_rand_r(&global_seed);
+}
+
+
+#endif // SANITIZER_TEST_UTILS_H
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/shared-lib-test-1-so.cc b/gcc-4.9/gcc/testsuite/g++.dg/asan/shared-lib-test-1-so.cc
new file mode 100644
index 000000000..7548bc02a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/shared-lib-test-1-so.cc
@@ -0,0 +1,20 @@
+//===----------- shared-lib-test-so.cc --------------------------*- C++ -*-===//
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+int pad[10];
+int GLOB[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+extern "C"
+void inc(int index) {
+ GLOB[index]++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/symbolize-callback-1.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/symbolize-callback-1.C
new file mode 100644
index 000000000..9978958f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/symbolize-callback-1.C
@@ -0,0 +1,21 @@
+// { dg-do run }
+// { dg-skip-if "" { *-*-* } { "*" } { "-O2" } }
+// { dg-options "-fno-builtin-malloc -fno-builtin-free" }
+// { dg-shouldfail "asan" }
+
+#include <stdio.h>
+#include <stdlib.h>
+
+extern "C"
+bool __asan_symbolize(const void *, char *out_buffer, int out_size) {
+ snprintf(out_buffer, out_size, "MySymbolizer");
+ return true;
+}
+
+int main() {
+ char *x = (char*)malloc(10);
+ free(x);
+ return x[5];
+}
+
+// { dg-output "MySymbolizer" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/bprob/bprob.exp b/gcc-4.9/gcc/testsuite/g++.dg/bprob/bprob.exp
new file mode 100644
index 000000000..8b68b859d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/bprob/bprob.exp
@@ -0,0 +1,68 @@
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+#
+# Test the functionality of programs compiled with profile-directed block
+# ordering using -fprofile-arcs followed by -fbranch-probabilities.
+
+load_lib target-supports.exp
+
+# Some targets don't have any implementation of __bb_init_func or are
+# missing other needed machinery.
+if { ![check_profiling_available "-fprofile-arcs"] } {
+ return
+}
+
+# The procedures in profopt.exp need these parameters.
+set tool g++
+set prof_ext "gcda"
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# Load support procs.
+load_lib profopt.exp
+
+# Save and override the default list defined in profopt.exp.
+set bprob_save_profopt_options $PROFOPT_OPTIONS
+set PROFOPT_OPTIONS [list \
+ { -g } \
+ { -O0 } \
+ { -O1 } \
+ { -O2 } \
+ { -O3 } \
+ { -O3 -g } \
+ { -Os } ]
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+set profile_options "-fprofile-arcs"
+set feedback_options "-fbranch-probabilities"
+
+# Main loop.
+foreach profile_option $profile_options feedback_option $feedback_options {
+ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+ profopt-execute $src
+ }
+}
+
+set PROFOPT_OPTIONS $bprob_save_profopt_options
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C b/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C
new file mode 100644
index 000000000..b1a1de77e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C
@@ -0,0 +1,234 @@
+/* Check that various C constructs (in C++) don't cause problems for
+ * profile-directed block ordering.
+
+ Most of this test is the same as bprob-1.c and gcov-4.c in
+ gcc.misc-tests. The "count" comments are left in to make comparisons
+ easier; they are ignored for this test. */
+
+extern "C" void abort (void);
+
+/* Check for loops. */
+
+int for_val1;
+int for_val2;
+int for_temp;
+
+int
+test_for1 (int n)
+{
+ int i;
+ for_temp = 1; /* count(3) */
+ for (i = 0; i < n; i++)
+ for_temp++; /* count(9) */
+ return for_temp; /* count(3) */
+}
+
+int
+test_for2 (int m, int n, int o)
+{
+ int i, j, k;
+ for_temp = 1; /* count(6) */
+ for (i = 0; i < n; i++)
+ for (j = 0; j < m; j++)
+ for (k = 0; k < o; k++)
+ for_temp++; /* count(81) */
+ return for_temp; /* count(6) */
+}
+
+int
+call_for ()
+{
+ for_val1 += test_for1 (0);
+ for_val1 += test_for1 (2);
+ for_val1 += test_for1 (7);
+
+ for_val2 += test_for2 (0, 0, 0);
+ for_val2 += test_for2 (1, 0, 0);
+ for_val2 += test_for2 (1, 3, 0);
+ for_val2 += test_for2 (1, 3, 1);
+ for_val2 += test_for2 (3, 1, 5);
+ for_val2 += test_for2 (3, 7, 3);
+}
+
+/* Check the use of goto. */
+
+int goto_val;
+
+int
+test_goto1 (int f)
+{
+ if (f) /* count(2) */
+ goto lab1; /* count(1) */
+ return 1; /* count(1) */
+lab1:
+ return 2; /* count(1) */
+}
+
+int
+test_goto2 (int f)
+{
+ int i;
+ for (i = 0; i < 10; i++) /* count(15) */
+ if (i == f) goto lab2; /* count(14) */
+ return 4; /* count(1) */
+lab2:
+ return 8; /* count(1) */
+}
+
+void
+call_goto ()
+{
+ goto_val += test_goto1 (0);
+ goto_val += test_goto1 (1);
+ goto_val += test_goto2 (3);
+ goto_val += test_goto2 (30);
+}
+
+/* Check nested if-then-else statements. */
+
+int ifelse_val1;
+int ifelse_val2;
+int ifelse_val3;
+
+int
+test_ifelse1 (int i, int j)
+{
+ int result = 0;
+ if (i) /* count(5) */
+ if (j) /* count(3) */
+ result = 4; /* count(3) */
+ else
+ result = 1024;
+ else
+ if (j) /* count(2) */
+ result = 1; /* count(1) */
+ else
+ result = 2; /* count(1) */
+ if (i > j) /* count(5) */
+ result *= 2; /* count(1) */
+ if (i > 10) /* count(5) */
+ if (j > 10) /* count(1) */
+ result *= 4; /* count(1) */
+ return result; /* count(5) */
+}
+
+int
+test_ifelse2 (int i)
+{
+ int result = 0;
+ if (!i) /* count(6) */
+ result = 1; /* count(1) */
+ if (i == 1) /* count(6) */
+ result = 1024;
+ if (i == 2) /* count(6) */
+ result = 2; /* count(3) */
+ if (i == 3) /* count(6) */
+ return 8; /* count(2) */
+ if (i == 4) /* count(4) */
+ return 2048;
+ return result; /* count(4) */
+}
+
+int
+test_ifelse3 (int i, int j)
+{
+ int result = 1;
+ if (i > 10 && j > i && j < 20) /* count(11) */
+ result = 16; /* count(1) */
+ if (i > 20) /* count(11) */
+ if (j > i) /* count(5) */
+ if (j < 30) /* count(2) */
+ result = 32; /* count(1) */
+ if (i == 3 || j == 47 || i == j) /* count(11) */
+ result = 64; /* count(3) */
+ return result; /* count(11) */
+}
+
+void
+call_ifelse ()
+{
+ ifelse_val1 += test_ifelse1 (0, 2);
+ ifelse_val1 += test_ifelse1 (0, 0);
+ ifelse_val1 += test_ifelse1 (1, 2);
+ ifelse_val1 += test_ifelse1 (10, 2);
+ ifelse_val1 += test_ifelse1 (11, 11);
+
+ ifelse_val2 += test_ifelse2 (0);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (3);
+ ifelse_val2 += test_ifelse2 (3);
+
+ ifelse_val3 += test_ifelse3 (11, 19);
+ ifelse_val3 += test_ifelse3 (25, 27);
+ ifelse_val3 += test_ifelse3 (11, 22);
+ ifelse_val3 += test_ifelse3 (11, 10);
+ ifelse_val3 += test_ifelse3 (21, 32);
+ ifelse_val3 += test_ifelse3 (21, 20);
+ ifelse_val3 += test_ifelse3 (1, 2);
+ ifelse_val3 += test_ifelse3 (32, 31);
+ ifelse_val3 += test_ifelse3 (3, 0);
+ ifelse_val3 += test_ifelse3 (0, 47); /* count(1) */
+ ifelse_val3 += test_ifelse3 (65, 65); /* count(1) */
+}
+
+/* Check switch statements. */
+
+int switch_val, switch_m;
+
+int
+test_switch (int i, int j)
+{
+ int result = 0; /* count(5) */
+
+ switch (i) /* count(5) */
+ {
+ case 1:
+ result = 2; /* count(1) */
+ break;
+ case 2:
+ result = 1024;
+ break;
+ case 3:
+ case 4:
+ if (j == 2) /* count(3) */
+ return 4; /* count(1) */
+ result = 8; /* count(2) */
+ break;
+ default:
+ result = 32; /* count(1) */
+ switch_m++; /* count(1) */
+ break;
+ }
+ return result; /* count(4) */
+}
+
+void
+call_switch ()
+{
+ switch_val += test_switch (1, 0);
+ switch_val += test_switch (3, 0);
+ switch_val += test_switch (3, 2);
+ switch_val += test_switch (4, 0);
+ switch_val += test_switch (16, 0);
+ switch_val += switch_m;
+}
+
+int
+main()
+{
+ call_for ();
+ call_goto ();
+ call_ifelse ();
+ call_switch ();
+ if ((for_val1 != 12)
+ || (for_val2 != 87)
+ || (goto_val != 15)
+ || (ifelse_val1 != 31)
+ || (ifelse_val2 != 23)
+ || (ifelse_val3 != 246)
+ || (switch_val != 55))
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C b/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C
new file mode 100644
index 000000000..23577d47e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C
@@ -0,0 +1,15 @@
+namespace {
+
+int calc(int j)
+{
+ if (j==0) return 0;
+ return calc(j-1)*j % 17;
+}
+
+}
+
+int main(void)
+{
+ return calc(25);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cdce3.C b/gcc-4.9/gcc/testsuite/g++.dg/cdce3.C
new file mode 100644
index 000000000..726e9ec51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cdce3.C
@@ -0,0 +1,235 @@
+/* { dg-do run } */
+/* { dg-require-effective-target c99_runtime } */
+/* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -lm" } */
+/* { dg-additional-options "-DLARGE_LONG_DOUBLE" { target large_long_double } } */
+/* { dg-additional-options "-DGNU_EXTENSION" { target pow10 } } */
+/* { dg-add-options ieee } */
+/* { dg-final { scan-tree-dump "cdce3.C:92: note: function call is shrink-wrapped into error conditions\." "cdce" { target pow10 } } } */
+/* { dg-final { scan-tree-dump "cdce3.C:93: note: function call is shrink-wrapped into error conditions\." "cdce" { target pow10 } } } */
+/* { dg-final { scan-tree-dump "cdce3.C:95: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:96: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:97: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:98: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:99: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:100: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:101: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:102: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:103: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:104: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:105: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:106: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:107: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { scan-tree-dump "cdce3.C:108: note: function call is shrink-wrapped into error conditions\." "cdce" } } */
+/* { dg-final { cleanup-tree-dump "cdce" } } */
+
+#include <stdlib.h>
+#include <math.h>
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+#include <errno.h>
+typedef void (*FP) (int xp);
+#define NI __attribute__((noinline))
+
+#if defined(LARGE_LONG_DOUBLE)
+typedef long double ldouble;
+ldouble result;
+
+#define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \
+{ \
+ float yy = name##f ((float) x); \
+ STORE_RESULT; \
+} \
+NI void prefix##name (int x) \
+{ \
+ double yy = name ((double)x); \
+ STORE_RESULT; \
+} \
+NI void prefix##name##l (int x) \
+{ \
+ ldouble yy = name##l ((ldouble)x); \
+ STORE_RESULT; \
+}
+#else
+double result;
+
+#define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \
+{ \
+ float yy = name##f ((float) x); \
+ STORE_RESULT; \
+} \
+NI void prefix##name (int x) \
+{ \
+ double yy = name ((double)x); \
+ STORE_RESULT; \
+}
+#endif
+
+#undef STORE_RESULT
+#define STORE_RESULT result = yy
+#if defined(GNU_EXTENSION)
+DEF_MATH_FUNC (m,pow10)
+DEF_MATH_FUNC (m,exp10)
+#endif
+DEF_MATH_FUNC (m,exp2)
+DEF_MATH_FUNC (m,exp)
+DEF_MATH_FUNC (m,expm1)
+DEF_MATH_FUNC (m,cosh)
+DEF_MATH_FUNC (m,sinh)
+DEF_MATH_FUNC (m,acos)
+DEF_MATH_FUNC (m,asin)
+DEF_MATH_FUNC (m,acosh)
+DEF_MATH_FUNC (m,atanh)
+DEF_MATH_FUNC (m,log)
+DEF_MATH_FUNC (m,log2)
+DEF_MATH_FUNC (m,log10)
+DEF_MATH_FUNC (m,log1p)
+DEF_MATH_FUNC (m,sqrt)
+
+#undef STORE_RESULT
+#define STORE_RESULT
+#if defined(GNU_EXTENSION)
+DEF_MATH_FUNC (o,pow10)
+DEF_MATH_FUNC (o,exp10)
+#endif
+DEF_MATH_FUNC (o,exp2)
+DEF_MATH_FUNC (o,exp)
+DEF_MATH_FUNC (o,expm1)
+DEF_MATH_FUNC (o,cosh)
+DEF_MATH_FUNC (o,sinh)
+DEF_MATH_FUNC (o,acos)
+DEF_MATH_FUNC (o,asin)
+DEF_MATH_FUNC (o,acosh)
+DEF_MATH_FUNC (o,atanh)
+DEF_MATH_FUNC (o,log)
+DEF_MATH_FUNC (o,log2)
+DEF_MATH_FUNC (o,log10)
+DEF_MATH_FUNC (o,log1p)
+DEF_MATH_FUNC (o,sqrt)
+
+#if defined(LARGE_LONG_DOUBLE)
+#define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \
+{ prefix##name, #name, 0, 0, lb, ub }, \
+{ prefix##name##l, #name "l" , 0, 0, lb, ub },
+#else
+#define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \
+{ prefix##name, #name, 0, 0, lb, ub },
+#endif
+
+struct MathFuncInfo
+{
+ FP math_func;
+ const char* name;
+ int lb;
+ int ub;
+ bool has_lb;
+ bool has_ub;
+} math_func_arr[] = {
+#if defined(GNU_EXTENSION)
+ INIT_MATH_FUNC (m,pow10, false, true)
+ INIT_MATH_FUNC (m,exp10, false, true)
+#endif
+ INIT_MATH_FUNC (m,exp2, false, true)
+ INIT_MATH_FUNC (m,expm1, false, true)
+ INIT_MATH_FUNC (m,exp, false, true)
+ INIT_MATH_FUNC (m,cosh, true, true)
+ INIT_MATH_FUNC (m,sinh, true, true)
+ INIT_MATH_FUNC (m,acos, true, true)
+ INIT_MATH_FUNC (m,asin, true, true)
+ INIT_MATH_FUNC (m,acosh, true, false)
+ INIT_MATH_FUNC (m,atanh, true, true)
+ INIT_MATH_FUNC (m,log10, true, false)
+ INIT_MATH_FUNC (m,log, true, false)
+ INIT_MATH_FUNC (m,log2, true, false)
+ INIT_MATH_FUNC (m,log1p, true, false)
+ INIT_MATH_FUNC (m,sqrt, true, false)
+ { 0, 0, 0, 0, 0, 0} };
+
+MathFuncInfo opt_math_func_arr[] =
+{
+#if defined(GNU_EXTENSION)
+ INIT_MATH_FUNC (o,pow10, false, true)
+ INIT_MATH_FUNC (o,exp10, false, true)
+#endif
+ INIT_MATH_FUNC (o,exp2, false, true)
+ INIT_MATH_FUNC (o,expm1, false, true)
+ INIT_MATH_FUNC (o,exp, false, true)
+ INIT_MATH_FUNC (o,cosh, true, true)
+ INIT_MATH_FUNC (o,sinh, true, true)
+ INIT_MATH_FUNC (o,acos, true, true)
+ INIT_MATH_FUNC (o,asin, true, true)
+ INIT_MATH_FUNC (o,acosh, true, false)
+ INIT_MATH_FUNC (o,atanh, true, true)
+ INIT_MATH_FUNC (o,log10, true, false)
+ INIT_MATH_FUNC (o,log, true, false)
+ INIT_MATH_FUNC (o,log2, true, false)
+ INIT_MATH_FUNC (o,log1p, true, false)
+ INIT_MATH_FUNC (o,sqrt, true, false)
+ { 0, 0, 0, 0, 0, 0} };
+
+int test (MathFuncInfo* math_func_infos)
+{
+ int i = 0;
+ int te = 0;
+
+ for (i = 0; math_func_infos[i].math_func; i++)
+ {
+ MathFuncInfo& info = math_func_infos[i];
+ int j;
+ if (info.has_lb)
+ {
+ for (j = 0; j > -500000; j--)
+ {
+
+ errno = 0;
+ info.math_func (j);
+ if (errno != 0)
+ {
+ te++;
+ info.lb = j ;
+ break;
+ }
+ }
+ }
+ if (info.has_ub)
+ {
+ for (j = 0; j < 500000; j++)
+ {
+ errno = 0;
+ info.math_func (j);
+ if (errno != 0)
+ {
+ te++;
+ info.ub = j ;
+ break;
+ }
+ }
+ }
+ }
+ return te;
+}
+
+int main()
+{
+ int te1, te2;
+
+ te1 = test (&math_func_arr[0]);
+ te2 = test (&opt_math_func_arr[0]);
+
+ // Now examine the result
+ int i = 0;
+ int errcnt = 0;
+ for (i = 0; math_func_arr[i].math_func; i++)
+ {
+ MathFuncInfo& info = math_func_arr[i];
+ MathFuncInfo& opt_info = opt_math_func_arr[i];
+#ifdef DEBUG
+ fprintf (stderr," %s: lb = %d, ub = %d: lb_opt = %d, ub_opt = %d\n",
+ info.name, info.lb, info.ub, opt_info.lb, opt_info.ub);
+#endif
+ if (info.lb != opt_info.lb) errcnt ++;
+ if (info.ub != opt_info.ub) errcnt ++;
+ }
+ if (errcnt) abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/asm1.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm1.c
new file mode 100644
index 000000000..7076d1285
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target *-*-* } }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler ".ascii bar" } }
+ { dg-final { scan-assembler ".ascii foo" } }
+ */
+extern int x, y;
+
+asm (".ascii bar");
+
+int foo (void)
+{
+ __asm__ (".ascii foo");
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/asm2.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm2.c
new file mode 100644
index 000000000..7fb1959d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm2.c
@@ -0,0 +1,33 @@
+/* Test for complex asm statements. Make sure it compiles
+ then test for some of the asm statements not being translated. */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler "std" } }
+ { dg-final { scan-assembler "cld" } }
+ { dg-final { scan-assembler "rep" } }
+ { dg-final { scan-assembler "movsb" } } */
+#define size_t int
+void *
+memmove (void *__dest, __const void *__src, size_t __n)
+{
+ register unsigned long int __d0, __d1, __d2;
+ if (__dest < __src)
+ __asm__ __volatile__
+ ("cld\n\t"
+ "rep\n\t"
+ "movsb"
+ : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+ : "0" (__n), "1" (__src), "2" (__dest)
+ : "memory");
+ else
+ __asm__ __volatile__
+ ("std\n\t"
+ "rep\n\t"
+ "movsb\n\t"
+ "cld"
+ : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+ : "0" (__n), "1" (__n - 1 + (const char *) __src),
+ "2" (__n - 1 + (char *) __dest)
+ : "memory");
+ return __dest;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/asm3.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm3.c
new file mode 100644
index 000000000..59c8d59ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm3.c
@@ -0,0 +1,10 @@
+/* Simple asm test. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler "foo" } } */
+extern int bar;
+
+int main (void)
+{
+ asm ("foo %0" : "=r" (bar));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/asm4.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm4.c
new file mode 100644
index 000000000..a4bb01401
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm4.c
@@ -0,0 +1,8 @@
+/* Test for string translation. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler-not "translate" } } */
+void foo (void)
+{
+ asm ("xx" : : "r"("translate") : "cc");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/asm5.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm5.c
new file mode 100644
index 000000000..ae2ec485d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/asm5.c
@@ -0,0 +1,13 @@
+/* Test for string translation. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler "foo" } } */
+int main()
+{
+ unsigned long int *ptr;
+ ptr = ((unsigned long int *)
+ ( { void *stack_ptr;
+ __asm__ __volatile__ ( "foo %0" : "=r" (stack_ptr) );
+ (stack_ptr); } ) );
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute1.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute1.c
new file mode 100644
index 000000000..799630030
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute1.c
@@ -0,0 +1,10 @@
+/* Test for attribute non-translation. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler "foo" } } */
+int walrus __attribute__ ((section (".foo")));
+
+int main (void)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute2.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute2.c
new file mode 100644
index 000000000..a67b7ac87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/attribute2.c
@@ -0,0 +1,8 @@
+/* Test to make sure that invalid attributes aren't translated.
+ If error recovery is ever testable then "foobar" should be
+ translated. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+*/
+int foo __attribute__ ((walrus)); /* { dg-warning "walrus" "ignored" } */
+char x[] = "foobar";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/charset.exp b/gcc-4.9/gcc/testsuite/g++.dg/charset/charset.exp
new file mode 100644
index 000000000..3ca071eea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/charset.exp
@@ -0,0 +1,44 @@
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the 'dg.exp' driver.
+
+# There's a bunch of headers we need.
+if [is_remote host] {
+ foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] {
+ remote_download host $header
+ }
+}
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib target-supports.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CHARSETCFLAGS
+if ![info exists DEFAULT_CHARSETCFLAGS] then {
+ set DEFAULT_CHARSETCFLAGS "-fexec-charset=IBM1047"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{c,cc,S} ]] \
+ $DEFAULT_CHARSETCFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/extern1.cc b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern1.cc
new file mode 100644
index 000000000..09284ad1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern1.cc
@@ -0,0 +1,15 @@
+/* Test extern statments not being translated. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+*/
+
+extern "C" {
+
+
+int testbug (void) {
+
+ return 0;
+
+}
+
+} //extern block
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/extern2.cc b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern2.cc
new file mode 100644
index 000000000..9a0c85039
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern2.cc
@@ -0,0 +1,5 @@
+/* Check that we push the declaration and then continue translation. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler-not "foobar" } } */
+extern "C" { const char* foo = "foobar"; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/extern3.cc b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern3.cc
new file mode 100644
index 000000000..05a0c3e42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/extern3.cc
@@ -0,0 +1,11 @@
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler-not "abcdefghijklmnopqrstuvwxyz" } } */
+
+extern char *bar;
+
+extern void foo (void)
+{
+ char str[]="abcdefghijklmnopqrstuvwxyz";
+ bar = str;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/function.cc b/gcc-4.9/gcc/testsuite/g++.dg/charset/function.cc
new file mode 100644
index 000000000..5aba6511b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/function.cc
@@ -0,0 +1,10 @@
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler-not "\"foobar\"" } } */
+
+const char *str;
+
+void foobar (void)
+{
+ str = __FUNCTION__;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/charset/string.c b/gcc-4.9/gcc/testsuite/g++.dg/charset/string.c
new file mode 100644
index 000000000..a09d39a20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/charset/string.c
@@ -0,0 +1,5 @@
+/* Simple character translation test. */
+/* { dg-do compile }
+ { dg-require-iconv "IBM1047" }
+ { dg-final { scan-assembler-not "string foobar" } } */
+const char* foo = "string foobar";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test1_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test1_tplt.cc
new file mode 100644
index 000000000..e9ee7ec63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test1_tplt.cc
@@ -0,0 +1,118 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+#include <cstdlib>
+#include <string.h>
+#if HAVE_IO
+#include <cstdio>
+#endif
+template <class T> int main2 (char **argv);
+
+int main (void)
+{
+ int x = 1, y = 1, z = 1;
+ char *array[2];
+ array[0] = strdup ("a.out");
+ array[1] = strdup ("5");
+ x = main2<unsigned char> (array);
+ x += main2<char> (array);
+ y = main2<short> (array);
+ y += main2<unsigned short> (array);
+ y += main2<int> (array);
+ y += main2<unsigned int> (array);
+ z = main2<long> (array);
+ z += main2<long long> (array);
+ y += main2<float> (array);
+ z += main2<double> (array);
+
+ return x+y+z;
+}
+template <class T>
+int main2 (char **argv)
+{
+ T array[10];
+ int ii = 0, x = 2, z= 0 , y = 0;
+
+ for (ii = 0; ii < 10; ii++)
+ array[ii] = 10;
+
+ array[0:10:1] = (T)15;
+
+ for (ii = 0; ii < 10; ii++)
+ if (array[ii] != (T)15)
+ return 1;
+
+
+ array[0:5:2] = (T)20;
+
+ for (ii = 0; ii < 10; ii += 2)
+ if (array[ii] != (T)20)
+ return 2;
+
+
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+
+ array[x:5:z] = (T)50;
+
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != (T)50)
+ return 3;
+
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]); /* (10 - 5) / 5 = 1 */
+ y = 10-atoi(argv[1]);
+
+ array[x:y:z] = (T)52;
+#if HAVE_IO
+ for (ii = atoi ("5"); ii < (atoi ("5") + atoi ("5")); ii += atoi ("1"))
+ std::printf("%d\t", (int)array[ii]);
+ std::printf("\n");
+#endif
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != (T)52)
+ return 4;
+
+
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+ y = 10-atoi(argv[1]);
+
+ array[x:y:((10-atoi(argv[1]))/atoi(argv[1]))] = (T)25;
+
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != (T)25)
+ return 5;
+
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+ y = 10-atoi(argv[1]);
+
+ array[atoi(argv[1]):(10-atoi(argv[1])):((10-atoi(argv[1]))/atoi(argv[1]))] =
+ (T)14;
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != (T)14)
+ return 6;
+
+
+ array[atoi("5"):5:1] = (T)65;
+
+ for (ii = atoi ("5"); ii < 10; ii++)
+ if (array[ii] != (T)65)
+ return 7;
+
+
+ array[atoi("5"):atoi("5"):atoi("1")] = 99;
+
+#if HAVE_IO
+ for (ii = atoi ("5"); ii < (atoi ("5") + atoi ("5")); ii += atoi ("1"))
+ std::printf("%d\t", (int)array[ii]);
+ std::printf("\n");
+#endif
+
+ for (ii = atoi ("5"); ii < (atoi ("5") + atoi ("5")); ii += atoi ("1"))
+ if (array[ii] != (T)99)
+ return 8;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test2_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test2_tplt.cc
new file mode 100644
index 000000000..041c05289
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test2_tplt.cc
@@ -0,0 +1,141 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus -Wno-overflow" } */
+
+#include <cstdlib>
+#include <string.h>
+template <class T> int main2(char **argv);
+int main(void)
+{
+ int x = 1, y = 1, z = 1, w = 1;
+ char *array[2];
+ array[0] = strdup ("a.out");
+ array[1] = strdup ("5");
+ w = main2<short>(array);
+ w += main2<unsigned short> (array);
+ x = main2<char> (array);
+ x += main2<unsigned char> (array);
+ y = main2<int> (array);
+ y += main2<unsigned int> (array);
+ z = main2<long> (array);
+ z += main2<unsigned long> (array);
+ z += main2<long long> (array);
+
+ return (w+x+y+z);
+}
+
+template<class T>
+int main2(char **argv)
+{
+ T array[10], array2[10];
+ int ii = 0, x = 2, z= 0 , y = 0 ;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 10;
+ array2[ii] = 5000000;
+ }
+
+ array2[0:10:1] = array[0:10:1];
+
+ for (ii = 0; ii < 10; ii++)
+ if (array2[ii] != array[ii])
+ return 1;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 10;
+ array2[ii] = 5000000;
+ }
+
+ array2[0:5:2] = array[0:5:2];
+
+ for (ii = 0; ii < 10; ii += 2)
+ if (array[ii] != array2[ii])
+ return 2;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 10;
+ array2[ii] = 5000000;
+ }
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+
+ array2[x:5:z] = array[x:5:z];
+
+ for (ii = x; ii < 5; ii += z)
+ if (array2[ii] != array[ii])
+ return 3;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 500;
+ array2[ii] = 1000000;
+ }
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+ y = 10-atoi(argv[1]);
+
+ array2[x:y:z] = array[x:y:z];
+ for (ii = x; ii < 10; ii = ii + z)
+ if (array2[ii] != array[ii])
+ return 4;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 500;
+ array2[ii] = 1000000;
+ }
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+ y = 10-atoi(argv[1]);
+
+ array[x:y:((10-atoi(argv[1]))/atoi(argv[1]))] =
+ array2[x:y:((10-atoi(argv[1]))/atoi(argv[1]))];
+
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != array2[ii])
+ return 6;
+
+
+ x = atoi(argv[1]);
+ z = (10-atoi(argv[1]))/atoi(argv[1]);
+ y = 10-atoi(argv[1]);
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 500;
+ array2[ii] = 1000000;
+ }
+
+ array[atoi(argv[1]):(10-atoi(argv[1])):((10-atoi(argv[1]))/atoi(argv[1]))] =
+ array2[atoi(argv[1]):(10-atoi(argv[1])):((10-atoi(argv[1]))/atoi(argv[1]))];
+ for (ii = x; ii < 10; ii += z)
+ if (array[ii] != array2[ii])
+ return 6;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 4;
+ array2[ii] = 2;
+ }
+
+ array[atoi("5"):5:1] = array2[atoi("5"):5:1];
+
+ for (ii = atoi ("5"); ii < 10; ii++)
+ if (array[ii] != array2[ii])
+ return 7;
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ array[ii] = 5;
+ array2[ii] = 1;
+ }
+ array[atoi("5"):atoi("5"):atoi("1")] = array2[atoi("5"):atoi("5"):atoi("1")];
+
+ for (ii = 5; ii < 10; ii++)
+ if (array2[ii] != array[ii])
+ return 8;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test_ND_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test_ND_tplt.cc
new file mode 100644
index 000000000..479ba1348
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/array_test_ND_tplt.cc
@@ -0,0 +1,115 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+#include <cstdlib>
+#include<string.h>
+template <class T> int main2(char **argv);
+
+int main(void)
+{
+ int x = 1, y=1, z=1, w = 1;
+ char *array[3];
+ array[0] = strdup ("a.out");
+ array[1] = strdup ("10");
+ array[2] = strdup ("15");
+ w = main2<char> (array);
+ w += main2<unsigned char> (array);
+ x = main2<int> (array);
+ x += main2<unsigned int> (array);
+ y = main2<long> (array);
+ y += main2<unsigned long> (array);
+ z = main2<short> (array);
+ z += main2<unsigned short> (array);
+ return x+y+z;
+}
+
+template <class T>
+int main2(char **argv)
+{
+ T array[10][15];
+ T array_2[10][15];
+ int ii = 0, jj = 0,x = 0, z= 1 , y = 10 ,argc = 3;
+
+
+ for (ii = 0; ii < 10; ii++) {
+ for (jj = 0; jj< 15; jj++) {
+ array[ii][jj] = ii+jj;
+ array_2[ii][jj] = 0;
+ }
+ }
+ array_2[0:5:2][0:5:3] = array[0:5:2][0:5:3] + 1 + 5 + array[0][5] + x;
+
+ for (ii = 0; ii < 10; ii += 2)
+ {
+ for (jj = 0; jj < 15; jj += 3)
+ {
+ if (array_2[ii][jj] != array[ii][jj] + 1 + 5 + array[0][5] + x)
+ return 1;
+ }
+ }
+
+
+ for (ii = 0; ii < 10; ii++) {
+ for (jj = 0; jj< 15; jj++) {
+ array[ii][jj] = ii+jj;
+ array_2[ii][jj] = 0;
+ }
+ }
+ x = atoi(argv[1]);
+ y = atoi(argv[2]);
+ array_2[0:x:1][0:y:1] = array[0:x:1][0:y:1] + x + y + array[0:x:1][0:y:1];
+
+ for (ii = 0; ii < x; ii++)
+ {
+ for (jj = 0; jj < y; jj++)
+ {
+ if (array_2[ii][jj] != array[ii][jj] + x + y + array[ii][jj])
+ return 2;
+ }
+ }
+
+ for (ii = 0; ii < 10; ii++) {
+ for (jj = 0; jj< 15; jj++) {
+ array[ii][jj] = ii+jj;
+ array_2[ii][jj] = 0;
+ }
+ }
+ x = atoi(argv[1]);
+ y = atoi(argv[2]);
+ z = (20- atoi (argv[1]))/atoi(argv[1]);
+ /* (20-10)/10 evaluates to 1 all the time :-). */
+ array_2[0:x:z][0:y:z] = array[0:x:z][0:y:z] + array[0:x:z][0:y:z] + y + z;
+
+ for (ii = 0; ii < x; ii += z)
+ {
+ for (jj = 0; jj < y; jj += z)
+ {
+ if (array_2[ii][jj] != array[ii][jj] + array[ii][jj] + y + z)
+ return 3;
+ }
+ }
+
+
+
+ for (ii = 0; ii < 10; ii++) {
+ for (jj = 0; jj< 15; jj++) {
+ array[ii][jj] = ii+jj;
+ array_2[ii][jj] = 0;
+ }
+ }
+ x = argc-3;
+ y = 20-atoi(argv[1]);
+ z = (20- atoi (argv[1]))/atoi(argv[1]);
+ /* (20-10)/10 evaluates to 1 all the time :-). */
+ array_2[(argc-3):(20-atoi(argv[1])):(20-atoi(argv[1]))/atoi(argv[1])][(argc-3):(30-atoi(argv[2])): ((30-atoi(argv[2]))/atoi(argv[2]))] = array[(argc-3):20-atoi(argv[1]):(20-atoi(argv[1]))/atoi(argv[1])][(argc-3):(30-atoi(argv[2])): (30-atoi(argv[2]))/atoi(argv[2])] + array[(argc-3):20-atoi(argv[1]):(20-atoi(argv[1]))/atoi(argv[1])][(argc-3):(30-atoi(argv[2])): (30-atoi(argv[2]))/atoi(argv[2])] * array[(argc-3):20-atoi(argv[1]):(20-atoi(argv[1]))/atoi(argv[1])][(argc-3):(30-atoi(argv[2])): (30-atoi(argv[2]))/atoi(argv[2])];
+
+ for (ii = 0; ii < 10; ii++)
+ {
+ for (jj = 0; jj < 15; jj++)
+ {
+ if (array_2[ii][jj] != array[ii][jj] + array[ii][jj] * array[ii][jj])
+ return 4;
+ }
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/braced_list.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/braced_list.cc
new file mode 100644
index 000000000..3521f8725
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/braced_list.cc
@@ -0,0 +1,13 @@
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-fcilkplus" } */
+
+int main (void)
+{
+ int Array[100], Array2[100];
+
+ Array[{1,2}:2] = 5; /* { dg-error "braced list index is not allowed" } */
+ Array[1:{1,2}:2] = 5; /* { dg-error "expected primary-expression before" } */
+ Array[1:10:{1,2}] = 5; /* { dg-error "expected primary-expression before" } */
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_custom_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_custom_tplt.cc
new file mode 100644
index 000000000..3d9e87bce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_custom_tplt.cc
@@ -0,0 +1,126 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus " } */
+
+#if HAVE_IO
+#include <cstdio>
+#endif
+
+#include <cstdlib>
+
+template <class T>
+T my_func (T x, T y)
+{
+ if (x > y)
+ return x;
+ else
+ return y;
+}
+
+template <class T>
+T main_func (T *array, T *array2, T identity_val, int size)
+{
+ T result;
+
+ result = __sec_reduce (identity_val, array[0:size:1] * array2[0:size:1],
+ my_func); // my_func (identity_val, array[5] * array2[5]);
+ return result;
+}
+int main (void)
+{
+ int i_index = 0, f_index = 0, d_index = 0, l_index = 0;
+ int iarray[10], iarray2[10], i_result, i_max;
+ long larray[10], larray2[10], l_result, l_max;
+ float farray[10], farray2[10], f_result, f_max;
+ double darray[10], darray2[10], d_result, d_max;
+ for (int ii = 0; ii < 10; ii++)
+ {
+ if (ii%2 && ii)
+ {
+ darray[ii] = (double)(1.0000/(double)ii);
+ farray[ii] = (float)(1.00/(float)ii);
+ }
+ else
+ {
+ darray[ii] = (double) ii + 0.10;
+ farray[ii] = (float) (1.00/((float)(ii+1.000)));
+ }
+ darray2[ii] = (double) (1.00000/ (double)(ii+1));
+ farray2[ii] = (float) (1.00/ (float)(ii+1));
+ }
+
+ for (int ii = 0; ii < 10; ii++)
+ {
+ iarray[ii] = ii;
+ larray[ii] = (long)ii;
+ }
+
+ for (int ii = 0; ii < 10; ii++)
+ {
+ iarray2[ii] = (ii-5);
+ larray2[ii] = long (ii-5);
+ }
+#if HAVE_IO
+ printf("Int: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%2d ", iarray[ii] * iarray2[ii]);
+ }
+ printf("\nfloat: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%4.3f ", farray[ii] * farray2[ii]);
+ }
+
+ printf("\nlong: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%2d ", larray[ii] * larray2[ii]);
+ }
+
+ printf("\ndouble: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%4.3f ", (float) (darray[ii] * darray2[ii]));
+ }
+ printf("\n");
+#endif
+
+ i_result = main_func<int> (iarray, iarray2, iarray[0] * iarray2[0], 10);
+ f_result = main_func<float>(farray, farray2, 0.00, 10);
+ d_result = main_func<double>(darray, darray2, 0.0000, 10);
+ l_result = main_func<long>(larray, larray2, 0, 10);
+
+#if HAVE_IO
+ printf("int result = %2d\n", i_result);
+ printf ("long result = %2d\n", l_result);
+ printf("float result = %4.3f\n", f_result);
+ printf("double result = %4.3lf\n", d_result);
+#endif
+
+ i_max = iarray[0] * iarray2[0];
+ f_max = farray[0] * farray2[0];
+ d_max = darray[0] * darray2[0];
+ l_max = larray[0] * larray2[0];
+ for (int ii = 0; ii < 10; ii++)
+ {
+ if (i_max < iarray[ii] * iarray2[ii])
+ i_max = iarray[ii] * iarray2[ii];
+ if (f_max < farray[ii] * farray2[ii])
+ f_max = farray[ii] * farray2[ii];
+ if (d_max < darray[ii] * darray2[ii])
+ d_max = darray[ii] * darray2[ii];
+ if (l_max < larray[ii] * larray2[ii])
+ l_max = larray[ii] * larray2[ii];
+ }
+
+ if (i_max != i_result)
+ return 1;
+ if (f_max != f_result)
+ return 2;
+ if (d_max != d_result)
+ return 3;
+ if (l_max != l_result)
+ return 4;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_mutating_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_mutating_tplt.cc
new file mode 100644
index 000000000..db81912cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/builtin_fn_mutating_tplt.cc
@@ -0,0 +1,134 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+#if HAVE_IO
+#include <cstdio>
+#include<iostream>
+#endif
+
+#include <cstdlib>
+
+template <class T>
+T my_func (T *x, T y)
+{
+ if (*x < y)
+ *x = y;
+ else
+ *x = *x;
+}
+
+template <class T> T my_func (T *x, T y);
+template <class T>
+T main_func (T *array, T *array2, T identity_val, int size)
+{
+ T result = identity_val;
+
+ __sec_reduce_mutating (&result, array[0:size] * array2[0:size:1], my_func);
+
+#if HAVE_IO
+ std::cout << "Result = " << result << std::endl;
+#endif
+ return result;
+}
+
+int main (void)
+{
+ int iarray[10], iarray2[10], i_result = 0, i_max;
+ long larray[10], larray2[10], l_result = 0, l_max;
+ float farray[10], farray2[10], f_result = 0, f_max;
+ double darray[10], darray2[10], d_result = 0, d_max;
+ for (int ii = 0; ii < 10; ii++)
+ {
+ if (ii%2 && ii)
+ {
+ darray[ii] = (double)(1.0000/(double)(ii));
+ farray[ii] = (float)(1.00/(float)(ii));
+ }
+ else
+ {
+ darray[ii] = (double) ii + 0.10;
+ farray[ii] = (float) (1.00/((float)(ii) + 0.10));
+ }
+ darray2[ii] = (double) (1.00000/ (double)(ii+1));
+ farray2[ii] = (float) (1.00/ (float)(ii+1));
+ }
+
+ for (int ii = 0; ii < 10; ii++)
+ {
+ iarray[ii] = ii;
+ larray[ii] = (long)ii;
+ }
+
+ for (int ii = 0; ii < 10; ii++)
+ {
+ iarray2[ii] = (ii-5);
+ larray2[ii] = (long)ii-5;
+ }
+#if HAVE_IO
+ printf("\nInt: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%2d ", iarray[ii] * iarray2[ii]);
+ }
+ printf("\nfloat: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%3.2f ", farray[ii] * farray2[ii]);
+ }
+
+ printf("\nlong: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%2d ", larray[ii] * larray2[ii]);
+ }
+
+ printf("\ndouble: ");
+ for (int ii=0; ii < 10; ii++)
+ {
+ printf("%4.3lf ", (float) (darray[ii] * darray2[ii]));
+ }
+ printf("\n");
+#endif
+
+ i_result = main_func<int> (iarray, iarray2, 0, 10);
+ l_result = main_func<long>(larray, larray2, 0, 10);
+ f_result = main_func<float>(farray, farray2, 0.00, 10);
+ d_result = main_func<double>(darray, darray2, 0.0000, 10);
+
+ i_max = iarray[0] * iarray2[0];
+ d_max = darray[0] * darray2[0];
+ f_max = farray[0] * farray2[0];
+ l_max = larray[0] * larray2[0];
+ for (int ii = 0; ii < 10; ii++)
+ {
+ if (iarray[ii] * iarray2[ii] > i_max)
+ i_max = iarray[ii] * iarray2[ii];
+ if (darray[ii] * darray2[ii] > d_max)
+ d_max = darray[ii] * darray2[ii];
+ if (farray[ii] * farray2[ii] > f_max)
+ f_max = farray[ii] * farray2[ii];
+ if (larray[ii] * larray2[ii] > l_max)
+ l_max = larray[ii] * larray2[ii];
+ }
+#if HAVE_IO
+ printf("int result = %2d\n", i_max);
+ printf("long result = %2d\n", l_max);
+ printf("float result = %4.3f\n", f_max);
+ printf("double result = %4.3lf\n", (float)d_max);
+#endif
+
+ if (i_max != i_result)
+ return 1;
+
+ if (f_max != f_result)
+ return 2;
+
+ if (l_max != l_result)
+ return 3;
+
+ if (d_max != d_result)
+ return 4;
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/fp_triplet_values_tplt.c b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/fp_triplet_values_tplt.c
new file mode 100644
index 000000000..1387558a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/fp_triplet_values_tplt.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+float q;
+
+void func (int *x)
+{
+ *x = 5;
+}
+template <class T> int main2 (T x, T y, T z);
+
+int main (void)
+{
+ main2 <float> (1.5, 2.3, 3.443);
+ main2 <double> (1.34393, 2.38383, 4.38383);
+ return 0;
+}
+template <class T>
+int main2 (T x, T y, T z)
+{
+ int array[10], array2[10];
+ array2[:] = array[x:2]; /* { dg-error "start-index of array notation triplet is not an integer" } */
+ array2[:] = array[1:y]; /* { dg-error "length of array notation triplet is not an integer" } */
+ array2[1:2:z] = array[:]; /* { dg-error "stride of array notation triplet is not an integer" } */
+ func (&array2[1:x:3]); /* { dg-error "length of array notation triplet is not an integer" } */
+ array2[y:9]++; /* { dg-error "start-index of array notation triplet is not an integer" } */
+ array2[1:x]++; /* { dg-error "length of array notation triplet is not an integer" } */
+ array2[1:9:x]++; /* { dg-error "stride of array notation triplet is not an integer" } */
+
+ ++array2[1:q:3]; /* { dg-error "length of array notation triplet is not an integer" } */
+ array2[:] = array[q:1:3]; /* { dg-error "start-index of array notation triplet is not an integer" } */
+ array2[:] = array[1:q:3]; /* { dg-error "length of array notation triplet is not an integer" } */
+ array2[:] = array[1:3:q]; /* { dg-error "stride of array notation triplet is not an integer" } */
+ func (&array2[1:q:3]); /* { dg-error "length of array notation triplet is not an integer" } */
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/postincr_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/postincr_test.cc
new file mode 100644
index 000000000..b0952c71b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/postincr_test.cc
@@ -0,0 +1,107 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+#define HAVE_IO 0
+
+#if HAVE_IO
+#include <cstdio>
+#endif
+
+#include <cstdlib>
+template <class T> int main2(int argc);
+
+int main (void)
+{
+ return (main2<int>(1) + main2<long> (1) + main2<long long> (1));
+}
+
+#if HAVE_IO
+template <class T> int print_array (T *array, int size);
+template <class T> int print_array (T *array, int size)
+{
+ for (int ii = 0; ii < size; ii++)
+ printf("%d ", array[ii]);
+ printf("\n");
+ return 0;
+}
+#endif
+
+template <class T>
+int main2(int argc)
+{
+ T array[10], array_serial[10];
+
+ for (int ii = 0; ii < 10; ii++) {
+ array[ii] = 0;
+ array_serial[ii] = 0;
+ }
+
+ array[:] = 19383;
+ for (int ii = 0; ii < 10; ii++)
+ array_serial[ii] = 19383;
+
+ array[:]++;
+
+ for (int ii = 0; ii < 10; ii++)
+ array_serial[ii]++;
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 1;
+
+ for (int ii = 0; ii < 10; ii++)
+ array[:]++;
+
+ for (int ii = 0; ii < 10; ii++)
+ for (int jj = 0; jj < 10; jj++)
+ array_serial[jj]++;
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 2;
+
+ if (argc == 2)
+ array[0:10:1]++;
+
+ if (argc == 2)
+ {
+ for (int ii = 0; ii < 10; ii++)
+ array_serial[ii]++;
+ }
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 3;
+
+ array[0:10/argc:argc]++;
+
+ for (int ii = 0; ii < 10; ii += argc)
+ array_serial[ii]++;
+
+
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 4;
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/preincr_test.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/preincr_test.cc
new file mode 100644
index 000000000..f5552c7ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/AN/preincr_test.cc
@@ -0,0 +1,106 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+
+#define HAVE_IO 0
+
+#if HAVE_IO
+#include <cstdio>
+#endif
+
+#include <cstdlib>
+template <class T> int main2(int argc);
+
+int main (void)
+{
+ return (main2<int>(1) + main2<long> (1) + main2<long long> (1));
+}
+
+#if HAVE_IO
+template <class T> int print_array (T *array, int size);
+template <class T> int print_array (T *array, int size)
+{
+ for (int ii = 0; ii < size; ii++)
+ printf("%d ", array[ii]);
+ printf("\n");
+ return 0;
+}
+#endif
+
+template <class T>
+int main2(int argc)
+{
+ int array[10], array_serial[10];
+
+ for (int ii = 0; ii < 10; ii++) {
+ array[ii] = 0;
+ array_serial[ii] = 0;
+ }
+
+ array[:] = 19383;
+ for (int ii = 0; ii < 10; ii++)
+ array_serial[ii] = 19383;
+
+ ++array[:];
+
+ for (int ii = 0; ii < 10; ii++)
+ ++array_serial[ii];
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 1;
+
+ for (int ii = 0; ii < 10; ii++)
+ ++array[:];
+
+ for (int ii = 0; ii < 10; ii++)
+ for (int jj = 0; jj < 10; jj++)
+ ++array_serial[jj];
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 2;
+
+ if (argc == 2)
+ ++array[0:10:1];
+
+ if (argc == 2)
+ {
+ for (int ii = 0; ii < 10; ii++)
+ ++array_serial[ii];
+ }
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 3;
+
+ ++array[0:10/argc:argc];
+
+ for (int ii = 0; ii < 10; ii += argc)
+ {
+ ++array_serial[ii];
+ }
+
+#if HAVE_IO
+ print_array<T>(array, 10);
+ print_array<T>(array_serial, 10);
+#endif
+
+ for (int ii = 0; ii < 10; ii++)
+ if (array_serial[ii] != array[ii])
+ return 4;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/catch_exc.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/catch_exc.cc
new file mode 100644
index 000000000..0633d1903
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/catch_exc.cc
@@ -0,0 +1,67 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-* } } } */
+
+#include <assert.h>
+#include <unistd.h>
+#if HAVE_IO
+#include <cstdio>
+#include <cilk/cilk_api.h>
+#endif
+#include <cstdlib>
+
+
+void func(int volatile* steal_me)
+{
+ while (! (*steal_me))
+ {
+ usleep(2000);
+ }
+#if HAVE_IO
+ printf("Foo executing on %d\n", __cilkrts_get_worker_number());
+#endif
+ throw 5;
+}
+
+void my_test()
+{
+ volatile int steal_me = 0;
+
+ try
+ {
+ _Cilk_spawn func(&steal_me);
+#if HAVE_IO
+ printf("Continuation executing on %d\n",
+ __cilkrts_get_worker_number());
+#endif
+ steal_me = 1;
+ _Cilk_sync;
+ goto bad;
+ }
+
+ catch (int x)
+ {
+#if HAVE_IO
+ printf("We caught x = %d\n", x);
+#endif
+ assert(x == 5);
+ }
+ if (0)
+ {
+ bad:
+#if HAVE_IO
+ printf("We should not be here!\n");
+#endif
+ __builtin_abort ();
+ }
+}
+
+
+int main()
+{
+ my_test();
+#if HAVE_IO
+ printf("PASSED\n");
+#endif
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/const_spawn.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/const_spawn.cc
new file mode 100644
index 000000000..1ea473f1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/const_spawn.cc
@@ -0,0 +1,78 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-* } } } */
+
+class Rectangle
+{
+ int area_val, h, w;
+ public:
+ Rectangle (int, int);
+ Rectangle (int, int, int);
+ ~Rectangle ();
+ int area ();
+};
+Rectangle::~Rectangle ()
+{
+ h = 0;
+ w = 0;
+ area_val = 0;
+}
+Rectangle::Rectangle (int height, int width)
+{
+ h = height;
+ w = width;
+ area_val = 0;
+}
+
+Rectangle::Rectangle (int height, int width, int area_orig)
+{
+ h = height;
+ w = width;
+ area_val = area_orig;
+}
+
+int Rectangle::area()
+{
+ return (area_val += (h*w));
+}
+
+/* Spawning constructor. */
+int main1 (void)
+{
+ Rectangle r = _Cilk_spawn Rectangle (4, 3);
+ return r.area();
+}
+
+/* Spawning constructor 2. */
+int main2 (void)
+{
+ Rectangle r (_Cilk_spawn Rectangle (4, 3));
+ return r.area();
+}
+
+/* Spawning copy constructor. */
+int main3 (void)
+{
+ Rectangle r = _Cilk_spawn Rectangle (4, 3, 2);
+ return r.area ();
+}
+
+/* Spawning copy constructor 2. */
+int main4 (void)
+{
+ Rectangle r ( _Cilk_spawn Rectangle (4, 3, 2));
+ return r.area();
+}
+
+int main (void)
+{
+ if (main1 () != 12)
+ __builtin_abort ();
+ if (main2 () != 12)
+ __builtin_abort ();
+ if (main3 () != 14)
+ __builtin_abort ();
+ if (main4() != 14)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-opr-overload.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-opr-overload.cc
new file mode 100644
index 000000000..6af4a367b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-opr-overload.cc
@@ -0,0 +1,94 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-* } } } */
+
+#if HAVE_IO
+#include <iostream>
+#endif
+
+class Some_Struct
+{
+ int calculated_value;
+ short some_unused_value;
+public:
+ Some_Struct () {
+ this->calculated_value = 0;
+ }
+ Some_Struct (int value) {
+ this->calculated_value = value;
+ }
+ Some_Struct operator=(Some_Struct f) {
+ this->calculated_value = f.calculated_value;
+ return *this;
+ }
+ bool operator!=(Some_Struct f) {
+ return (this->calculated_value != f.calculated_value);
+ }
+ Some_Struct operator+(Some_Struct &f) {
+ Some_Struct z;
+ z.calculated_value = this->calculated_value + f.calculated_value;
+ return z;
+ }
+ Some_Struct operator-(int x) {
+ Some_Struct z;
+ z.calculated_value = this->calculated_value - x;
+ return z;
+ }
+ bool operator<(int x) {
+ return (this->calculated_value < x);
+ }
+ int get_calculated_value () {
+ return this->calculated_value;
+ }
+};
+
+
+template <class T>
+T fibonacci_serial (T f)
+{
+ if (f < 2)
+ return f;
+ T a = fibonacci_serial (f-1);
+ T b = fibonacci_serial (f-2);
+ return (a+b);
+}
+
+template <class T>
+T fibonacci (T f)
+{
+ if (f < 2)
+ return f;
+ T a = _Cilk_spawn fibonacci (f-1);
+ T b = fibonacci (f-2);
+ _Cilk_sync;
+ return (a+b);
+}
+
+int main (void)
+{
+ Some_Struct f (40), f_serial(40);
+ f = fibonacci (f);
+ f_serial = fibonacci_serial (f_serial);
+
+ if (f != f_serial)
+ __builtin_abort ();
+
+ int t = 40, t_serial = 40;
+ t = fibonacci (t);
+ t_serial = fibonacci_serial (t_serial);
+ if (t != t_serial)
+ __builtin_abort ();
+
+ short s = 20, s_serial = 20;
+ s = fibonacci (s);
+ s_serial = fibonacci_serial (s_serial);
+ if (s != s_serial)
+ __builtin_abort ();
+
+#if HAVE_IO
+ std::cout << "Fib_Parallel (40) = " << f.get_calculated_value() << std::endl;
+ std::cout << "Fib_Serial (40) = " << f_serial.get_calculated_value()
+ << std::endl;
+#endif
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-tplt.cc
new file mode 100644
index 000000000..dbc2da881
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/fib-tplt.cc
@@ -0,0 +1,53 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-*-* } } } */
+
+struct fib_struct
+{
+ int x;
+ int *y;
+ int z[3];
+ struct fib_struct *ptr_next;
+ struct fib_struct operator+(struct fib_struct &other) {
+ struct fib_struct z ;
+ z.x = (*this).x + (other.x);
+ return z;
+ }
+ struct fib_struct operator-(int other) {
+ struct fib_struct z ;
+ z.x = this->x - other;
+ return z;
+ }
+ bool operator<(int number) {
+ return (this->x < number);
+ }
+
+};
+
+template <typename T>
+T fib (T z) {
+ if (z < 2) return z;
+ T a = _Cilk_spawn fib<T>(z - 1);
+ T b = fib<T>(z - 2);
+ T c = a + b;
+ return (a+b);
+}
+
+
+int sfib(int x)
+{
+ if (x < 2) return x;
+ int a = sfib(x-1);
+ int b = sfib(x-2);
+ return (a+b);
+}
+
+int main () {
+ int z = 30;
+ int parallel_fib = fib<int>(z);
+ int serial_fib = sfib(z);
+ if (serial_fib != parallel_fib)
+ __builtin_abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns.cc
new file mode 100644
index 000000000..9b3d2cc26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns.cc
@@ -0,0 +1,237 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+// { dg-require-effective-target c++11 }
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-* } } } */
+#define FIRST_NUMBER 5
+#define SECOND_NUMBER 3
+#define HAVE_IO 0
+#if HAVE_IO
+#include <stdio.h>
+#endif
+
+#include <stdlib.h>
+
+int global_var;
+
+void foo1(int *array, int size)
+{
+#if HAVE_IO
+ for (int ii = 0; ii < size; ii++)
+ printf("%2d\t", array[ii]);
+ printf("\n");
+ fflush (stdout);
+#else
+ if (size != 2)
+ __builtin_abort ();
+ if (array[0] != FIRST_NUMBER)
+ __builtin_abort ();
+ if (array[1] != SECOND_NUMBER)
+ __builtin_abort ();
+#endif
+ global_var++;
+}
+void foo1_c(const int *array, int size)
+{
+#if HAVE_IO
+ for (int ii = 0; ii < size; ii++)
+ printf("%2d\t", array[ii]);
+ printf("\n");
+ fflush (stdout);
+#else
+ if (size != 2)
+ __builtin_abort ();
+ if (array[0] != FIRST_NUMBER)
+ __builtin_abort ();
+ if (array[1] != SECOND_NUMBER)
+ __builtin_abort ();
+#endif
+ global_var++;
+}
+
+
+int main2 (int argc) {
+ int A[2] = {FIRST_NUMBER, SECOND_NUMBER};
+ int B[2] = {FIRST_NUMBER, SECOND_NUMBER};
+ int main_size = argc+1; /* We know argc is 1, and so 1+1 = 2. */
+ int q = 0;
+
+ global_var = 0;
+ auto func0 = [=](){ foo1_c(A, 2); };
+ _Cilk_spawn func0();
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func1 = [=](int *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func1 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func2 = [=](int *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func2 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func3 = [=](int *Aa, int size){ int new_size = (size % 2 + 2);
+ foo1(Aa, size); };
+ _Cilk_spawn func3 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func4 = [](int *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func4 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func5 = [](int *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func5 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func6 = [&](int *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func6 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func7 = [&](int *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func7 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func8 = [&](){ foo1(A, 2); };
+ _Cilk_spawn func8 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ /* We ignore the first param here and pass in A from the outer fn. */
+ auto func9 = [&](int *Aa, int size){ foo1(A, size); };
+ _Cilk_spawn func9 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func10 = [=](){ foo1_c(A, main_size); };
+ _Cilk_spawn func10 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ auto func11 = [&](){ foo1(A, main_size); };
+ _Cilk_spawn func11 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ /* We ignore the first & second param here and pass in A from the
+ outer fn. */
+ auto func12 = [&](int *Aa, int size){ foo1(A, main_size); };
+ _Cilk_spawn func12 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [&](int *Aa){ foo1(Aa, 2); }(A);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [&](int *Aa, int size){ foo1(Aa, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [=](int *Aa){ foo1(Aa, 2); }(A);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [=](int *Aa, int size){ foo1(Aa, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ /* We ignore the first param here. */
+ _Cilk_spawn [=](int *Aa, int size){ foo1_c(A, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ /* We ignore the first and second param here. */
+ _Cilk_spawn [=](int *Aa, int size){ foo1_c(A, size); }(B, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [&](){ foo1(A, 2); }();
+ [&](){ foo1(A, 2); }();
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [=](){ foo1_c (A, main_size); }();
+ foo1 (A, 2);
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ global_var = 0;
+ _Cilk_spawn [&](){ foo1(A, main_size); }();
+ [&](){ foo1(A, 2); }();
+ _Cilk_sync;
+ if (global_var != 2)
+ return (++q);
+
+ return q;
+}
+
+int main (void)
+{
+ return main2 (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns_tplt.cc b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns_tplt.cc
new file mode 100644
index 000000000..b6e3fea85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/CK/lambda_spawns_tplt.cc
@@ -0,0 +1,174 @@
+/* { dg-options "-fcilkplus" } */
+/* { dg-do run { target i?86-*-* x86_64-*-* arm*-*-* } } */
+// { dg-require-effective-target c++11 }
+/* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* arm*-*-* } } } */
+
+#define FIRST_NUMBER 5
+#define SECOND_NUMBER 3
+#define HAVE_IO 0
+#if HAVE_IO
+#include <stdio.h>
+#endif
+
+#include <stdlib.h>
+
+template <class T>
+void foo1(T *array, int size)
+{
+#if HAVE_IO
+ for (int ii = 0; ii < size; ii++)
+ printf("%2d\t", (int)array[ii]);
+ printf("\n");
+ fflush (stdout);
+#else
+ if (size != 2)
+ __builtin_abort ();
+ if (array[0] != FIRST_NUMBER)
+ __builtin_abort ();
+ if (array[1] != SECOND_NUMBER)
+ __builtin_abort ();
+#endif
+}
+template <class T>
+void foo1_c(const T *array, int size)
+{
+#if HAVE_IO
+ for (int ii = 0; ii < size; ii++)
+ printf("%2d\t", (int)array[ii]);
+ printf("\n");
+ fflush (stdout);
+#else
+ if (size != 2)
+ __builtin_abort ();
+ if (array[0] != FIRST_NUMBER)
+ __builtin_abort ();
+ if (array[1] != SECOND_NUMBER)
+ __builtin_abort ();
+#endif
+}
+template <class T>
+int main2 (int argc, char **argv) {
+ T A[2] = {FIRST_NUMBER, SECOND_NUMBER};
+ int main_size = argc+1; /* We know argc is 1, and so 1+1 = 2. */
+ auto func0 = [=](){ foo1_c(A, 2); };
+ _Cilk_spawn func0();
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func1 = [=](T *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func1 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func2 = [=](T *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func2 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func3 = [=](T *Aa, int size){ int new_size = (size % 2 + 2);
+ foo1(Aa, size); };
+ _Cilk_spawn func3 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func4 = [](T *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func4 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func5 = [](T *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func5 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func6 = [&](T *Aa){ foo1(Aa, 2); };
+ _Cilk_spawn func6 (A);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func7 = [&](T *Aa, int size){ foo1(Aa, size); };
+ _Cilk_spawn func7 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func8 = [&](){ foo1(A, 2); };
+ _Cilk_spawn func8 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ /* We ignore the first param here and pass in A from the outer fn. */
+ auto func9 = [&](T *Aa, int size){ foo1(A, size); };
+ _Cilk_spawn func9 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func10 = [=](){ foo1_c(A, main_size); };
+ _Cilk_spawn func10 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ auto func11 = [&](){ foo1(A, main_size); };
+ _Cilk_spawn func11 ();
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ /* We ignore the first & second param here and pass in A from the
+ outer fn. */
+ auto func12 = [&](T *Aa, int size){ foo1(A, main_size); };
+ _Cilk_spawn func12 (A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [&](T *Aa){ foo1(Aa, 2); }(A);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [&](T *Aa, int size){ foo1(Aa, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [=](T *Aa){ foo1(Aa, 2); }(A);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [=](T *Aa, int size){ foo1(Aa, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ /* We ignore the first param here. */
+ _Cilk_spawn [=](T *Aa, int size){ foo1_c(A, size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ /* We ignore the first and second param here. */
+ _Cilk_spawn [=](T *Aa, int size){ foo1_c(A, main_size); }(A, 2);
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [&](){ foo1(A, 2); }();
+ [&](){ foo1(A, 2); }();
+ _Cilk_sync;
+
+ _Cilk_spawn [=](){ foo1_c(A, main_size); }();
+ foo1 (A, 2);
+ _Cilk_sync;
+
+ _Cilk_spawn [&](){ foo1(A, main_size); }();
+ [&](){ foo1(A, 2); }();
+ _Cilk_sync;
+
+ return 0;
+}
+
+int main (void)
+{
+ int argc = 1;
+ char **argv = NULL;
+ int x = 1, y = 1, z = 1, q = 1, p = 1;
+ x = main2<char>(argc,argv);
+ y = main2<short>(argc,argv);
+ z = main2<int>(argc,argv);
+ p = main2<long>(argc,argv);
+ q = main2<long long>(argc,argv);
+ return (x+y+z+p+q);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp
new file mode 100644
index 000000000..204a75458
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp
@@ -0,0 +1,78 @@
+# Copyright (C) 2013-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Written by Balaji V. Iyer <balaji.v.iyer@intel.com>
+
+load_lib g++-dg.exp
+
+if { ![check_effective_target_cilkplus] } {
+ return;
+}
+
+set library_var [get_multilibs]
+# Pointing the ld_library_path to the Cilk Runtime library binaries.
+append ld_library_path ":${library_var}/libcilkrts/.libs"
+set_ld_library_path_env_vars
+
+global TEST_EXTRA_LIBS
+set TEST_EXTRA_LIBS "-L${library_var}/libcilkrts/.libs"
+
+dg-init
+# Run the tests that are shared with C.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/PS/*.c]] ""
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-O3" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] " " " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-g -O2" " "
+# Run the C++ only tests.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] ""
+dg-finish
+
+dg-init
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O1 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O2 -ftree-vectorize -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O1 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O2 -ftree-vectorize -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O3 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -ftree-vectorize -fcilkplus -g" " "
+
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O0 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O1 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O2 -ftree-vectorize -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O0 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O1 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O2 -ftree-vectorize -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O3 -fcilkplus" " "
+dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -ftree-vectorize -fcilkplus -g" " "
+
+if { [check_libcilkrts_available] } {
+ dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O1 -fcilkplus" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O3 -fcilkplus" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -fcilkplus" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -O2 -fcilkplus" " "
+
+ dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O1" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O3" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g" " "
+ dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g -O2" " "
+ }
+dg-finish
+unset TEST_EXTRA_LIBS
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/ef_test.C b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/ef_test.C
new file mode 100644
index 000000000..3e75cbd92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/ef_test.C
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-options "-fcilkplus" } */
+
+
+__attribute__((vector (nomask), vector(mask), vector(mask,linear(x:1))))
+int func (int x)
+{
+ return x+5;
+}
+
+
+__attribute__((vector(mask,uniform (y), linear(x:1))))
+__attribute__((vector (nomask, uniform (x), linear(y:1))))
+int func2 (int x, int y)
+{
+ return x+y;
+}
+
+int func4 (int x, int y) __attribute__((vector, vector (nomask), vector (uniform(y), linear(x:1))));
+
+
+template <class T, class R>
+__attribute__((vector, vector(mask,uniform (y), linear(x:1))))
+T func3 (T x, R y)
+{
+ return x+(T)y;
+}
+
+
+
+int main (void)
+{
+ if ((func3 (5, 4) + func2 (5, 4) + func (5) + (int) func3<long, int> (5, 4)) !=
+ (5 + 4) + (5 + 4) + (5 + 5) + (int) ((long)5 +(int)4))
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for.C b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for.C
new file mode 100644
index 000000000..6e16cfcd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for.C
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcilkplus" } */
+
+// Test storage classes in the initialization of a <#pragma simd> for
+// loop.
+
+int *a, *b;
+
+void foo()
+{
+#pragma simd
+ for (static int tt=5; tt < 10; ++tt) /* { dg-error "before 'static'\|not declared\|expected" } */
+ a[tt] = b[tt];
+
+#pragma simd
+ for (extern int var=0; var < 1000; ++var) /* { dg-error "before 'extern'\|not declared\|expected" } */
+ a[var] = var;
+
+#pragma simd
+ for (register int regj = 0; regj < 1000; ++regj) /* { dg-error "before 'register'\|not declared\|expected" } */
+ b[regj] = a[regj] * 2;
+
+#pragma simd
+ for (volatile int vj=0; vj<1000; ++vj) /* { dg-error "iteration variable cannot be volatile" } */
+ a[vj] = b[vj];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for2.C b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for2.C
new file mode 100644
index 000000000..345e54236
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for2.C
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+int *p;
+extern int stuff();
+
+template <int value>
+void foobar(int a)
+{
+#pragma simd
+ for (int i=0; i < a; ++i)
+ p[i] = value;
+}
+
+template <int value>
+void foobar2(int a)
+{
+ int j = 123;
+#pragma simd linear(j : value)
+ for (int i=0; i < a; ++i)
+ {
+ p[i] = value;
+ j += stuff();
+ }
+}
+
+void funky()
+{
+ foobar <69> (1000);
+ foobar2 <123> (2000);
+}
+
+void foobar3(int a)
+{
+ int j = 123;
+#pragma simd linear(j : a + a) /* { dg-error "step size must be an integer" } */
+ for (int i=0; i < a; ++i)
+ {
+ p[i] = 1234;
+ extern int bar();
+ j += bar();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for3.C b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for3.C
new file mode 100644
index 000000000..28dbdee43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for3.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcilkplus" } */
+
+// Test storage classes in the initialization of a <#pragma simd> for
+// loop.
+
+int *a, *b;
+
+void foo()
+{
+#pragma simd
+ for (int tt=5; tt < 10; ++tt)
+ {
+ a[tt] = b[tt];
+ if (tt == 8)
+ throw 1; /* { dg-error "throw expressions are not allowed" } */
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for4.C b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for4.C
new file mode 100644
index 000000000..5b86b9f7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/for4.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+int *p;
+extern int stuff();
+
+template <int value>
+void foobar(int a)
+{
+ int j = 123;
+#pragma simd linear(j : value + 1)
+ for (int i=0; i < a; ++i)
+ {
+ p[i] = value;
+ j += stuff();
+ }
+}
+
+void funky()
+{
+ foobar <69> (1000);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1.h
new file mode 100644
index 000000000..09d64162f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1.h
@@ -0,0 +1,10 @@
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
new file mode 100644
index 000000000..ce9aa1f09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+extern void bitfield1_x (void);
+
+int
+main ()
+{
+ bitfield1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
new file mode 100644
index 000000000..727632af8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
@@ -0,0 +1,16 @@
+// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" }
+
+#include "bitfield1.h"
+
+extern void bitfield1_y (A& a);
+
+void bitfield1_x ()
+{
+ A a;
+
+ a.bitS = 1;
+ a.bitU = 1;
+ a.bit = 1;
+
+ bitfield1_y (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
new file mode 100644
index 000000000..282776718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
@@ -0,0 +1,15 @@
+// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" }
+
+extern "C" void abort (void);
+
+#include "bitfield1.h"
+
+void bitfield1_y (A& a)
+{
+ if (a.bitS != -1)
+ abort ();
+ if (a.bitU != 1)
+ abort ();
+ if (a.bit != 1)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2.h
new file mode 100644
index 000000000..09d64162f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2.h
@@ -0,0 +1,10 @@
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
new file mode 100644
index 000000000..4169843f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+extern void bitfield1_x (void);
+
+int
+main ()
+{
+ bitfield1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
new file mode 100644
index 000000000..080d21b41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
@@ -0,0 +1,16 @@
+// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" }
+
+#include "bitfield1.h"
+
+extern void bitfield1_y (A& a);
+
+void bitfield1_x ()
+{
+ A a;
+
+ a.bitS = 1;
+ a.bitU = 1;
+ a.bit = 1;
+
+ bitfield1_y (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
new file mode 100644
index 000000000..d27578328
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
@@ -0,0 +1,15 @@
+// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" }
+
+extern "C" void abort (void);
+
+#include "bitfield1.h"
+
+void bitfield1_y (A& a)
+{
+ if (a.bitS != -1)
+ abort ();
+ if (a.bitU != 1)
+ abort ();
+ if (a.bit != -1)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
new file mode 100644
index 000000000..b9f6ac898
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
@@ -0,0 +1,18 @@
+/* PR target/38736 */
+/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */
+/* { dg-require-effective-target avx } */
+
+/* Test compatibility of attribute ((aligned)) with and without -mavx. */
+
+extern int aligned_x (void);
+extern int aligned_y_avx (void);
+extern "C" void abort (void);
+
+int
+main ()
+{
+ if (aligned_x () != aligned_y_avx ())
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
new file mode 100644
index 000000000..aeab257aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
@@ -0,0 +1,15 @@
+/* PR target/38736 */
+/* { dg-options "-O2" } */
+
+struct alignment_test_struct
+{
+ char space[4] __attribute__((__aligned__));
+};
+
+extern int aligned_x (void);
+
+int
+aligned_x (void)
+{
+ return __alignof__(struct alignment_test_struct);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
new file mode 100644
index 000000000..bade1b292
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
@@ -0,0 +1,6 @@
+/* PR target/38736 */
+/* { dg-options "-O2 -mavx" } */
+
+#define aligned_x aligned_y_avx
+
+#include "pr38736_x.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h
new file mode 100644
index 000000000..aee0b6b49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h
@@ -0,0 +1,54 @@
+class C0
+{ public: int i0; };
+class C1
+ : public C0
+{ public: int i1; };
+class C2
+ : public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : public C1
+ , public C2
+ , virtual public C0
+{ public: int i3; };
+class C4
+ : virtual public C1
+ , virtual public C0
+ , virtual public C3
+ , public C2
+{ public: int i4; };
+class C5
+ : public C3
+ , virtual public C0
+ , virtual public C2
+{ public: int i5; };
+class C6
+ : public C1
+ , public C2
+ , virtual public C5
+ , virtual public C3
+ , virtual public C0
+{ public: int i6; };
+class C7
+ : public C1
+ , virtual public C5
+ , virtual public C4
+ , virtual public C2
+ , virtual public C0
+ , virtual public C6
+{ public: int i7; };
+class C8
+ : virtual public C4
+ , public C3
+ , public C0
+ , virtual public C7
+ , virtual public C6
+{ public: int i8; };
+class C9
+ : virtual public C0
+ , public C4
+ , public C8
+ , public C1
+ , public C6
+{ public: int i9; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C
new file mode 100644
index 000000000..606c0fe2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+extern void vbase8_10_x (void);
+
+int
+main ()
+{
+ vbase8_10_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
new file mode 100644
index 000000000..c56d080eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
@@ -0,0 +1,51 @@
+// { dg-options -w }
+
+#include "vbase8-10.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_10_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
new file mode 100644
index 000000000..5364ed6b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
@@ -0,0 +1,65 @@
+// { dg-options -w }
+
+extern "C" void abort (void);
+
+#include "vbase8-10.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h
new file mode 100644
index 000000000..cd510e2ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h
@@ -0,0 +1,54 @@
+class C0
+{ public: int i0; };
+class C1
+ : virtual public C0
+{ public: int i1; };
+class C2
+ : virtual public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : virtual public C2
+ , virtual public C1
+{ public: int i3; };
+class C4
+ : virtual public C2
+ , public C0
+ , public C1
+{ public: int i4; };
+class C5
+ : virtual public C0
+ , public C2
+ , virtual public C1
+ , virtual public C3
+ , virtual public C4
+{ public: int i5; };
+class C6
+ : virtual public C1
+ , virtual public C3
+ , public C0
+ , public C2
+ , virtual public C4
+{ public: int i6; };
+class C7
+ : virtual public C5
+ , public C2
+ , public C6
+ , virtual public C0
+ , public C3
+{ public: int i7; };
+class C8
+ : virtual public C5
+ , public C7
+ , virtual public C0
+ , virtual public C2
+ , virtual public C6
+{ public: int i8; };
+class C9
+ : virtual public C2
+ , virtual public C4
+ , public C1
+ , virtual public C0
+ , public C7
+ , public C5
+{ public: int i9; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C
new file mode 100644
index 000000000..16a0a3cd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+extern void vbase8_21_x (void);
+
+int
+main ()
+{
+ vbase8_21_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
new file mode 100644
index 000000000..818eade03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
@@ -0,0 +1,51 @@
+// { dg-options -w }
+
+#include "vbase8-21.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_21_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
new file mode 100644
index 000000000..512613935
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
@@ -0,0 +1,65 @@
+// { dg-options -w }
+
+extern "C" void abort (void);
+
+#include "vbase8-21.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h
new file mode 100644
index 000000000..e19e93eae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h
@@ -0,0 +1,59 @@
+class C0
+{ public: int i0; };
+class C1
+ : public C0
+{ public: int i1; };
+class C2
+ : public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : virtual public C0
+ , virtual public C2
+ , virtual public C1
+{ public: int i3; };
+class C4
+ : virtual public C2
+ , public C1
+ , virtual public C3
+ , public C0
+{ public: int i4; };
+class C5
+ : virtual public C0
+ , virtual public C4
+ , public C1
+ , virtual public C2
+ , virtual public C3
+{ public: int i5; };
+class C6
+ : public C0
+ , virtual public C1
+ , public C5
+ , public C2
+ , virtual public C3
+ , virtual public C4
+{ public: int i6; };
+class C7
+ : virtual public C1
+ , public C5
+ , virtual public C6
+ , virtual public C4
+ , virtual public C3
+ , virtual public C0
+{ public: int i7; };
+class C8
+ : virtual public C6
+ , virtual public C1
+ , virtual public C2
+ , public C3
+ , virtual public C4
+{ public: int i8; };
+class C9
+ : public C4
+ , virtual public C2
+ , virtual public C8
+ , public C3
+ , public C1
+ , public C6
+ , public C5
+{ public: int i9; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C
new file mode 100644
index 000000000..6455a2efc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 22. Horribly complicated class hierarchy
+
+extern void vbase8_22_x (void);
+
+int
+main ()
+{
+ vbase8_22_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
new file mode 100644
index 000000000..49f021adf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
@@ -0,0 +1,51 @@
+// { dg-options -w }
+
+#include "vbase8-22.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_22_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
new file mode 100644
index 000000000..49ab04a87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
@@ -0,0 +1,65 @@
+// { dg-options -w }
+
+extern "C" void abort (void);
+
+#include "vbase8-22.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h
new file mode 100644
index 000000000..b183fbe4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h
@@ -0,0 +1,57 @@
+class C0
+{ public: int i0; };
+class C1
+ : virtual public C0
+{ public: int i1; };
+class C2
+ : public C0
+ , public C1
+{ public: int i2; };
+class C3
+ : virtual public C0
+ , public C1
+ , public C2
+{ public: int i3; };
+class C4
+ : public C2
+ , public C3
+ , virtual public C1
+ , virtual public C0
+{ public: int i4; };
+class C5
+ : virtual public C2
+ , public C1
+ , public C0
+{ public: int i5; };
+class C6
+ : virtual public C0
+ , virtual public C5
+ , public C1
+ , public C3
+ , public C4
+{ public: int i6; };
+class C7
+ : public C6
+ , virtual public C0
+ , public C1
+ , public C2
+ , virtual public C4
+{ public: int i7; };
+class C8
+ : public C2
+ , virtual public C6
+ , virtual public C7
+ , public C5
+ , public C3
+ , virtual public C4
+{ public: int i8; };
+class C9
+ : public C5
+ , virtual public C3
+ , virtual public C8
+ , public C0
+ , public C2
+ , public C7
+ , public C6
+ , public C4
+{ public: int i9; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C
new file mode 100644
index 000000000..f5e5e3824
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 4. Horribly complicated class hierarchy
+
+extern void vbase8_4_x (void);
+
+int
+main ()
+{
+ vbase8_4_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
new file mode 100644
index 000000000..db60cc6ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
@@ -0,0 +1,51 @@
+// { dg-options -w }
+
+#include "vbase8-4.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_4_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
new file mode 100644
index 000000000..24d5046c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
@@ -0,0 +1,65 @@
+// { dg-options -w }
+
+extern "C" void abort (void);
+
+#include "vbase8-4.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/README b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/README
new file mode 100644
index 000000000..adbaf4fce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/README
@@ -0,0 +1,18 @@
+Tests in this directory are for functionality that has changed in GCC
+from one release to another or that is not ABI-compliant and may change
+in a future release.
+
+Each test header for changed behavior should indicate the version in
+which the behavior changed, in order to help users of these tests to
+determine whether a test failure is expected or not.
+
+Every test in this directory that covers behavior that is not
+ABI-compliant should also be covered by a test for -Wabi to ensure that
+there is a warning for the construct.
+
+
+Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5.h
new file mode 100644
index 000000000..6f7f012cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5.h
@@ -0,0 +1,11 @@
+struct A {
+ virtual void f();
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 1;
+ int : 0;
+ int f3 : 4;
+ int f4 : 3;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C
new file mode 100644
index 000000000..415a8846c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C
@@ -0,0 +1,14 @@
+// The offset of `B::f2' is not ABI-compliant and may change in a future
+// version of GCC.
+// g++.dg/abi/bitfield5.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "bitfield5.h"
+
+extern void bitfield5_x (void);
+
+int
+main ()
+{
+ bitfield5_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C
new file mode 100644
index 000000000..9be937234
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C
@@ -0,0 +1,13 @@
+#include "bitfield5.h"
+
+extern void bitfield5_y (B&);
+
+void bitfield5_x ()
+{
+ B b;
+
+ b.f3 = 7;
+ b.f4 = 3;
+
+ bitfield5_y (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C
new file mode 100644
index 000000000..6ee4dd008
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C
@@ -0,0 +1,13 @@
+extern "C" void abort (void);
+
+#include "bitfield5.h"
+
+void A::f () {}
+
+void bitfield5_y (B& b)
+{
+ if (b.f3 != 7)
+ abort ();
+ if (b.f4 != 3)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7.h
new file mode 100644
index 000000000..2060bf747
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7.h
@@ -0,0 +1,3 @@
+union U {
+ int i: 4096;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C
new file mode 100644
index 000000000..57bb96101
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C
@@ -0,0 +1,16 @@
+// { dg-options "-w" }
+
+// The size assigned to `U' may not be ABI-compliant and may change in a
+// future version of GCC.
+// g++.dg/abi/bitfield7.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "bitfield7.h"
+
+extern void bitfield7_x (void);
+
+int
+main ()
+{
+ bitfield7_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
new file mode 100644
index 000000000..9b2a622a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
@@ -0,0 +1,15 @@
+// { dg-options "-w" }
+
+#include "bitfield7.h"
+
+extern void bitfield7_y (U*);
+
+void bitfield7_x ()
+{
+ U u[2];
+
+ u[0].i = 7;
+ u[1].i = 8;
+
+ bitfield7_y (u);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
new file mode 100644
index 000000000..afa5446ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
@@ -0,0 +1,13 @@
+// { dg-options "-w" }
+
+extern "C" void abort (void);
+
+#include "bitfield7.h"
+
+void bitfield7_y (U* u)
+{
+ if (u[0].i != 7)
+ abort ();
+ if (u[1].i != 8)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6.h
new file mode 100644
index 000000000..47a0da8b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6.h
@@ -0,0 +1,7 @@
+struct A {};
+
+struct B {
+ A a;
+ virtual void f () {}
+ int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_main.C
new file mode 100644
index 000000000..bf6d98241
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_main.C
@@ -0,0 +1,14 @@
+// `B::a' contains empty classes which may cause base classes to be
+// placed at different locations in a future version of GCC.
+// g++.dg/abi/empty6.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "empty6.h"
+
+extern void empty6_x (void);
+
+int
+main ()
+{
+ empty6_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_x.C
new file mode 100644
index 000000000..f7e25e9ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_x.C
@@ -0,0 +1,12 @@
+#include "empty6.h"
+
+extern void empty6_y (B&);
+
+void empty6_x ()
+{
+ B b;
+
+ b.i = 7;
+
+ empty6_y (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_y.C
new file mode 100644
index 000000000..cb3d45c9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/empty6_y.C
@@ -0,0 +1,9 @@
+extern "C" void abort (void);
+
+#include "empty6.h"
+
+void empty6_y (B& b)
+{
+ if (b.i != 7)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10.h
new file mode 100644
index 000000000..f418d1e56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10.h
@@ -0,0 +1,12 @@
+struct A {
+ virtual void f();
+ char c1;
+};
+
+struct B {
+ B();
+ char c2;
+};
+
+struct C : public A, public virtual B {
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_main.C
new file mode 100644
index 000000000..a082b5dbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_main.C
@@ -0,0 +1,14 @@
+// The offset of virtual base `B' is not ABI-compliant and may change in
+// a future version of GCC.
+// g++.dg/abi/vbase10.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "vbase10.h"
+
+extern void vbase10_x (void);
+
+int
+main ()
+{
+ vbase10_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_x.C
new file mode 100644
index 000000000..6d51d3c72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_x.C
@@ -0,0 +1,13 @@
+#include "vbase10.h"
+
+extern void vbase10_y (C&);
+
+void vbase10_x ()
+{
+ C c;
+
+ c.c1 = 1;
+ c.c2 = 2;
+
+ vbase10_y (c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_y.C
new file mode 100644
index 000000000..70ce0075e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase10_y.C
@@ -0,0 +1,14 @@
+extern "C" void abort (void);
+
+#include "vbase10.h"
+
+void A::f () {}
+B::B() {}
+
+void vbase10_y (C& c)
+{
+ if (c.c1 != 1)
+ abort ();
+ if (c.c2 != 2)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11.h
new file mode 100644
index 000000000..a298f7644
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11.h
@@ -0,0 +1,12 @@
+struct base
+{
+ short b;
+ virtual int foo();
+};
+
+struct derived: virtual base
+{
+ int d;
+ virtual int foo();
+ virtual int bar();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_main.C
new file mode 100644
index 000000000..2ac599449
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_main.C
@@ -0,0 +1,13 @@
+// Test case from PR 7470, which was fixed in GCC 3.2 and breaks binary
+// compatibility with earlier releases.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "vbase11.h"
+
+extern void vbase11_x (void);
+
+int
+main ()
+{
+ vbase11_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_x.C
new file mode 100644
index 000000000..4b2398ae1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_x.C
@@ -0,0 +1,14 @@
+#include "vbase11.h"
+
+extern void vbase11_y (derived&);
+
+int base::foo() { return 1; }
+int derived::foo() { return 2; }
+int derived::bar() { return 3; }
+
+void vbase11_x ()
+{
+ derived d;
+
+ vbase11_y (d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_y.C
new file mode 100644
index 000000000..01ca62b87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/break/vbase11_y.C
@@ -0,0 +1,11 @@
+extern "C" void abort (void);
+
+#include "vbase11.h"
+
+void vbase11_y (derived& d)
+{
+ if (d.foo() != 2)
+ abort ();
+ if (d.bar() != 3)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/compat.exp b/gcc-4.9/gcc/testsuite/g++.dg/compat/compat.exp
new file mode 100644
index 000000000..1a7cdb839
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/compat.exp
@@ -0,0 +1,129 @@
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+#
+# This file was written by Janis Johnson, <janis187@us.ibm.com>
+
+
+# Test interoperability of two compilers that follow the same ABI.
+#
+# Break simple tests into two pieces and see that they work when linked
+# together. If an alternate compiler is specified then the two main
+# pieces of each test are compiled with different compilers. The
+# alternate compiler must be installed, and is specified by defining
+# ALT_CXX_UNDER_TEST in the environment.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+global GXX_UNDER_TEST
+global ld_library_path
+
+# Load procedures from common libraries.
+load_lib standard.exp
+load_lib g++.exp
+load_lib target-libpath.exp
+
+#
+# compat-use-alt-compiler -- make the alternate compiler the default
+#
+proc compat-use-alt-compiler { } {
+ global GXX_UNDER_TEST ALT_CXX_UNDER_TEST
+ global CXXFLAGS
+ global ALWAYS_CXXFLAGS
+ global ld_library_path alt_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST
+ set CXXFLAGS ""
+ set ALWAYS_CXXFLAGS ""
+ set ld_library_path $alt_ld_library_path
+ set_ld_library_path_env_vars
+ }
+}
+
+#
+# compat-use-tst-compiler -- make compiler under test the default
+#
+proc compat-use-tst-compiler { } {
+ global GXX_UNDER_TEST save_gxx_under_test
+ global CXXFLAGS save_cxxflags
+ global ALWAYS_CXXFLAGS save_always_cxxflags
+ global ld_library_path save_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $save_gxx_under_test
+ set CXXFLAGS $save_cxxflags
+ set ALWAYS_CXXFLAGS $save_always_cxxflags
+ set ld_library_path $save_ld_library_path
+ set_ld_library_path_env_vars
+ }
+}
+
+# Load the language-independent compabibility support procedures.
+# This must be done after the compat-use-*-compiler definitions.
+load_lib compat.exp
+
+g++_init
+
+# Save variables for the C++ compiler under test, which each test will
+# change a couple of times. This must be done after calling g++-init.
+set save_gxx_under_test $GXX_UNDER_TEST
+set save_cxxflags $CXXFLAGS
+set save_always_cxxflags $ALWAYS_CXXFLAGS
+set save_ld_library_path $ld_library_path
+
+# Define an identifier for use with this suite to avoid name conflicts
+# with other compat tests running at the same time.
+set sid "cp_compat"
+
+# Find out whether there is an alternate compiler to test. If the
+# variable is defined but is set to "same", that means we use the same
+# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS
+# are different.
+set use_alt 0
+set same_alt 0
+set alt_ld_library_path "."
+if [info exists ALT_CXX_UNDER_TEST] then {
+ set use_alt 1
+ if [string match "same" $ALT_CXX_UNDER_TEST] then {
+ set same_alt 1
+ } else {
+ if [info exists ALT_LD_LIBRARY_PATH] then {
+ append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}"
+ }
+ }
+}
+
+# Main loop.
+foreach src [lsort [find $srcdir/$subdir *_main.C]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+
+ compat-execute $src $sid $use_alt
+}
+
+# Restore the original compiler under test.
+compat-use-tst-compiler
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/compat-common.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/compat-common.h
new file mode 100644
index 000000000..43c22d722
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/compat-common.h
@@ -0,0 +1,55 @@
+/* Several of the binary compatibility tests use these macros to
+ allow debugging the test or tracking down a failure by getting an
+ indication of whether each individual check passed or failed.
+ When DBG is defined, each check is shown by a dot (pass) or 'F'
+ (fail) rather than aborting as soon as a failure is detected. */
+
+#ifdef DBG
+#include <stdio.h>
+#define DEBUG_INIT setbuf (stdout, NULL);
+#define DEBUG_FPUTS(x) fputs (x, stdout);
+#define DEBUG_DOT putc ('.', stdout);
+#define DEBUG_NL putc ('\n', stdout);
+#define DEBUG_FAIL putc ('F', stdout); fails++;
+#define DEBUG_CHECK { DEBUG_FAIL } else { DEBUG_DOT }
+#define DEBUG_FINI if (fails) DEBUG_FPUTS ("failed\n") \
+ else DEBUG_FPUTS ("passed\n")
+#else
+#define DEBUG_INIT
+#define DEBUG_FPUTS(x)
+#define DEBUG_DOT
+#define DEBUG_NL
+#define DEBUG_FAIL abort ();
+#define DEBUG_CHECK abort ();
+#define DEBUG_FINI
+#endif
+
+#ifdef SKIP_COMPLEX
+#ifndef SKIP_COMPLEX_INT
+#define SKIP_COMPLEX_INT
+#endif
+#endif
+
+#ifndef SKIP_COMPLEX
+#ifdef __GNUC__
+#define CINT(x, y) (x + y * __extension__ 1i)
+#define CDBL(x, y) (x + y * __extension__ 1i)
+#else
+#ifdef __SUNPRO_C
+/* ??? Complex support without <complex.h>. */
+#else
+#include <complex.h>
+#endif
+#ifndef SKIP_COMPLEX_INT
+#define CINT(x, y) ((_Complex int) (x + y * _Complex_I))
+#endif
+#define CDBL(x, y) (x + y * _Complex_I)
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void abort (void);
+#else
+extern void abort (void);
+#endif
+extern int fails;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h
new file mode 100644
index 000000000..ec347f9b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h
@@ -0,0 +1,67 @@
+namespace std {
+namespace decimal {
+
+ class decimal32
+ {
+ public:
+ typedef float __dec32 __attribute__((mode(SD)));
+ decimal32 () : __val(0.e-101DF) {}
+ decimal32 (__dec32 x) : __val(x) {}
+ __dec32 __val;
+ };
+
+ class decimal64
+ {
+ public:
+ typedef float __dec64 __attribute__((mode(DD)));
+ decimal64 () : __val(0.e-398dd) {}
+ decimal64 (__dec64 x) : __val(x) {}
+ __dec64 __val;
+ };
+
+ class decimal128
+ {
+ public:
+ typedef float __dec128 __attribute__((mode(TD)));
+ decimal128 () : __val(0.e-6176DL) {}
+ decimal128 (__dec128 x) : __val(x) {}
+ __dec128 __val;
+ };
+
+ inline decimal32 operator+ (decimal32 lhs, decimal32 rhs)
+ {
+ decimal32 tmp;
+ tmp.__val = lhs.__val + rhs.__val;
+ return tmp;
+ }
+
+ inline decimal64 operator+ (decimal64 lhs, decimal64 rhs)
+ {
+ decimal64 tmp;
+ tmp.__val = lhs.__val + rhs.__val;
+ return tmp;
+ }
+
+ inline decimal128 operator+ (decimal128 lhs, decimal128 rhs)
+ {
+ decimal128 tmp;
+ tmp.__val = lhs.__val + rhs.__val;
+ return tmp;
+ }
+
+ inline bool operator!= (decimal32 lhs, decimal32 rhs)
+ {
+ return lhs.__val != rhs.__val;
+ }
+
+ inline bool operator!= (decimal64 lhs, decimal64 rhs)
+ {
+ return lhs.__val != rhs.__val;
+ }
+
+ inline bool operator!= (decimal128 lhs, decimal128 rhs)
+ {
+ return lhs.__val != rhs.__val;
+ }
+}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C
new file mode 100644
index 000000000..963dc3bbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing decimal scalars by value. */
+
+extern void pass_1_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_1_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C
new file mode 100644
index 000000000..265a1317b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C
@@ -0,0 +1,30 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_x.h"
+
+void
+pass_1_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C
new file mode 100644
index 000000000..5da7f87d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C
new file mode 100644
index 000000000..533e4b276
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing decimal classes by value. */
+
+extern void pass_2_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_2_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C
new file mode 100644
index 000000000..8a67bda0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C
@@ -0,0 +1,32 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "pass_x.h"
+
+void
+pass_2_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C
new file mode 100644
index 000000000..97471457d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C
new file mode 100644
index 000000000..de09992c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing decimal scalars and classes by value. */
+
+extern void pass_3_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_3_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C
new file mode 100644
index 000000000..17e4d1c8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C
@@ -0,0 +1,30 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_x.h"
+
+void
+pass_3_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C
new file mode 100644
index 000000000..97471457d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C
new file mode 100644
index 000000000..d5a0a47d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing decimal classes and scalars by value. */
+
+extern void pass_4_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_4_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C
new file mode 100644
index 000000000..b0483ac27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C
@@ -0,0 +1,32 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "pass_x.h"
+
+void
+pass_4_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C
new file mode 100644
index 000000000..5da7f87d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C
new file mode 100644
index 000000000..9b25a49c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing decimal scalars and typedef'd classes by value. */
+
+extern void pass_5_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_5_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C
new file mode 100644
index 000000000..11c4d96c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C
@@ -0,0 +1,30 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_x.h"
+
+void
+pass_5_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C
new file mode 100644
index 000000000..5a2c1fba0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+typedef std::decimal::decimal32 dec32;
+typedef std::decimal::decimal64 dec64;
+typedef std::decimal::decimal128 dec128;
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C
new file mode 100644
index 000000000..1b686a21d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test passing typedef'd decimal classes and scalars by value. */
+
+extern void pass_6_x (void);
+int fails;
+
+int
+main ()
+{
+ pass_6_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C
new file mode 100644
index 000000000..e59ca7f72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C
@@ -0,0 +1,32 @@
+#include "decimal-dummy.h"
+
+typedef std::decimal::decimal32 dec32;
+typedef std::decimal::decimal64 dec64;
+typedef std::decimal::decimal128 dec128;
+
+#include "pass_x.h"
+
+void
+pass_6_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+#ifndef SKIP_DECIMAL32
+T(d32)
+#endif
+#ifndef SKIP_DECIMAL64
+T(d64)
+#endif
+#ifndef SKIP_DECIMAL128
+T(d128)
+#endif
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C
new file mode 100644
index 000000000..5da7f87d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "pass_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_x.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_x.h
new file mode 100644
index 000000000..5b25dc9bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_x.h
@@ -0,0 +1,151 @@
+#include "compat-common.h"
+
+#define T(NAME, TYPE, INITVAL) \
+TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \
+TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \
+TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \
+TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \
+ \
+extern void init##NAME (TYPE *p, TYPE v); \
+extern void checkg##NAME (void); \
+extern void \
+test##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \
+ TYPE x05, TYPE x06, TYPE x07, TYPE x08, \
+ TYPE x09, TYPE x10, TYPE x11, TYPE x12, \
+ TYPE x13, TYPE x14, TYPE x15, TYPE x16); \
+extern void testva##NAME (int n, ...); \
+ \
+extern void \
+check##NAME (TYPE x, TYPE v) \
+{ \
+ if (x != v + INITVAL) \
+ DEBUG_CHECK \
+} \
+ \
+extern void \
+test2_##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \
+ TYPE x05, TYPE x06, TYPE x07, TYPE x08) \
+{ \
+ test##NAME (x01, g02##NAME, x02, g04##NAME, \
+ x03, g06##NAME, x04, g08##NAME, \
+ x05, g10##NAME, x06, g12##NAME, \
+ x07, g14##NAME, x08, g16##NAME); \
+} \
+ \
+extern void \
+testit##NAME (void) \
+{ \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" init: ") \
+ init##NAME (&g01##NAME, 1); \
+ init##NAME (&g02##NAME, 2); \
+ init##NAME (&g03##NAME, 3); \
+ init##NAME (&g04##NAME, 4); \
+ init##NAME (&g05##NAME, 5); \
+ init##NAME (&g06##NAME, 6); \
+ init##NAME (&g07##NAME, 7); \
+ init##NAME (&g08##NAME, 8); \
+ init##NAME (&g09##NAME, 9); \
+ init##NAME (&g10##NAME, 10); \
+ init##NAME (&g11##NAME, 11); \
+ init##NAME (&g12##NAME, 12); \
+ init##NAME (&g13##NAME, 13); \
+ init##NAME (&g14##NAME, 14); \
+ init##NAME (&g15##NAME, 15); \
+ init##NAME (&g16##NAME, 16); \
+ checkg##NAME (); \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" test: ") \
+ test##NAME (g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME, g14##NAME, g15##NAME, g16##NAME); \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" testva: ") \
+ DEBUG_NL \
+ testva##NAME (1, \
+ g01##NAME); \
+ DEBUG_NL \
+ testva##NAME (2, \
+ g01##NAME, g02##NAME); \
+ DEBUG_NL \
+ testva##NAME (3, \
+ g01##NAME, g02##NAME, g03##NAME); \
+ DEBUG_NL \
+ testva##NAME (4, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME); \
+ DEBUG_NL \
+ testva##NAME (5, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME); \
+ DEBUG_NL \
+ testva##NAME (6, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME); \
+ DEBUG_NL \
+ testva##NAME (7, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME); \
+ DEBUG_NL \
+ testva##NAME (8, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME); \
+ DEBUG_NL \
+ testva##NAME (9, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME); \
+ DEBUG_NL \
+ testva##NAME (10, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME); \
+ DEBUG_NL \
+ testva##NAME (11, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME); \
+ DEBUG_NL \
+ testva##NAME (12, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME); \
+ DEBUG_NL \
+ testva##NAME (13, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME); \
+ DEBUG_NL \
+ testva##NAME (14, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME, g14##NAME); \
+ DEBUG_NL \
+ testva##NAME (15, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME, g14##NAME, g15##NAME); \
+ DEBUG_NL \
+ testva##NAME (16, \
+ g01##NAME, g02##NAME, g03##NAME, g04##NAME, \
+ g05##NAME, g06##NAME, g07##NAME, g08##NAME, \
+ g09##NAME, g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME, g14##NAME, g15##NAME, g16##NAME); \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" test2: ") \
+ test2_##NAME (g01##NAME, g03##NAME, g05##NAME, g07##NAME, \
+ g09##NAME, g11##NAME, g13##NAME, g15##NAME); \
+ DEBUG_NL \
+}
+
+T(d32, dec32, (dec32)1.5DF)
+T(d64, dec64, (dec64)2.5DD)
+T(d128, dec128, (dec128)3.5DL)
+
+#undef T
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_y.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_y.h
new file mode 100644
index 000000000..f835b1983
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/pass_y.h
@@ -0,0 +1,89 @@
+#include <stdarg.h>
+
+#include "compat-common.h"
+
+#ifdef SKIP_VA
+const int test_va = 0;
+#else
+const int test_va = 1;
+#endif
+
+#define T(NAME, TYPE, INITVAL) \
+extern TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \
+extern TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \
+extern TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \
+extern TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \
+ \
+extern void check##NAME (TYPE x, TYPE v); \
+ \
+extern void \
+init##NAME (TYPE *p, TYPE v) \
+{ \
+ *p = v + INITVAL; \
+} \
+ \
+extern void \
+checkg##NAME (void) \
+{ \
+ check##NAME (g01##NAME, 1); \
+ check##NAME (g02##NAME, 2); \
+ check##NAME (g03##NAME, 3); \
+ check##NAME (g04##NAME, 4); \
+ check##NAME (g05##NAME, 5); \
+ check##NAME (g06##NAME, 6); \
+ check##NAME (g07##NAME, 7); \
+ check##NAME (g08##NAME, 8); \
+ check##NAME (g09##NAME, 9); \
+ check##NAME (g10##NAME, 10); \
+ check##NAME (g11##NAME, 11); \
+ check##NAME (g12##NAME, 12); \
+ check##NAME (g13##NAME, 13); \
+ check##NAME (g14##NAME, 14); \
+ check##NAME (g15##NAME, 15); \
+ check##NAME (g16##NAME, 16); \
+} \
+ \
+extern void \
+test##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \
+ TYPE x05, TYPE x06, TYPE x07, TYPE x08, \
+ TYPE x09, TYPE x10, TYPE x11, TYPE x12, \
+ TYPE x13, TYPE x14, TYPE x15, TYPE x16) \
+{ \
+ check##NAME (x01, 1); \
+ check##NAME (x02, 2); \
+ check##NAME (x03, 3); \
+ check##NAME (x04, 4); \
+ check##NAME (x05, 5); \
+ check##NAME (x06, 6); \
+ check##NAME (x07, 7); \
+ check##NAME (x08, 8); \
+ check##NAME (x09, 9); \
+ check##NAME (x10, 10); \
+ check##NAME (x11, 11); \
+ check##NAME (x12, 12); \
+ check##NAME (x13, 13); \
+ check##NAME (x14, 14); \
+ check##NAME (x15, 15); \
+ check##NAME (x16, 16); \
+} \
+ \
+extern void \
+testva##NAME (int n, ...) \
+{ \
+ int i; \
+ va_list ap; \
+ if (test_va) \
+ { \
+ va_start (ap, n); \
+ for (i = 0; i < n; i++) \
+ { \
+ TYPE t = va_arg (ap, TYPE); \
+ check##NAME (t, i+1); \
+ } \
+ va_end (ap); \
+ } \
+}
+
+T(d32, dec32, (dec32)1.5DF)
+T(d64, dec64, (dec64)2.5DD)
+T(d128, dec128, (dec128)3.5DL)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C
new file mode 100644
index 000000000..c663bb01c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for decimal float scalars. */
+
+extern void return_1_x (void);
+int fails;
+
+int
+main ()
+{
+ return_1_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C
new file mode 100644
index 000000000..e391bd1f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C
@@ -0,0 +1,24 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_x.h"
+
+void
+return_1_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C
new file mode 100644
index 000000000..0b4d4bf38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C
new file mode 100644
index 000000000..afa27f269
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for decimal classes. */
+
+extern void return_2_x (void);
+int fails;
+
+int
+main ()
+{
+ return_2_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C
new file mode 100644
index 000000000..d96c01479
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C
@@ -0,0 +1,26 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "return_x.h"
+
+void
+return_2_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C
new file mode 100644
index 000000000..c68088b30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C
new file mode 100644
index 000000000..468f3fc0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for decimal float scalars and classes. */
+
+extern void return_3_x (void);
+int fails;
+
+int
+main ()
+{
+ return_3_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C
new file mode 100644
index 000000000..52e599c76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C
@@ -0,0 +1,24 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_x.h"
+
+void
+return_3_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C
new file mode 100644
index 000000000..c68088b30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C
new file mode 100644
index 000000000..365d8becd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for decimal float classes and scalars. */
+
+extern void return_4_x (void);
+int fails;
+
+int
+main ()
+{
+ return_4_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C
new file mode 100644
index 000000000..b9d28fa5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C
@@ -0,0 +1,26 @@
+#include "decimal-dummy.h"
+
+#define dec32 std::decimal::decimal32
+#define dec64 std::decimal::decimal64
+#define dec128 std::decimal::decimal128
+
+#include "return_x.h"
+
+void
+return_4_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C
new file mode 100644
index 000000000..0b4d4bf38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C
new file mode 100644
index 000000000..2c3348327
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for decimal float scalars and typedef'd
+ classes. */
+
+extern void return_5_x (void);
+int fails;
+
+int
+main ()
+{
+ return_5_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C
new file mode 100644
index 000000000..a2bb6173b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C
@@ -0,0 +1,24 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_x.h"
+
+void
+return_5_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C
new file mode 100644
index 000000000..0f780167a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C
@@ -0,0 +1,7 @@
+#include "decimal-dummy.h"
+
+typedef std::decimal::decimal32 dec32;
+typedef std::decimal::decimal64 dec64;
+typedef std::decimal::decimal128 dec128;
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C
new file mode 100644
index 000000000..94526bdcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target dfp } */
+
+/* Test function return values for typedef'd decimal float classes
+ and scalars. */
+
+extern void return_6_x (void);
+int fails;
+
+int
+main ()
+{
+ return_6_x ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C
new file mode 100644
index 000000000..e0a487dbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C
@@ -0,0 +1,26 @@
+#include "decimal-dummy.h"
+
+typedef std::decimal::decimal32 dec32;
+typedef std::decimal::decimal64 dec64;
+typedef std::decimal::decimal128 dec128;
+
+#include "return_x.h"
+
+void
+return_6_x (void)
+{
+DEBUG_INIT
+
+#define T(NAME) testit##NAME ();
+
+T(d32)
+T(d64)
+T(d128)
+
+DEBUG_FINI
+
+if (fails != 0)
+ abort ();
+
+#undef T
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C
new file mode 100644
index 000000000..0b4d4bf38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C
@@ -0,0 +1,5 @@
+typedef float dec32 __attribute__((mode(SD)));
+typedef float dec64 __attribute__((mode(DD)));
+typedef float dec128 __attribute__((mode(TD)));
+
+#include "return_y.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_x.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_x.h
new file mode 100644
index 000000000..401adfb5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_x.h
@@ -0,0 +1,90 @@
+#include "compat-common.h"
+
+#ifdef SKIP_VA
+const int test_va = 0;
+#else
+const int test_va = 1;
+#endif
+
+#define T(NAME, TYPE, INITVAL) \
+TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \
+TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \
+TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \
+TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \
+ \
+extern void init##NAME (TYPE *p, TYPE v); \
+extern void checkg##NAME (void); \
+extern TYPE test0##NAME (void); \
+extern TYPE test1##NAME (TYPE); \
+extern TYPE testva##NAME (int n, ...); \
+ \
+extern void \
+check##NAME (TYPE x, TYPE v) \
+{ \
+ if (x != v) \
+ DEBUG_CHECK \
+} \
+ \
+extern void \
+testit##NAME (void) \
+{ \
+ TYPE rslt; \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" init: ") \
+ init##NAME (&g01##NAME, 1); \
+ init##NAME (&g02##NAME, 2); \
+ init##NAME (&g03##NAME, 3); \
+ init##NAME (&g04##NAME, 4); \
+ init##NAME (&g05##NAME, 5); \
+ init##NAME (&g06##NAME, 6); \
+ init##NAME (&g07##NAME, 7); \
+ init##NAME (&g08##NAME, 8); \
+ init##NAME (&g09##NAME, 9); \
+ init##NAME (&g10##NAME, 10); \
+ init##NAME (&g11##NAME, 11); \
+ init##NAME (&g12##NAME, 12); \
+ init##NAME (&g13##NAME, 13); \
+ init##NAME (&g14##NAME, 14); \
+ init##NAME (&g15##NAME, 15); \
+ init##NAME (&g16##NAME, 16); \
+ checkg##NAME (); \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" test0: ") \
+ rslt = test0##NAME (); \
+ check##NAME (rslt, g01##NAME); \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" test1: ") \
+ rslt = test1##NAME (g01##NAME); \
+ check##NAME (rslt, g01##NAME); \
+ if (test_va) \
+ { \
+ DEBUG_NL \
+ DEBUG_FPUTS (#NAME) \
+ DEBUG_FPUTS (" testva: ") \
+ rslt = testva##NAME (1, g01##NAME); \
+ check##NAME (rslt, g01##NAME); \
+ rslt = testva##NAME (5, g01##NAME, g02##NAME, g03##NAME, \
+ g04##NAME, g05##NAME); \
+ check##NAME (rslt, g05##NAME); \
+ rslt = testva##NAME (9, g01##NAME, g02##NAME, g03##NAME, \
+ g04##NAME, g05##NAME, g06##NAME, \
+ g07##NAME, g08##NAME, g09##NAME); \
+ check##NAME (rslt, g09##NAME); \
+ rslt = testva##NAME (16, g01##NAME, g02##NAME, g03##NAME, \
+ g04##NAME, g05##NAME, g06##NAME, \
+ g07##NAME, g08##NAME, g09##NAME, \
+ g10##NAME, g11##NAME, g12##NAME, \
+ g13##NAME, g14##NAME, g15##NAME, \
+ g16##NAME); \
+ check##NAME (rslt, g16##NAME); \
+ } \
+ DEBUG_NL \
+}
+
+T(d32, dec32, (dec32)1.5DF);
+T(d64, dec64, (dec64)2.5DD);
+T(d128, dec128, (dec128)3.5DL);
+
+#undef T
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_y.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_y.h
new file mode 100644
index 000000000..285526e2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/decimal/return_y.h
@@ -0,0 +1,67 @@
+#include <stdarg.h>
+
+#include "compat-common.h"
+
+#define T(NAME, TYPE, INITVAL) \
+extern TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \
+extern TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \
+extern TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \
+extern TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \
+ \
+extern void check##NAME (TYPE x, TYPE v); \
+ \
+extern void \
+init##NAME (TYPE *p, TYPE v) \
+{ \
+ *p = v + INITVAL; \
+} \
+ \
+extern void \
+checkg##NAME (void) \
+{ \
+ check##NAME (g01##NAME, 1+INITVAL); \
+ check##NAME (g02##NAME, 2+INITVAL); \
+ check##NAME (g03##NAME, 3+INITVAL); \
+ check##NAME (g04##NAME, 4+INITVAL); \
+ check##NAME (g05##NAME, 5+INITVAL); \
+ check##NAME (g06##NAME, 6+INITVAL); \
+ check##NAME (g07##NAME, 7+INITVAL); \
+ check##NAME (g08##NAME, 8+INITVAL); \
+ check##NAME (g09##NAME, 9+INITVAL); \
+ check##NAME (g10##NAME, 10+INITVAL); \
+ check##NAME (g11##NAME, 11+INITVAL); \
+ check##NAME (g12##NAME, 12+INITVAL); \
+ check##NAME (g13##NAME, 13+INITVAL); \
+ check##NAME (g14##NAME, 14+INITVAL); \
+ check##NAME (g15##NAME, 15+INITVAL); \
+ check##NAME (g16##NAME, 16+INITVAL); \
+} \
+ \
+extern TYPE \
+test0##NAME (void) \
+{ \
+ return g01##NAME; \
+} \
+ \
+extern TYPE \
+test1##NAME (TYPE x01) \
+{ \
+ return x01; \
+} \
+ \
+extern TYPE \
+testva##NAME (int n, ...) \
+{ \
+ int i; \
+ TYPE rslt; \
+ va_list ap; \
+ va_start (ap, n); \
+ for (i = 0; i < n; i++) \
+ rslt = va_arg (ap, TYPE); \
+ va_end (ap); \
+ return rslt; \
+}
+
+T(d32, dec32, (dec32)1.5)
+T(d64, dec64, (dec64)2.5)
+T(d128, dec128, (dec128)3.5)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1.h
new file mode 100644
index 000000000..e83476f2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1.h
@@ -0,0 +1,10 @@
+struct Foo
+{
+ ~Foo ();
+};
+
+struct Bar
+{
+ ~Bar ();
+ Foo f;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C
new file mode 100644
index 000000000..a188b46da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
+// PR 411
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void ctor1_x (void);
+
+int
+main ()
+{
+ ctor1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C
new file mode 100644
index 000000000..d74a52087
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C
@@ -0,0 +1,22 @@
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+#include "ctor1.h"
+
+bool was_f_in_Bar_destroyed=false;
+
+void ctor1_x ()
+{
+ try
+ {
+ Bar f;
+ }
+ catch(int i)
+ {
+ if(was_f_in_Bar_destroyed)
+ {
+ exit (0);
+ }
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C
new file mode 100644
index 000000000..260ab1c34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C
@@ -0,0 +1,13 @@
+extern bool was_f_in_Bar_destroyed;
+
+#include "ctor1.h"
+
+Foo::~Foo()
+{
+ was_f_in_Bar_destroyed=true;
+}
+
+Bar::~Bar()
+{
+ throw 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2.h
new file mode 100644
index 000000000..c6b9f40f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2.h
@@ -0,0 +1,22 @@
+struct VBase
+{
+ virtual void f () {}
+ VBase();
+ ~VBase();
+};
+
+struct StreamBase
+{
+ virtual ~StreamBase() {}
+};
+
+struct Stream : public virtual VBase, public StreamBase
+{
+ Stream();
+ virtual ~Stream() {}
+};
+
+struct DerivedStream : public Stream
+{
+ DerivedStream();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C
new file mode 100644
index 000000000..58836e26e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C
@@ -0,0 +1,12 @@
+// PR c++/4460
+// Test that the cleanup for fully-constructed subobjects when a
+// constructor throws gets the right address for a virtual base.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void ctor2_x (void);
+
+int main ()
+{
+ ctor2_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C
new file mode 100644
index 000000000..3fa1a53ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C
@@ -0,0 +1,19 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "ctor2.h"
+
+int r;
+
+void ctor2_x () {
+
+ try
+ {
+ DerivedStream str;
+ }
+ catch (...) { }
+
+ if (r != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C
new file mode 100644
index 000000000..00ba92000
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C
@@ -0,0 +1,20 @@
+extern int r;
+void *p;
+
+#include "ctor2.h"
+
+VBase::VBase ()
+{
+ p = this;
+}
+
+VBase::~VBase ()
+{
+ if (p != this) r = 1;
+}
+
+Stream::Stream () {}
+DerivedStream::DerivedStream ()
+{
+ throw 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1.h
new file mode 100644
index 000000000..0dfa793e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1.h
@@ -0,0 +1,7 @@
+struct A {
+ ~A();
+};
+
+struct B: public A {
+ ~B();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C
new file mode 100644
index 000000000..962fa6427
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C
@@ -0,0 +1,14 @@
+// PR c++/411
+
+// Test that a fully-constructed base is destroyed before transferring
+// control to the handler of a function-try-block.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void dtor1_x (void);
+
+int
+main ()
+{
+ dtor1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C
new file mode 100644
index 000000000..f7f4cc8a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C
@@ -0,0 +1,14 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "dtor1.h"
+
+int r;
+
+void dtor1_x ()
+{
+ { B b; }
+ if (r != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C
new file mode 100644
index 000000000..a1ec41a27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C
@@ -0,0 +1,18 @@
+extern int r;
+int ad;
+
+#include "dtor1.h"
+
+A::~A () { ++ad; }
+
+B::~B ()
+try
+ {
+ throw 1;
+ }
+catch (...)
+ {
+ if (!ad)
+ r = 1;
+ return;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1.h
new file mode 100644
index 000000000..1f5f0c936
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1.h
@@ -0,0 +1,5 @@
+struct a
+{
+ a();
+ ~a();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_main.C
new file mode 100644
index 000000000..2a8fca42c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_main.C
@@ -0,0 +1,11 @@
+// Test that cleanups get run when a catch filter fails to match.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void filter1_x (void);
+
+int
+main ()
+{
+ filter1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_x.C
new file mode 100644
index 000000000..b3789aa15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_x.C
@@ -0,0 +1,21 @@
+#include "filter1.h"
+
+extern "C" void exit (int);
+extern "C" void abort (void);
+extern void ex_test (void);
+
+void
+filter1_x ()
+{
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
+
+a::a() { }
+a::~a() { exit (0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_y.C
new file mode 100644
index 000000000..48de0877d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter1_y.C
@@ -0,0 +1,17 @@
+#include "filter1.h"
+
+struct e1 {};
+struct e2 {};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_main.C
new file mode 100644
index 000000000..866199c6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_main.C
@@ -0,0 +1,12 @@
+// Test that terminate gets run when a catch filter fails to match while
+// running destructors. Original bug depended on a::~a being inlined.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void filter2_x (void);
+
+int
+main ()
+{
+ filter2_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
new file mode 100644
index 000000000..287ffc7bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
@@ -0,0 +1,22 @@
+#include <exception>
+#include <cstdlib>
+
+extern "C" void abort (void);
+
+extern void my_terminate (void);
+extern void ex_test (void);
+
+void
+filter2_x ()
+{
+ std::set_terminate (my_terminate);
+
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_y.C
new file mode 100644
index 000000000..87c6fea10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/filter2_y.C
@@ -0,0 +1,39 @@
+#include <exception>
+#include <cstdlib>
+
+struct e1 {};
+struct e2 {};
+
+struct a
+{
+ a () { }
+
+ ~a ()
+ {
+ try
+ {
+ throw e1();
+ }
+ catch (e2 &)
+ {
+ }
+ }
+};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
+
+void my_terminate ()
+{
+ std::exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_main.C
new file mode 100644
index 000000000..ee4cad8e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_main.C
@@ -0,0 +1,13 @@
+// PR c++/5757
+// Test that when a constructor throws in a new-expression, we pass the
+// right pointer to operator delete.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void new1_x (void);
+
+int
+main ()
+{
+ new1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_x.C
new file mode 100644
index 000000000..121287170
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_x.C
@@ -0,0 +1,29 @@
+#include <new>
+#include <cstddef>
+
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+extern void * operator new[] (std::size_t s) throw (std::bad_alloc);
+extern void operator delete[] (void *p) throw ();
+
+struct A
+{
+ A() { throw 1; }
+ ~A() {}
+};
+
+int ret = 1;
+
+void
+new1_x ()
+{
+ try
+ {
+ A *p = new A[4];
+ }
+ catch (...) {}
+ if (ret != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_y.C
new file mode 100644
index 000000000..fbe0e2145
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/new1_y.C
@@ -0,0 +1,19 @@
+#include <new>
+#include <cstddef>
+
+extern int ret;
+
+void *ptr;
+void * operator new[] (std::size_t s) throw (std::bad_alloc)
+{
+ ptr = operator new (s);
+ return ptr;
+}
+
+void operator delete[] (void *p) throw ()
+{
+ if (p == ptr)
+ ret = 0;
+ operator delete (p);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1.h
new file mode 100644
index 000000000..853ea3914
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1.h
@@ -0,0 +1,5 @@
+struct A
+{
+ A();
+ ~A();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C
new file mode 100644
index 000000000..3b76b5c88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C
@@ -0,0 +1,12 @@
+// PR c++/5636
+// Bug: the named return value optimization interfered with EH cleanups.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void nrv1_x (void);
+
+int
+main ()
+{
+ nrv1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C
new file mode 100644
index 000000000..0647de889
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C
@@ -0,0 +1,21 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "nrv1.h"
+
+extern A f (void);
+
+int c, d;
+
+void nrv1_x ()
+{
+ try
+ { A a = f(); }
+ catch (...) { }
+ if (d < c)
+ abort ();
+ exit (0);
+}
+
+A::A() { ++c; }
+A::~A() { ++d; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C
new file mode 100644
index 000000000..5a43af7c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C
@@ -0,0 +1,8 @@
+#include "nrv1.h"
+
+A f()
+{
+ A nrv;
+ throw 42;
+ return nrv;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3.h
new file mode 100644
index 000000000..a042c1004
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3.h
@@ -0,0 +1,8 @@
+class Base {};
+
+struct A : virtual public Base
+{
+ A();
+};
+
+struct B {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_main.C
new file mode 100644
index 000000000..3f0e919b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_main.C
@@ -0,0 +1,12 @@
+// PR c++/4381
+// Test that exception-specs work properly for classes with virtual bases.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void spec3_x (void);
+
+int
+main ()
+{
+ spec3_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_x.C
new file mode 100644
index 000000000..b8e5fbeaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_x.C
@@ -0,0 +1,9 @@
+#include "spec3.h"
+
+extern void func () throw (B,A);
+
+void spec3_x (void)
+{
+ try { func(); }
+ catch (A& a) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_y.C
new file mode 100644
index 000000000..fef6b368c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/spec3_y.C
@@ -0,0 +1,8 @@
+#include "spec3.h"
+
+A::A() {}
+
+void func() throw (B,A)
+{
+ throw A();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1.h
new file mode 100644
index 000000000..93999a11d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1.h
@@ -0,0 +1,15 @@
+class A {};
+
+template <class T>
+struct B
+{
+ typedef A E;
+};
+
+template <class T>
+struct C
+{
+ typedef B<T> D;
+ typedef typename D::E E;
+ void f() throw(E);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_main.C
new file mode 100644
index 000000000..2d169808c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_main.C
@@ -0,0 +1,12 @@
+// Test whether exception specifier dependent on template parameter
+// is accepted during template decl processing.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void template1_x (void);
+
+int
+main ()
+{
+ template1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_x.C
new file mode 100644
index 000000000..5a18be789
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_x.C
@@ -0,0 +1,21 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "template1.h"
+
+void template1_x ()
+{
+ int caught = 0;
+ try
+ {
+ C<int> x;
+ x.f();
+ }
+ catch (A)
+ {
+ ++caught;
+ }
+ if (caught != 1)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_y.C
new file mode 100644
index 000000000..19425375c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/template1_y.C
@@ -0,0 +1,8 @@
+#include "template1.h"
+
+template<class T> void C<T>::f (void) throw (E)
+{
+ throw E();
+}
+
+template class C<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C
new file mode 100644
index 000000000..1658db77e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C
@@ -0,0 +1,12 @@
+// PR 3719
+// Test that an unexpected handler can rethrow to categorize.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void unexpected1_x ();
+
+int
+main ()
+{
+ unexpected1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C
new file mode 100644
index 000000000..61361a68d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C
@@ -0,0 +1,26 @@
+#include <exception>
+
+struct One { };
+struct Two { };
+
+extern "C" void abort ();
+extern void doit (void) throw (Two);
+extern void handle_unexpected (void);
+
+void
+unexpected1_x ()
+{
+ std::set_unexpected (handle_unexpected);
+
+ try
+ {
+ doit ();
+ }
+ catch (Two &)
+ {
+ }
+ catch (...)
+ {
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C
new file mode 100644
index 000000000..0c42c4579
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C
@@ -0,0 +1,21 @@
+struct One { };
+struct Two { };
+
+void
+handle_unexpected ()
+{
+ try
+ {
+ throw;
+ }
+ catch (One &)
+ {
+ throw Two ();
+ }
+}
+
+void
+doit () throw (Two)
+{
+ throw One ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_main.C
new file mode 100644
index 000000000..96b2cc4b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_main.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// Split into pieces for binary compatibility testing October 2002
+
+// Incorrect construction and destruction of multi-dimensional
+// array of class.
+
+extern void array5_x (void);
+
+int
+main ()
+{
+ array5_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_x.C
new file mode 100644
index 000000000..dc138772c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_x.C
@@ -0,0 +1,33 @@
+extern "C" void abort (void);
+
+extern int count;
+extern int num;
+
+struct A
+{
+ A();
+ ~A();
+};
+
+struct Array
+{
+ A array[2][2][2];
+};
+
+void
+array5_x ()
+{
+ for (num = 0; num <= 8; ++num)
+ {
+ count = 0;
+ try
+ {
+ Array A;
+ }
+ catch (...)
+ {
+ }
+ if (count != 0)
+ abort();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_y.C
new file mode 100644
index 000000000..64b295ed5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/array5_y.C
@@ -0,0 +1,20 @@
+int count;
+int num;
+
+struct A
+{
+ A();
+ ~A();
+};
+
+A::A()
+{
+ if (count == num)
+ throw "";
+ count++;
+}
+
+A::~A()
+{
+ count--;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1.h
new file mode 100644
index 000000000..2876b76ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1.h
@@ -0,0 +1,6 @@
+struct C
+{
+ int m;
+ C();
+ ~C();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_main.C
new file mode 100644
index 000000000..acefaab14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_main.C
@@ -0,0 +1,12 @@
+// PR c++/3948
+// Test that the destructor call for a value parameter gets the
+// right address.
+// Split into pieces for binary compatibility testing October 2002
+
+extern void byval1_x (void);
+
+int
+main ()
+{
+ byval1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_x.C
new file mode 100644
index 000000000..248dbe763
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_x.C
@@ -0,0 +1,15 @@
+#include "byval1.h"
+
+extern "C" void abort (void);
+extern void Foo (C c);
+extern int r;
+
+void
+byval1_x ()
+{
+ C c;
+
+ Foo (c);
+ if (r != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_y.C
new file mode 100644
index 000000000..6e217e84e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/byval1_y.C
@@ -0,0 +1,14 @@
+#include "byval1.h"
+
+void *p[2];
+
+int i;
+int r;
+
+C::C() { p[i++] = this; }
+C::~C() { if (p[--i] != this) r = 1; }
+
+void Foo (C c)
+{
+ p[i++] = &c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1.h
new file mode 100644
index 000000000..77e21c12e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1.h
@@ -0,0 +1,30 @@
+struct B
+{
+ int x;
+ B (int);
+ ~B ();
+};
+
+struct C1 : public B {
+ C1 (int);
+};
+
+struct C2 : public B {
+ C2 (int);
+};
+
+struct D : public B {
+ D (int);
+};
+
+struct E : public B {
+ E (int);
+};
+
+struct A
+ : public C1, C2, virtual public D, virtual public E
+{
+ A ();
+ B x1;
+ B x2;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_main.C
new file mode 100644
index 000000000..788687840
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_main.C
@@ -0,0 +1,9 @@
+// Split into pieces for binary compatibility testing October 2002
+
+extern void dtor1_x (void);
+
+int
+main ()
+{
+ dtor1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_x.C
new file mode 100644
index 000000000..8a4727cfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_x.C
@@ -0,0 +1,7 @@
+#include "dtor1.h"
+
+void
+dtor1_x (void)
+{
+ A a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_y.C
new file mode 100644
index 000000000..27610fc1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/dtor1_y.C
@@ -0,0 +1,18 @@
+#include "dtor1.h"
+
+extern "C" void abort ();
+
+int d = 5;
+
+B::B (int i) : x (i) { }
+B::~B () { if (d-- != x) abort (); }
+
+C1::C1 (int i) : B (i) {}
+
+C2::C2 (int i) : B (i) {}
+
+D::D (int i) : B (i) {}
+
+E::E (int i) : B (i) {}
+
+A::A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1.h
new file mode 100644
index 000000000..481e7308b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1.h
@@ -0,0 +1,5 @@
+struct A {
+ A ();
+ A (const A&);
+ ~A ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_main.C
new file mode 100644
index 000000000..c08d02fff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_main.C
@@ -0,0 +1,25 @@
+// Test that the destructor for a temporary passed by value isn't run
+// until end of full-expression, as per [class.copy]:
+
+// Whenever a temporary class object is copied using a copy constructor,
+// and this object and the copy have the same cv-unqualified type, an
+// implementation is permitted to treat the original and the copy as two
+// different ways of referring to the same object and not perform a copy
+// at all, even if the class copy constructor or destructor have side
+// effects.... In these cases, the
+// object is destroyed at the later of times when the original and the
+// copy would have been destroyed without the optimization.
+
+// Here, the temporary would be destroyed later than the parm, so either we
+// must suppress the optimization in this case or destroy value parms in the
+// caller.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void elide1_x (void);
+
+int
+main ()
+{
+ elide1_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_x.C
new file mode 100644
index 000000000..dbc287e4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_x.C
@@ -0,0 +1,15 @@
+#include "elide1.h"
+
+extern "C" void abort (void);
+extern void f (A);
+extern int d;
+
+void
+elide1_x (void)
+{
+ int r;
+ f (A ()), r = d;
+
+ if (r >= d || !d)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_y.C
new file mode 100644
index 000000000..e767d0808
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/elide1_y.C
@@ -0,0 +1,9 @@
+#include "elide1.h"
+
+int d;
+
+A::A () { }
+A::A (const A&) { }
+A::~A() { ++d; }
+
+void f (A a) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C
new file mode 100644
index 000000000..73782829e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C
@@ -0,0 +1,11 @@
+// Submitted by Jason Merrill <jason_merrill@redhat.com>
+// Test for proper handling of local static references.
+// Split into pieces for binary compatibility testing October 2002
+
+extern void init_ref2_x (void);
+
+int
+main ()
+{
+ init_ref2_x ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C
new file mode 100644
index 000000000..7fbec89b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C
@@ -0,0 +1,22 @@
+extern "C" void abort (void);
+extern void g (void);
+extern void h (void);
+
+int r;
+int c;
+int f ()
+{
+ // Test that we only initialize i once.
+ if (++c > 1)
+ ++r;
+ return 42;
+}
+
+void
+init_ref2_x (void)
+{
+ g ();
+ h ();
+ if (r != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C
new file mode 100644
index 000000000..23e66b2f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C
@@ -0,0 +1,24 @@
+extern int f (void);
+extern int r;
+
+const int *p;
+
+void g ()
+{
+ static const int &i = f();
+
+ // Test that i points to the same place in both calls.
+ if (p && p != &i)
+ ++r;
+ // Test that if so, it points to static data.
+ if (i != 42)
+ ++r;
+
+ p = &i;
+}
+
+void h ()
+{
+ int arr[] = { 1, 1, 1, 1, 1, 1, 1 };
+ g ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.exp b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.exp
new file mode 100644
index 000000000..13211c2fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.exp
@@ -0,0 +1,166 @@
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+#
+# This file was written by Jakub Jelinek, <jakub@redhat.com>
+# Based on compat.exp writte by Janis Johnson, <janis187@us.ibm.com>
+
+
+# Test interoperability of two compilers that follow the same ABI.
+#
+# Break simple tests into two pieces and see that they work when linked
+# together. If an alternate compiler is specified then the two main
+# pieces of each test are compiled with different compilers. The
+# alternate compiler must be installed, and is specified by defining
+# ALT_CXX_UNDER_TEST in the environment.
+#
+# struct-layout-1 are generated structure layout interoperability tests,
+# so a generator first needs to be compiled on host, run there and the
+# generated tests then compiled on build and executed on target.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+global GXX_UNDER_TEST
+global ld_library_path
+
+# Load procedures from common libraries.
+load_lib standard.exp
+load_lib g++.exp
+load_lib target-libpath.exp
+
+#
+# compat-use-alt-compiler -- make the alternate compiler the default
+#
+proc compat-use-alt-compiler { } {
+ global GXX_UNDER_TEST ALT_CXX_UNDER_TEST
+ global CXXFLAGS
+ global ALWAYS_CXXFLAGS
+ global ld_library_path alt_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST
+ set CXXFLAGS ""
+ set ALWAYS_CXXFLAGS ""
+ set ld_library_path $alt_ld_library_path
+ set_ld_library_path_env_vars
+ }
+}
+
+#
+# compat-use-tst-compiler -- make compiler under test the default
+#
+proc compat-use-tst-compiler { } {
+ global GXX_UNDER_TEST save_gxx_under_test
+ global CXXFLAGS save_cxxflags
+ global ALWAYS_CXXFLAGS save_always_cxxflags
+ global ld_library_path save_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $save_gxx_under_test
+ set CXXFLAGS $save_cxxflags
+ set ALWAYS_CXXFLAGS $save_always_cxxflags
+ set ld_library_path $save_ld_library_path
+ set_ld_library_path_env_vars
+ }
+}
+
+# Load the language-independent compabibility support procedures.
+# This must be done after the compat-use-*-compiler definitions.
+load_lib compat.exp
+
+g++_init
+
+# Save variables for the C++ compiler under test, which each test will
+# change a couple of times. This must be done after calling g++-init.
+set save_gxx_under_test $GXX_UNDER_TEST
+set save_cxxflags $CXXFLAGS
+set save_always_cxxflags $ALWAYS_CXXFLAGS
+set save_ld_library_path $ld_library_path
+
+# Define an identifier for use with this suite to avoid name conflicts
+# with other compat tests running at the same time.
+set sid "cp_compat"
+
+# Find out whether there is an alternate compiler to test. If the
+# variable is defined but is set to "same", that means we use the same
+# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS
+# are different.
+set use_alt 0
+set same_alt 0
+set alt_ld_library_path "."
+if [info exists ALT_CXX_UNDER_TEST] then {
+ set use_alt 1
+ if [string match "same" $ALT_CXX_UNDER_TEST] then {
+ set same_alt 1
+ } else {
+ if [info exists ALT_LD_LIBRARY_PATH] then {
+ append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}"
+ }
+ }
+}
+
+set tstobjdir "$tmpdir/g++.dg-struct-layout-1"
+set generator "$tmpdir/g++.dg-struct-layout-1_generate.exe"
+
+set generator_src "$srcdir/$subdir/struct-layout-1_generate.c"
+set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random.c"
+set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random_r.c"
+set generator_cmd "-o $generator $generator_src"
+
+# Temporarily switch to the environment of the host compiler.
+restore_ld_library_path_env_vars
+set status [remote_exec build "$HOSTCC $HOSTCFLAGS $generator_cmd"]
+set status [lindex $status 0]
+set_ld_library_path_env_vars
+if { $status == 0 } then {
+ file delete -force $tstobjdir
+ file mkdir $tstobjdir
+ set generator_args "-s $srcdir/$subdir -d $tstobjdir"
+ if [info exists env(RUN_ALL_COMPAT_TESTS) ] then {
+ set generator_args "$generator_args -n 15000"
+ }
+ if [check_effective_target_short_enums] then {
+ set generator_args "-e $generator_args"
+ }
+ set status [remote_exec host "$generator $generator_args"]
+ set status [lindex $status 0]
+ if { $status == 0 } then {
+ foreach src [lsort [find $tstobjdir *_main.C]] {
+ # If we're only testing specific files and this isn't one
+ # of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+
+ compat-execute $src $sid $use_alt
+ }
+ } else {
+ warning "Could not execute g++.dg/compat/struct-layout-1 generator"
+ }
+} else {
+ warning "Could not compile g++.dg/compat/struct-layout-1 generator"
+}
+
+# Restore the original compiler under test.
+compat-use-tst-compiler
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.h
new file mode 100644
index 000000000..2b93a72c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1.h
@@ -0,0 +1,502 @@
+#include <limits.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../../gcc.dg/compat/compat-common.h"
+
+#ifndef SKIP_ATTRIBUTE
+# include "../../gcc.dg/compat/vector-defs.h"
+#else
+typedef int qi;
+typedef int hi;
+typedef int si;
+typedef int di;
+typedef float sf;
+typedef float df;
+typedef int v8qi;
+typedef int v16qi;
+typedef int v2hi;
+typedef int v4hi;
+typedef int v8hi;
+typedef int v2si;
+typedef int v4si;
+typedef int v1di;
+typedef int v2di;
+typedef int v2sf;
+typedef int v4sf;
+typedef int v16sf;
+typedef int v2df;
+typedef int u8qi;
+typedef int u16qi;
+typedef int u2hi;
+typedef int u4hi;
+typedef int u8hi;
+typedef int u2si;
+typedef int u4si;
+typedef int u1di;
+typedef int u2di;
+typedef int u2sf;
+typedef int u4sf;
+typedef int u16sf;
+typedef int u2df;
+#endif
+#if (defined __i386__ || defined __x86_64__) && !defined SKIP_ATTRIBUTE
+# ifdef __MMX__
+typedef int __m64 __attribute__ ((__vector_size__ (8)));
+# else
+typedef int __m64;
+# endif
+# ifdef __SSE__
+typedef float __m128 __attribute__ ((__vector_size__ (16)));
+# else
+typedef int __m128;
+# endif
+#else
+typedef int __m64;
+typedef int __m128;
+#endif
+#if defined (__uClinux__)
+/* The maximum achievable alignment on uClinux is usually 16 bytes. */
+#define v16sf v4sf
+#define u16sf u4sf
+#endif
+
+#define FLDS_MAX 32
+extern struct Info
+{
+ int nfields, nbitfields;
+ void *sp, *a0p, *a3p;
+ void *flds[FLDS_MAX];
+ size_t sz, sizes[FLDS_MAX];
+ size_t als, ala0, ala3, aligns[FLDS_MAX];
+} info;
+
+extern int intarray[256];
+extern int fn0 (void), fn1 (void), fn2 (void), fn3 (void), fn4 (void);
+extern int fn5 (void), fn6 (void), fn7 (void), fn8 (void), fn9 (void);
+
+#ifdef DBG
+#define FAIL(n, m) printf ("fail %d.%d\n", n, m), ++fails
+#else
+#define FAIL(n, m) ++fails
+#endif
+
+#ifdef SKIP_ATTRIBUTE
+# define __attribute__(x)
+#endif
+#define atal __attribute__((aligned))
+#define atpa __attribute__((packed))
+#define atalpa __attribute__((aligned, packed))
+#define atpaal __attribute__((packed, aligned))
+#define atal1 __attribute__((aligned (1)))
+#define atal2 __attribute__((aligned (2)))
+#define atal4 __attribute__((aligned (4)))
+#define atal8 __attribute__((aligned (8)))
+#define atal16 __attribute__((aligned (16)))
+#define atal1pa __attribute__((aligned (1), packed))
+#define atal2pa __attribute__((aligned (2), packed))
+#define atal4pa __attribute__((aligned (4), packed))
+#define atal8pa __attribute__((aligned (8), packed))
+#define atal16pa __attribute__((aligned (16), packed))
+#define atpaal1 __attribute__((packed, aligned (1)))
+#define atpaal2 __attribute__((packed, aligned (2)))
+#define atpaal4 __attribute__((packed, aligned (4)))
+#define atpaal8 __attribute__((packed, aligned (8)))
+#define atpaal16 __attribute__((packed, aligned (16)))
+
+#if UCHAR_MAX == 255 && USHORT_MAX == 65535 && UINT_MAX == 4294967295U \
+ && ULLONG_MAX == 18446744073709551615ULL
+/* For ILP32 and LP64 targets, assume float is at least 32-bit
+ and double plus long double at least 64-bit. */
+# define atalx1 atal1
+# define atalx2 atal2
+# define atalx4 atal4
+# define atalx8 atal8
+# define atalx16 atal16
+# define atalx1pa atal1pa
+# define atalx2pa atal2pa
+# define atalx4pa atal4pa
+# define atalx8pa atal8pa
+# define atalx16pa atal16pa
+# define atpaalx1 atpaal1
+# define atpaalx2 atpaal2
+# define atpaalx4 atpaal4
+# define atpaalx8 atpaal8
+# define atpaalx16 atpaal16
+# if ULONG_MAX > 4294967295UL
+# define ataly8 atal8
+# define ataly8pa atal8pa
+# define atpaaly8 atpaal8
+# define ataly16 atal16
+# define ataly16pa atal16pa
+# define atpaaly16 atpaal16
+# else
+# define ataly8
+# define ataly8pa
+# define atpaaly8
+# define ataly16
+# define ataly16pa
+# define atpaaly16
+# endif
+#else
+# define atalx1
+# define atalx2
+# define atalx4
+# define atalx8
+# define atalx16
+# define atalx1pa
+# define atalx2pa
+# define atalx4pa
+# define atalx8pa
+# define atalx16pa
+# define atpaalx1
+# define atpaalx2
+# define atpaalx4
+# define atpaalx8
+# define atpaalx16
+# define ataly8
+# define ataly8pa
+# define atpaaly8
+# define ataly16
+# define ataly16pa
+# define atpaaly16
+#endif
+
+#define atQI __attribute__((mode (QI)))
+#define atHI __attribute__((mode (HI)))
+#define atSI __attribute__((mode (SI)))
+#define atDI __attribute__((mode (DI)))
+
+enum E0 { e0_0 };
+enum E1 { e1_0, e1_1 };
+enum E2 { e2_m3 = -3, e2_m2, e2_m1, e2_0, e2_1, e2_2, e2_3 };
+enum E3 { e3_m127 = -127, e3_m126, e3_m125, e3_0 = 0, e3_125 = 125, e3_126, e3_127 };
+enum E4 { e4_0, e4_1, e4_2, e4_3, e4_253 = 253, e4_254, e4_255 };
+enum E5 { e5_m32767 = -32767, e5_m32766, e5_m32765, e5_0 = 0, e5_32765 = 32765, e5_32766, e5_32767 };
+enum E6 { e6_0, e6_1, e6_2, e6_3, e6_65533 = 65533, e6_65534, e6_65535 };
+enum E7 { e7_m2147483647 = -2147483647, e7_m2147483646, e7_m2147483645,
+ e7_0, e7_2147483645 = 2147483645, e7_2147483646, e7_2147483647 };
+enum E8 { e8_0, e8_1, e8_2, e8_3, e8_4294967293 = 4294967293U, e8_4294967294, e8_4294967295 };
+enum E9 { e9_m1099511627775 = -1099511627775LL, e9_m1099511627774, e9_m1099511627773,
+ e9_0, e9_1099511627773 = 1099511627773LL, e9_1099511627774, e9_1099511627775 };
+
+typedef char Tchar;
+typedef signed char Tschar;
+typedef unsigned char Tuchar;
+typedef short int Tshort;
+typedef unsigned short int Tushort;
+typedef int Tint;
+typedef unsigned int Tuint;
+typedef long int Tlong;
+typedef unsigned long int Tulong;
+typedef long long int Tllong;
+typedef unsigned long long int Tullong;
+typedef float Tfloat;
+typedef double Tdouble;
+typedef long double Tldouble;
+typedef _Complex float Tcfloat;
+typedef _Complex double Tcdouble;
+typedef _Complex long double Tcldouble;
+typedef bool Tbool;
+typedef enum E0 TE0;
+typedef enum E1 TE1;
+typedef enum E2 TE2;
+typedef enum E3 TE3;
+typedef enum E4 TE4;
+typedef enum E5 TE5;
+typedef enum E6 TE6;
+typedef enum E7 TE7;
+typedef enum E8 TE8;
+typedef enum E9 TE9;
+typedef void *Tptr;
+typedef char *Tcptr;
+typedef int *Tiptr;
+typedef char Talchar atal;
+typedef signed char Talschar atal;
+typedef unsigned char Taluchar atal;
+typedef short int Talshort atal;
+typedef unsigned short int Talushort atal;
+typedef int Talint atal;
+typedef unsigned int Taluint atal;
+typedef long int Tallong atal;
+typedef unsigned long int Talulong atal;
+typedef long long int Talllong atal;
+typedef unsigned long long int Talullong atal;
+typedef float Talfloat atal;
+typedef double Taldouble atal;
+typedef long double Talldouble atal;
+typedef _Complex float Talcfloat atal;
+typedef _Complex double Talcdouble atal;
+typedef _Complex long double Talcldouble atal;
+typedef bool Talbool atal;
+typedef enum E0 TalE0 atal;
+typedef enum E1 TalE1 atal;
+typedef enum E2 TalE2 atal;
+typedef enum E3 TalE3 atal;
+typedef enum E4 TalE4 atal;
+typedef enum E5 TalE5 atal;
+typedef enum E6 TalE6 atal;
+typedef enum E7 TalE7 atal;
+typedef enum E8 TalE8 atal;
+typedef enum E9 TalE9 atal;
+typedef void *Talptr atal;
+typedef char *Talcptr atal;
+typedef int *Taliptr atal;
+typedef char Tal1char atal1;
+typedef signed char Tal1schar atal1;
+typedef unsigned char Tal1uchar atal1;
+typedef short int Tal1short atal1;
+typedef unsigned short int Tal1ushort atal1;
+typedef int Tal1int atal1;
+typedef unsigned int Tal1uint atal1;
+typedef long int Tal1long atal1;
+typedef unsigned long int Tal1ulong atal1;
+typedef long long int Tal1llong atal1;
+typedef unsigned long long int Tal1ullong atal1;
+typedef float Tal1float atal1;
+typedef double Tal1double atal1;
+typedef long double Tal1ldouble atal1;
+typedef _Complex float Tal1cfloat atal1;
+typedef _Complex double Tal1cdouble atal1;
+typedef _Complex long double Tal1cldouble atal1;
+typedef bool Tal1bool atal1;
+typedef enum E0 Tal1E0 atal1;
+typedef enum E1 Tal1E1 atal1;
+typedef enum E2 Tal1E2 atal1;
+typedef enum E3 Tal1E3 atal1;
+typedef enum E4 Tal1E4 atal1;
+typedef enum E5 Tal1E5 atal1;
+typedef enum E6 Tal1E6 atal1;
+typedef enum E7 Tal1E7 atal1;
+typedef enum E8 Tal1E8 atal1;
+typedef enum E9 Tal1E9 atal1;
+typedef void *Tal1ptr atal1;
+typedef char *Tal1cptr atal1;
+typedef int *Tal1iptr atal1;
+typedef char Tal2char atal2;
+typedef signed char Tal2schar atal2;
+typedef unsigned char Tal2uchar atal2;
+typedef short int Tal2short atal2;
+typedef unsigned short int Tal2ushort atal2;
+typedef int Tal2int atal2;
+typedef unsigned int Tal2uint atal2;
+typedef long int Tal2long atal2;
+typedef unsigned long int Tal2ulong atal2;
+typedef long long int Tal2llong atal2;
+typedef unsigned long long int Tal2ullong atal2;
+typedef float Tal2float atal2;
+typedef double Tal2double atal2;
+typedef long double Tal2ldouble atal2;
+typedef _Complex float Tal2cfloat atal2;
+typedef _Complex double Tal2cdouble atal2;
+typedef _Complex long double Tal2cldouble atal2;
+typedef bool Tal2bool atal2;
+typedef enum E0 Tal2E0 atal2;
+typedef enum E1 Tal2E1 atal2;
+typedef enum E2 Tal2E2 atal2;
+typedef enum E3 Tal2E3 atal2;
+typedef enum E4 Tal2E4 atal2;
+typedef enum E5 Tal2E5 atal2;
+typedef enum E6 Tal2E6 atal2;
+typedef enum E7 Tal2E7 atal2;
+typedef enum E8 Tal2E8 atal2;
+typedef enum E9 Tal2E9 atal2;
+typedef void *Tal2ptr atal2;
+typedef char *Tal2cptr atal2;
+typedef int *Tal2iptr atal2;
+typedef char Tal4char atal4;
+typedef signed char Tal4schar atal4;
+typedef unsigned char Tal4uchar atal4;
+typedef short int Tal4short atal4;
+typedef unsigned short int Tal4ushort atal4;
+typedef int Tal4int atal4;
+typedef unsigned int Tal4uint atal4;
+typedef long int Tal4long atal4;
+typedef unsigned long int Tal4ulong atal4;
+typedef long long int Tal4llong atal4;
+typedef unsigned long long int Tal4ullong atal4;
+typedef float Tal4float atal4;
+typedef double Tal4double atal4;
+typedef long double Tal4ldouble atal4;
+typedef _Complex float Tal4cfloat atal4;
+typedef _Complex double Tal4cdouble atal4;
+typedef _Complex long double Tal4cldouble atal4;
+typedef bool Tal4bool atal4;
+typedef enum E0 Tal4E0 atal4;
+typedef enum E1 Tal4E1 atal4;
+typedef enum E2 Tal4E2 atal4;
+typedef enum E3 Tal4E3 atal4;
+typedef enum E4 Tal4E4 atal4;
+typedef enum E5 Tal4E5 atal4;
+typedef enum E6 Tal4E6 atal4;
+typedef enum E7 Tal4E7 atal4;
+typedef enum E8 Tal4E8 atal4;
+typedef enum E9 Tal4E9 atal4;
+typedef void *Tal4ptr atal4;
+typedef char *Tal4cptr atal4;
+typedef int *Tal4iptr atal4;
+typedef char Tal8char atal8;
+typedef signed char Tal8schar atal8;
+typedef unsigned char Tal8uchar atal8;
+typedef short int Tal8short atal8;
+typedef unsigned short int Tal8ushort atal8;
+typedef int Tal8int atal8;
+typedef unsigned int Tal8uint atal8;
+typedef long int Tal8long atal8;
+typedef unsigned long int Tal8ulong atal8;
+typedef long long int Tal8llong atal8;
+typedef unsigned long long int Tal8ullong atal8;
+typedef float Tal8float atal8;
+typedef double Tal8double atal8;
+typedef long double Tal8ldouble atal8;
+typedef _Complex float Tal8cfloat atal8;
+typedef _Complex double Tal8cdouble atal8;
+typedef _Complex long double Tal8cldouble atal8;
+typedef bool Tal8bool atal8;
+typedef enum E0 Tal8E0 atal8;
+typedef enum E1 Tal8E1 atal8;
+typedef enum E2 Tal8E2 atal8;
+typedef enum E3 Tal8E3 atal8;
+typedef enum E4 Tal8E4 atal8;
+typedef enum E5 Tal8E5 atal8;
+typedef enum E6 Tal8E6 atal8;
+typedef enum E7 Tal8E7 atal8;
+typedef enum E8 Tal8E8 atal8;
+typedef enum E9 Tal8E9 atal8;
+typedef void *Tal8ptr atal8;
+typedef char *Tal8cptr atal8;
+typedef int *Tal8iptr atal8;
+typedef char Tal16char atal16;
+typedef signed char Tal16schar atal16;
+typedef unsigned char Tal16uchar atal16;
+typedef short int Tal16short atal16;
+typedef unsigned short int Tal16ushort atal16;
+typedef int Tal16int atal16;
+typedef unsigned int Tal16uint atal16;
+typedef long int Tal16long atal16;
+typedef unsigned long int Tal16ulong atal16;
+typedef long long int Tal16llong atal16;
+typedef unsigned long long int Tal16ullong atal16;
+typedef float Tal16float atal16;
+typedef double Tal16double atal16;
+typedef long double Tal16ldouble atal16;
+typedef _Complex float Tal16cfloat atal16;
+typedef _Complex double Tal16cdouble atal16;
+typedef _Complex long double Tal16cldouble atal16;
+typedef bool Tal16bool atal16;
+typedef enum E0 Tal16E0 atal16;
+typedef enum E1 Tal16E1 atal16;
+typedef enum E2 Tal16E2 atal16;
+typedef enum E3 Tal16E3 atal16;
+typedef enum E4 Tal16E4 atal16;
+typedef enum E5 Tal16E5 atal16;
+typedef enum E6 Tal16E6 atal16;
+typedef enum E7 Tal16E7 atal16;
+typedef enum E8 Tal16E8 atal16;
+typedef enum E9 Tal16E9 atal16;
+typedef void *Tal16ptr atal16;
+typedef char *Tal16cptr atal16;
+typedef int *Tal16iptr atal16;
+typedef char Talx1char atalx1;
+typedef signed char Talx1schar atalx1;
+typedef unsigned char Talx1uchar atalx1;
+typedef short int Talx1short atalx1;
+typedef unsigned short int Talx1ushort atalx1;
+typedef int Talx1int atalx1;
+typedef unsigned int Talx1uint atalx1;
+typedef long int Talx1long atalx1;
+typedef unsigned long int Talx1ulong atalx1;
+typedef long long int Talx1llong atalx1;
+typedef unsigned long long int Talx1ullong atalx1;
+typedef float Talx1float atalx1;
+typedef double Talx1double atalx1;
+typedef long double Talx1ldouble atalx1;
+typedef _Complex float Talx1cfloat atalx1;
+typedef _Complex double Talx1cdouble atalx1;
+typedef _Complex long double Talx1cldouble atalx1;
+typedef bool Talx1bool atalx1;
+typedef enum E0 Talx1E0 atalx1;
+typedef enum E1 Talx1E1 atalx1;
+typedef enum E2 Talx1E2 atalx1;
+typedef enum E3 Talx1E3 atalx1;
+typedef enum E4 Talx1E4 atalx1;
+typedef enum E5 Talx1E5 atalx1;
+typedef enum E6 Talx1E6 atalx1;
+typedef enum E7 Talx1E7 atalx1;
+typedef enum E8 Talx1E8 atalx1;
+typedef enum E9 Talx1E9 atalx1;
+typedef void *Talx1ptr atalx1;
+typedef char *Talx1cptr atalx1;
+typedef int *Talx1iptr atalx1;
+typedef short int Talx2short atalx2;
+typedef unsigned short int Talx2ushort atalx2;
+typedef int Talx2int atalx2;
+typedef unsigned int Talx2uint atalx2;
+typedef long int Talx2long atalx2;
+typedef unsigned long int Talx2ulong atalx2;
+typedef long long int Talx2llong atalx2;
+typedef unsigned long long int Talx2ullong atalx2;
+typedef float Talx2float atalx2;
+typedef double Talx2double atalx2;
+typedef long double Talx2ldouble atalx2;
+typedef _Complex float Talx2cfloat atalx2;
+typedef _Complex double Talx2cdouble atalx2;
+typedef _Complex long double Talx2cldouble atalx2;
+typedef enum E0 Talx2E0 atalx2;
+typedef enum E1 Talx2E1 atalx2;
+typedef enum E2 Talx2E2 atalx2;
+typedef enum E3 Talx2E3 atalx2;
+typedef enum E4 Talx2E4 atalx2;
+typedef enum E5 Talx2E5 atalx2;
+typedef enum E6 Talx2E6 atalx2;
+typedef enum E7 Talx2E7 atalx2;
+typedef enum E8 Talx2E8 atalx2;
+typedef enum E9 Talx2E9 atalx2;
+typedef void *Talx2ptr atalx2;
+typedef char *Talx2cptr atalx2;
+typedef int *Talx2iptr atalx2;
+typedef int Talx4int atalx4;
+typedef unsigned int Talx4uint atalx4;
+typedef long int Talx4long atalx4;
+typedef unsigned long int Talx4ulong atalx4;
+typedef long long int Talx4llong atalx4;
+typedef unsigned long long int Talx4ullong atalx4;
+typedef float Talx4float atalx4;
+typedef double Talx4double atalx4;
+typedef long double Talx4ldouble atalx4;
+typedef _Complex float Talx4cfloat atalx4;
+typedef _Complex double Talx4cdouble atalx4;
+typedef _Complex long double Talx4cldouble atalx4;
+typedef enum E0 Talx4E0 atalx4;
+typedef enum E1 Talx4E1 atalx4;
+typedef enum E2 Talx4E2 atalx4;
+typedef enum E3 Talx4E3 atalx4;
+typedef enum E4 Talx4E4 atalx4;
+typedef enum E5 Talx4E5 atalx4;
+typedef enum E6 Talx4E6 atalx4;
+typedef enum E7 Talx4E7 atalx4;
+typedef enum E8 Talx4E8 atalx4;
+typedef enum E9 Talx4E9 atalx4;
+typedef void *Talx4ptr atalx4;
+typedef char *Talx4cptr atalx4;
+typedef int *Talx4iptr atalx4;
+typedef long int Taly8long ataly8;
+typedef unsigned long int Taly8ulong ataly8;
+typedef long long int Talx8llong atalx8;
+typedef unsigned long long int Talx8ullong atalx8;
+typedef double Talx8double atalx8;
+typedef long double Talx8ldouble atalx8;
+typedef _Complex float Talx8cfloat atalx8;
+typedef _Complex double Talx8cdouble atalx8;
+typedef _Complex long double Talx8cldouble atalx8;
+typedef void *Taly8ptr ataly8;
+typedef char *Taly8cptr ataly8;
+typedef int *Taly8iptr ataly8;
+typedef _Complex double Talx16cdouble atalx16;
+typedef _Complex long double Talx16cldouble atalx16;
+typedef int (*Tfnptr) (void);
+
+#define T(n, fields, ops) TX(n, struct, , fields, ({ ops });)
+#define U(n, fields, ops) TX(n, union, , fields, ({ ops });)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c
new file mode 100644
index 000000000..2cf08946e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c
@@ -0,0 +1,1666 @@
+/* Structure layout test generator.
+ Copyright (C) 2004, 2005, 2007, 2008, 2009, 2011, 2012
+ Free Software Foundation, Inc.
+ Contributed by Jakub Jelinek <jakub@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+
+/* Compile with gcc -o struct-layout-1_generate{,.c} generate_random{,_r}.c */
+
+/* N.B. -- This program cannot use libiberty as that will not work
+ when testing an installed compiler. */
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+/* We use our own pseudo-random number generator, so that it gives the same
+ values on all hosts. */
+#include "../../gcc.dg/compat/generate-random.h"
+
+#if LLONG_MAX != 9223372036854775807LL && __LONG_LONG_MAX__ != 9223372036854775807LL
+# error Need 64-bit long long
+#endif
+
+#if defined __MSVCRT__
+#define COMPAT_PRLL "I64"
+#else
+#define COMPAT_PRLL "ll"
+#endif
+
+const char *dg_options[] = {
+"/* { dg-options \"%s-I%s\" } */\n",
+"/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
+"/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
+"/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* i?86-*-mingw32* x86_64-*-mingw32* i?86-*-cygwin* } } */\n",
+"/* { dg-options \"%s-I%s -mno-base-addresses\" { target mmix-*-* } } */\n",
+"/* { dg-options \"%s-I%s -mlongcalls -mtext-section-literals\" { target xtensa*-*-* } } */\n"
+#define NDG_OPTIONS (sizeof (dg_options) / sizeof (dg_options[0]))
+};
+
+typedef unsigned int hashval_t;
+
+enum TYPE
+{
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_FLOAT,
+ TYPE_SENUM,
+ TYPE_UENUM,
+ TYPE_PTR,
+ TYPE_FNPTR,
+ TYPE_OTHER
+};
+
+struct types
+{
+ const char *name;
+ enum TYPE type;
+ unsigned long long int maxval;
+ char bitfld;
+};
+
+struct types base_types[] = {
+/* As we don't know whether char will be signed or not, just limit ourselves
+ to unsigned values less than maximum signed char value. */
+{ "char", TYPE_UINT, 127, 'C' },
+{ "signed char", TYPE_INT, 127, 'C' },
+{ "unsigned char", TYPE_UINT, 255, 'C' },
+{ "short int", TYPE_INT, 32767, 'S' },
+{ "unsigned short int", TYPE_UINT, 65535, 'S' },
+{ "int", TYPE_INT, 2147483647, 'I' },
+{ "unsigned int", TYPE_UINT, 4294967295U, 'I' },
+{ "long int", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "unsigned long int", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "long long int", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "unsigned long long int", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "bool", TYPE_UINT, 1, 'B' },
+{ "void *", TYPE_PTR, 0, 0 },
+{ "char *", TYPE_PTR, 0, 0 },
+{ "int *", TYPE_PTR, 0, 0 },
+{ "float", TYPE_FLOAT, 0, 0 },
+{ "double", TYPE_FLOAT, 0, 0 },
+{ "long double", TYPE_FLOAT, 0, 0 },
+#define NTYPES1 18
+{ "Tchar", TYPE_UINT, 127, 'C' },
+{ "Tschar", TYPE_INT, 127, 'C' },
+{ "Tuchar", TYPE_UINT, 255, 'C' },
+{ "Tshort", TYPE_INT, 32767, 'S' },
+{ "Tushort", TYPE_UINT, 65535, 'S' },
+{ "Tint", TYPE_INT, 2147483647, 'I' },
+{ "Tuint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tlong", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tllong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tbool", TYPE_UINT, 1, 'B' },
+{ "size_t", TYPE_UINT, 18446744073709551615ULL, 0 },
+{ "Tptr", TYPE_PTR, 0, 0 },
+{ "Tcptr", TYPE_PTR, 0, 0 },
+{ "Tiptr", TYPE_PTR, 0, 0 },
+{ "Tfnptr", TYPE_FNPTR, 0, 0 },
+{ "Tfloat", TYPE_FLOAT, 0, 0 },
+{ "Tdouble", TYPE_FLOAT, 0, 0 },
+{ "Tldouble", TYPE_FLOAT, 0, 0 },
+{ "enum E0", TYPE_UENUM, 0, ' ' },
+{ "enum E1", TYPE_UENUM, 1, ' ' },
+{ "enum E2", TYPE_SENUM, 3, ' ' },
+{ "enum E3", TYPE_SENUM, 127, ' ' },
+{ "enum E4", TYPE_UENUM, 255, ' ' },
+{ "enum E5", TYPE_SENUM, 32767, ' ' },
+{ "enum E6", TYPE_UENUM, 65535, ' ' },
+{ "enum E7", TYPE_SENUM, 2147483647, ' ' },
+{ "enum E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "enum E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "TE0", TYPE_UENUM, 0, ' ' },
+{ "TE1", TYPE_UENUM, 1, ' ' },
+{ "TE2", TYPE_SENUM, 3, ' ' },
+{ "TE3", TYPE_SENUM, 127, ' ' },
+{ "TE4", TYPE_UENUM, 255, ' ' },
+{ "TE5", TYPE_SENUM, 32767, ' ' },
+{ "TE6", TYPE_UENUM, 65535, ' ' },
+{ "TE7", TYPE_SENUM, 2147483647, ' ' },
+{ "TE8", TYPE_UENUM, 4294967295U, ' ' },
+{ "TE9", TYPE_SENUM, 1099511627775LL, ' ' },
+/* vector-defs.h typedefs */
+{ "qi", TYPE_INT, 127, 0 },
+{ "hi", TYPE_INT, 32767, 0 },
+{ "si", TYPE_INT, 2147483647, 0 },
+{ "di", TYPE_INT, 9223372036854775807LL, 0 },
+{ "sf", TYPE_FLOAT, 0, 0 },
+{ "df", TYPE_FLOAT, 0, 0 }
+#define NTYPES2 (sizeof (base_types) / sizeof (base_types[0]))
+};
+struct types vector_types[] = {
+/* vector-defs.h typedefs */
+{ "v8qi", TYPE_OTHER, 0, 0 },
+{ "v16qi", TYPE_OTHER, 0, 0 },
+{ "v2hi", TYPE_OTHER, 0, 0 },
+{ "v4hi", TYPE_OTHER, 0, 0 },
+{ "v8hi", TYPE_OTHER, 0, 0 },
+{ "v2si", TYPE_OTHER, 0, 0 },
+{ "v4si", TYPE_OTHER, 0, 0 },
+{ "v1di", TYPE_OTHER, 0, 0 },
+{ "v2di", TYPE_OTHER, 0, 0 },
+{ "v2sf", TYPE_OTHER, 0, 0 },
+{ "v4sf", TYPE_OTHER, 0, 0 },
+{ "v16sf", TYPE_OTHER, 0, 0 },
+{ "v2df", TYPE_OTHER, 0, 0 },
+{ "u8qi", TYPE_OTHER, 0, 0 },
+{ "u16qi", TYPE_OTHER, 0, 0 },
+{ "u2hi", TYPE_OTHER, 0, 0 },
+{ "u4hi", TYPE_OTHER, 0, 0 },
+{ "u8hi", TYPE_OTHER, 0, 0 },
+{ "u2si", TYPE_OTHER, 0, 0 },
+{ "u4si", TYPE_OTHER, 0, 0 },
+{ "u1di", TYPE_OTHER, 0, 0 },
+{ "u2di", TYPE_OTHER, 0, 0 },
+{ "u2sf", TYPE_OTHER, 0, 0 },
+{ "u4sf", TYPE_OTHER, 0, 0 },
+{ "u16sf", TYPE_OTHER, 0, 0 },
+{ "u2df", TYPE_OTHER, 0, 0 },
+{ "__m64", TYPE_OTHER, 0, 0 },
+{ "__m128", TYPE_OTHER, 0, 0 }
+#define NVTYPES2 (sizeof (vector_types) / sizeof (vector_types[0]))
+};
+struct types attrib_types[] = {
+{ "Talchar", TYPE_UINT, 127, 'C' },
+{ "Talschar", TYPE_INT, 127, 'C' },
+{ "Taluchar", TYPE_UINT, 255, 'C' },
+{ "Talshort", TYPE_INT, 32767, 'S' },
+{ "Talushort", TYPE_UINT, 65535, 'S' },
+{ "Talint", TYPE_INT, 2147483647, 'I' },
+{ "Taluint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tallong", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Talulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Talllong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Talullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Talbool", TYPE_UINT, 1, 'B' },
+{ "Talptr", TYPE_PTR, 0, 0 },
+{ "Talcptr", TYPE_PTR, 0, 0 },
+{ "Taliptr", TYPE_PTR, 0, 0 },
+{ "Talfloat", TYPE_FLOAT, 0, 0 },
+{ "Taldouble", TYPE_FLOAT, 0, 0 },
+{ "Talldouble", TYPE_FLOAT, 0, 0 },
+{ "TalE0", TYPE_UENUM, 0, ' ' },
+{ "TalE1", TYPE_UENUM, 1, ' ' },
+{ "TalE2", TYPE_SENUM, 3, ' ' },
+{ "TalE3", TYPE_SENUM, 127, ' ' },
+{ "TalE4", TYPE_UENUM, 255, ' ' },
+{ "TalE5", TYPE_SENUM, 32767, ' ' },
+{ "TalE6", TYPE_UENUM, 65535, ' ' },
+{ "TalE7", TYPE_SENUM, 2147483647, ' ' },
+{ "TalE8", TYPE_UENUM, 4294967295U, ' ' },
+{ "TalE9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Tal1char", TYPE_UINT, 127, 'C' },
+{ "Tal1schar", TYPE_INT, 127, 'C' },
+{ "Tal1uchar", TYPE_UINT, 255, 'C' },
+{ "Tal1short", TYPE_INT, 32767, 'S' },
+{ "Tal1ushort", TYPE_UINT, 65535, 'S' },
+{ "Tal1int", TYPE_INT, 2147483647, 'I' },
+{ "Tal1uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tal1long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tal1ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tal1llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tal1ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tal1bool", TYPE_UINT, 1, 'B' },
+{ "Tal1ptr", TYPE_PTR, 0, 0 },
+{ "Tal1cptr", TYPE_PTR, 0, 0 },
+{ "Tal1iptr", TYPE_PTR, 0, 0 },
+{ "Tal1float", TYPE_FLOAT, 0, 0 },
+{ "Tal1double", TYPE_FLOAT, 0, 0 },
+{ "Tal1ldouble", TYPE_FLOAT, 0, 0 },
+{ "Tal1E0", TYPE_UENUM, 0, ' ' },
+{ "Tal1E1", TYPE_UENUM, 1, ' ' },
+{ "Tal1E2", TYPE_SENUM, 3, ' ' },
+{ "Tal1E3", TYPE_SENUM, 127, ' ' },
+{ "Tal1E4", TYPE_UENUM, 255, ' ' },
+{ "Tal1E5", TYPE_SENUM, 32767, ' ' },
+{ "Tal1E6", TYPE_UENUM, 65535, ' ' },
+{ "Tal1E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Tal1E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Tal1E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Tal2char", TYPE_UINT, 127, 'C' },
+{ "Tal2schar", TYPE_INT, 127, 'C' },
+{ "Tal2uchar", TYPE_UINT, 255, 'C' },
+{ "Tal2short", TYPE_INT, 32767, 'S' },
+{ "Tal2ushort", TYPE_UINT, 65535, 'S' },
+{ "Tal2int", TYPE_INT, 2147483647, 'I' },
+{ "Tal2uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tal2long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tal2ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tal2llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tal2ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tal2bool", TYPE_UINT, 1, 'B' },
+{ "Tal2ptr", TYPE_PTR, 0, 0 },
+{ "Tal2cptr", TYPE_PTR, 0, 0 },
+{ "Tal2iptr", TYPE_PTR, 0, 0 },
+{ "Tal2float", TYPE_FLOAT, 0, 0 },
+{ "Tal2double", TYPE_FLOAT, 0, 0 },
+{ "Tal2ldouble", TYPE_FLOAT, 0, 0 },
+{ "Tal2E0", TYPE_UENUM, 0, ' ' },
+{ "Tal2E1", TYPE_UENUM, 1, ' ' },
+{ "Tal2E2", TYPE_SENUM, 3, ' ' },
+{ "Tal2E3", TYPE_SENUM, 127, ' ' },
+{ "Tal2E4", TYPE_UENUM, 255, ' ' },
+{ "Tal2E5", TYPE_SENUM, 32767, ' ' },
+{ "Tal2E6", TYPE_UENUM, 65535, ' ' },
+{ "Tal2E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Tal2E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Tal2E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Tal4char", TYPE_UINT, 127, 'C' },
+{ "Tal4schar", TYPE_INT, 127, 'C' },
+{ "Tal4uchar", TYPE_UINT, 255, 'C' },
+{ "Tal4short", TYPE_INT, 32767, 'S' },
+{ "Tal4ushort", TYPE_UINT, 65535, 'S' },
+{ "Tal4int", TYPE_INT, 2147483647, 'I' },
+{ "Tal4uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tal4long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tal4ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tal4llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tal4ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tal4bool", TYPE_UINT, 1, 'B' },
+{ "Tal4ptr", TYPE_PTR, 0, 0 },
+{ "Tal4cptr", TYPE_PTR, 0, 0 },
+{ "Tal4iptr", TYPE_PTR, 0, 0 },
+{ "Tal4float", TYPE_FLOAT, 0, 0 },
+{ "Tal4double", TYPE_FLOAT, 0, 0 },
+{ "Tal4ldouble", TYPE_FLOAT, 0, 0 },
+{ "Tal4E0", TYPE_UENUM, 0, ' ' },
+{ "Tal4E1", TYPE_UENUM, 1, ' ' },
+{ "Tal4E2", TYPE_SENUM, 3, ' ' },
+{ "Tal4E3", TYPE_SENUM, 127, ' ' },
+{ "Tal4E4", TYPE_UENUM, 255, ' ' },
+{ "Tal4E5", TYPE_SENUM, 32767, ' ' },
+{ "Tal4E6", TYPE_UENUM, 65535, ' ' },
+{ "Tal4E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Tal4E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Tal4E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Tal8char", TYPE_UINT, 127, 'C' },
+{ "Tal8schar", TYPE_INT, 127, 'C' },
+{ "Tal8uchar", TYPE_UINT, 255, 'C' },
+{ "Tal8short", TYPE_INT, 32767, 'S' },
+{ "Tal8ushort", TYPE_UINT, 65535, 'S' },
+{ "Tal8int", TYPE_INT, 2147483647, 'I' },
+{ "Tal8uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tal8long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tal8ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tal8llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tal8ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tal8bool", TYPE_UINT, 1, 'B' },
+{ "Tal8ptr", TYPE_PTR, 0, 0 },
+{ "Tal8cptr", TYPE_PTR, 0, 0 },
+{ "Tal8iptr", TYPE_PTR, 0, 0 },
+{ "Tal8float", TYPE_FLOAT, 0, 0 },
+{ "Tal8double", TYPE_FLOAT, 0, 0 },
+{ "Tal8ldouble", TYPE_FLOAT, 0, 0 },
+{ "Tal8E0", TYPE_UENUM, 0, ' ' },
+{ "Tal8E1", TYPE_UENUM, 1, ' ' },
+{ "Tal8E2", TYPE_SENUM, 3, ' ' },
+{ "Tal8E3", TYPE_SENUM, 127, ' ' },
+{ "Tal8E4", TYPE_UENUM, 255, ' ' },
+{ "Tal8E5", TYPE_SENUM, 32767, ' ' },
+{ "Tal8E6", TYPE_UENUM, 65535, ' ' },
+{ "Tal8E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Tal8E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Tal8E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Tal16char", TYPE_UINT, 127, 'C' },
+{ "Tal16schar", TYPE_INT, 127, 'C' },
+{ "Tal16uchar", TYPE_UINT, 255, 'C' },
+{ "Tal16short", TYPE_INT, 32767, 'S' },
+{ "Tal16ushort", TYPE_UINT, 65535, 'S' },
+{ "Tal16int", TYPE_INT, 2147483647, 'I' },
+{ "Tal16uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Tal16long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Tal16ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Tal16llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Tal16ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Tal16bool", TYPE_UINT, 1, 'B' },
+{ "Tal16ptr", TYPE_PTR, 0, 0 },
+{ "Tal16cptr", TYPE_PTR, 0, 0 },
+{ "Tal16iptr", TYPE_PTR, 0, 0 },
+{ "Tal16float", TYPE_FLOAT, 0, 0 },
+{ "Tal16double", TYPE_FLOAT, 0, 0 },
+{ "Tal16ldouble", TYPE_FLOAT, 0, 0 },
+{ "Tal16E0", TYPE_UENUM, 0, ' ' },
+{ "Tal16E1", TYPE_UENUM, 1, ' ' },
+{ "Tal16E2", TYPE_SENUM, 3, ' ' },
+{ "Tal16E3", TYPE_SENUM, 127, ' ' },
+{ "Tal16E4", TYPE_UENUM, 255, ' ' },
+{ "Tal16E5", TYPE_SENUM, 32767, ' ' },
+{ "Tal16E6", TYPE_UENUM, 65535, ' ' },
+{ "Tal16E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Tal16E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Tal16E9", TYPE_SENUM, 1099511627775LL, ' ' }
+#define NATYPES2 (sizeof (attrib_types) / sizeof (attrib_types[0]))
+};
+
+struct types bitfld_types[NTYPES2];
+int n_bitfld_types;
+struct types aligned_bitfld_types[NATYPES2];
+int n_aligned_bitfld_types;
+
+const char *attributes[] = {
+"atal",
+"atpa",
+"atal1",
+"atal2",
+"atal4",
+"atal8",
+"atal16",
+#define NATTRIBS1 7
+"atalpa",
+"atpaal",
+"atal1pa",
+"atal2pa",
+"atal4pa",
+"atal8pa",
+"atal16pa",
+"atpaal1",
+"atpaal2",
+"atpaal4",
+"atpaal8",
+"atpaal16"
+#define NATTRIBS2 (sizeof (attributes) / sizeof (attributes[0]))
+};
+
+enum ETYPE
+{
+ ETYPE_TYPE,
+ ETYPE_ARRAY,
+ ETYPE_BITFLD,
+ ETYPE_STRUCT,
+ ETYPE_UNION,
+ ETYPE_STRUCT_ARRAY,
+ ETYPE_UNION_ARRAY
+};
+
+struct entry
+{
+#ifdef __GNUC__
+ enum ETYPE etype : 8;
+#else
+ unsigned char etype;
+#endif
+ unsigned short len;
+ unsigned char arr_len;
+ struct types *type;
+ const char *attrib;
+ /* Used to chain together entries in the hash table. */
+ struct entry *next;
+};
+struct types attrib_array_types[] = {
+{ "Talx1char", TYPE_UINT, 127, 'C' },
+{ "Talx1schar", TYPE_INT, 127, 'C' },
+{ "Talx1uchar", TYPE_UINT, 255, 'C' },
+{ "Talx1short", TYPE_INT, 32767, 'S' },
+{ "Talx1ushort", TYPE_UINT, 65535, 'S' },
+{ "Talx1int", TYPE_INT, 2147483647, 'I' },
+{ "Talx1uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Talx1long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Talx1ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Talx1llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Talx1ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Talx1bool", TYPE_UINT, 1, 'B' },
+{ "Talx1ptr", TYPE_PTR, 0, 0 },
+{ "Talx1cptr", TYPE_PTR, 0, 0 },
+{ "Talx1iptr", TYPE_PTR, 0, 0 },
+{ "Talx1float", TYPE_FLOAT, 0, 0 },
+{ "Talx1double", TYPE_FLOAT, 0, 0 },
+{ "Talx1ldouble", TYPE_FLOAT, 0, 0 },
+{ "Talx1E0", TYPE_UENUM, 0, ' ' },
+{ "Talx1E1", TYPE_UENUM, 1, ' ' },
+{ "Talx1E2", TYPE_SENUM, 3, ' ' },
+{ "Talx1E3", TYPE_SENUM, 127, ' ' },
+{ "Talx1E4", TYPE_UENUM, 255, ' ' },
+{ "Talx1E5", TYPE_SENUM, 32767, ' ' },
+{ "Talx1E6", TYPE_UENUM, 65535, ' ' },
+{ "Talx1E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Talx1E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Talx1E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Talx2short", TYPE_INT, 32767, 'S' },
+{ "Talx2ushort", TYPE_UINT, 65535, 'S' },
+{ "Talx2int", TYPE_INT, 2147483647, 'I' },
+{ "Talx2uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Talx2long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Talx2ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Talx2llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Talx2ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Talx2ptr", TYPE_PTR, 0, 0 },
+{ "Talx2cptr", TYPE_PTR, 0, 0 },
+{ "Talx2iptr", TYPE_PTR, 0, 0 },
+{ "Talx2float", TYPE_FLOAT, 0, 0 },
+{ "Talx2double", TYPE_FLOAT, 0, 0 },
+{ "Talx2ldouble", TYPE_FLOAT, 0, 0 },
+{ "Talx2E0", TYPE_UENUM, 0, ' ' },
+{ "Talx2E1", TYPE_UENUM, 1, ' ' },
+{ "Talx2E2", TYPE_SENUM, 3, ' ' },
+{ "Talx2E3", TYPE_SENUM, 127, ' ' },
+{ "Talx2E4", TYPE_UENUM, 255, ' ' },
+{ "Talx2E5", TYPE_SENUM, 32767, ' ' },
+{ "Talx2E6", TYPE_UENUM, 65535, ' ' },
+{ "Talx2E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Talx2E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Talx2E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Talx4int", TYPE_INT, 2147483647, 'I' },
+{ "Talx4uint", TYPE_UINT, 4294967295U, 'I' },
+{ "Talx4long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Talx4ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Talx4llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Talx4ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Talx4ptr", TYPE_PTR, 0, 0 },
+{ "Talx4cptr", TYPE_PTR, 0, 0 },
+{ "Talx4iptr", TYPE_PTR, 0, 0 },
+{ "Talx4float", TYPE_FLOAT, 0, 0 },
+{ "Talx4double", TYPE_FLOAT, 0, 0 },
+{ "Talx4ldouble", TYPE_FLOAT, 0, 0 },
+{ "Talx4E0", TYPE_UENUM, 0, ' ' },
+{ "Talx4E1", TYPE_UENUM, 1, ' ' },
+{ "Talx4E2", TYPE_SENUM, 3, ' ' },
+{ "Talx4E3", TYPE_SENUM, 127, ' ' },
+{ "Talx4E4", TYPE_UENUM, 255, ' ' },
+{ "Talx4E5", TYPE_SENUM, 32767, ' ' },
+{ "Talx4E6", TYPE_UENUM, 65535, ' ' },
+{ "Talx4E7", TYPE_SENUM, 2147483647, ' ' },
+{ "Talx4E8", TYPE_UENUM, 4294967295U, ' ' },
+{ "Talx4E9", TYPE_SENUM, 1099511627775LL, ' ' },
+{ "Taly8long", TYPE_INT, 9223372036854775807LL, 'L' },
+{ "Taly8ulong", TYPE_UINT, 18446744073709551615ULL, 'L' },
+{ "Talx8llong", TYPE_INT, 9223372036854775807LL, 'Q' },
+{ "Talx8ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' },
+{ "Taly8ptr", TYPE_PTR, 0, 0 },
+{ "Taly8cptr", TYPE_PTR, 0, 0 },
+{ "Taly8iptr", TYPE_PTR, 0, 0 },
+{ "Talx8double", TYPE_FLOAT, 0, 0 },
+{ "Talx8ldouble", TYPE_FLOAT, 0, 0 }
+#define NAATYPES2 (sizeof (attrib_array_types) / sizeof (attrib_array_types[0]))
+};
+
+/* A prime number giving the number of slots in the hash table. */
+#define HASH_SIZE 32749
+static struct entry *hash_table[HASH_SIZE];
+
+static int idx, limidx, output_one, short_enums;
+static const char *destdir;
+static const char *srcdir;
+static const char *srcdir_safe;
+FILE *outfile;
+
+void
+switchfiles (int fields)
+{
+ static int filecnt;
+ static char *destbuf, *destptr;
+ int i;
+
+ ++filecnt;
+ if (outfile)
+ fclose (outfile);
+ if (output_one)
+ {
+ outfile = stdout;
+ return;
+ }
+ if (destbuf == NULL)
+ {
+ size_t len = strlen (destdir);
+ destbuf = malloc (len + 20);
+ if (!destbuf)
+ abort ();
+ memcpy (destbuf, destdir, len);
+ if (!len || destbuf[len - 1] != '/')
+ destbuf[len++] = '/';
+ destptr = destbuf + len;
+ }
+ sprintf (destptr, "t%03d_main.C", filecnt);
+ outfile = fopen (destbuf, "w");
+ if (outfile == NULL)
+ {
+ fail:
+ fputs ("failed to create test files\n", stderr);
+ exit (1);
+ }
+ for (i = 0; i < NDG_OPTIONS; i++)
+ fprintf (outfile, dg_options[i], "", srcdir_safe);
+ fprintf (outfile, "\n\
+#include \"struct-layout-1.h\"\n\
+\n\
+#define TX(n, type, attrs, fields, ops) extern void test##n (void);\n\
+#include \"t%03d_test.h\"\n\
+#undef TX\n\
+\n\
+int main (void)\n\
+{\n\
+#define TX(n, type, attrs, fields, ops) test##n ();\n\
+#include \"t%03d_test.h\"\n\
+#undef TX\n\
+ if (fails)\n\
+ {\n\
+ fflush (stdout);\n\
+ abort ();\n\
+ }\n\
+ exit (0);\n\
+}\n", filecnt, filecnt);
+ fclose (outfile);
+ sprintf (destptr, "t%03d_x.C", filecnt);
+ outfile = fopen (destbuf, "w");
+ if (outfile == NULL)
+ goto fail;
+ for (i = 0; i < NDG_OPTIONS; i++)
+ fprintf (outfile, dg_options[i], "-w ", srcdir_safe);
+ fprintf (outfile, "\n\
+#include \"struct-layout-1_x1.h\"\n\
+#include \"t%03d_test.h\"\n\
+#include \"struct-layout-1_x2.h\"\n\
+#include \"t%03d_test.h\"\n", filecnt, filecnt);
+ fclose (outfile);
+ sprintf (destptr, "t%03d_y.C", filecnt);
+ outfile = fopen (destbuf, "w");
+ if (outfile == NULL)
+ goto fail;
+ for (i = 0; i < NDG_OPTIONS; i++)
+ fprintf (outfile, dg_options[i], "-w ", srcdir_safe);
+ fprintf (outfile, "\n\
+#include \"struct-layout-1_y1.h\"\n\
+#include \"t%03d_test.h\"\n\
+#include \"struct-layout-1_y2.h\"\n\
+#include \"t%03d_test.h\"\n", filecnt, filecnt);
+ fclose (outfile);
+ sprintf (destptr, "t%03d_test.h", filecnt);
+ outfile = fopen (destbuf, "w");
+ if (outfile == NULL)
+ goto fail;
+ if (fields <= 2)
+ limidx = idx + 300;
+ else if (fields <= 4)
+ limidx = idx + 200;
+ else if (fields <= 6)
+ limidx = idx + 100;
+ else
+ limidx = idx + 50;
+}
+
+unsigned long long int
+getrandll (void)
+{
+ unsigned long long int ret;
+ ret = generate_random () & 0xffffff;
+ ret |= (generate_random () & 0xffffffLL) << 24;
+ ret |= ((unsigned long long int) generate_random ()) << 48;
+ return ret;
+}
+
+int
+subfield (struct entry *e, char *letter)
+{
+ int i, type;
+ char buf[20];
+ const char *p;
+ switch (e[0].etype)
+ {
+ case ETYPE_STRUCT:
+ case ETYPE_UNION:
+ case ETYPE_STRUCT_ARRAY:
+ case ETYPE_UNION_ARRAY:
+ type = e[0].attrib ? 1 + (generate_random () & 3) : 0;
+ if (e[0].etype == ETYPE_STRUCT || e[0].etype == ETYPE_STRUCT_ARRAY)
+ p = "struct";
+ else
+ p = "union";
+ if (e[0].etype == ETYPE_STRUCT_ARRAY || e[0].etype == ETYPE_UNION_ARRAY)
+ {
+ if (e[0].arr_len == 255)
+ snprintf (buf, 20, "%c[]", *letter);
+ else
+ snprintf (buf, 20, "%c[%d]", *letter, e[0].arr_len);
+ /* If this is an array type, do not put aligned attributes on
+ elements. Aligning elements to a value greater than their
+ size will result in a compiler error. */
+ if (type == 1
+ && ((strncmp (e[0].attrib, "atal", 4) == 0)
+ || strncmp (e[0].attrib, "atpaal", 6) == 0))
+ type = 2;
+ }
+ else
+ {
+ buf[0] = *letter;
+ buf[1] = '\0';
+ }
+ ++*letter;
+ switch (type)
+ {
+ case 0:
+ case 3:
+ case 4:
+ fprintf (outfile, "%s{", p);
+ break;
+ case 1:
+ fprintf (outfile, "%s %s{", e[0].attrib, p);
+ break;
+ case 2:
+ fprintf (outfile, "%s %s{", p, e[0].attrib);
+ break;
+ }
+
+ for (i = 1; i <= e[0].len; )
+ i += subfield (e + i, letter);
+
+ switch (type)
+ {
+ case 0:
+ case 1:
+ case 2:
+ fprintf (outfile, "}%s;", buf);
+ break;
+ case 3:
+ fprintf (outfile, "}%s %s;", e[0].attrib, buf);
+ break;
+ case 4:
+ fprintf (outfile, "}%s %s;", buf, e[0].attrib);
+ break;
+ }
+ return 1 + e[0].len;
+ case ETYPE_TYPE:
+ case ETYPE_ARRAY:
+ if (e[0].etype == ETYPE_ARRAY)
+ {
+ if (e[0].arr_len == 255)
+ snprintf (buf, 20, "%c[]", *letter);
+ else
+ snprintf (buf, 20, "%c[%d]", *letter, e[0].arr_len);
+ }
+ else
+ {
+ buf[0] = *letter;
+ buf[1] = '\0';
+ }
+ ++*letter;
+ if (e[0].attrib)
+ {
+ /* If this is an array type, do not put aligned attributes on
+ elements. Aligning elements to a value greater than their
+ size will result in a compiler error. */
+ if (e[0].etype == ETYPE_ARRAY
+ && ((strncmp (e[0].attrib, "atal", 4) == 0)
+ || strncmp (e[0].attrib, "atpaal", 6) == 0))
+ type = 2;
+ else
+ type = generate_random () % 3;
+ switch (type)
+ {
+ case 0:
+ fprintf (outfile, "%s %s %s;", e[0].attrib, e[0].type->name,
+ buf);
+ break;
+ case 1:
+ fprintf (outfile, "%s %s %s;", e[0].type->name, e[0].attrib,
+ buf);
+ break;
+ case 2:
+ fprintf (outfile, "%s %s %s;", e[0].type->name, buf,
+ e[0].attrib);
+ break;
+ }
+ }
+ else
+ fprintf (outfile, "%s %s;", e[0].type->name, buf);
+ return 1;
+ case ETYPE_BITFLD:
+ if (e[0].len == 0)
+ {
+ if (e[0].attrib)
+ switch (generate_random () % 3)
+ {
+ case 0:
+ fprintf (outfile, "%s %s:0;", e[0].attrib, e[0].type->name);
+ break;
+ case 1:
+ fprintf (outfile, "%s %s:0;", e[0].type->name, e[0].attrib);
+ break;
+ case 2:
+ fprintf (outfile, "%s:0 %s;", e[0].type->name, e[0].attrib);
+ break;
+ }
+ else
+ fprintf (outfile, "%s:0;", e[0].type->name);
+ ++*letter;
+ return 1;
+ }
+ snprintf (buf, 20, "%d", e[0].len);
+ if (e[0].attrib)
+ switch (generate_random () % 3)
+ {
+ case 0:
+ fprintf (outfile, "%s %s %c:%s;", e[0].attrib, e[0].type->name,
+ *letter, buf);
+ break;
+ case 1:
+ fprintf (outfile, "%s %s %c:%s;", e[0].type->name, e[0].attrib,
+ *letter, buf);
+ break;
+ case 2:
+ fprintf (outfile, "%s %c:%s %s;", e[0].type->name, *letter,
+ buf, e[0].attrib);
+ break;
+ }
+ else
+ fprintf (outfile, "%s %c:%s;", e[0].type->name, *letter, buf);
+ ++*letter;
+ return 1;
+ default:
+ abort ();
+ }
+}
+
+char namebuf[1024];
+
+void
+output_FNB (char mode, struct entry *e)
+{
+ unsigned long long int l1, l2, m;
+ int signs = 0;
+ const char *p, *q;
+
+ if (e->type->type == TYPE_OTHER)
+ {
+ if (mode == 'B')
+ abort ();
+ fprintf (outfile, "N(%d,%s)", idx, namebuf);
+ return;
+ }
+ fprintf (outfile, "%c(%d,%s,", mode, idx, namebuf);
+ l1 = getrandll ();
+ l2 = getrandll ();
+ switch (e->type->type)
+ {
+ case TYPE_INT:
+ signs = generate_random () & 3;
+ m = e->type->maxval;
+ if (mode == 'B')
+ m &= e->len > 1 ? (1ULL << (e->len - 1)) - 1 : 1;
+ l1 &= m;
+ l2 &= m;
+ fprintf (outfile, "%s%" COMPAT_PRLL "u%s,%s%" COMPAT_PRLL "u%s",
+ (signs & 1) ? "-" : "", l1, l1 > 2147483647 ? "LL" : "",
+ (signs & 2) ? "-" : "", l2, l2 > 2147483647 ? "LL" : "");
+ break;
+ case TYPE_UINT:
+ m = e->type->maxval;
+ if (mode == 'B')
+ m &= (1ULL << e->len) - 1;
+ l1 &= m;
+ l2 &= m;
+ fprintf (outfile,"%" COMPAT_PRLL "uU%s,%" COMPAT_PRLL "uU%s",
+ l1, l1 > 4294967295U ? "LL" : "",
+ l2, l2 > 4294967295U ? "LL" : "");
+ break;
+ case TYPE_FLOAT:
+ l1 &= 0xffffff;
+ l2 &= 0xffffff;
+ signs = generate_random () & 3;
+ fprintf (outfile, "%s%f,%s%f", (signs & 1) ? "-" : "",
+ ((double) l1) / 64, (signs & 2) ? "-" : "", ((double) l2) / 64);
+ break;
+ case TYPE_UENUM:
+ if (e->type->maxval == 0)
+ fputs ("e0_0,e0_0", outfile);
+ else if (e->type->maxval == 1)
+ fprintf (outfile, "e1_%" COMPAT_PRLL "d,e1_%" COMPAT_PRLL "d",
+ l1 & 1, l2 & 1);
+ else
+ {
+ p = strchr (e->type->name, '\0');
+ while (--p >= e->type->name && *p >= '0' && *p <= '9');
+ p++;
+ l1 %= 7;
+ l2 %= 7;
+ if (l1 > 3)
+ l1 += e->type->maxval - 6;
+ if (l2 > 3)
+ l2 += e->type->maxval - 6;
+ fprintf (outfile, "e%s_%" COMPAT_PRLL "d,e%s_%" COMPAT_PRLL "d",
+ p, l1, p, l2);
+ }
+ break;
+ case TYPE_SENUM:
+ p = strchr (e->type->name, '\0');
+ while (--p >= e->type->name && *p >= '0' && *p <= '9');
+ p++;
+ l1 %= 7;
+ l2 %= 7;
+ fprintf (outfile, "e%s_%s%" COMPAT_PRLL "d,e%s_%s%" COMPAT_PRLL "d",
+ p, l1 < 3 ? "m" : "",
+ l1 == 3 ? 0LL : e->type->maxval - (l1 & 3),
+ p, l2 < 3 ? "m" : "",
+ l2 == 3 ? 0LL : e->type->maxval - (l2 & 3));
+ break;
+ case TYPE_PTR:
+ l1 %= 256;
+ l2 %= 256;
+ fprintf (outfile,
+ "(%s)&intarray[%" COMPAT_PRLL "d], (%s)&intarray[%" COMPAT_PRLL "d]",
+ e->type->name, l1, e->type->name, l2);
+ break;
+ case TYPE_FNPTR:
+ l1 %= 10;
+ l2 %= 10;
+ fprintf (outfile,
+ "fn%" COMPAT_PRLL "d,fn%" COMPAT_PRLL "d", l1, l2);
+ break;
+ default:
+ abort ();
+ }
+ fputs (")", outfile);
+}
+
+int
+subvalues (struct entry *e, char *p, char *letter)
+{
+ int i, j;
+ char *q;
+ if (p >= namebuf + sizeof (namebuf) - 32)
+ abort ();
+ p[0] = *letter;
+ p[1] = '\0';
+ q = p + 1;
+ switch (e[0].etype)
+ {
+ case ETYPE_STRUCT_ARRAY:
+ case ETYPE_UNION_ARRAY:
+ if (e[0].arr_len == 0 || e[0].arr_len == 255)
+ {
+ *letter += 1 + e[0].len;
+ return 1 + e[0].len;
+ }
+ i = generate_random () % e[0].arr_len;
+ snprintf (p, sizeof (namebuf) - (p - namebuf) - 1,
+ "%c[%d]", *letter, i);
+ q = strchr (p, '\0');
+ /* FALLTHROUGH */
+ case ETYPE_STRUCT:
+ case ETYPE_UNION:
+ *q++ = '.';
+ ++*letter;
+ for (i = 1; i <= e[0].len; )
+ {
+ i += subvalues (e + i, q, letter);
+ if (e[0].etype == ETYPE_UNION || e[0].etype == ETYPE_UNION_ARRAY)
+ {
+ *letter += e[0].len - i + 1;
+ break;
+ }
+ }
+ return 1 + e[0].len;
+ case ETYPE_TYPE:
+ ++*letter;
+ output_FNB ('F', e);
+ return 1;
+ case ETYPE_ARRAY:
+ if (e[0].arr_len == 0 || e[0].arr_len == 255)
+ {
+ ++*letter;
+ return 1;
+ }
+ i = generate_random () % e[0].arr_len;
+ snprintf (p, sizeof (namebuf) - (p - namebuf),
+ "%c[%d]", *letter, i);
+ output_FNB ('F', e);
+ if ((generate_random () & 7) == 0)
+ {
+ j = generate_random () % e[0].arr_len;
+ if (i != j)
+ {
+ snprintf (p, sizeof (namebuf) - (p - namebuf),
+ "%c[%d]", *letter, j);
+ output_FNB ('F', e);
+ }
+ }
+ ++*letter;
+ return 1;
+ case ETYPE_BITFLD:
+ ++*letter;
+ if (e[0].len != 0)
+ output_FNB ('B', e);
+ return 1;
+ }
+}
+
+/* DERIVED FROM:
+--------------------------------------------------------------------
+lookup2.c, by Bob Jenkins, December 1996, Public Domain.
+hash(), hash2(), hash3, and mix() are externally useful functions.
+Routines to test the hash are included if SELF_TEST is defined.
+You can use this free for any purpose. It has no warranty.
+--------------------------------------------------------------------
+*/
+
+/*
+--------------------------------------------------------------------
+mix -- mix 3 32-bit values reversibly.
+For every delta with one or two bit set, and the deltas of all three
+ high bits or all three low bits, whether the original value of a,b,c
+ is almost all zero or is uniformly distributed,
+* If mix() is run forward or backward, at least 32 bits in a,b,c
+ have at least 1/4 probability of changing.
+* If mix() is run forward, every bit of c will change between 1/3 and
+ 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
+mix() was built out of 36 single-cycle latency instructions in a
+ structure that could supported 2x parallelism, like so:
+ a -= b;
+ a -= c; x = (c>>13);
+ b -= c; a ^= x;
+ b -= a; x = (a<<8);
+ c -= a; b ^= x;
+ c -= b; x = (b>>13);
+ ...
+ Unfortunately, superscalar Pentiums and Sparcs can't take advantage
+ of that parallelism. They've also turned some of those single-cycle
+ latency instructions into multi-cycle latency instructions. Still,
+ this is the fastest good hash I could find. There were about 2^^68
+ to choose from. I only looked at a billion or so.
+--------------------------------------------------------------------
+*/
+/* same, but slower, works on systems that might have 8 byte hashval_t's */
+#define mix(a,b,c) \
+{ \
+ a -= b; a -= c; a ^= (c>>13); \
+ b -= c; b -= a; b ^= (a<< 8); \
+ c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
+ a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
+ b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
+ c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
+ a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
+ b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
+ c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
+}
+
+/*
+--------------------------------------------------------------------
+hash() -- hash a variable-length key into a 32-bit value
+ k : the key (the unaligned variable-length array of bytes)
+ len : the length of the key, counting by bytes
+ level : can be any 4-byte value
+Returns a 32-bit value. Every bit of the key affects every bit of
+the return value. Every 1-bit and 2-bit delta achieves avalanche.
+About 36+6len instructions.
+
+The best hash table sizes are powers of 2. There is no need to do
+mod a prime (mod is sooo slow!). If you need less than 32 bits,
+use a bitmask. For example, if you need only 10 bits, do
+ h = (h & hashmask(10));
+In which case, the hash table should have hashsize(10) elements.
+
+If you are hashing n strings (ub1 **)k, do it like this:
+ for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
+
+By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
+code any way you wish, private, educational, or commercial. It's free.
+
+See http://burtleburtle.net/bob/hash/evahash.html
+Use for hash table lookup, or anything where one collision in 2^32 is
+acceptable. Do NOT use for cryptographic purposes.
+--------------------------------------------------------------------
+*/
+
+static hashval_t
+iterative_hash (const void *k_in /* the key */,
+ register size_t length /* the length of the key */,
+ register hashval_t initval /* the previous hash, or
+ an arbitrary value */)
+{
+ register const unsigned char *k = (const unsigned char *)k_in;
+ register hashval_t a,b,c,len;
+
+ /* Set up the internal state */
+ len = length;
+ a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
+ c = initval; /* the previous hash value */
+
+ /*---------------------------------------- handle most of the key */
+ while (len >= 12)
+ {
+ a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24));
+ b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24));
+ c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24));
+ mix(a,b,c);
+ k += 12; len -= 12;
+ }
+
+ /*------------------------------------- handle the last 11 bytes */
+ c += length;
+ switch(len) /* all the case statements fall through */
+ {
+ case 11: c+=((hashval_t)k[10]<<24);
+ case 10: c+=((hashval_t)k[9]<<16);
+ case 9 : c+=((hashval_t)k[8]<<8);
+ /* the first byte of c is reserved for the length */
+ case 8 : b+=((hashval_t)k[7]<<24);
+ case 7 : b+=((hashval_t)k[6]<<16);
+ case 6 : b+=((hashval_t)k[5]<<8);
+ case 5 : b+=k[4];
+ case 4 : a+=((hashval_t)k[3]<<24);
+ case 3 : a+=((hashval_t)k[2]<<16);
+ case 2 : a+=((hashval_t)k[1]<<8);
+ case 1 : a+=k[0];
+ /* case 0: nothing left to add */
+ }
+ mix(a,b,c);
+ /*-------------------------------------------- report the result */
+ return c;
+}
+
+hashval_t
+e_hash (const void *a)
+{
+ const struct entry *e = a;
+ hashval_t ret = 0;
+ int i;
+
+ if (e[0].etype != ETYPE_STRUCT && e[0].etype != ETYPE_UNION)
+ abort ();
+ for (i = 0; i <= e[0].len; ++i)
+ {
+ int attriblen;
+ ret = iterative_hash (&e[i], offsetof (struct entry, attrib), ret);
+ attriblen = e[i].attrib ? strlen (e[i].attrib) : -1;
+ ret = iterative_hash (&attriblen, sizeof (int), ret);
+ if (e[i].attrib)
+ ret = iterative_hash (e[i].attrib, attriblen, ret);
+ }
+ return ret;
+}
+
+int
+e_eq (const void *a, const void *b)
+{
+ const struct entry *ea = a, *eb = b;
+ int i;
+ if (ea[0].etype != ETYPE_STRUCT && ea[0].etype != ETYPE_UNION)
+ abort ();
+ if (ea[0].len != eb[0].len)
+ return 0;
+ for (i = 0; i <= ea[0].len; ++i)
+ {
+ if (ea[i].etype != eb[i].etype
+ || ea[i].len != eb[i].len
+ || ea[i].arr_len != eb[i].arr_len
+ || ea[i].type != eb[i].type)
+ return 0;
+ if ((ea[i].attrib == NULL) ^ (eb[i].attrib == NULL))
+ return 0;
+ if (ea[i].attrib && strcmp (ea[i].attrib, eb[i].attrib) != 0)
+ return 0;
+ }
+ return 1;
+}
+
+static int
+e_exists (const struct entry *e)
+{
+ struct entry *h;
+ hashval_t hval;
+
+ hval = e_hash (e);
+ for (h = hash_table[hval % HASH_SIZE]; h; h = h->next)
+ if (e_eq (e, h))
+ return 1;
+ return 0;
+}
+
+static void
+e_insert (struct entry *e)
+{
+ hashval_t hval;
+
+ hval = e_hash (e);
+ e->next = hash_table[hval % HASH_SIZE];
+ hash_table[hval % HASH_SIZE] = e;
+}
+
+void
+output (struct entry *e)
+{
+ int i;
+ char c;
+ struct entry *n;
+
+ if (e[0].etype != ETYPE_STRUCT && e[0].etype != ETYPE_UNION)
+ abort ();
+
+ if (e_exists (e))
+ return;
+
+ n = (struct entry *) malloc ((e[0].len + 1) * sizeof (struct entry));
+ memcpy (n, e, (e[0].len + 1) * sizeof (struct entry));
+ e_insert (n);
+
+ if (idx == limidx)
+ switchfiles (e[0].len);
+
+ if (e[0].etype == ETYPE_STRUCT)
+ fprintf (outfile, "T(%d,", idx);
+ else
+ fprintf (outfile, "U(%d,", idx);
+ c = 'a';
+ for (i = 1; i <= e[0].len; )
+ i += subfield (e + i, &c);
+ fputs (",", outfile);
+ c = 'a';
+ for (i = 1; i <= e[0].len; )
+ {
+ i += subvalues (e + i, namebuf, &c);
+ if (e[0].etype == ETYPE_UNION)
+ break;
+ }
+ fputs (")\n", outfile);
+ if (output_one && idx == limidx)
+ exit (0);
+ ++idx;
+}
+
+enum FEATURE
+{
+ FEATURE_VECTOR = 1,
+ FEATURE_ALIGNEDPACKED = 2,
+ FEATURE_ZEROARRAY = 4,
+ FEATURE_ZEROBITFLD = 8,
+ ALL_FEATURES = FEATURE_VECTOR | FEATURE_ZEROARRAY
+ | FEATURE_ALIGNEDPACKED | FEATURE_ZEROBITFLD
+};
+
+void
+singles (enum FEATURE features)
+{
+ struct entry e[2];
+ int i;
+ memset (e, 0, sizeof (e));
+ e[0].etype = ETYPE_STRUCT;
+ output (e);
+ e[0].etype = ETYPE_UNION;
+ output (e);
+ e[0].len = 1;
+ for (i = 0; i < NTYPES2; ++i)
+ {
+ e[0].etype = ETYPE_STRUCT;
+ e[1].etype = ETYPE_TYPE;
+ e[1].type = &base_types[i];
+ output (e);
+ e[0].etype = ETYPE_UNION;
+ output (e);
+ }
+ if (features & FEATURE_VECTOR)
+ for (i = 0; i < NVTYPES2; ++i)
+ {
+ e[0].etype = ETYPE_STRUCT;
+ e[1].etype = ETYPE_TYPE;
+ e[1].type = &vector_types[i];
+ output (e);
+ e[0].etype = ETYPE_UNION;
+ output (e);
+ }
+}
+
+void
+choose_type (enum FEATURE features, struct entry *e, int r, int in_array)
+{
+ int i;
+
+ i = NTYPES2 - NTYPES1;
+ if (features & FEATURE_VECTOR)
+ i += NVTYPES2;
+ if ((r & 3) == 0)
+ {
+ if (in_array)
+ i += NAATYPES2;
+ else
+ i += NATYPES2;
+ }
+ r >>= 2;
+ r %= i;
+ if (r < NTYPES2 - NTYPES1)
+ e->type = &base_types[r + NTYPES1];
+ r -= NTYPES2 - NTYPES1;
+ if (e->type == NULL && (features & FEATURE_VECTOR))
+ {
+ if (r < NVTYPES2)
+ e->type = &vector_types[r];
+ r -= NVTYPES2;
+ }
+ if (e->type == NULL && !in_array)
+ {
+ if (r < NATYPES2)
+ e->type = &attrib_types[r];
+ r -= NATYPES2;
+ }
+ if (e->type == NULL && in_array)
+ {
+ if (r < NAATYPES2)
+ e->type = &attrib_array_types[r];
+ r -= NAATYPES2;
+ }
+ if (e->type == NULL)
+ abort ();
+}
+
+/* This is from gcc.c-torture/execute/builtin-bitops-1.c. */
+static int
+my_ffsll (unsigned long long x)
+{
+ int i;
+ if (x == 0)
+ return 0;
+ /* We've tested LLONG_MAX for 64 bits so this should be safe. */
+ for (i = 0; i < 64; i++)
+ if (x & (1ULL << i))
+ break;
+ return i + 1;
+}
+
+void
+generate_fields (enum FEATURE features, struct entry *e, struct entry *parent,
+ int len)
+{
+ int r, i, j, ret = 1, n, incr, sametype;
+
+ for (n = 0; n < len; n += incr)
+ {
+ r = generate_random ();
+ /* 50% ETYPE_TYPE base_types NTYPES1
+ 12.5% ETYPE_TYPE other
+ 12.5% ETYPE_ARRAY
+ 12.5% ETYPE_BITFLD
+ 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */
+ i = (r & 7);
+ r >>= 3;
+ incr = 1;
+ switch (i)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ e[n].etype = ETYPE_TYPE;
+ e[n].type = &base_types[r % NTYPES1];
+ break;
+ case 4:
+ e[n].etype = ETYPE_TYPE;
+ choose_type (features, &e[n], r, 0);
+ break;
+ case 5:
+ e[n].etype = ETYPE_ARRAY;
+ i = r & 1;
+ r >>= 1;
+ if (i)
+ e[n].type = &base_types[r % NTYPES1];
+ else
+ choose_type (features, &e[n], r, 1);
+ r = generate_random ();
+ if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0)
+ {
+ e[n].arr_len = 0;
+ if (n == len - 1 && (r & 4)
+ && (parent->etype == ETYPE_STRUCT
+ || parent->etype == ETYPE_STRUCT_ARRAY))
+ {
+ int k;
+ for (k = 0; k < n; ++k)
+ if (e[k].etype != ETYPE_BITFLD || e[k].len)
+ {
+ e[n].arr_len = 255;
+ break;
+ }
+ }
+ }
+ else if ((r & 3) != 3)
+ e[n].arr_len = (r >> 2) & 7;
+ else
+ e[n].arr_len = (r >> 2) & 31;
+ break;
+ case 6:
+ sametype = 1;
+ switch (r & 7)
+ {
+ case 0:
+ case 1:
+ case 2:
+ break;
+ case 3:
+ case 4:
+ case 5:
+ incr = 1 + (r >> 3) % (len - n);
+ break;
+ case 6:
+ case 7:
+ sametype = 0;
+ incr = 1 + (r >> 3) % (len - n);
+ break;
+ }
+ for (j = n; j < n + incr; ++j)
+ {
+ int mi, ma;
+
+ e[j].etype = ETYPE_BITFLD;
+ if (j == n || !sametype)
+ {
+ int k;
+ r = generate_random ();
+ k = r & 3;
+ r >>= 2;
+ if (!k)
+ e[j].type
+ = &aligned_bitfld_types[r % n_aligned_bitfld_types];
+ else
+ e[j].type
+ = &bitfld_types[r % n_bitfld_types];
+ }
+ else
+ e[j].type = e[n].type;
+ r = generate_random ();
+ mi = 0;
+ ma = 0;
+ switch (e[j].type->bitfld)
+ {
+ case 'C': ma = 8; break;
+ case 'S': ma = 16; break;
+ case 'I': ma = 32; break;
+ case 'L':
+ case 'Q': ma = 64; break;
+ case 'B': ma = 1; break;
+ case ' ':
+ if (e[j].type->type == TYPE_UENUM)
+ mi = my_ffsll (e[j].type->maxval + 1) - 1;
+ else if (e[j].type->type == TYPE_SENUM)
+ mi = my_ffsll (e[j].type->maxval + 1);
+ else
+ abort ();
+ if (!mi)
+ mi = 1;
+ if (mi > 32)
+ ma = 64;
+ else if (mi > 16 || !short_enums)
+ ma = 32;
+ else if (mi > 8)
+ ma = 16;
+ else
+ ma = 8;
+ break;
+ default:
+ abort ();
+ }
+ e[j].len = ma + 1;
+ if (sametype && (r & 3) == 0 && ma > 1)
+ {
+ int sum = 0, k;
+ for (k = n; k < j; ++k)
+ sum += e[k].len;
+ sum %= ma;
+ e[j].len = sum ? ma - sum : ma;
+ }
+ r >>= 2;
+ if (!sametype && (r & 7) == 0)
+ ma *= 8;
+ r >>= 3;
+ if (! (features & FEATURE_ZEROBITFLD) && mi == 0)
+ mi = 1;
+ if (e[j].len < mi || e[j].len > ma)
+ e[j].len = mi + (r % (ma + 1 - mi));
+ r >>= 6;
+ if ((features & FEATURE_ZEROBITFLD) && (r & 3) == 0
+ && mi == 0)
+ e[j].len = 0;
+ }
+ break;
+ case 7:
+ switch (r & 7)
+ {
+ case 0:
+ case 1:
+ case 2:
+ e[n].etype = ETYPE_STRUCT;
+ break;
+ case 3:
+ case 4:
+ e[n].etype = ETYPE_UNION;
+ break;
+ case 5:
+ case 6:
+ e[n].etype = ETYPE_STRUCT_ARRAY;
+ break;
+ case 7:
+ e[n].etype = ETYPE_UNION_ARRAY;
+ break;
+ }
+ r >>= 3;
+ e[n].len = r % (len - n);
+ incr = 1 + e[n].len;
+ generate_fields (features, &e[n + 1], &e[n], e[n].len);
+ if (e[n].etype == ETYPE_STRUCT_ARRAY
+ || e[n].etype == ETYPE_UNION_ARRAY)
+ {
+ r = generate_random ();
+ if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0)
+ {
+ e[n].arr_len = 0;
+ if (n + incr == len && (r & 4)
+ && (parent->etype == ETYPE_STRUCT
+ || parent->etype == ETYPE_STRUCT_ARRAY))
+ {
+ int k;
+ for (k = 0; k < n; ++k)
+ if (e[k].etype != ETYPE_BITFLD || e[k].len)
+ {
+ e[n].arr_len = 255;
+ break;
+ }
+ }
+ }
+ else if ((r & 3) != 3)
+ e[n].arr_len = (r >> 2) & 7;
+ else
+ e[n].arr_len = (r >> 2) & 31;
+ }
+ break;
+ }
+ r = generate_random ();
+ if ((r & 7) == 0)
+ {
+ r >>= 3;
+ i = (features & FEATURE_ALIGNEDPACKED) ? NATTRIBS2 : NATTRIBS1;
+ e[n].attrib = attributes[r % i];
+ if (! (features & FEATURE_ALIGNEDPACKED)
+ && strcmp (e[n].attrib, "atpa") == 0
+ && ((e[n].type >= &attrib_types[0]
+ && e[n].type < &attrib_types[NATYPES2])
+ || (e[n].type >= &attrib_array_types[0]
+ && e[n].type < &attrib_array_types[NAATYPES2])
+ || (e[n].type >= &aligned_bitfld_types[0]
+ && e[n].type < &aligned_bitfld_types[n_aligned_bitfld_types])))
+ e[n].attrib = NULL;
+ }
+ }
+}
+
+void
+generate_random_tests (enum FEATURE features, int len)
+{
+ struct entry e[len + 1];
+ int i, r;
+ if (len > 'z' - 'a' + 1)
+ abort ();
+ memset (e, 0, sizeof (e));
+ r = generate_random ();
+ if ((r & 7) == 0)
+ e[0].etype = ETYPE_UNION;
+ else
+ e[0].etype = ETYPE_STRUCT;
+ r >>= 3;
+ e[0].len = len;
+ generate_fields (features, &e[1], &e[0], len);
+ output (e);
+}
+
+struct { const char *name; enum FEATURE f; }
+features[] = {
+{ "normal", 0 },
+{ "vector", FEATURE_VECTOR },
+{ "[0] :0", FEATURE_ZEROARRAY | FEATURE_ZEROBITFLD },
+{ "vector [0]",
+ FEATURE_VECTOR | FEATURE_ZEROARRAY },
+{ "aligned packed vector [0] :0",
+ FEATURE_VECTOR | FEATURE_ZEROARRAY
+ | FEATURE_ALIGNEDPACKED | FEATURE_ZEROBITFLD },
+};
+
+int
+main (int argc, char **argv)
+{
+ int i, j, count, c, n = 3000;
+ char *optarg;
+
+ if (sizeof (int) != 4 || sizeof (long long) != 8)
+ return 1;
+
+ i = 1;
+ while (i < argc)
+ {
+ c = '\0';
+ if (argv[i][0] == '-' && argv[i][2] == '\0')
+ c = argv[i][1];
+ optarg = argv[i + 1];
+ if (!optarg)
+ goto usage;
+ switch (c)
+ {
+ case 'n':
+ n = atoi (optarg);
+ break;
+ case 'd':
+ destdir = optarg;
+ break;
+ case 's':
+ srcdir = optarg;
+ break;
+ case 'i':
+ output_one = 1;
+ limidx = atoi (optarg);
+ break;
+ case 'e':
+ short_enums = 1;
+ i--;
+ break;
+ default:
+ fprintf (stderr, "unrecognized option %s\n", argv[i]);
+ goto usage;
+ }
+ i += 2;
+ }
+
+ if (output_one)
+ {
+ outfile = fopen ("/dev/null", "w");
+ if (outfile == NULL)
+ {
+ fputs ("could not open /dev/null", stderr);
+ return 1;
+ }
+ n = limidx + 1;
+ }
+
+ if (destdir == NULL && !output_one)
+ {
+ usage:
+ fprintf (stderr, "Usage:\n\
+%s [-e] [-s srcdir -d destdir] [-n count] [-i idx]\n\
+Either -s srcdir -d destdir or -i idx must be used\n", argv[0]);
+ return 1;
+ }
+
+ if (srcdir == NULL && !output_one)
+ goto usage;
+
+ if (srcdir != NULL)
+ {
+ const char *s = srcdir;
+ char *ss, *t;
+ t = ss = malloc (strlen (srcdir) + 1);
+ if (!ss)
+ abort ();
+ do {
+ if (*s == '\\')
+ *t++ = '/';
+ else
+ *t++ = *s;
+ } while (*s++);
+ srcdir_safe = ss;
+ }
+
+ for (i = 0; i < NTYPES2; ++i)
+ if (base_types[i].bitfld)
+ bitfld_types[n_bitfld_types++] = base_types[i];
+ for (i = 0; i < NATYPES2; ++i)
+ if (attrib_types[i].bitfld)
+ aligned_bitfld_types[n_aligned_bitfld_types++] = attrib_types[i];
+ for (i = 0; i < sizeof (features) / sizeof (features[0]); ++i)
+ {
+ int startidx = idx;
+ if (! output_one)
+ limidx = idx;
+ if (!i)
+ count = 200;
+ else
+ count = 20;
+ for (j = 1; j <= 9; ++j)
+ while (idx < startidx + j * count)
+ generate_random_tests (features[i].f, j);
+ while (idx < startidx + count * 10)
+ generate_random_tests (features[i].f, 10 + (generate_random () % 16));
+ }
+ for (i = 0; n > 3000 && i < sizeof (features) / sizeof (features[0]); ++i)
+ {
+ int startidx;
+ startidx = idx;
+ if (! output_one)
+ limidx = idx;
+ singles (features[i].f);
+ if (!i)
+ {
+ count = 1000;
+ while (idx < startidx + 1000)
+ generate_random_tests (features[i].f, 1);
+ }
+ else
+ {
+ startidx = idx;
+ count = 100;
+ while (idx < startidx + 100)
+ generate_random_tests (features[i].f, 1);
+ }
+ startidx = idx;
+ for (j = 2; j <= 9; ++j)
+ while (idx < startidx + (j - 1) * count)
+ generate_random_tests (features[i].f, j);
+ while (idx < startidx + count * 9)
+ generate_random_tests (features[i].f, 10 + (generate_random () % 16));
+ }
+ if (! output_one)
+ limidx = idx;
+ while (idx < n)
+ generate_random_tests (ALL_FEATURES, 1 + (generate_random () % 25));
+ fclose (outfile);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h
new file mode 100644
index 000000000..e14433e03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h
@@ -0,0 +1,68 @@
+#include "struct-layout-1.h"
+
+struct Info info;
+int fails;
+int intarray[256];
+int fn0 (void) { return 0; }
+int fn1 (void) { return 1; }
+int fn2 (void) { return 2; }
+int fn3 (void) { return 3; }
+int fn4 (void) { return 4; }
+int fn5 (void) { return 5; }
+int fn6 (void) { return 6; }
+int fn7 (void) { return 7; }
+int fn8 (void) { return 8; }
+int fn9 (void) { return 9; }
+
+/* This macro is intended for fields where their
+ addresses/sizes/alignments and value passing should be checked. */
+#define F(n, x, v, w) \
+ info.flds[i] = &s##n.x; \
+ info.sizes[i] = sizeof (s##n.x); \
+ info.aligns[i] = __alignof__ (s##n.x); \
+ s##n.x = v; \
+ a##n[2].x = w; \
+ ++i;
+/* This macro is for fields where just their addresses/sizes/alignments
+ should be checked. */
+#define N(n, x) \
+ info.flds[i] = &s##n.x; \
+ info.sizes[i] = sizeof (s##n.x); \
+ info.aligns[i] = __alignof__ (s##n.x); \
+ ++i;
+/* This macro is for fields where just value passing should be checked. */
+#define B(n, x, v, w) \
+ s##n.x = v; \
+ a##n[2].x = w; \
+ ++j;
+#define TX(n, type, attrs, fields, ops) \
+type S##n { fields } attrs; \
+type S##n s##n; \
+extern type S##n a##n[5]; \
+extern type S##n check##n (type S##n, type S##n *, \
+ type S##n); \
+extern void check##n##va (int i, ...); \
+extern void checkx##n (type S##n); \
+void test##n (void) \
+{ \
+ int i, j; \
+ memset (&s##n, '\0', sizeof (s##n)); \
+ memset (a##n, '\0', sizeof (a##n)); \
+ memset (&info, '\0', sizeof (info)); \
+ info.sp = &s##n; \
+ info.a0p = &a##n[0]; \
+ info.a3p = &a##n[3]; \
+ info.sz = sizeof (s##n); \
+ info.als = __alignof__ (s##n); \
+ info.ala0 = __alignof__ (a##n[0]); \
+ info.ala3 = __alignof__ (a##n[3]); \
+ if (((long) (__SIZE_TYPE__) &a##n[3]) & (info.als - 1)) \
+ FAIL (n, 1); \
+ i = 0; j = 0; \
+ ops \
+ info.nfields = i; \
+ info.nbitfields = j; \
+ checkx##n (check##n (s##n, &a##n[1], a##n[2])); \
+ check##n##va (1, 1.0, s##n, 2LL, a##n[2], a##n[2]); \
+ check##n##va (2, s##n, s##n, 2.0L, a##n[2], s##n); \
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h
new file mode 100644
index 000000000..907a2c959
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h
@@ -0,0 +1,14 @@
+#undef F
+#undef N
+#undef B
+#undef TX
+#define F(n, x, v, w) \
+ if (arg.x != s##n.x) FAIL (n, 30);
+#define N(n, x)
+#define B(n, x, v, w) \
+ if (arg.x != s##n.x) FAIL (n, 30);
+#define TX(n, type, attrs, fields, ops) \
+void checkx##n (type S##n arg) \
+{ \
+ ops \
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h
new file mode 100644
index 000000000..9a5d2468a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h
@@ -0,0 +1,76 @@
+#include "struct-layout-1.h"
+
+#define F(n, x, v, w) \
+ if (info.flds[i] != &s##n.x) \
+ FAIL (n, 50); \
+ if (info.sizes[i] != sizeof (s##n.x)) \
+ FAIL (n, 51); \
+ if (info.aligns[i] != __alignof__ (s##n.x)) \
+ FAIL (n, 52); \
+ if (s##n.x != (__typeof__ (s##n.x)) v) \
+ FAIL (n, 53); \
+ if (a##n[2].x != (__typeof__ (s##n.x)) w) \
+ FAIL (n, 54); \
+ if (arg0.x != s##n.x) \
+ FAIL (n, 55); \
+ if (arg2.x != a##n[2].x) \
+ FAIL (n, 56); \
+ ret.x = s##n.x; \
+ ++i;
+#define N(n, x) \
+ if (info.flds[i] != &s##n.x) \
+ FAIL (n, 50); \
+ if (info.sizes[i] != sizeof (s##n.x)) \
+ FAIL (n, 51); \
+ if (info.aligns[i] != __alignof__ (s##n.x)) \
+ FAIL (n, 52); \
+ ++i;
+#define B(n, x, v, w) \
+ b1.x = v; b2.x = w; \
+ if (s##n.x != b1.x) \
+ FAIL (n, 53); \
+ if (a##n[2].x != b2.x) \
+ FAIL (n, 54); \
+ if (arg0.x != s##n.x) \
+ FAIL (n, 55); \
+ if (arg2.x != a##n[2].x) \
+ FAIL (n, 56); \
+ ret.x = s##n.x; \
+ ++j;
+#define TX(n, type, attrs, fields, ops) \
+type S##n { fields } attrs; \
+extern type S##n s##n; \
+type S##n a##n[5]; \
+type S##n \
+check##n (type S##n arg0, type S##n *arg1, type S##n arg2) \
+{ \
+ type S##n ret; \
+ type S##n b1, b2; \
+ int i, j; \
+ \
+ memset (&ret, 0, sizeof (ret)); \
+ memset (&b1, 0, sizeof (b1)); \
+ memset (&b2, 0, sizeof (b2)); \
+ if (info.sp != &s##n) \
+ FAIL (n, 10); \
+ if (info.a0p != &a##n[0]) \
+ FAIL (n, 11); \
+ if (info.a3p != &a##n[3]) \
+ FAIL (n, 12); \
+ if (info.sz != sizeof (s##n)) \
+ FAIL (n, 13); \
+ if (info.als != __alignof__ (s##n)) \
+ FAIL (n, 14); \
+ if (info.ala0 != __alignof__ (a##n[0])) \
+ FAIL (n, 15); \
+ if (info.ala3 != __alignof__ (a##n[3])) \
+ FAIL (n, 16); \
+ if (arg1 != &a##n[1]) \
+ FAIL (n, 17); \
+ i = 0; j = 0; \
+ ops \
+ if (i != info.nfields || j != info.nbitfields) \
+ FAIL (n, 18); \
+ \
+ return ret; \
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h
new file mode 100644
index 000000000..02a341e1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h
@@ -0,0 +1,69 @@
+#undef F
+#undef N
+#undef B
+#undef TX
+
+#ifdef SKIP_VA
+const int test_va = 0;
+#else
+const int test_va = 1;
+#endif
+
+#define F(n, x, v, w) \
+ if (p->x != arg.x) FAIL (n, 74);
+#define N(n, x)
+#define B(n, x, v, w) \
+ if (p->x != arg.x) FAIL (n, 74);
+#define TX(n, type, attrs, fields, ops) \
+void \
+check##n##va (int z, ...) \
+{ \
+ type S##n arg, *p; \
+ va_list ap; \
+ int i; \
+ \
+ if (test_va) \
+ { \
+ va_start (ap, z); \
+ for (i = 0; i < 5; ++i) \
+ { \
+ p = NULL; \
+ switch ((z << 4) | i) \
+ { \
+ case 0x10: \
+ if (va_arg (ap, double) != 1.0) \
+ FAIL (n, 70); \
+ break; \
+ case 0x12: \
+ if (va_arg (ap, long long) != 2LL) \
+ FAIL (n, 71); \
+ break; \
+ case 0x22: \
+ if (va_arg (ap, long double) != 2.0L) \
+ FAIL (n, 72); \
+ break; \
+ case 0x11: \
+ case 0x20: \
+ case 0x21: \
+ case 0x24: \
+ p = &s##n; \
+ arg = va_arg (ap, type S##n); \
+ break; \
+ case 0x13: \
+ case 0x14: \
+ case 0x23: \
+ p = &a##n[2]; \
+ arg = va_arg (ap, type S##n); \
+ break; \
+ default: \
+ FAIL (n, 73); \
+ break; \
+ } \
+ if (p) \
+ { \
+ ops \
+ } \
+ } \
+ va_end (ap); \
+ } \
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/constexpr-null1.C b/gcc-4.9/gcc/testsuite/g++.dg/constexpr-null1.C
new file mode 100644
index 000000000..b9ec7b5f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/constexpr-null1.C
@@ -0,0 +1,11 @@
+// PR c++/46670
+// { dg-do compile { target c++11 } }
+
+extern unsigned char __TBB_ReverseByte(unsigned char src);
+extern unsigned char *reversed;
+template<typename T> T __TBB_ReverseBits(T src)
+{
+ unsigned char *original = (unsigned char *) &src;
+ for( int i = sizeof(T)-1; i--; )
+ reversed[i] = __TBB_ReverseByte( original[sizeof(T)-i-1] );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C
new file mode 100644
index 000000000..f187e63a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C
@@ -0,0 +1,25 @@
+// PR c++/38579
+
+struct P
+{
+protected:
+ P() {}
+ P(const P&) {}
+};
+
+struct B : protected P
+{
+ B() {}
+};
+
+struct C : public P
+{
+ // C can access P's copy ctor, but can't convert b to const P&.
+ C(const B& b) : P(b) {} // { dg-error "inaccessible base" }
+};
+
+void foo()
+{
+ B b;
+ C c(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C
new file mode 100644
index 000000000..85ea1d25f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C
@@ -0,0 +1,9 @@
+// PR c++/19787
+
+struct H {
+ operator char(); // { dg-message "note" }
+ operator short(); // { dg-message "note" }
+};
+
+int const& ref = H(); // { dg-error "ambiguous" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 8 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C
new file mode 100644
index 000000000..a9d9d699c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C
@@ -0,0 +1,18 @@
+// PR c++/57948
+
+struct Base { };
+struct Derived : Base
+{
+ struct Derived2 : Base
+ {
+ struct ConvertibleToBothDerivedRef
+ {
+ operator Derived&();
+ operator Derived2&();
+ void bind_lvalue_to_conv_lvalue_ambig(ConvertibleToBothDerivedRef both)
+ {
+ Base &br1 = both; // { dg-error "ambiguous" }
+ }
+ };
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C
new file mode 100644
index 000000000..e236504ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C
@@ -0,0 +1,20 @@
+// PR c++/48749
+
+struct Tuple3
+{
+ float x;
+};
+
+struct Pos: virtual Tuple3 { };
+
+struct TexCoords
+{
+ Pos pos;
+};
+
+template <class T>
+void eval (const TexCoords &coords)
+{
+ const Pos &pos = coords.pos;
+ pos.x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C
new file mode 100644
index 000000000..a660e7950
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+// { dg-options "-w" }
+
+enum E { a, b = 1LL << 48 };
+
+struct S {
+ E e : 3;
+};
+
+S s;
+
+int main () {
+ if (sizeof (E) != sizeof (long long))
+ return 1;
+ if (sizeof (s.e + 3) != sizeof (long long))
+ return 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C
new file mode 100644
index 000000000..f75504e0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C
@@ -0,0 +1,24 @@
+// PR c++/38007
+// We need to use the conversion function to the declared type of a bitfield,
+// not the lowered bitfield type.
+// { dg-do link }
+
+struct A
+{
+ operator unsigned int() { return 42; }
+ operator unsigned char();
+};
+
+struct B
+{
+ unsigned int b : 8;
+};
+
+int
+main ()
+{
+ A u;
+ unsigned int v = u;
+ B w;
+ w.b = u;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C
new file mode 100644
index 000000000..e36539c64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C
@@ -0,0 +1,8 @@
+// Make sure that digest_init converts to the declared type of the
+// bitfield, not just the lowered type.
+
+enum E { EA, EB };
+
+struct A { E e: 8; };
+
+A a = { 0 }; // { dg-error "invalid conversion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C
new file mode 100644
index 000000000..aa60d3505
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C
@@ -0,0 +1,11 @@
+// PR c++/27292
+
+struct A
+{
+ int i : 8;
+};
+
+bool foo(A a)
+{
+ return int(a.i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C
new file mode 100644
index 000000000..a897bf59e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C
@@ -0,0 +1,14 @@
+// PR c++/16376
+// { dg-do run }
+
+int main(void){
+ struct bits {
+ unsigned int ui3 : 3;
+ } bits;
+ int i = -1; /* is a very large positive number as unsigned */
+
+ bits.ui3 = 1u;
+ if( bits.ui3 < i )
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C
new file mode 100644
index 000000000..75fe3016e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C
@@ -0,0 +1,20 @@
+// PR c++/27292
+
+enum ColorRole
+{
+ WindowText, Button
+};
+
+struct QPalette {
+
+ColorRole bg_role:8;
+
+ bool hasBackground();
+};
+
+
+bool
+QPalette::hasBackground ()
+{
+ return (ColorRole (bg_role) != WindowText);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C
new file mode 100644
index 000000000..b931ec97c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C
@@ -0,0 +1,14 @@
+// PR c++/27506
+
+enum EBorderStyle
+ {
+ BNATIVE, BHIDDEN
+ };
+struct BorderValue
+{
+ enum EBorderStyle style:8;
+};
+enum EBorderStyle f(const struct BorderValue *border)
+{
+ return border ? border->style : BNATIVE;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C
new file mode 100644
index 000000000..79664ab7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C
@@ -0,0 +1,10 @@
+// PR c++/27471
+
+struct A { unsigned a:8; };
+
+extern void b(unsigned char);
+
+void breakme (A f)
+{
+ b((unsigned char) f.a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C
new file mode 100644
index 000000000..1080168dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C
@@ -0,0 +1,16 @@
+// PR c++/33984
+// { dg-do compile }
+
+struct S
+{
+ unsigned int bar : 3;
+} s;
+
+int foo (unsigned int &);
+int foo (double);
+
+int
+main ()
+{
+ return foo (s.bar); // { dg-error "cannot bind bitfield" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C
new file mode 100644
index 000000000..dbc62fade
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C
@@ -0,0 +1,16 @@
+// PR c++/35056
+// { dg-do compile }
+// { dg-options "-O2" }
+
+enum EBorderStyle { bla = 1 };
+inline bool compare_ref(const unsigned int &t, const EBorderStyle &u)
+{ return t == u; }
+inline bool compare_val(const unsigned int t, const EBorderStyle u)
+{ return t == u; }
+struct S {
+ unsigned m_style : 4;
+};
+void call_ref (S *s, EBorderStyle v)
+{ if (!compare_ref(s->m_style, v)) s->m_style = v; }
+void call_val (S *s, EBorderStyle v)
+{ if (!compare_val(s->m_style, v)) s->m_style = v; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C
new file mode 100644
index 000000000..998dd4873
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C
@@ -0,0 +1,17 @@
+// PR c++/35909
+// { dg-do compile }
+
+struct MidiCommand
+{
+ unsigned data1 : 8;
+};
+
+void g(const unsigned char &);
+void h(const unsigned int &);
+
+void f(MidiCommand mc)
+{
+ g(mc.data1);
+ h(mc.data1);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C
new file mode 100644
index 000000000..f90b42165
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C
@@ -0,0 +1,22 @@
+// PR c++/10841
+
+int main() {
+ class Base {
+ public:
+ int i, j, k;
+ void f(); };
+
+ class Derived : private Base {
+ public:
+ int m, n, p;
+ void g();
+ };
+
+ Derived derived;
+ Base &base = (Base &)derived;
+ (int Base::*)&Derived::n;
+ (int Derived::*)&Base::j;
+ (void (Base::*)(void))&Derived::g;
+ (void (Derived::*)(void))&Base::f;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C
new file mode 100644
index 000000000..ac8329730
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C
@@ -0,0 +1,9 @@
+// Origin: PR c++/42260
+// { dg-do compile }
+
+struct A
+{
+ template<typename T> operator T*();
+};
+
+int i = *A();// { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C
new file mode 100644
index 000000000..43287a1eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C
@@ -0,0 +1,14 @@
+// Origin: PR c++/46824
+
+class Incomplete;
+struct Ptr
+{
+ operator Incomplete*();
+};
+
+int
+main()
+{
+ Ptr p;
+ *p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C
new file mode 100644
index 000000000..16184ccb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C
@@ -0,0 +1,12 @@
+// PR c++/9440
+ struct A {
+ explicit A(int = 0);
+ A(const A&);
+ operator int() const;
+ };
+
+ A
+ bar(bool b, const A& a)
+ {
+ return (b ? A() : a);
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C
new file mode 100644
index 000000000..d31de33e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C
@@ -0,0 +1,15 @@
+// PR c++/10245
+
+struct X {};
+
+struct Y {
+ Y ();
+ operator X () const;
+private:
+ Y (const Y &);
+};
+
+Y y;
+void foo() {
+ X x = (1 ? Y() : Y());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C
new file mode 100644
index 000000000..da052d453
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C
@@ -0,0 +1,20 @@
+// PR c++/9537
+
+class String
+{
+public:
+ String();
+ String( char *str );
+ operator char *();
+};
+
+const String operator+( String s1, String )
+{
+ return s1;
+}
+
+String valGlue(const String before)
+{
+ String ret;
+ return false ? ret : before + before;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C
new file mode 100644
index 000000000..3bd64763a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C
@@ -0,0 +1,31 @@
+// Origin: PR c++/45383
+// { dg-do run }
+
+struct null {
+ null() {}
+ template<class T>
+ operator T*() const {
+ return 0;
+ }
+
+ template<class C, class T>
+ operator T C::*() const {
+ return 0;
+ }
+private:
+ null(const null&);
+ null& operator=(const null&);
+ void operator&() const;
+};
+
+static struct null null;
+
+int
+main()
+{
+ int* ptr = null;
+ if (ptr == null)
+ return 0;
+ if (ptr != null)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C
new file mode 100644
index 000000000..8c05e1b14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C
@@ -0,0 +1,18 @@
+// PR c++/11283
+// Converting "a" to the type of "i" produces "int" rather than "const
+// int", which was causing build_conditional_expr to abort. But we don't
+// care about cv-quals on non-class rvalues.
+
+struct A
+{
+ operator int ();
+};
+
+extern A a;
+extern const int i;
+extern bool b;
+
+int f ()
+{
+ return b ? a : i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C
new file mode 100644
index 000000000..5e43bc063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C
@@ -0,0 +1,5 @@
+// PR c++/14211
+
+void f(char *str) {
+ char *& m = const_cast<char *>(str); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C
new file mode 100644
index 000000000..fd2be1f44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C
@@ -0,0 +1,11 @@
+struct B {};
+struct D : public B {};
+
+typedef int B::*bm;
+typedef int D::*dm;
+
+bm bp;
+
+void f() {
+ const_cast<dm>(bp); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C
new file mode 100644
index 000000000..faa9f810c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C
@@ -0,0 +1,7 @@
+// PR c++/18177
+
+void foo()
+{
+ X; // { dg-error "" }
+ const_cast<int&>(X);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C
new file mode 100644
index 000000000..ca38580e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C
@@ -0,0 +1,34 @@
+// { dg-options "" }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// DR 195 will allow conversions between function and object pointers
+// under some circumstances. It is in drafting, so we don't implement
+// it (yet).
+
+// this checks we are silent when not being pedantic.
+
+typedef void (*PF)(void);
+typedef void *PV;
+typedef int *PO;
+
+
+void foo ()
+{
+ PF pf;
+ PV pv;
+ PO po;
+
+ /* the following two will almost definitly be ok with 195. */
+ pf = reinterpret_cast <PF>(pv);
+ pv = reinterpret_cast <PV>(pf);
+
+ /* the following two might or might not be ok with 195. */
+ pf = reinterpret_cast <PF>(po);
+ po = reinterpret_cast <PO>(pf);
+
+ /* These will never be ok, as they are implicit. */
+ pv = pf; // { dg-error "invalid conversion" "" }
+ pf = pv; // { dg-error "invalid conversion" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C
new file mode 100644
index 000000000..cb26623e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C
@@ -0,0 +1,32 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// DR 195 was about allowing conversions between function and object
+// pointers under some circumstances. The issue got resolved for C++11,
+// which, in 5.2.10 p8 says that: "Converting a function pointer to an
+// object pointer type or vice versa is conditionally-supported."
+
+// This checks we don't warn anymore with -pedantic.
+
+typedef void (*PF)(void);
+typedef void *PV;
+typedef int *PO;
+
+void foo ()
+{
+ PF pf;
+ PV pv;
+ PO po;
+
+ /* the following two will almost definitly be ok with 195. */
+ pf = reinterpret_cast <PF>(pv);
+ pv = reinterpret_cast <PV>(pf);
+
+ /* the following two might or might not be ok with 195. */
+ pf = reinterpret_cast <PF>(po);
+ po = reinterpret_cast <PO>(pf);
+
+ /* These will never be ok, as they are implicit. */
+ pv = pf; // { dg-error "invalid conversion" "" }
+ pf = pv; // { dg-error "invalid conversion" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C
new file mode 100644
index 000000000..a781cbaa3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C
@@ -0,0 +1,15 @@
+// PR c++/10385
+// Origin: <douglas@coc.ufrj.br>
+// { dg-do compile }
+
+struct A
+{
+ void foo();
+};
+
+A& bar();
+
+void baz()
+{
+ dynamic_cast<A&>( bar().foo ); // { dg-error "cannot dynamic_cast" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C
new file mode 100644
index 000000000..6ea8cadb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C
@@ -0,0 +1,10 @@
+// { dg-do run }
+// { dg-options "-O2 -finline-functions" }
+
+enum E { V = 1 };
+static const E E_MIN = V;
+static const E E_MAX = V;
+
+bool valid(E v) { return v >= E_MIN && v <= E_MAX; }
+
+int main() { return valid(E(2)); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C
new file mode 100644
index 000000000..97237893d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C
@@ -0,0 +1,8 @@
+// PR c++/42219
+
+void foo(const void); // { dg-error "incomplete|const" }
+
+void bar()
+{
+ void (*pf)() = foo; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C
new file mode 100644
index 000000000..da2fb0fad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C
@@ -0,0 +1,26 @@
+// PR c++/36334
+
+struct X
+{
+ typedef int* foobar();
+ static void foo(foobar&);
+};
+
+void X::foo(foobar&)
+{
+}
+
+struct Y : public X
+{
+ static foobar bar;
+ static void foo();
+};
+
+void Y::foo()
+{
+ X::foo(bar);
+}
+int* Y::bar()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C
new file mode 100644
index 000000000..c3d76133d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C
@@ -0,0 +1,11 @@
+// PR c++/37646
+
+struct A
+{
+ void foo();
+
+ void bar(int i)
+ {
+ void (*p)() = i ? foo : foo; // { dg-error "invalid use of member" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C
new file mode 100644
index 000000000..5e9767a00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C
@@ -0,0 +1,10 @@
+/* Test for overflow in NULL pointer constant. */
+/* { dg-do compile } */
+
+#include <limits.h>
+
+void *p = 0;
+
+void *q = 0 * (INT_MAX + 1); // { dg-error "invalid conversion" }
+// { dg-warning "integer overflow in expression" "" { target *-*-* } 8 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C
new file mode 100644
index 000000000..74ceff49d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C
@@ -0,0 +1,10 @@
+/* Test for enumeration as NULL pointer constant. */
+/* PR c++/14644 */
+/* { dg-do compile } */
+
+enum { NULL = 0 };
+
+void *p = 0;
+
+void *q = NULL; // { dg-error "cannot convert" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C
new file mode 100644
index 000000000..e0a3e5f46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C
@@ -0,0 +1,11 @@
+class C
+{
+ template<typename U>
+ operator U(); // { dg-message "note" }
+};
+
+int fn (C c)
+{
+ return C::operator float(c); // { dg-error "operator float.C" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 9 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C
new file mode 100644
index 000000000..b40098810
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C
@@ -0,0 +1,16 @@
+// PR c++/13907
+
+struct A {
+ operator int & ();
+ operator const int & () const;
+};
+
+
+void f(int &);
+void f(const int &);
+
+
+int main() {
+ const A x = A();
+ f(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C
new file mode 100644
index 000000000..a01cdcf76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C
@@ -0,0 +1,3 @@
+// PR c++/22256
+
+struct node { int* operator int*(); }; // { dg-error "return type specified" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C
new file mode 100644
index 000000000..7ef4b6a0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C
@@ -0,0 +1,19 @@
+/* PR c++/26698 */
+/* { dg-do compile } */
+
+struct X {
+ int x;
+ X (int i = 0) : x (i) {}
+ operator X& (void) const {
+ return *(new X);
+ }
+};
+
+void add_one (X & ref) { /* { dg-message "in passing argument" } */
+ ++ ref.x;
+}
+
+void foo() {
+ X const a (2);
+ add_one(a); /* { dg-error "invalid initialization of reference of type" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C
new file mode 100644
index 000000000..69ef996d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dseketel@redhat.com>
+// Origin: PR c++/36407
+// { dg-do compile }
+
+struct A
+{
+ A (const A&);
+};
+
+struct B
+{
+ operator A&();
+};
+
+void
+foo (const B& b)
+{
+ const A a = b; // { dg-error "conversion from 'const B' to non-scalar type 'const A' requested" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C
new file mode 100644
index 000000000..9aec9f0a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C
@@ -0,0 +1,18 @@
+// Origin: PR c++/42766
+// { dg-do compile }
+
+template<class T> class smart_pointer {
+public:
+ operator T* () const { }
+ operator bool () const { }
+ operator bool () { }
+};
+class Context { };
+typedef smart_pointer<Context> ContextP;
+class SvnClient {
+ ~SvnClient();
+ ContextP svnContext;
+};
+SvnClient::~SvnClient() {
+ delete svnContext;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C
new file mode 100644
index 000000000..ed00ea3f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C
@@ -0,0 +1,13 @@
+struct S {};
+
+void f (int S::*const*);
+
+typedef int I;
+
+void f (I S::*const*);
+
+void g() {
+ int S::*const* p;
+
+ f(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C
new file mode 100644
index 000000000..d46113db6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C
@@ -0,0 +1,39 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to data member static cast tests.
+
+struct A { int x; };
+struct B : A { int x; };
+struct P : A { int x; };
+struct V { int x; };
+struct D : B, virtual V, private P { int x; };
+
+// Valid static casts.
+int B::*p1 = static_cast<int B::*>(&D::x);
+int D::*p2 = static_cast<int D::*>(&B::x);
+
+// Virtual base class.
+int V::*p3 = static_cast<int V::*>(&D::x); // { dg-error "" }
+int D::*p4 = static_cast<int D::*>(&V::x); // { dg-error "" }
+
+// Inaccessible base class.
+int P::*p5 = static_cast<int P::*>(&D::x); // { dg-error "" }
+int D::*p6 = static_cast<int D::*>(&P::x); // { dg-error "" }
+
+// Ambiguous base class.
+int A::*p7 = static_cast<int A::*>(&D::x); // { dg-error "" }
+int D::*p8 = static_cast<int D::*>(&A::x); // { dg-error "" }
+
+// Valid conversions which increase cv-qualification.
+const int B::*p9 = static_cast<const int B::*>(&D::x);
+const int D::*p10 = static_cast<const int D::*>(&B::x);
+
+// Invalid conversions which decrease cv-qualification.
+int B::*p11 = static_cast<int B::*>(p10); // { dg-error "casts away qualifiers" }
+int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away qualifiers" }
+
+// Attempts to change member type.
+float B::*p13 = static_cast<float B::*>(&D::x); // { dg-error "" }
+float D::*p14 = static_cast<float D::*>(&B::x); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C
new file mode 100644
index 000000000..13005e429
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C
@@ -0,0 +1,31 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to member function static cast tests.
+
+struct A { int f (); };
+struct B : A { int f (); };
+struct P : A { int f (); };
+struct V { int f (); };
+struct D : B, virtual V, private P { int f (); };
+
+// Valid static casts.
+int (B::*p1)() = static_cast<int (B::*)()>(&D::f);
+int (D::*p2)() = static_cast<int (D::*)()>(&B::f);
+
+// Virtual base class.
+int (V::*p3)() = static_cast<int (V::*)()>(&D::f); // { dg-error "" }
+int (D::*p4)() = static_cast<int (D::*)()>(&V::f); // { dg-error "" }
+
+// Inaccessible base class.
+int (P::*p5)() = static_cast<int (P::*)()>(&D::f); // { dg-error "" }
+int (D::*p6)() = static_cast<int (D::*)()>(&P::f); // { dg-error "" }
+
+// Ambiguous base class.
+int (A::*p7)() = static_cast<int (A::*)()>(&D::f); // { dg-error "" }
+int (D::*p8)() = static_cast<int (D::*)()>(&A::f); // { dg-error "" }
+
+// Attempts to change member type.
+float (B::*p13)() = static_cast<float (B::*)()>(&D::f); // { dg-error "" }
+float (D::*p14)() = static_cast<float (D::*)()>(&B::f); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C
new file mode 100644
index 000000000..fd260df64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C
@@ -0,0 +1,43 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to data member c-style cast tests.
+
+struct X {};
+struct A { int x; };
+struct B : A { int x; };
+struct P : A { int x; };
+struct V { int x; };
+struct D : B, virtual V, private P { int x; };
+
+// Accessible, non-virtual, non-ambiguous base clas.
+int B::*p1 = (int B::*)&D::x;
+int D::*p2 = (int D::*)&B::x;
+
+// Virtual base class.
+int V::*p3 = (int V::*)&D::x; // { dg-error "" }
+int D::*p4 = (int D::*)&V::x; // { dg-error "" }
+
+// Inaccessible base class.
+int P::*p5 = (int P::*)&D::x;
+int D::*p6 = (int D::*)&P::x;
+
+// Ambiguous base class.
+int A::*p7 = (int A::*)&D::x; // { dg-error "" }
+int D::*p8 = (int D::*)&A::x; // { dg-error "" }
+
+// Valid conversions which increase cv-qualification.
+const int B::*p9 = (const int B::*)&D::x;
+const int D::*p10 = (const int D::*)&B::x;
+
+// Valid conversions which decrease cv-qualification.
+int B::*p11 = (int B::*)p10;
+int D::*p12 = (int D::*)p9;
+
+// Attempts to change member type allowed via reinterpret_cast.
+float B::*p13 = (float B::*)&D::x;
+float D::*p14 = (float D::*)&B::x;
+
+// Conversion via unrelated classes allwed via reinterpret_cast.
+int X::*p15 = (int X::*)&D::x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C
new file mode 100644
index 000000000..6f06badd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C
@@ -0,0 +1,35 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to member function c-style cast tests.
+
+struct X {};
+struct A { int f (); };
+struct B : A { int f (); };
+struct P : A { int f (); };
+struct V { int f (); };
+struct D : B, virtual V, private P { int f (); };
+
+// Accessible, non-virtual, non-ambiguous base clas.
+int (B::*p1)() = (int (B::*)())&D::f;
+int (D::*p2)() = (int (D::*)())&B::f;
+
+// Virtual base class.
+int (V::*p3)() = (int (V::*)())&D::f; // { dg-error "" }
+int (D::*p4)() = (int (D::*)())&V::f; // { dg-error "" }
+
+// Inaccessible base class.
+int (P::*p5)() = (int (P::*)())&D::f;
+int (D::*p6)() = (int (D::*)())&P::f;
+
+// Ambiguous base class.
+int (A::*p7)() = (int (A::*)())&D::f; // { dg-error "" }
+int (D::*p8)() = (int (D::*)())&A::f; // { dg-error "" }
+
+// Attempts to change member type allowed via reinterpret_cast.
+float (B::*p13)() = (float (B::*)())&D::f;
+float (D::*p14)() = (float (D::*)())&B::f;
+
+// Conversion via unrelated classes allwed via reinterpret_cast.
+int (X::*p15)() = (int (X::*)())&D::f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C
new file mode 100644
index 000000000..a3c0c966c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C
@@ -0,0 +1,35 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to data member implicit cast tests.
+
+struct A { int x; };
+struct B : A { int x; };
+struct P : A { int x; };
+struct V { int x; };
+struct D : B, virtual V, private P { int x; };
+
+// Valid.
+int D::*p1 = &B::x;
+
+// Derived class.
+int B::*p2 = &D::x; // { dg-error "" }
+
+// Virtual base class.
+int D::*p3 = &V::x; // { dg-error "" }
+
+// Inaccessible base class.
+int D::*p4 = &P::x; // { dg-error "" }
+
+// Ambiguous base class.
+int D::*p5 = &A::x; // { dg-error "" }
+
+// Increases cv-qualification.
+const int D::*p6 = &B::x;
+
+// Decreases cv-qualification.
+int D::*p7 = static_cast<const int D::*>(&D::x); // { dg-error "" }
+
+// Different member type.
+float D::*p8 = &B::x; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C
new file mode 100644
index 000000000..ad75a52bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C
@@ -0,0 +1,29 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Assorted pointer to member function implicit cast tests.
+
+struct A { int f (); };
+struct B : A { int f (); };
+struct P : A { int f (); };
+struct V { int f (); };
+struct D : B, virtual V, private P { int f (); };
+
+// Valid.
+int (D::*p1)() = &B::f;
+
+// Derived class.
+int (B::*p2)() = &D::f; // { dg-error "" }
+
+// Virtual base class.
+int (D::*p3)() = &V::f; // { dg-error "" }
+
+// Inaccessible base class.
+int (D::*p4)() = &P::f; // { dg-error "" }
+
+// Ambiguous base class.
+int (D::*p5)() = &A::f; // { dg-error "" }
+
+// Different member type.
+float (D::*p6)() = &B::f; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C
new file mode 100644
index 000000000..95d902fa9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do run }
+
+// Test for proper conversion of null pointers to data members.
+
+struct B1 {
+ int x;
+};
+
+struct B2 {
+ int x;
+};
+
+struct D : B1, B2 {
+ int x;
+};
+
+int main ()
+{
+ int D::*pd = 0;
+ int B2::*pb2 = 0;
+
+ return pd != pb2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C
new file mode 100644
index 000000000..d4a260f92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C
@@ -0,0 +1,26 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Test implicit conversion of pointers to member functions appearing as
+// operands of the equality operators.
+
+struct B { };
+
+struct BV { };
+
+struct D : B, virtual BV { };
+
+struct C { };
+
+void f ()
+{
+ void (D::*pd) () = 0;
+ void (B::*pb) () = 0;
+ void (BV::*pbv) () = 0;
+ void (C::*pc) () = 0;
+
+ pd == pb;
+ pd == pbv; // { dg-error "" }
+ pd == pc; // { dg-error "comparison between distinct pointer-to-member types" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C
new file mode 100644
index 000000000..c0b368434
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C
@@ -0,0 +1,9 @@
+// PR c++/60345
+
+struct C {};
+struct J : C {};
+struct A {
+ operator J* ();
+};
+A p;
+C* const& q = p;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C
new file mode 100644
index 000000000..aa55f6f4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C
@@ -0,0 +1,6 @@
+// PR c++/15076
+
+struct Y { Y(int &); };
+
+int v;
+Y y1(reinterpret_cast<int>(v));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C
new file mode 100644
index 000000000..e9b2328b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C
@@ -0,0 +1,5 @@
+bool b;
+
+void f() {
+ reinterpret_cast<void*>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C
new file mode 100644
index 000000000..62fb91444
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C
@@ -0,0 +1,7 @@
+struct S {};
+
+S s;
+
+void f() {
+ reinterpret_cast<const S>(s); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C
new file mode 100644
index 000000000..71575a1ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C
@@ -0,0 +1,4 @@
+// PR c++/51379
+
+unsigned long t1 = 1;
+unsigned long t2 = reinterpret_cast<unsigned long>(t1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C
new file mode 100644
index 000000000..f36500a9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C
@@ -0,0 +1,15 @@
+// PR c++/31419
+
+struct B
+{
+ template<typename T>
+ operator T const& () const
+ {
+ return 42;
+ }
+};
+
+B f()
+{
+ return B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C
new file mode 100644
index 000000000..522d8b547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-msse2" { target { i?86-*-* x86_64-*-* } } } */
+
+/* Test overload resolution of vector types.
+ From Janis Johnson and Paolo Bonzini, based on PR/16882 */
+
+#define vector __attribute__((vector_size(16)))
+
+vector signed int vld (int a1, const vector signed int *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */
+vector signed short vld (int a1, const vector signed short *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */
+
+extern int i;
+extern vector signed short vss;
+extern vector signed char *vscp;
+extern vector signed short *vssp;
+extern const vector signed short *cvssp;
+
+void foo ()
+{
+ vss = vld(i, vscp); /* { dg-error "no matching function for call" } */
+ // { dg-message "candidate" "candidate note" { target *-*-* } 20 }
+ vss = vld(i, vssp);
+ vss = vld(i, cvssp);
+}
+
+/* Ignore a warning that is irrelevant to the purpose of this test. */
+/* { dg-prune-output ".*GCC vector returned by reference.*" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C
new file mode 100644
index 000000000..873e707e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+/* Test generic operations on vectors. */
+
+int __attribute__((vector_size(16))) a, b, c;
+int __attribute__((vector_size(8))) d;
+void foo()
+{
+ a = b ^ c;
+ a = b + c;
+ a = b - c;
+ a = b * c;
+ a = b / c;
+ a = -b;
+ a = d + b; /* { dg-error "invalid operands to binary +" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C
new file mode 100644
index 000000000..8d9626449
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+typedef int myint;
+
+float __attribute__((vector_size(16))) b;
+int __attribute__((vector_size(16))) d;
+myint __attribute__((vector_size(16))) d2;
+unsigned int __attribute__((vector_size(16))) e;
+
+void foo()
+{
+ b + d; /* { dg-error "invalid operands to binary" } */
+ d += e; /* { dg-message "use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts.*cannot convert '__vector.4. unsigned int' to '__vector.4. int' in assignment" } */
+ d2 += d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C
new file mode 100644
index 000000000..f8f7f2e45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C
@@ -0,0 +1,34 @@
+// PR c++/29734
+// { dg-do compile }
+// { dg-options "" }
+
+int t;
+float u;
+int __attribute__((vector_size (8))) v;
+float __attribute__((vector_size (8))) w;
+int b[10];
+
+void
+foo ()
+{
+ b[t];
+ b[u]; // { dg-error "invalid types" }
+ b[v]; // { dg-error "invalid types" }
+ b[w]; // { dg-error "invalid types" }
+ t[b];
+ u[b]; // { dg-error "invalid types" }
+ v[b]; // { dg-error "invalid types" }
+ w[b]; // { dg-error "invalid types" }
+ new int[t];
+ new int[u]; // { dg-error "new-declarator must have integral" }
+ new int[v]; // { dg-error "new-declarator must have integral" }
+ new int[w]; // { dg-error "new-declarator must have integral" }
+ switch (t) { default: break; }
+ switch (u) { default: break; } // { dg-error "switch quantity not an integer" }
+ switch (v) { default: break; } // { dg-error "switch quantity not an integer" }
+ switch (w) { default: break; } // { dg-error "switch quantity not an integer" }
+ t = ~t;
+ u = ~u; // { dg-error "wrong type argument to bit-complement" }
+ v = ~v;
+ w = ~w; // { dg-error "wrong type argument to bit-complement" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C
new file mode 100644
index 000000000..3fa8e418e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+struct A {
+ virtual void f(const A* a) = 0;
+};
+
+struct B : virtual A {
+ virtual void f(const A* a);
+};
+
+void B::f(const A* a)
+{
+ static_cast<const B&>(*a); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C
new file mode 100644
index 000000000..120fc0e1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C
@@ -0,0 +1,5 @@
+// PR c++/27422
+// { dg-do compile }
+
+void foo(void i); // { dg-error "incomplete type|invalid use" }
+void bar() { foo(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C
new file mode 100644
index 000000000..9bd6d9f4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C
@@ -0,0 +1,16 @@
+// PR c++/54165
+
+struct A
+{
+ template<typename T>
+ operator T()
+ {
+ T l[];
+ }
+};
+
+int main()
+{
+ A a;
+ (void)a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/_Pragma1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/_Pragma1.C
new file mode 100644
index 000000000..2a4086b81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/_Pragma1.C
@@ -0,0 +1,10 @@
+// PR c++/27748
+// This is supposed to succeed only if
+// the target doesn't define HANDLE_PRAGMA_PACK_WITH_EXPANSION.
+// { dg-do compile { target { ! { *-*-solaris2* } } } }
+
+#define push bar
+#define foo _Pragma ("pack(push)")
+foo
+int i;
+#pragma pack(pop)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C
new file mode 100644
index 000000000..61e13c5d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C
@@ -0,0 +1,10 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-std=c++98 -pedantic" } */
+
+/* This file is for testing the preprocessor in -std=c++98 -pedantic mode.
+ Neil Booth, 2 Dec 2000. */
+
+#if 1LL /* { dg-warning "long long" } */
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98.C
new file mode 100644
index 000000000..0ec4f359f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++98.C
@@ -0,0 +1,10 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-std=c++98" } */
+
+/* This file is for testing the preprocessor in -std=c++98 mode.
+ Neil Booth, 2 Dec 2000. */
+
+#if 1LL
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C
new file mode 100644
index 000000000..e4e048293
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C
@@ -0,0 +1,12 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-c -include ${srcdir}/g++.dg/cpp/c++_cmd_1.h" } */
+
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+int main ()
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h
new file mode 100644
index 000000000..06f4941bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h
@@ -0,0 +1,6 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* Header file for c++_cmd_1.C */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/limits.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/limits.C
new file mode 100644
index 000000000..5824e0193
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/limits.C
@@ -0,0 +1,21 @@
+// { dg-options "-pedantic" }
+// { dg-do compile }
+
+#include <limits>
+
+// Compiling this with -pedantic was wrongly triggering this error:
+// libstdc++-v3/include/limits:1269:45: warning : use of C++11 long long integer constant [-Wlong-long]
+// min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
+// ^
+// libstdc++-v3/include/limits:1272:44: warning : use of C++11 long long integer constant [-Wlong-long]
+// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
+// ^
+// libstdc++-v3/include/limits:1342:44: warning : use of C++11 long long integer constant [-Wlong-long]
+// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1
+// ^
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste1.C
new file mode 100644
index 000000000..accc762ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste1.C
@@ -0,0 +1,13 @@
+// PR preprocessor/57757
+// { dg-do compile { target c++11 } }
+
+#define S(x) x
+extern S("C")void exit (int);
+int
+main ()
+{
+ (void) (S("foo")and 0);
+ const wchar_t *p = S(L"foo")L"bar";
+ const char *a = S("foo")R"(bar)";
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste2.C
new file mode 100644
index 000000000..6f83a8641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/paste2.C
@@ -0,0 +1,15 @@
+// PR preprocessor/57757
+// { dg-do compile { target c++11 } }
+// { dg-options "-save-temps" }
+// { dg-final cleanup-saved-temps }
+
+#define S(x) x
+extern S("C")void exit (int);
+int
+main ()
+{
+ (void) (S("foo")and 0);
+ const wchar_t *p = S(L"foo")L"bar";
+ const char *a = S("foo")R"(bar)";
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/pedantic-errors.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/pedantic-errors.C
new file mode 100644
index 000000000..0c6045af8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/pedantic-errors.C
@@ -0,0 +1,5 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c++98 -pedantic-errors" } */
+
+#if 1
+#endif 1 /* { dg-error "extra tokens at end of #endif directive" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C
new file mode 100644
index 000000000..31e1ad6d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C
@@ -0,0 +1,5 @@
+// { dg-do compile }
+// { dg-options "-Wunknown-pragmas" }
+
+#pragma STDC FLOAT_CONST_DECIMAL64 ON // { dg-warning "not supported for C\\\+\\\+" }
+double d = 1.0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-1.C
new file mode 100644
index 000000000..da3133071
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-1.C
@@ -0,0 +1,9 @@
+// Test location of diagnostics for interpreting strings. Bug 17964.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile }
+
+const char *s = "\q"; // { dg-error "unknown escape sequence" }
+
+const char *t = "\ "; // { dg-error "unknown escape sequence" }
+
+const char *u = "";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-2.C
new file mode 100644
index 000000000..f71486231
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/string-2.C
@@ -0,0 +1,6 @@
+// Test diagnostics for interpreting strings: This is a pedwarn.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile }
+// { dg-options "" }
+
+const char *s = "\q"; // { dg-warning "unknown escape sequence" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/stringop-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/stringop-1.C
new file mode 100644
index 000000000..071a1009c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/stringop-1.C
@@ -0,0 +1,29 @@
+/* Test for buffer overrun stringizing named operators longer than 4
+ characters. */
+/* { dg-do compile } */
+
+#define str(x) #x
+#define var(v,a,b,c,d) static const char v##a##b##c##d[] = str(xor_eq)
+#define var1(v,a,b,c) \
+ var(v,a,b,c,0); var(v,a,b,c,1); var(v,a,b,c,2); var(v,a,b,c,3); \
+ var(v,a,b,c,4); var(v,a,b,c,5); var(v,a,b,c,6); var(v,a,b,c,7); \
+ var(v,a,b,c,8); var(v,a,b,c,9)
+#define var2(v,a,b) \
+ var1(v,a,b,0); var1(v,a,b,1); var1(v,a,b,2); var1(v,a,b,3); \
+ var1(v,a,b,4); var1(v,a,b,5); var1(v,a,b,6); var1(v,a,b,7); \
+ var1(v,a,b,8); var1(v,a,b,9)
+#define var3(v,a) \
+ var2(v,a,0); var2(v,a,1); var2(v,a,2); var2(v,a,3); \
+ var2(v,a,4); var2(v,a,5); var2(v,a,6); var2(v,a,7); \
+ var2(v,a,8); var2(v,a,9)
+
+var3(v,0);
+var3(v,1);
+var3(v,2);
+var3(v,3);
+var3(v,4);
+var3(v,5);
+var3(v,6);
+var3(v,7);
+var3(v,8);
+var3(v,9);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.C
new file mode 100644
index 000000000..39168239a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.C
@@ -0,0 +1,16 @@
+/* Contributed by Dodji Seketeli <dodji@redhat.com> */
+/* Origin: PR preprocessor/7263 */
+/* { dg-options "-pedantic -std=c++98 -ftrack-macro-expansion=1" } */
+/* { dg-do compile } */
+
+/* This tests the proprer suppression of warning coming from macro
+ defined in system headers and expanded in a non-system header
+ location. */
+#include "syshdr3.h"
+
+static _Complex float c = _Complex_I + _Complex_I; /* These macros are defined in
+ system header so we should
+ have no warning here. */
+U_LL u = ONE_ULL; /* Likewise here. */
+
+unsigned long long v = 1ULL; /* { dg-warning "long long" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.h
new file mode 100644
index 000000000..e5d502a24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/syshdr3.h
@@ -0,0 +1,7 @@
+#pragma GCC system_header
+
+#define _Complex __complex__
+#define _Complex_I 1.0iF
+
+#define U_LL unsigned long long
+#define ONE_ULL 1ULL
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/truefalse.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/truefalse.C
new file mode 100644
index 000000000..d852d4e2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/truefalse.C
@@ -0,0 +1,17 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+
+/* Source: Neil Booth, 18 Apr 2003. */
+
+/* { dg-do preprocess } */
+/* { dg-options "-ansi -pedantic -Wundef" } */
+
+/* Check that for C++ we handle true and false correctly, and do not
+ treat them as undefined identifiers. */
+
+#if true /* { dg-bogus "is not defined" } */
+#error foo /* { dg-error "foo" } */
+#endif
+
+#if false /* { dg-bogus "is not defined" } */
+#error foo /* { dg-bogus "foo" } */
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucn-1.C
new file mode 100644
index 000000000..b2d4f98fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucn-1.C
@@ -0,0 +1,14 @@
+// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html
+// { dg-do compile { target c++11 } }
+// { dg-options "-fextended-identifiers" }
+
+int main()
+{
+ "\u0041"; // 'A' UCN is OK in string literal
+ '\u0041'; // also OK in character literal
+
+ int c\u0041c; // { dg-error "not valid in an identifier" }
+ int c\u0024c; // $ is OK; not part of basic source char set
+
+ U"\uD800"; // { dg-error "not a valid universal character" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucnid-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucnid-1.C
new file mode 100644
index 000000000..7a8f72a5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/ucnid-1.C
@@ -0,0 +1,17 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=gnu++98 -pedantic -fextended-identifiers" } */
+
+\u00AA /* { dg-error "not valid in an identifier" } */
+\u00AB /* { dg-error "not valid in an identifier" } */
+\u00B6 /* { dg-error "not valid in an identifier" } */
+\u00BA /* { dg-error "not valid in an identifier" } */
+\u00C0
+\u00D6
+\u0384
+
+\u0669 /* { dg-error "not valid in an identifier" } */
+A\u0669 /* { dg-error "not valid in an identifier" } */
+0\u00BA /* { dg-error "not valid in an identifier" } */
+0\u0669 /* { dg-error "not valid in an identifier" } */
+\u0E59
+A\u0E59
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp/weak.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp/weak.C
new file mode 100644
index 000000000..6c51e1985
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp/weak.C
@@ -0,0 +1,5 @@
+// { dg-options "-fno-weak" }
+
+#if __GXX_WEAK__
+#error "__GXX_WEAK__ defined when -fno-weak in use"
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C
new file mode 100644
index 000000000..b9b975b5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C
@@ -0,0 +1,28 @@
+// { dg-do run { target c++11 } }
+
+// Make sure -Wliteral-suffix is enabled by default and
+// triggers as expected.
+
+#define BAR "bar"
+#define PLUS_ONE + 1
+
+#include <cstdint>
+#include <cassert>
+
+
+void
+test()
+{
+ char c = '3'PLUS_ONE; // { dg-warning "invalid suffix on literal" }
+ char s[] = "foo"BAR; // { dg-warning "invalid suffix on literal" }
+
+ assert(c == '4');
+ assert(s[3] != '\0');
+ assert(s[3] == 'b');
+}
+
+int
+main()
+{
+ test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C
new file mode 100644
index 000000000..232e48435
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C
@@ -0,0 +1,24 @@
+// PR c++/57211
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-parameter" }
+
+template <class T> T&& move(T&);
+
+struct A
+{
+ struct B
+ {
+ B& operator=(B&&);
+ };
+
+ B f;
+
+ A& operator=(A&& p) = default;
+};
+
+int main()
+{
+ A a;
+ A b;
+ b = move(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C
new file mode 100644
index 000000000..a9dd15547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C
@@ -0,0 +1,162 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+struct A;
+
+typedef int (A::*pointmemfun) (int);
+typedef int (A::*pointdmem);
+typedef int (*pointfun) (int);
+
+pointmemfun pmfs;
+pointdmem pdms;
+pointfun pfs;
+int* ps;
+
+void f()
+{
+ pointmemfun pmf(0); // { dg-warning "zero as null pointer" }
+ pointdmem pdm(0); // { dg-warning "zero as null pointer" }
+ pointfun pf(0); // { dg-warning "zero as null pointer" }
+ int* p(0); // { dg-warning "zero as null pointer" }
+
+ pointmemfun pmfn(nullptr);
+ pointdmem pdmn(nullptr);
+ pointfun pfn(nullptr);
+ int* pn(nullptr);
+
+ pmf = 0; // { dg-warning "zero as null pointer" }
+
+ pdm = 0; // { dg-warning "zero as null pointer" }
+
+ pf = 0; // { dg-warning "zero as null pointer" }
+
+ p = 0; // { dg-warning "zero as null pointer" }
+
+ pmf = nullptr;
+
+ pdm = nullptr;
+
+ pf = nullptr;
+
+ p = nullptr;
+
+ if (pmf)
+ ;
+
+ if (pdm)
+ ;
+
+ if (pf)
+ ;
+
+ if (p)
+ ;
+
+ if (!pmf)
+ ;
+
+ if (!pdm)
+ ;
+
+ if (!pf)
+ ;
+
+ if (!p)
+ ;
+
+ if (pmf == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pdm == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pf == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (p == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pmf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pdm) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == p) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pmf != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pdm != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pf != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (p != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pmf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pdm) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != p) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pmf == nullptr)
+ ;
+
+ if (pdm == nullptr)
+ ;
+
+ if (pf == nullptr)
+ ;
+
+ if (p == nullptr)
+ ;
+
+ if (nullptr == pmf)
+ ;
+
+ if (nullptr == pdm)
+ ;
+
+ if (nullptr == pf)
+ ;
+
+ if (nullptr == p)
+ ;
+
+ if (pmf != nullptr)
+ ;
+
+ if (pdm != nullptr)
+ ;
+
+ if (pf != nullptr)
+ ;
+
+ if (p != nullptr)
+ ;
+
+ if (nullptr != pmf)
+ ;
+
+ if (nullptr != pdm)
+ ;
+
+ if (nullptr != pf)
+ ;
+
+ if (nullptr != p)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C
new file mode 100644
index 000000000..5cb4022af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C
@@ -0,0 +1,15 @@
+// PR c++/56373
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+struct shared_ptr
+{
+ shared_ptr(decltype(nullptr));
+};
+
+void f()
+{
+ shared_ptr a = 0; // { dg-warning "zero as null pointer" }
+ shared_ptr b(0); // { dg-warning "zero as null pointer" }
+ shared_ptr c{0}; // { dg-warning "zero as null pointer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C
new file mode 100644
index 000000000..7c2a712d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+const char* foo()
+{
+ return __func__;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C
new file mode 100644
index 000000000..55c951f97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C
@@ -0,0 +1,15 @@
+// PR c++/49042
+// { dg-do compile { target c++11 } }
+
+template <class T>
+class A
+{
+ T p;
+public:
+ template <class U> auto f() -> decltype(+p) { }
+};
+
+int main()
+{
+ A<int>().f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C
new file mode 100644
index 000000000..74960a66a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C
@@ -0,0 +1,39 @@
+// PR c++/58954
+// { dg-require-effective-target c++11 }
+
+template<class T>
+T&& declval();
+
+template<class T>
+struct foo_argument
+{
+ template<class Ret, class C, class Arg>
+ static Arg test(Ret (C::*)(Arg));
+
+ typedef decltype(test(&T::template foo<>)) type;
+};
+
+template<class T, class>
+struct dependent { typedef T type; };
+
+template<class T>
+struct base
+{
+ template<class Ignore = void>
+ auto foo(int i) -> decltype(declval<
+ typename dependent<T&, Ignore>::type
+ >().foo_impl(i));
+};
+
+struct derived : base<derived>
+{
+ friend struct base<derived>;
+private:
+ int foo_impl(int i);
+};
+
+int main()
+{
+ foo_argument<derived>::type var = 0;
+ return var;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C
new file mode 100644
index 000000000..bcefe3fc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C
@@ -0,0 +1,36 @@
+// { dg-do compile { target c++11 } }
+
+template<template<class> class TT> struct X { };
+template<class> struct Y { };
+template<class T> using Z = Y<T>;
+
+void f(X<Y>);
+void g(X<Z>);
+
+void
+foo()
+{
+ // Below x and y have the same type (DR 1286)
+ X<Y> y;
+ X<Z> z;
+
+ // ... So these must compile.
+ f(z); // { dg-bogus "" }
+ g(y); // { dg-bogus "" }
+}
+
+template<class> struct A0 {};
+template<class T> using AA0 = A0<T>;
+template<class T> using AAA0 = AA0<T>;
+
+void f0(A0<int>);
+void
+g0()
+{
+ AA0<int> a;
+ AAA0<int> b;
+ f0(a);
+ f0(b);
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C
new file mode 100644
index 000000000..c52ab46aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+// These also represent tests for printing alias declarations and
+// their instantiations.
+
+template<class T, class U> struct A0 {};
+template<class T, class U> using AA0 = A0<T, U>;
+template<class T> struct AA0<int, T> {}; // { dg-error "specialization" }
+
+template <class U> using Ptr = U*;
+template<class U> struct Ptr<U*> {}; // { dg-error "specialization" }
+
+struct A {
+ using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C
new file mode 100644
index 000000000..7c8bad983
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> using Ptr = T*;
+Ptr<unsigned>; // { dg-error "does not declare anything" }
+Ptr<char><int>; // { dg-error "not a template|does not declare anything" }
+template class Ptr<int>;//{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" }
+
+template <class T> using Arg = T;
+struct A {};
+template class Arg<A>;// { dg-error "alias templ\[^\n\r\]*specialization\[^\n\r\]*Arg<A>\[^\n\r\]*after\[^\n\r\]*class" }
+
+template <template <class> class TT, class T> using Instantiate = TT<T>;
+template <class> struct Vector {};
+
+// The below is not OK, because of [dcl.type.elab]:
+//
+// If the identifier resolves to a typedef-name or the
+// simple-template-id resolves to an alias template
+// specialization, the elaborated-type-specifier is ill-formed.
+//
+template class Instantiate<Vector, int>;//{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" }
+
+template <class T> struct S {};
+template<class T> using SFor = S<T>;
+// Likewise, this is not OK.
+template class SFor<int>; //{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C
new file mode 100644
index 000000000..54574337b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+namespace N
+{
+ template <class T> using U = T*;
+}
+
+void f(N::U<int>) { blah; } // { dg-error "void f(N::U<int>)|not declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C
new file mode 100644
index 000000000..df23e5519
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C
@@ -0,0 +1,4 @@
+// Origin: PR c++/51027
+// { dg-do compile { target c++11 } }
+
+using INT = int // { dg-error "expected|;|at end of input" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C
new file mode 100644
index 000000000..368e5af55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C
@@ -0,0 +1,24 @@
+// Origin PR c++/51191
+// { dg-do compile { target c++11 } }
+
+template< class T >
+class ClassTemplate {};
+
+template< class T >
+struct Metafunction {
+ typedef T type;
+};
+
+template< class T >
+using TemplateAlias = ClassTemplate< typename Metafunction<T>::type >;
+
+using Alias = TemplateAlias<int>;
+
+template< class T >
+void f( TemplateAlias<T> );
+
+int main()
+{
+ Alias x;
+ f( x ); // { dg-error "no matching function for call to|f" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C
new file mode 100644
index 000000000..52f2201a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C
@@ -0,0 +1,14 @@
+// Origin: PR c++/51145
+// { dg-do compile { target c++11 } }
+
+struct A {};
+
+template<class>
+using X = A;
+
+struct X<int>* px; // { dg-error "using\[^\n\r\]*alias\[^\n\r\]*specialization\[^\n\r\]*X<int>\[^\n\r\]*after\[^\n\r\]*struct|invalid type in declaration before\[^\n\r\]*;" }
+
+template<int>
+using Y = A;
+
+struct Y<0>* py;// { dg-error "alias\[^\n\r\]*specialization\[^\n\r\]*Y<0>\[^\n\r\]*after\[^\n\r\]*struct|invalid type in declaration before\[^\n\r\]*;" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C
new file mode 100644
index 000000000..2d617ab81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C
@@ -0,0 +1,17 @@
+// Origin PR c++/51194
+// { dg-do compile { target c++11 } }
+
+template<class U, class V> //#1
+struct foo {};
+
+template<class U, class V=char>
+struct P {};
+
+template<template<class... U> class... TT>
+struct bar {
+ template<class... Args>
+ using mem = P<TT<Args...>...>;//#2
+};
+
+bar<foo>::mem<int, char> b;//#3
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C
new file mode 100644
index 000000000..d934a93bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C
@@ -0,0 +1,28 @@
+// Origin PR c++/51143
+// { dg-do compile { target c++11 } }
+
+using A0 = struct B0 { void f() {} };
+
+template<int N>
+using A1 =
+ struct B1 { // { dg-error "types may not be defined in alias template" }
+ static auto constexpr value = N;
+ };
+
+A1<0> a1;
+
+template<class T>
+using A2 =
+ struct B2 { // { dg-error "types may not be defined in alias template" }
+ void f(T){}
+ };
+
+A2<bool> a2;
+
+template<class T>
+using A3 =
+ enum B3 {b = 0;}; //{ dg-error "types may not be defined in alias template" }
+
+A3<int> a3; // { dg-error "'A3' does not name a type" }
+
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C
new file mode 100644
index 000000000..bf947fb81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C
@@ -0,0 +1,21 @@
+// Origin PR c++/51289
+// { dg-do compile { target c++11 } }
+
+template<typename a, template <typename, typename> class b>
+struct foo {
+ template <typename t>
+ using type = b<a, t>;
+ template <typename t>
+ b<a, t> funca() {}
+
+ template <typename t>
+ type<t> funcb() {}
+};
+
+// This is an additional test, to emit an error message when using
+// unexpanded parameter packs in an alias declaration.
+template <class ... T>
+struct S {};
+
+template<class ... T>
+using A = S<T>; // { dg-error "parameter packs not expanded" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C
new file mode 100644
index 000000000..199b05483
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C
@@ -0,0 +1,9 @@
+// Origin: PR c++/51541
+// { dg-do compile { target c++11 } }
+
+template<typename Z> using ::T = void(int n); // { dg-error "" }
+template<typename Z> using operator int = void(int n); // { dg-error "" }
+template<typename Z> using typename U = void; // { dg-error "" }
+template<typename Z> using typename ::V = void(int n); // { dg-error "" }
+template<typename Z> using typename ::operator bool = void(int n); // { dg-error "" }
+using foo __attribute__((aligned(4)) = int; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C
new file mode 100644
index 000000000..b101cb3b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C
@@ -0,0 +1,31 @@
+// PR c++/53567
+// { dg-do compile { target c++11 } }
+
+template <unsigned int, bool> struct IntegerType { typedef unsigned type; };
+
+template <class EnumT>
+using UnderlyingEnumType = typename IntegerType<sizeof(EnumT), (EnumT(-1) > EnumT(0))>::type;
+
+template <class EnumT, class UnderlyingT = UnderlyingEnumType<EnumT>>
+struct EnumMask
+{
+ constexpr EnumMask(EnumT val) : m_val(val) {}
+ operator EnumT() { return m_val; }
+
+ EnumT m_val;
+};
+
+enum class A : unsigned { x };
+
+template <class EnumT>
+EnumMask<EnumT> operator ~(EnumT lhs)
+{
+ return EnumT(~unsigned(lhs) & unsigned(EnumT::maskAll)); // { dg-error "not a member" }
+
+}
+
+int main()
+{
+ ~A::x;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C
new file mode 100644
index 000000000..0204f6454
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target c++11 } }
+
+template<class T> struct S0 {};
+template<class T> using AS0 = S0<T>;
+
+template<template<class> class TT>
+void f(TT<int>);
+
+template class AS0<char>; // { dg-error "alias templ\[^\n\r\]*specialization\[^\n\r\]*after\[^\n\r\]*class" }
+
+void
+foo()
+{
+ AS0<int> a;
+ f(a);
+}
+
+template<class T, class U> struct Vector{};
+template<class T> struct Alloc {};
+
+template<class T> using Vec = Vector<T, Alloc<T> >;
+
+template<class T> void g(Vector<T, Alloc<T> >);
+
+template<template<class T> class TT> void h(TT<int>); // { dg-error "provided for" }
+
+void
+bar()
+{
+ Vec<int> a;
+ g(a);
+ h(a); // { dg-error "no matching function|wrong number of template arguments" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C
new file mode 100644
index 000000000..078d25718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C
@@ -0,0 +1,9 @@
+// PR c++/53858
+// { dg-do compile { target c++11 } }
+
+template <typename T> struct s0 { typedef T tdef0; };
+template <typename T> struct s1 { typedef T tdef1; };
+template <typename T> using us1 = typename s1<T>::tdef1;
+template <typename T, typename TT = typename us1<T>::tdef0> struct s2 {};
+
+int main () { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C
new file mode 100644
index 000000000..463f539d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C
@@ -0,0 +1,23 @@
+// PR c++/54575
+// { dg-do compile { target c++11 } }
+
+template<typename _From, typename _To>
+struct is_convertible { static const bool value = true; };
+
+template<bool> struct enable_if { };
+template<> struct enable_if<true> { typedef int type; };
+
+template<typename _InIter>
+using _RequireInputIter
+= typename enable_if<is_convertible<_InIter,bool>::value>::type;
+
+template<typename _Tp> struct X {
+ template<typename _InputIterator,
+ typename = _RequireInputIter<_InputIterator>>
+ void insert(_InputIterator) {}
+};
+
+template<typename> void foo() {
+ X<int> subdomain_indices;
+ subdomain_indices.insert(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C
new file mode 100644
index 000000000..1f6cb8f40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C
@@ -0,0 +1,12 @@
+// The standard is unclear about whether this testcase is well-formed.
+// Clang considers it well-formed, EDG not. Let's go with EDG for now.
+// { dg-do compile { target c++11 } }
+
+template <class T>
+using foo = typename T::bar; // { dg-error "this context" }
+
+class B
+{
+ typedef int bar; // { dg-error "private" }
+ foo<B> f; // { dg-message "required" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C
new file mode 100644
index 000000000..0e4ba45aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C
@@ -0,0 +1,17 @@
+// PR c++/52233
+// { dg-do compile { target c++11 } }
+
+template <typename t>
+struct foo
+{
+ template <template <typename...> class... xs>
+ using type = int;
+};
+
+template <typename t, template <typename...> class... xs>
+struct bar
+{
+ using type = typename foo<t>::template type<xs...>;
+};
+
+bar<int, foo> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C
new file mode 100644
index 000000000..b68fa9346
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C
@@ -0,0 +1,24 @@
+// Origin: PR c++/53540
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct context
+{
+ typedef int type;
+};
+
+template <typename T>
+void function()
+{
+ using ctx1 = context<T>;
+ typename ctx1::type f1;
+
+ typedef context<T> ctx2;
+ typename ctx2::type f2;
+}
+
+int main()
+{
+ function<int>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C
new file mode 100644
index 000000000..a388ae410
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C
@@ -0,0 +1,10 @@
+// PR c++/54859
+// { dg-do compile { target c++11 } }
+
+template<unsigned N>
+ using Num = int;
+
+template<typename... Types>
+ using Count = Num<sizeof...(Types)>;
+
+Count<int, char, void> i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C
new file mode 100644
index 000000000..dd4cc0286
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C
@@ -0,0 +1,10 @@
+// Origin: PR c++/54466
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+ struct X { };
+
+template<typename T>
+ using Y = const X<T>;
+
+using Z = Y<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C
new file mode 100644
index 000000000..91208abf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C
@@ -0,0 +1,11 @@
+// Origin: PR c++/54875
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+using AddConst = T const;
+
+enum FwdEnum : int;
+
+int main() {
+ AddConst<FwdEnum> *ptr = nullptr;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C
new file mode 100644
index 000000000..086b5e54f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C
@@ -0,0 +1,7 @@
+// Origin: PR c++/54401
+// { dg-do compile { target c++11 } }
+
+template<typename>
+struct X {
+ using type = T; // { dg-error "expected type-specifier|does not name a type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C
new file mode 100644
index 000000000..f6cc6950b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C
@@ -0,0 +1,10 @@
+// Origin: PR c++/52343
+// { dg-do compile { target c++11 } }
+
+template<typename>
+using A = int;
+
+template<template<class> class>
+struct B {};
+
+B<A> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C
new file mode 100644
index 000000000..2204c250c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+// Exercise some member alias templates ...
+
+template<class T, class U> class A0 {};
+
+template<class T>
+struct A1 {
+ template<class U> struct S {};
+ template<class U> using AA0 = A0<T, U>;
+
+ void f(A0<T, int>);
+
+ void
+ foo()
+ {
+ AA0<int> a;
+ const AA0<int> b;
+ f(a);
+ f(b);
+ }
+};
+
+void
+bar()
+{
+ A1<int> a1;
+ a1.foo();
+ A1<int>::AA0<int> a1aa0;
+ a1.f(a1aa0);
+}
+
+// ... some simple member alias ...
+struct B {
+ using A = int;
+};
+
+B::A a;
+
+// ... and some simple alias
+
+using Int = int;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C
new file mode 100644
index 000000000..7ad5e6d83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C
@@ -0,0 +1,15 @@
+// Origin PR c++/55311
+// { dg-do compile { target c++11 } }
+
+template <const char *const C, typename T>
+struct A
+{};
+
+struct B {};
+
+extern constexpr char HELLO_WORLD[] = "hello world";
+
+A<HELLO_WORLD, B> g; // <-- This works fine
+
+template <typename T>
+using PartiallySpecialized = A<HELLO_WORLD, T>; // <-- This fails
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C
new file mode 100644
index 000000000..83eea471d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C
@@ -0,0 +1,20 @@
+// Origin: PR c++/55663
+// { dg-do compile { target c++11 } }
+
+template <typename>
+constexpr bool the_truth () { return true; }
+
+template <bool>
+ struct Takes_bool { };
+
+template<bool B>
+ using Alias = Takes_bool<B>;
+
+template<typename T>
+ struct test { using type = Alias<the_truth<T>()>; };
+
+int main () {
+ test<int> a;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C
new file mode 100644
index 000000000..cb39edde8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C
@@ -0,0 +1,20 @@
+// PR c++/56611
+// { dg-do compile { target c++11 } }
+
+template<class T> struct remove_reference { typedef T type; };
+template<class T> struct remove_reference<T&> { typedef T type; };
+template<class T> T declval() { return T(); }
+
+int f(int, int){return 0;}
+struct Func{};
+
+template<class... Args> using result2
+= decltype(f(declval<typename remove_reference<Args>::type>()...));
+
+template<class Sig> struct R;
+template<class This, class... Args> struct R< This(Args...) >
+{
+ typedef result2<Args...> type;
+};
+
+typedef R< Func(int, int) >::type R_type;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C
new file mode 100644
index 000000000..25781a484
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C
@@ -0,0 +1,14 @@
+// PR c++/51239
+// { dg-require-effective-target c++11 }
+
+template<class... x>
+class list{};
+template<class a, class... b>
+using tail=list<b...>;
+template <class...T>
+void f(tail<T...>); // { dg-error "alias" }
+
+int main()
+{
+ f<int,int>({});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C
new file mode 100644
index 000000000..a1c442eab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C
@@ -0,0 +1,15 @@
+// PR c++/51239
+// { dg-require-effective-target c++11 }
+// This variant should work because tail is equivalent to list.
+
+template<class y, class... x>
+class list{};
+template<class a, class... b>
+using tail=list<a, b...>;
+template <class...T>
+void f(tail<T...>);
+
+int main()
+{
+ f<int,int>({});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C
new file mode 100644
index 000000000..4306ab703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C
@@ -0,0 +1,23 @@
+// PR c++/57222
+// { dg-require-effective-target c++11 }
+
+template <template <typename T> class Templ>
+using Bool = Templ<bool>;
+
+template <typename T>
+class Foo {
+private:
+public:
+ template<template<typename U> class Templ>
+ void method(Bool<Templ> boolTempl);
+};
+
+template <typename T>
+template <template <typename U> class Templ>
+void Foo<T>::method(Bool<Templ> boolTempl) {
+}
+
+int main() {
+ Foo<char> foo;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C
new file mode 100644
index 000000000..f412b302d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C
@@ -0,0 +1,9 @@
+// PR c++/57279
+// { dg-require-effective-target c++11 }
+
+typedef void fc1() const; // OK
+typedef void frr1() &&; // OK
+typedef void fcr1() const &;
+using fc2 = void() const; // #4
+using frr2 = void() &&; // OK
+using fcr2 = void() const &; // #6
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C
new file mode 100644
index 000000000..dd3a422c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C
@@ -0,0 +1,6 @@
+// PR c++/53658
+// { dg-do compile { target c++11 } }
+
+struct A;
+template <typename> using Foo = const A;
+template <typename Item> Foo <Item> bar();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C
new file mode 100644
index 000000000..d6a3e12ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C
@@ -0,0 +1,21 @@
+// PR c++/57138
+// { dg-do compile { target c++11 } }
+
+template <template <typename ... X> class T, typename ... Y>
+struct D
+{
+ template <typename ... Z>
+ using type = T <Y..., Z...>; // { dg-error "pack expansion" }
+};
+template <typename T>
+class A {};
+template <typename X, typename Y>
+struct B;
+template <typename T>
+struct B <int, T>
+{
+ typedef A <T> type;
+};
+template <typename X, typename Y>
+using C = typename B <X, Y>::type;
+struct E : public D <C> {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C
new file mode 100644
index 000000000..bc98737b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C
@@ -0,0 +1,41 @@
+// PR c++/58435
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct same { static const bool value = false; };
+template<typename T>
+struct same<T, T> { static const bool value = true; };
+
+template <template <typename> class F, typename T> struct apply
+{ typedef F<T> type; };
+template <template <typename> class F, typename T> struct applyc
+{ typedef const F<T> type; };
+template <template <typename> class F, typename T> struct applyv
+{ typedef volatile F<T> type; };
+template <template <typename> class F, typename T> struct applycv
+{ typedef const volatile F<T> type; };
+
+template <typename T> using map = T;
+template <typename T> using mapc = const T;
+template <typename T> using mapv = volatile T;
+template <typename T> using mapcv = const volatile T;
+
+static_assert(same<apply<map, int>::type, int>::value, "");
+static_assert(same<apply<mapc, int>::type, const int>::value, "");
+static_assert(same<apply<mapv, int>::type, volatile int>::value, "");
+static_assert(same<apply<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applyc<map, int>::type, const int>::value, "");
+static_assert(same<applyc<mapc, int>::type, const int>::value, "");
+static_assert(same<applyc<mapv, int>::type, const volatile int>::value, "");
+static_assert(same<applyc<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applyv<map, int>::type, volatile int>::value, "");
+static_assert(same<applyv<mapc, int>::type, const volatile int>::value, "");
+static_assert(same<applyv<mapv, int>::type, volatile int>::value, "");
+static_assert(same<applyv<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applycv<map, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapc, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapv, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapcv, int>::type, const volatile int>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C
new file mode 100644
index 000000000..9fe553861
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C
@@ -0,0 +1,11 @@
+// PR c++/58856
+// { dg-require-effective-target c++11 }
+
+template <typename T>
+struct U1 {};
+
+template <typename T1, typename... Ts>
+using U2 = U1<T1>;
+
+template <typename T1, typename... Ts>
+using U3 = U2<T1, Ts...>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C
new file mode 100644
index 000000000..60edaf7e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+// [temp.alias]/3:
+// The type-id in an alias template declaration shall not refer
+// to the alias template being declared. The type produced by an
+// alias template specialization shall not directly or indirectly
+// make use of that specialization.
+
+template <class T> struct A;
+template <class T> using B = typename A<T>::U; // { dg-error "type" }
+template <class T> struct A {
+ typedef B<T> U;
+};
+B<short> b; // { dg-error "invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C
new file mode 100644
index 000000000..f8bff7820
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C
@@ -0,0 +1,33 @@
+// PR c++/58170
+// { dg-require-effective-target c++11 }
+// { dg-prune-output "not declared" }
+// { dg-prune-output "expected" }
+
+template <typename T, typename U>
+struct base {
+ template <typename V>
+ struct derived;
+};
+
+template <typename T, typename U>
+template <typename V>
+struct base<T, U>::derived : public base<T, V> {
+};
+
+// This (wrong?) alias declaration provokes the crash.
+template <typename T, typename U, typename V>
+using alias = base<T, U>::derived<V>; // { dg-error "template|typename" }
+
+// This one works:
+// template <typename T, typename U, typename V>
+// using alias = typename base<T, U>::template derived<V>;
+
+template <typename T>
+void f() {
+ alias<T, bool, char> m{};
+ (void) m;
+}
+
+int main() {
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C
new file mode 100644
index 000000000..c444217b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C
@@ -0,0 +1,18 @@
+// PR c++/60182
+// { dg-require-effective-target c++11 }
+
+class B {};
+template <typename> using __allocator_base = B;
+template <typename> class F : __allocator_base<int> {};
+class C {};
+template <typename, typename = F<int> > class G : C {};
+template <typename> class D;
+class A {
+ using Container = G<D<char>>;
+ A();
+ A(D<char> const &);
+ Container m_elements;
+};
+template <template <class, class> class C, class A = F<D<int>>>
+void doSomething(C<D<char>, A> &);
+A::A(D<char> const &) : A() { doSomething(m_elements); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C
new file mode 100644
index 000000000..559fc51c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C
@@ -0,0 +1,34 @@
+// { dg-do compile { target c++11 } }
+
+// alias template of a partial specialization
+
+template<class T, class U, class W> struct S0 {};
+template<class T, class U> struct S0<T, U, char> {};
+template<class T> using AS0 = S0<T, int, char>;
+void foo(S0<bool, int, char>);
+
+AS0<bool> a; // OK
+
+void
+f()
+{
+ foo(a); //OK
+}
+
+// alias template of an explicit specialization of a member template
+
+template<class T>
+struct S1 {
+ template<class U>
+ struct M {};
+};
+template<class T> using AM = S1<int>::M<T>;
+void bar(S1<int>::M<bool>);
+
+AM<bool> b; //OK.
+
+void
+g()
+{
+ bar(b); //OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C
new file mode 100644
index 000000000..e0faf2bcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+// Alias template of non-class types.
+
+template <class T, class U> struct same;
+template <class T> struct same<T,T> {};
+
+template <class T> using Ptr = T*;
+template <template <class> class T> struct A {
+ template <class U> using X = T<U>;
+};
+same<A<Ptr>::X<int>,int*> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C
new file mode 100644
index 000000000..f5911d9df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+// Add arguments to unbound template template parameter.
+
+template <template <class> class Template>
+struct Internal {
+ template <class Arg> using Bind = Template<Arg>;
+};
+
+template <template <class> class Template, class Arg>
+using Instantiate = Template<Arg>; // After parsing #1, the
+ // BOUND_TEMPLATE_TEMPLATE_PARM
+ // parameter Template gets
+ // the UNBOUND_CLASS_TEMPLATE
+ // Internal<Template>::template Bind
+ // as an argument, and the
+ // parameter Arg gets Argument as
+ // an argument. And we build
+ // 'Bind<Argument>'.
+
+template <template <class> class Template, class Argument>
+using Bind = Instantiate<Internal<Template>::template Bind, Argument>; //#1
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C
new file mode 100644
index 000000000..c40fbbbbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target c++11 } }
+
+struct A {
+ template <class U> using C = U;
+};
+
+// The particularity of the below struct is to have more than 7
+// fields. In this case, looking up a member here should exercise
+// cp/search.c:lookup_field_1 in such a way that it finds it in the
+// CLASSTYPE_SORTED_FIELDS of struct A7.
+struct A7 {
+ int f0;
+ int f1;
+ int f2;
+ int f3;
+ int f4;
+ int f5;
+ int f6;
+ int f7;
+ template <class U> using C = U;
+};
+
+template <class T>
+struct B {
+ typename T::template C<int> n; //#0
+};
+
+// These should trigger the lookup
+// of template C inside class A or
+// A7, via #0.
+B<A> b;
+B<A7> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C
new file mode 100644
index 000000000..5794617d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A {
+ using Result = T;
+};
+template <class A> using Arg = typename A::Result;
+Arg<A<int>> b;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C
new file mode 100644
index 000000000..524216ad5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C
@@ -0,0 +1,13 @@
+// Origin: PR c++/51032
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "No stabs" { aarch64*-*-* mmix-*-* *-*-aix* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-vxworks* nios2-*-* } { "*" } { "" } }
+// { dg-options "-gstabs+" }
+
+template <class C>
+struct A {
+ template<class U> using B = U*;
+ int a;
+};
+
+A<int> a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C
new file mode 100644
index 000000000..0c545c735
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C
@@ -0,0 +1,13 @@
+// DR 1286: An alias template can be equivalent to an underlying template.
+// { dg-do compile { target c++11 } }
+
+template <class T, class U> struct same;
+template <class T> struct same<T,T> {};
+
+template <class T> struct A {};
+template <class T> using B = A<T>;
+
+template <template <class> class T> class C {};
+
+void f(C<B>) { } // { dg-final { scan-assembler "_Z1f1CI1AE" } }
+same<C<A>, C<B> > s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C
new file mode 100644
index 000000000..1780c9a47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C
@@ -0,0 +1,60 @@
+// DR 1286
+// { dg-do compile { target c++11 } }
+
+template <class,class> struct same;
+template <class T> struct same<T,T> {};
+
+template <class,class> struct different {};
+template <class T> struct different<T,T>;
+
+template<typename T, typename U = T> struct A;
+template<template <class...> class> struct X;
+
+// equivalent to A
+template<typename V, typename W>
+using B = A<V, W>;
+
+same<X<A>,X<B>> s1;
+
+// not equivalent to A: not all parameters used
+template<typename V, typename W>
+using C = A<V>;
+
+different<X<A>,X<C>> d1;
+
+// not equivalent to A: different number of parameters
+template<typename V>
+using D = A<V>;
+
+different<X<A>,X<D>> d2;
+
+// not equivalent to A: template-arguments in wrong order
+template<typename V, typename W>
+using E = A<W, V>;
+
+different<X<A>,X<E>> d3;
+
+// equivalent to A: default arguments not considered
+template<typename V, typename W = int>
+using F = A<V, W>;
+
+same<X<A>,X<F>> s2;
+
+// equivalent to A and B
+template<typename V, typename W>
+using G = A<V, W>;
+
+same<X<A>,X<G>> s3;
+same<X<B>,X<G>> s3b;
+
+// equivalent to E
+template<typename V, typename W>
+using H = E<V, W>;
+
+same<X<E>,X<H>> s4;
+
+// not equivalent to A: argument not identifier
+template<typename V, typename W>
+using I = A<V, typename W::type>;
+
+different<X<A>,X<I>> d4;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C
new file mode 100644
index 000000000..fef981823
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C
@@ -0,0 +1,12 @@
+// PR c++/60328
+// { dg-require-effective-target c++11 }
+
+template <class _T, class... _Rest>
+struct Foo
+{
+ template <class _TT, class... _RR>
+ using Bar = Foo<_TT, _RR...>;
+
+ using Normal = Foo<_Rest...>;
+ using Fail = Bar<_Rest...>;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C
new file mode 100644
index 000000000..260a193a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C
@@ -0,0 +1,47 @@
+// PR c++/57734
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct same_type { static const bool value = false; };
+
+template<typename T>
+struct same_type<T, T> { static const bool value = true; };
+
+enum e { zero };
+enum class eclass { one };
+
+template<typename T>
+using enum_alias = e;
+
+template<typename T>
+using eclass_alias = eclass;
+
+typedef enum_alias<void> etest0;
+typedef enum_alias<void> etest0;
+typedef enum_alias<int> etest0;
+typedef enum_alias<int> etest1;
+
+static_assert (same_type<etest0, etest1>::value, "");
+
+typedef eclass_alias<void> ectest0;
+typedef eclass_alias<void> ectest0;
+typedef eclass_alias<int> ectest0;
+typedef eclass_alias<int> ectest1;
+
+static_assert (same_type<ectest0, ectest1>::value, "");
+
+template<typename T>
+enum_alias<T> efoo(T f) { return enum_alias<T>::zero; }
+
+template<typename T>
+constexpr enum_alias<T> cefoo(T f) { return enum_alias<T>::zero; }
+
+static_assert ( cefoo(1) == e::zero, "");
+
+template<typename T>
+eclass_alias<T> ecfoo(T f) { return eclass_alias<T>::one; }
+
+template<typename T>
+constexpr eclass_alias<T> cecfoo(T f) { return eclass_alias<T>::one; }
+
+static_assert ( cecfoo(1) == eclass::one, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C
new file mode 100644
index 000000000..92422f95a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+int main(void)
+{
+ static_assert(alignof(int) == __alignof(int), "alignof(int) does not equal __alignof(int)");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C
new file mode 100644
index 000000000..d571d9d77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+int main(void)
+{
+ alignof(int); //ok with a type but not with an expression
+ alignof(3); // { dg-warning "alignof" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C
new file mode 100644
index 000000000..c349cec06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+int main(void)
+{
+ alignof(void (void)); // { dg-warning "function type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C
new file mode 100644
index 000000000..ca3c47ad6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C
@@ -0,0 +1,7 @@
+// PR c++/51316
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ alignof(int []);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C
new file mode 100644
index 000000000..b8d390518
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-std=c++98 -Wc++11-compat" }
+
+// Test warning for use of auto in C++98 mode with C++11
+// compatibility warnings
+void f()
+{
+ auto int x = 5; // { dg-warning "changes meaning" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C
new file mode 100644
index 000000000..296873eed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C
@@ -0,0 +1,21 @@
+// Positive test for auto
+// { dg-do run { target c++11 } }
+
+#include <typeinfo>
+extern "C" void abort();
+
+int main()
+{
+ if (auto i = 42L)
+ {
+ if (typeid (i) != typeid (long int))
+ abort ();
+ }
+
+ while (auto i = 1)
+ {
+ if (typeid (i) != typeid (int))
+ abort ();
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C
new file mode 100644
index 000000000..208f512a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C
@@ -0,0 +1,12 @@
+// PR c++/38256
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ template<typename T> operator T();
+};
+
+void foo()
+{
+ A<0>().operator auto(); // { dg-error "auto" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C
new file mode 100644
index 000000000..0ada26544
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C
@@ -0,0 +1,28 @@
+// PR c++/40306, c++/40307
+// { dg-do run { target c++11 } }
+
+template< typename T >
+struct test {
+ test run() {
+ auto tmp = *this;
+ return tmp;
+ }
+ test run_pass() {
+ test tmp( *this );
+ return tmp;
+ }
+
+ test run_fail() {
+ auto tmp( *this );
+ return tmp;
+ }
+};
+
+int main()
+{
+ test<int> x;
+ x.run();
+ x.run_pass();
+ x.run_fail();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C
new file mode 100644
index 000000000..ca5758ddf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+template< typename Fn > struct function;
+
+template< typename Result, typename ... ArgTypes >
+struct function< auto (ArgTypes...)->Result > {
+};
+
+int main()
+{
+ function< auto(double)->int > y;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C
new file mode 100644
index 000000000..e9754f325
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C
@@ -0,0 +1,7 @@
+// PR c++/40619
+// { dg-do compile { target c++11 } }
+
+template<typename U> struct X {};
+
+template<typename T> auto f(T t) -> X<decltype(t+1)> {}
+template<typename T> auto g(T t) -> X<decltype(t+1)> {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C
new file mode 100644
index 000000000..7f9529e3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C
@@ -0,0 +1,10 @@
+// PR c++/42567
+// { dg-do compile { target c++11 } }
+
+template<typename B>
+struct A {
+ template<typename C>
+ void fn(C c) {
+ auto& key = *c;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C
new file mode 100644
index 000000000..e6ddf0c24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+void f()
+{
+ auto val = val; // { dg-error "auto" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C
new file mode 100644
index 000000000..d27d4375d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+struct Explicit {
+ Explicit() = default; // Line 2
+ explicit Explicit(const Explicit&){}
+} ex;
+
+auto ex2(ex); // Line 6
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C
new file mode 100644
index 000000000..cff36d212
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C
@@ -0,0 +1,73 @@
+// Positive test for auto
+// { dg-do run { target c++11 } }
+
+#include <typeinfo>
+extern "C" void abort();
+
+int f() {}
+
+struct A
+{
+ int i;
+ int f() {}
+ A operator+(A a) { return a; }
+};
+
+template <class T>
+void g(T t)
+{
+ auto x = t+t;
+ if (typeid(x) != typeid(t+t))
+ abort();
+
+ auto p = new auto(&t);
+ if (typeid(p) != typeid(T**))
+ abort();
+}
+
+int main()
+{
+ auto i = 42;
+ if (typeid (i) != typeid (int))
+ abort();
+
+ auto *p = &i;
+ if (typeid (p) != typeid (int*))
+ abort();
+
+ auto *p2 = &p;
+ if (typeid (p2) != typeid (int**))
+ abort();
+
+ auto (*fp)() = f;
+ if (typeid (fp) != typeid (int (*)()))
+ abort();
+
+ auto A::* pm = &A::i;
+ if (typeid (pm) != typeid (int A::*))
+ abort();
+
+ auto (A::*pmf)() = &A::f;
+ if (typeid (pmf) != typeid (int (A::*)()))
+ abort();
+
+ g(42);
+ g(10.f);
+ g(A());
+
+ auto *p3 = new auto (i);
+ if (typeid (p3) != typeid (int*))
+ abort();
+
+ for (auto idx = i; idx != 0; idx = 0);
+ while (auto idx = 0);
+ if (auto idx = 1);
+
+ switch (auto s = i)
+ {
+ case 42:
+ break;
+ }
+
+ auto j = 42, k = 24;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C
new file mode 100644
index 000000000..fe9925d0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C
@@ -0,0 +1,20 @@
+// Test for proper non-deduced context handling of the initializer
+// for an auto declaration/new.
+// { dg-do compile { target c++11 } }
+
+struct with_apply
+{
+ template <unsigned>
+ void apply(const double&){}
+};
+
+auto p = &with_apply::apply<0>;
+auto pp = new auto(&with_apply::apply<0>);
+
+template <class T>
+void f()
+{
+ auto p = &T::template apply<0>;
+}
+
+template void f<with_apply>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C
new file mode 100644
index 000000000..a827b3df8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C
@@ -0,0 +1,5 @@
+// Origin PR c++/47208
+// { dg-do compile { target c++11 } }
+
+constexpr auto list = { }; // { dg-error "deducing from brace-enclosed initializer list requires #include <initializer_list>" }
+static const int l = list.size();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C
new file mode 100644
index 000000000..4ae1d1cf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C
@@ -0,0 +1,21 @@
+// PR c++/47999
+// { dg-do compile { target c++11 } }
+
+int& identity(int& i)
+{
+ return i;
+}
+
+// In a function template, auto type deduction works incorrectly.
+template <typename = void>
+void f()
+{
+ int i = 0;
+ auto&& x = identity(i); // Type of x should be `int&`, but it is `int&&`.
+}
+
+int main (int argc, char* argv[])
+{
+ f();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C
new file mode 100644
index 000000000..f14c2b8b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C
@@ -0,0 +1,4 @@
+// PR c++/46245
+// { dg-do compile { target c++11 } }
+
+template<auto f()->int> struct A { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C
new file mode 100644
index 000000000..d370cc6f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C
@@ -0,0 +1,5 @@
+// PR c++/48599
+// { dg-do compile { target c++11 } }
+
+int v[1];
+auto (*p)[1] = &v; // { dg-error "array of .auto" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C
new file mode 100644
index 000000000..9e08a5bf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C
@@ -0,0 +1,12 @@
+// PR c++/42056
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ int a[auto(1)]; // { dg-error "invalid use of" }
+};
+
+template<int> void foo()
+{
+ int a[auto(1)]; // { dg-error "invalid use of" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C
new file mode 100644
index 000000000..d355a6397
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C
@@ -0,0 +1,21 @@
+// PR c++/43321
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f(T t)
+{
+ auto *p = t;
+}
+
+template <class T>
+void g(const T& tr)
+{
+ auto p = *tr;
+}
+
+int main()
+{
+ int b;
+ f(&b);
+ g(&b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C
new file mode 100644
index 000000000..f8e9097b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C
@@ -0,0 +1,6 @@
+// PR c++/51186
+
+auto main()->int // { dg-error "std=" "std" { target { ! c++11 } } }
+ // { dg-error "auto" "auto" { target { ! c++11 } } 3 }
+ // { dg-error "no type" "no type" { target { ! c++11 } } 3 }
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C
new file mode 100644
index 000000000..441d8843a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C
@@ -0,0 +1,4 @@
+// PR c++/51404
+// { dg-do compile { target c++11 } }
+
+int i = auto().x; // { dg-error "invalid use of" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C
new file mode 100644
index 000000000..80fdc12b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C
@@ -0,0 +1,24 @@
+// PR c++/51401
+// { dg-do compile { target c++11 } }
+
+template <int>
+struct A
+{
+ auto i; // { dg-error "non-static data member declared" }
+};
+
+template <int>
+struct B
+{
+ auto i = 0; // { dg-error "non-static data member declared" }
+};
+
+struct C
+{
+ auto i; // { dg-error "non-static data member declared" }
+};
+
+struct D
+{
+ auto i = 0; // { dg-error "non-static data member declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C
new file mode 100644
index 000000000..c2e5519ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C
@@ -0,0 +1,27 @@
+// Negative test for auto
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+auto x; // { dg-error "auto" }
+
+// If the type deduced for the template parameter U is not the same in each
+// deduction, the program is ill-formed.
+auto i = 42, j = 42.0; // { dg-error "auto" }
+
+// New CWG issue
+auto a[2] = { 1, 2 }; // { dg-error "auto|initializer_list" }
+
+template<class T>
+struct A { };
+
+A<int> A1;
+// CWG issue 625
+A<auto> A2 = A1; // { dg-error "" }
+
+auto foo() { } // { dg-error "auto" "" { target { ! c++1y } } }
+
+void bar(auto i) // { dg-error "incomplete|auto" }
+{
+ (void)i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C
new file mode 100644
index 000000000..cce67d556
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C
@@ -0,0 +1,9 @@
+// Origin PR c++/51473
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ auto friend struct B; // { dg-error "multiple types|can only be specified|friend" }
+};
+
+auto int; // { dg-error "multiple types|can only be specified for variables" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C
new file mode 100644
index 000000000..26a656063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C
@@ -0,0 +1,12 @@
+// PR c++/51416
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename... U> void foo(T, U... u)
+{
+ auto foo(u...); // { dg-error "auto" }
+}
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C
new file mode 100644
index 000000000..2aad34e40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+// { dg-final { scan-assembler "_Z1fIiEDTnw_Dapifp_EET_" } }
+template <class T> auto f(T t) -> decltype (new auto(t));
+
+int main()
+{
+ f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C
new file mode 100644
index 000000000..dade5a8ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C
@@ -0,0 +1,15 @@
+// PR c++/53484
+// { dg-do compile { target c++11 } }
+
+template<class T,class U> struct ST;
+template<class T> struct ST<T,T> {};
+
+template <class T>
+void f(T x){
+ [&]{
+ auto y = x;
+ ST<decltype(y),int>();
+ }();
+}
+
+int main(){ f(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C
new file mode 100644
index 000000000..3682d60bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C
@@ -0,0 +1,18 @@
+// PR c++/51421
+// { dg-do compile { target c++11 } }
+
+int foo1(int);
+
+void bar1()
+{
+ auto i = foo1(i); // { dg-error "before deduction" }
+}
+
+struct A {};
+
+A foo2(A);
+
+void bar2()
+{
+ auto a = foo2(a); // { dg-error "before deduction" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C
new file mode 100644
index 000000000..55eebbeff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C
@@ -0,0 +1,11 @@
+// PR c++/53122
+// { dg-do compile { target c++11 } }
+
+template<typename... Args>
+ void foo(Args&&...) { }
+
+template<typename... Args>
+ void bar(Args&&...)
+{
+ auto fn = foo<Args...>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C
new file mode 100644
index 000000000..586bc6ebb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C
@@ -0,0 +1,18 @@
+// PR c++/54903
+// { dg-do compile { target c++11 } }
+
+template<int N, int D>
+struct Modulus
+{
+ static auto const value = N % D;
+};
+
+template<int N>
+struct Angle
+{
+ static auto const value = Modulus<N, 360>::value; // ERROR
+ //static int const value = Modulus<N, 360>::value; // OK
+ //static auto const value = N % 360; // OK
+
+ typedef Angle<value> type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C
new file mode 100644
index 000000000..f4b29046d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C
@@ -0,0 +1,14 @@
+// PR c++/55003
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct A {
+ static const auto t
+ = (typename T::type)42;
+};
+
+struct X {
+ typedef int type;
+};
+
+A<X> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C
new file mode 100644
index 000000000..070a39b9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C
@@ -0,0 +1,8 @@
+// PR c++/57183
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-variable" }
+
+constexpr float PI_0 = 3.1415926F;
+constexpr auto PI_1 = 3.1415926F;
+const float PI_2 = 3.1415926F;
+const auto PI_3 = 3.1415926F;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C
new file mode 100644
index 000000000..dfa1fb4e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C
@@ -0,0 +1,6 @@
+// PR c++/58560
+// { dg-do compile { target c++11 } }
+
+typedef auto T; // { dg-error "typedef declared 'auto'" }
+
+void foo() { T(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C
new file mode 100644
index 000000000..36144fd9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C
@@ -0,0 +1,27 @@
+// Testcase for deduction of std::initializer_list for auto.
+// { dg-do run { target c++11 } }
+
+#include <typeinfo>
+#include <initializer_list>
+extern "C" void abort();
+
+template <class T>
+void f (T t)
+{
+ auto ilt = { &t, &t };
+ if (typeid(ilt) != typeid(std::initializer_list<T*>))
+ abort();
+
+ auto il = { 1, 2, 3 };
+ if (typeid(il) != typeid(std::initializer_list<int>))
+ abort();
+}
+
+int main()
+{
+ auto il = { 1, 2, 3 };
+ if (typeid(il) != typeid(std::initializer_list<int>))
+ abort();
+
+ f('c');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C
new file mode 100644
index 000000000..287191e59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C
@@ -0,0 +1,11 @@
+// PR c++/58888
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ static constexpr auto b{1.0};
+};
+
+constexpr decltype(A::b) A::b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C
new file mode 100644
index 000000000..b2a77550f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C
@@ -0,0 +1,5 @@
+// PR c++/58550
+// { dg-do compile { target c++11 } }
+
+auto foo(); // { dg-error "auto" "" { target { ! c++1y } } }
+auto fp = foo; // { dg-error "auto" "" { target c++1y } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C
new file mode 100644
index 000000000..8ed66d1ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C
@@ -0,0 +1,22 @@
+// Testcase for non-dependent auto in templates
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<class> void f();
+} a;
+
+template <class T>
+void g()
+{
+ auto aa = a;
+ aa.f<int>();
+
+ auto p = new auto (a);
+ p->f<int>();
+}
+
+int main()
+{
+ g<double>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C
new file mode 100644
index 000000000..c213c747b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C
@@ -0,0 +1,13 @@
+// PR c++/37965
+// Negative test for auto
+// { dg-do compile { target c++11 } }
+
+auto i = 6;
+auto j; // { dg-error "has no initializer" }
+
+template<int> struct A
+{
+ static auto k = 7; // { dg-error "non-const" }
+ static auto l; // { dg-error "has no initializer" }
+ auto m; // { dg-error "non-static data member declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C
new file mode 100644
index 000000000..205bb960c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C
@@ -0,0 +1,123 @@
+// PR c++/37962
+// Negative test for auto
+// { dg-do compile { target c++11 } }
+
+#include <typeinfo>
+#include <stdarg.h>
+#include <stddef.h>
+
+int i = *(auto *) 0; // { dg-error "auto" }
+struct A *p = (auto *) 0; // { dg-error "auto" }
+int *q = static_cast <auto *>(0); // { dg-error "auto" }
+const int *r = const_cast <auto *>(q); // { dg-error "auto" }
+const std::type_info &t1 = typeid (auto); // { dg-error "auto" }
+const std::type_info &t2 = typeid (auto *); // { dg-error "auto" }
+
+struct A
+{
+ operator auto (); // { dg-error "auto" "" { target { ! c++1y } } }
+ operator auto *(); // { dg-error "auto" "" { target { ! c++1y } } }
+};
+
+struct A2
+{
+ operator auto () -> int; // { dg-error "invalid use of" "" { target { ! c++1y } } }
+ operator auto *() -> int; // { dg-error "auto" }
+};
+
+template <typename> struct B
+{
+ enum { e };
+};
+
+template <typename T> struct C
+{
+ C () : i () {}
+ int i;
+};
+
+bool d = (auto (A::*)()) 0; // { dg-error "auto" }
+
+void
+foo ()
+{
+ __extension__ (auto) { 0 }; // { dg-error "auto" }
+ C<int> c;
+ dynamic_cast<auto> (c); // { dg-error "auto" }
+ reinterpret_cast<auto> (c); // { dg-error "auto" }
+ int i = auto (0); // { dg-error "auto" }
+ auto p1 = new (auto); // { dg-error "auto" }
+ auto p2 = new (auto) (42); // { dg-error "invalid use of|deduce" }
+ offsetof (auto, fld); // { dg-error "auto" }
+ offsetof (auto *, fld); // { dg-error "auto" }
+ sizeof (auto); // { dg-error "auto" }
+ sizeof (auto *); // { dg-error "auto" }
+}
+
+void
+foo2 (void)
+{
+ __alignof__ (auto); // { dg-error "auto" }
+ __alignof__ (auto *); // { dg-error "auto" }
+ __typeof__ (auto) v1; // { dg-error "auto" }
+ __typeof__ (auto *) v2; // { dg-error "auto" }
+ __is_class (auto); // { dg-error "auto|expected" }
+ __is_pod (auto *); // { dg-error "auto|expected" }
+ __is_base_of (int, auto); // { dg-error "auto|expected" }
+ __is_base_of (auto, int); // { dg-error "auto|expected" }
+ __is_base_of (auto, auto *); // { dg-error "auto|expected" }
+}
+
+B<auto> b; // { dg-error "auto|invalid" }
+C<auto> c; // { dg-error "auto|invalid" }
+C<auto *> c2; // { dg-error "auto|invalid" }
+
+enum : auto { EE = 0 }; // { dg-error "must be an integral type" }
+enum struct D : auto * { FF = 0 }; // { dg-error "must be an integral type|declar|expected" }
+
+void
+bar ()
+{
+ try { } catch (auto i) { } // { dg-error "parameter" }
+ try { } catch (auto) { } // { dg-error "parameter" }
+ try { } catch (auto *i) { } // { dg-error "parameter" }
+ try { } catch (auto *) { } // { dg-error "parameter" }
+}
+
+void
+baz (int i, ...)
+{
+ va_list ap;
+ va_start (ap, i);
+ va_arg (ap, auto); // { dg-error "invalid use of" }
+ va_arg (ap, auto *); // { dg-error "invalid use of|expected" }
+ va_arg (ap, auto &); // { dg-error "invalid use of|expected" }
+ va_end (ap);
+}
+
+template <typename T = auto> struct E {}; // { dg-error "invalid use of" }
+template <class T = auto *> struct F {}; // { dg-error "invalid use of|expected" }
+
+auto fnlate () -> auto; // { dg-error "invalid use of" "" { target { ! c++1y } } }
+auto fnlate2 () -> auto *; // { dg-error "invalid use of|expected" "" { target { ! c++1y } } }
+
+void
+badthrow () throw (auto) // { dg-error "invalid use of" }
+{
+}
+
+void
+badthrow2 () throw (auto &) // { dg-error "invalid use of|expected" }
+{
+}
+
+template <auto V = 4> struct G {}; // { dg-error "auto" }
+
+template <typename T> struct H { H (); ~H (); };
+H<auto> h; // { dg-error "invalid" }
+
+void qq (auto); // { dg-error "auto" }
+void qr (auto*); // { dg-error "auto" }
+
+// PR c++/46145
+typedef auto autot; // { dg-error "auto" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C
new file mode 100644
index 000000000..2052d3991
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C
@@ -0,0 +1,19 @@
+// Test for throwing bad_array_new_length on invalid array length
+// { dg-do run { target c++11 } }
+
+#include <new>
+
+void * f(int i)
+{
+ return new int[i];
+}
+
+int main()
+{
+ try
+ {
+ f(-1);
+ }
+ catch (std::bad_array_new_length) { return 0; }
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C
new file mode 100644
index 000000000..bcc9b9ad5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C
@@ -0,0 +1,20 @@
+// Test for throwing bad_array_new_length on invalid array length
+// { dg-do run { target c++11 } }
+
+#include <new>
+
+void * f(int i)
+{
+ return new int[i]{1,2,3,4};
+}
+
+int main()
+{
+ f(4); // OK
+ try
+ {
+ f(3);
+ }
+ catch (std::bad_array_new_length) { return 0; }
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C
new file mode 100644
index 000000000..9b7ce7dc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+struct S{};
+void f(S&&);
+
+int main()
+{
+ f(S());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C
new file mode 100644
index 000000000..6f5c29720
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct list {};
+
+template<typename T>
+struct vector {
+ operator T() const;
+};
+
+void f()
+{
+ vector<vector<int>> v;
+ const vector<int> vi = static_cast<vector<int>>(v);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C
new file mode 100644
index 000000000..35c8608bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+template<int i> class X { /* ... */ };
+X< 1>2 > x1; // // { dg-error "numeric constant" }
+X<(1>2)> x2; // Okay.
+
+template<class T> class Y { /* ... */ };
+Y<X<1>> x3; // Okay, same as "Y<X<1> > x3;".
+Y<X<6>>1>> x4; // { dg-error "numeric constant" }
+Y<X<(6>>1)>> x5; // Okay
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C
new file mode 100644
index 000000000..93c714862
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-std=c++98 -Wc++11-compat" }
+
+template<int N> struct X {};
+
+X<1 >> 2> x; // { dg-warning "is treated as|suggest parentheses" }
+
+// From cp/parser.c
+typedef int Y;
+template <int V> struct Foo {};
+Foo<Y () >> 5> r; // { dg-warning "is treated as|suggest parentheses" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C
new file mode 100644
index 000000000..256f4cb6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C
@@ -0,0 +1,34 @@
+// { dg-do compile { target c++11 } }
+template<typename T>
+struct vector {
+};
+
+struct X {
+ template<typename T>
+ struct tmpl {
+ operator T() const;
+ };
+};
+
+template<typename T>
+void g()
+{
+ T::template tmpl<vector<int>>() + 2;
+}
+
+template<typename T>
+void operator+(vector<T>, int);
+
+void f()
+{
+ vector<vector<int>>() + 2;
+}
+
+// PR c++/36460
+template <class a>
+class A {};
+template <class b>
+class B {};
+
+A<B<void()>> x;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C
new file mode 100644
index 000000000..2b8ef33e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+struct S
+{
+ S();
+ S(S &&);
+private:
+ S(S &);
+};
+
+S f()
+{
+ S s;
+ return static_cast<S&&>(s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C
new file mode 100644
index 000000000..d11d72413
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C
@@ -0,0 +1,30 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test cast from lvalue to rvalue
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+
+struct A {};
+
+one foo(const A&) {return one();}
+two foo(A&&) {return two();}
+
+int test1()
+{
+ A a;
+ sa<sizeof(foo(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(foo(static_cast<A&&>(a))) == 2 * sizeof(long)> t2;
+ return 0;
+}
+
+int main()
+{
+ return test1();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C
new file mode 100644
index 000000000..81778ea78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C
@@ -0,0 +1,16 @@
+// PR c++/53371
+// { dg-do compile { target c++11 } }
+
+struct Abs
+{
+ virtual void a() = 0;
+};
+
+void foo()
+{
+ try {
+ } catch (Abs) { } // { dg-error "abstract class type" }
+
+ try {
+ } catch (int&&) { } // { dg-error "rvalue reference type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C
new file mode 100644
index 000000000..89fe0318f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename U> struct same_type;
+template<typename T> struct same_type<T, T> {};
+
+template <typename T>
+struct S
+{
+ typedef T const (&type)();
+};
+
+void f()
+{
+ // initial implementation didn't ignore const qualifier on
+ // reference, resulting in a typedef of 'const int& (&)()'
+ same_type<S<int &>::type, int&(&)()>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C
new file mode 100644
index 000000000..b537bb583
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C
@@ -0,0 +1,38 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename U> struct same_type;
+template<typename T> struct same_type<T, T> {};
+
+typedef int & lref;
+typedef int const & clref;
+typedef int && rref;
+typedef int const && crref;
+
+template<typename T>
+struct S
+{
+ typedef T & lref;
+ typedef T const & clref;
+ typedef T && rref;
+ typedef T const && crref;
+};
+
+void f()
+{
+ same_type<lref &, int &>();
+ same_type<lref &&, int &>();
+ same_type<rref &, int &>();
+ same_type<rref &&, int &&>();
+
+ same_type<rref const &, int &>();
+ same_type<crref volatile &&, int const &&>();
+ same_type<clref const &&, int const &>();
+
+ same_type<S<int &>::lref &, int &>();
+ same_type<S<int &&>::lref &&, int &>();
+ same_type<S<int &>::rref &, int &>();
+ same_type<S<int &&>::rref &&, int &&>();
+
+ same_type<S<int const &>::rref, int const &>();
+ same_type<S<int volatile &&>::crref, int volatile &&>();
+ same_type<S<int const &&>::clref, int const &>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C
new file mode 100644
index 000000000..746a84e7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C
@@ -0,0 +1,14 @@
+// PR c++/46336
+// { dg-do compile { target c++11 } }
+
+extern "C" {
+ enum A { };
+ inline constexpr A
+ f(A a, A b) // { dg-message "previous declaration" }
+ { return A(static_cast<int>(a) & static_cast<int>(b)); }
+ enum B { };
+ inline constexpr B
+ f(B a, B b) // { dg-error "C function" }
+ { return B(static_cast<int>(a) & static_cast<int>(b)); }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C
new file mode 100644
index 000000000..17a366e84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C
@@ -0,0 +1,13 @@
+// PR c++/46420
+// { dg-do compile { target c++11 } }
+
+template<typename> class vector { };
+struct A{};
+template <class T1>
+void complete_test(vector<T1> data1){
+ A drop=A();
+}
+int main(){
+ vector<double> vect1;
+ complete_test(vect1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C
new file mode 100644
index 000000000..263a44bc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C
@@ -0,0 +1,25 @@
+// PR c++/47570
+// { dg-do compile { target c++11 } }
+
+unsigned int constexpr one()
+{ return 1; }
+
+int constexpr one_B()
+{ return 1; }
+
+int main()
+{
+ // FAIL TO COMPILE:
+ static bool constexpr SC_huh1 = ((unsigned int)one()) >= ((unsigned int)0);
+ static bool constexpr SC_huh2 = one() >= ((unsigned int)0);
+ static bool constexpr SC_huh3 = one() >= 0;
+
+ // COMPILE OK:
+ static bool constexpr SC_huh4 = ((one() == 0) || (one() > 0));
+ static bool constexpr SC_huh5 = one() == 0;
+ static bool constexpr SC_huh6 = one() > 0;
+ static bool constexpr SC_huh7 = one_B() >= 0;
+ static bool constexpr SC_huh8 = one() >= 1;
+
+ return SC_huh3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C
new file mode 100644
index 000000000..933831b94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C
@@ -0,0 +1,11 @@
+// PR c++/47969
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ // constexpr operator int () { return 1; }
+};
+
+constexpr A a = A();
+
+int ar[a]; // { dg-error "has non-integral type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C
new file mode 100644
index 000000000..88d442691
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C
@@ -0,0 +1,50 @@
+// PR c++/48089
+// { dg-do compile { target c++11 } }
+
+// bang is ill-formed (diagnostic required) because its initializer is
+// non-constant, because it uses the value of an uninitialized object.
+
+// s() is ill-formed (no diagnostic required) because there is no set of
+// arguments that would produce a constant expression.
+
+// R() is well-formed because i is initialized before j.
+
+struct s {
+ constexpr s() : v(v) { } // { dg-message "" }
+ int v;
+};
+
+constexpr s bang; // { dg-message "" }
+
+struct R {
+ int i,j;
+ constexpr R() : i(42),j(i) { } // { dg-bogus "" "" { xfail *-*-* } }
+};
+
+constexpr R r; // { dg-bogus "" "" { xfail *-*-* } }
+
+// Ill-formed (no diagnostic required)
+struct T {
+ int i;
+ constexpr int f() { return i; }
+ constexpr T(): i(0) { }
+ constexpr T(const T& t) : i(f()) { } // { dg-message "" }
+};
+
+constexpr T t1;
+// Ill-formed (diagnostic required)
+constexpr T t2(t1); // { dg-message "" }
+
+// Well-formed
+struct U {
+ int i, j;
+ constexpr int f(int _i) { return _i; }
+ constexpr int g() { return i; }
+ constexpr U(): i(0), j(0) { }
+ constexpr U(const U& t) : i(f(t.i)),j(0) { } // { dg-bogus "" "" { xfail *-*-* } }
+ constexpr U(int _i) : i(_i),j(g()) { } // { dg-bogus "" "" { xfail *-*-* } }
+};
+
+constexpr U u1;
+constexpr U u2(u1); // { dg-bogus "" "" { xfail *-*-* } }
+constexpr U u3(1); // { dg-bogus "" "" { xfail *-*-* } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C
new file mode 100644
index 000000000..c1d1c3754
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C
@@ -0,0 +1,17 @@
+// PR c++/49776
+// { dg-do compile { target c++11 } }
+
+struct s
+{
+ int i[1];
+
+ template<class... Types>
+ constexpr s(Types... args)
+ : i{args...} // { dg-error "cannot convert" }
+ { }
+};
+
+int main()
+{
+ s test = nullptr;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C
new file mode 100644
index 000000000..413566f49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C
@@ -0,0 +1,11 @@
+// PR c++/51369
+// { dg-do compile { target c++11 } }
+
+constexpr int x[2][2] = {};
+
+template<int>
+void
+foo ()
+{
+ x[0][0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C
new file mode 100644
index 000000000..0ce07a5b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C
@@ -0,0 +1,7 @@
+// PR c++/52672
+// { dg-do compile { target c++11 } }
+
+__extension__ typedef __SIZE_TYPE__ * ul_ptr;
+constexpr unsigned long a = *((ul_ptr)0x0); // { dg-error "" }
+constexpr unsigned long b = *((ul_ptr)(*((ul_ptr)0x0))); // { dg-error "" }
+constexpr unsigned long c = *((ul_ptr)*((ul_ptr)(*((ul_ptr)0x0)))); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C
new file mode 100644
index 000000000..c90fc765e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4;
+constexpr V4 v = { 1, 1, 1, 0 };
+constexpr V4 r = v[0] + v;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C
new file mode 100644
index 000000000..f34619a6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+// Ignore warning on some powerpc-ibm-aix configurations.
+// { dg-prune-output "non-standard ABI extension" }
+// { dg-prune-output "changes the ABI" }
+
+typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4;
+constexpr V4 build (float x, float y, float z) { return __extension__ (V4){ x, y, z, 0 };}
+constexpr V4 x = build (1, 0, 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C
new file mode 100644
index 000000000..58c00ed4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+// Ignore warning on some powerpc-ibm-aix configurations.
+// { dg-prune-output "non-standard ABI extension" }
+
+typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4;
+
+struct Rot3 {
+ typedef float T;
+ typedef V4 Vec;
+ Vec axis[3];
+ constexpr Rot3 (V4 ix, V4 iy, V4 iz) : axis {ix, iy, iz} {}
+
+ constexpr Rot3(T xx, T xy, T xz, T yx, T yy, T yz, T zx, T zy, T zz) :
+ Rot3((Vec) { xx, xy, xz, 0 },
+ (Vec) { yx, yy, yz, 0 },
+ (Vec) { zx, zy, zz, 0 }) {}
+
+};
+
+constexpr Rot3 r1( 0, 1 ,0, 0, 0, 1, 1, 0, 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C
new file mode 100644
index 000000000..56b09bda0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C
@@ -0,0 +1,22 @@
+// PR c++/55432
+// { dg-do compile { target c++11 } }
+
+struct tag_t{} tag{};
+
+constexpr tag_t const& pass(tag_t & t)
+{
+ return t;
+}
+
+struct S
+{
+ constexpr S(tag_t) {};
+};
+
+struct T
+{
+ S mem;
+ T( tag_t & args ) : mem(pass(args)) {}
+};
+
+T t(tag);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C
new file mode 100644
index 000000000..bec69c75d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C
@@ -0,0 +1,24 @@
+// PR c++/55573
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+// Ignore warning on some powerpc-ibm-aix configurations.
+// { dg-prune-output "non-standard ABI extension" }
+
+template <typename T, int N>
+struct ExtVecTraits {
+ typedef T __attribute__((vector_size (N * sizeof (T)))) type;
+};
+
+template <typename T>
+using Vec4 = typename ExtVecTraits<T,4>::type;
+
+template <typename T>
+struct Rot3
+{
+ typedef Vec4<T> Vec;
+ Vec axis[3];
+ constexpr Rot3 (Vec4<T> ix, Vec4<T> iy, Vec4<T> iz) : axis {ix, iy, iz} {}
+};
+
+typedef Vec4<float> Vec;
+Rot3<float> r2 ((Vec) {0, 1, 0, 0}, (Vec){0, 0, 1, 0}, (Vec){1, 0, 0, 0});
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C
new file mode 100644
index 000000000..ffbefbbac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C
@@ -0,0 +1,30 @@
+// PR c++/55708
+// { dg-do compile { target c++11 } }
+
+template<int N,int NNN>
+struct AA { static constexpr int val = N; };
+
+template<typename A,typename B>
+//constexpr unsigned long long mymax(A a,B b){ // <-- compiles
+constexpr unsigned long long mymax(A && a,const B& b){
+ return a<b?b:a;
+}
+
+template<char... List>
+constexpr long long operator"" _y() noexcept
+{
+ return AA<1, mymax(1,2)>::val; // <-- crashes gcc
+ // return mymax(1,2); // <-- compiles
+ // return AA<1,2>::val; // <-- compiles
+}
+
+template<char... List>
+constexpr unsigned long long do_y() noexcept
+{
+ return AA<1, mymax(1,2)>::val; // <-- crashes gcc
+}
+
+int main()
+{
+ return 1_y + do_y();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C
new file mode 100644
index 000000000..945bf020f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C
@@ -0,0 +1,12 @@
+// PR c++/56302
+// { dg-do compile { target c++11 } }
+// { dg-options "-O0" }
+
+constexpr int foo () { return 42; }
+constexpr int x = foo () + 2;
+
+void
+bar ()
+{
+ __asm ("" : : "n" (x), "n" (foo () * 7 + x));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C
new file mode 100644
index 000000000..1a0189b56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C
@@ -0,0 +1,4 @@
+// { dg-options "-std=c++98" }
+
+constexpr int i = 42; // { dg-message "std=c\\+\\+11" }
+// { dg-error "constexpr" "" { target *-*-* } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
new file mode 100644
index 000000000..8d791dd03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
@@ -0,0 +1,13 @@
+// Origin PR c++/51462
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i = 0;
+};
+
+struct B
+{
+ A a;
+ constexpr B() : a(0) {} // { dg-error "no matching function" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C
new file mode 100644
index 000000000..418a20299
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C
@@ -0,0 +1,17 @@
+// PR c++/47301
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=1" }
+
+struct A
+{
+ constexpr operator int ()
+ {
+ return 1;
+ }
+};
+
+template < int > struct B
+{
+ static constexpr A a = A();
+ int ar[a];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C
new file mode 100644
index 000000000..569824dc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+class base
+{
+protected:
+ constexpr base() { }
+};
+
+struct A : base { };
+
+int main()
+{
+ A a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C
new file mode 100644
index 000000000..ea86d7bc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C
@@ -0,0 +1,20 @@
+// PR c++/56481
+// Non-linearity in potential_constant_expression_1
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ constexpr bool foo ();
+#define A(n) , f##n##0, f##n##1, f##n##2, f##n##3
+#define B(n) A(n##0) A(n##1) A(n##2) A(n##3)
+#define C B(0) B(1) B(2) B(3)
+ bool f C;
+};
+
+constexpr bool
+S::foo ()
+{
+#undef A
+#define A(n) && f##n##0 && f##n##1 && f##n##2 && f##n##3
+ return f C;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C
new file mode 100644
index 000000000..15d20f692
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+constexpr T do_get(T* x, int n) {
+ return x[n - 1];
+}
+
+template<class T, int N>
+constexpr T get(T (&x)[N]) {
+ return do_get(x, N);
+}
+
+constexpr int arr_i[] = {1};
+constexpr auto var = get(arr_i); // #2
+static_assert(var == arr_i[0], "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C
new file mode 100644
index 000000000..921819622
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct IsNegative {
+ int dummy; // Workaround for empty class problem
+ constexpr IsNegative() : dummy(0) {}
+ constexpr bool operator()(const T& x) {
+ return x < T(0);
+ }
+};
+
+template<class T, int N, class Pred>
+constexpr bool has_neg(T (&x)[N], Pred p) {
+ return p(x[0]) || p(x[1]);
+}
+
+constexpr int a[] = {1, -2};
+
+constexpr auto answer = has_neg(a, IsNegative<int>{}); // #1
+
+static_assert(answer, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C
new file mode 100644
index 000000000..2338f70f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+constexpr bool is_negative(int x) {
+ return x < 0;
+}
+
+constexpr bool do_has_neg(const int* x, bool(*p)(int)) {
+ return p(x[0]) || p(x[1]); // Line 6
+}
+
+constexpr bool has_neg(const int (&x)[2], bool(*p)(int)) {
+ return do_has_neg(x, p); // Line 10
+}
+
+constexpr int a[] = {1, -2};
+
+constexpr auto answer = has_neg(a, is_negative); // Line 15
+
+static_assert(answer, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C
new file mode 100644
index 000000000..3dd3f34e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+constexpr const int do_last(const int* x, int n) {
+ return x[n - 1];
+}
+
+struct IsNegative {
+ constexpr bool operator()(const int& x) {
+ return x < 0;
+ }
+};
+
+template<int N, class Pred>
+constexpr bool has_neg(const int (&x)[N], Pred p) {
+ return p(do_last(x, N)); // Line 13
+}
+
+constexpr int a[] = {1, -2};
+
+constexpr auto answer = has_neg(a, IsNegative{}); // Line 18
+
+static_assert(answer, "Error");
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C
new file mode 100644
index 000000000..eec32d672
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+constexpr T do_last(T* x, int n) {
+ return x[n - 1]; //
+}
+
+template<class T, int N>
+constexpr T last(T (&x)[N]) {
+ return do_last(x, N);
+}
+
+constexpr bool is_negative(int x) { return x < 0; }
+
+template<class T>
+struct IsNegative {
+ constexpr bool operator()(const T& x) {
+ return x < T(0);
+ }
+};
+
+template<class T, int N, class Pred>
+constexpr bool has_neg(T (&x)[N], Pred p) {
+ return p(last(x)); // Line 22
+}
+
+constexpr int a[] = {1, -2};
+
+constexpr auto answer1 = has_neg(a, IsNegative<int>{}); // Line 27
+constexpr auto answer2 = has_neg(a, is_negative);
+
+static_assert(answer2 == answer1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C
new file mode 100644
index 000000000..3a483989c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+
+typedef decltype(sizeof(char)) size_type;
+
+template<class T, size_type N>
+constexpr size_type size(T (&)[N]) { return N; }
+
+double array_double[] = { 1.0, 2.0, 3.0 };
+
+constexpr auto sz_d = size(array_double);
+
+static_assert(sz_d == 3, "Array size failure");
+
+void f(bool (&param)[2]) {
+ static_assert(size(param) == 2, "Array size failure"); // Line 13
+ short data[] = {-1, 2, -45, 6, 88, 99, -345};
+ static_assert(size(data) == 7, "Array size failure");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C
new file mode 100644
index 000000000..93f914114
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C
@@ -0,0 +1,20 @@
+// PR c++/49290
+// { dg-do compile { target c++11 } }
+
+typedef unsigned T;
+struct S
+{
+ constexpr T foo (void);
+ unsigned s1[16];
+};
+
+constexpr T
+S::foo ()
+{
+ return *(T *) (s1 + 10);
+}
+
+constexpr S s = { 0,1,2,3,4,5,6,7,8,9,10 };
+
+#define SA(X) static_assert ((X), #X)
+SA(s.foo() == 10);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C
new file mode 100644
index 000000000..ee425ea1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C
@@ -0,0 +1,54 @@
+// PR c++/57047
+// { dg-require-effective-target c++11 }
+
+template <typename>
+struct A;
+template <typename T>
+struct A <T &>
+{
+ typedef T type;
+};
+template <typename T>
+constexpr T && foo (typename A <T>::type & __t) noexcept
+{
+ return static_cast <T &&>(__t);
+}
+template <class T1, class T2>
+struct B
+{
+ T1 t1;
+ T2 t2;
+ template <class U>
+ constexpr B (U && __x, const T2 & __y) : t1 (foo <U> (__x)), t2 (__y) {}
+};
+static inline constexpr bool
+fn1 (const char c)
+{
+ return ('0' <= c) && (c <= '9');
+}
+static inline constexpr bool
+fn2 (const char c)
+{
+ return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'));
+}
+static constexpr bool
+fn3 (const char *const x)
+{
+ return (x[1] == '\0' && x[0] == ']') ? true : (!fn1 (x[0])) ? false : fn3 (&x[1]);
+}
+static constexpr bool
+fn4 (const char *const x)
+{
+ return (x[0] == '\0') ? fn3 (&x[1]) : fn4 (&x[1]);
+}
+static inline constexpr bool
+fn5 (const char *const x)
+{
+ return fn2 (x[0]) ? fn4 (x) : false;
+}
+struct C final
+{
+ constexpr C (const char *const t1) : c (fn5 (t1) ? 199 : 69) {}
+ unsigned c;
+};
+B <C, C> p ("a", "b");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C
new file mode 100644
index 000000000..02fba9554
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+template <const int I[2]> struct A { int ir[I[0]]; };
+extern constexpr int ar[2] = { 1, 2 };
+A<ar> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C
new file mode 100644
index 000000000..1614d6bd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler-not "static_initialization" } }
+
+struct A
+{
+ int i;
+ constexpr A(): i(0) { }
+};
+
+struct B
+{
+ A a[4];
+};
+
+extern const B b{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C
new file mode 100644
index 000000000..ad6b12171
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C
@@ -0,0 +1,19 @@
+// PR c++/46348
+// { dg-do compile { target c++11 } }
+
+template<__SIZE_TYPE__ _Nw>
+ struct _Base
+ {
+ typedef unsigned long _WordT;
+
+ _WordT _M_w[_Nw];
+
+ constexpr
+ _Base()
+ : _M_w() { }
+ };
+
+int main()
+{
+ _Base<256> bs;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C
new file mode 100644
index 000000000..12f42f183
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C
@@ -0,0 +1,14 @@
+// PR c++/48132
+// { dg-do compile { target c++11 } }
+
+struct C
+{
+ constexpr C (int x) : c (x) {}
+ int c;
+};
+
+void
+foo ()
+{
+ C a[] = { C (0) };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C
new file mode 100644
index 000000000..aa9526494
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C
@@ -0,0 +1,14 @@
+// PR c++/49924
+// { dg-do compile { target c++11 } }
+
+struct A { constexpr A() { } };
+
+struct B {
+ A array[1]; //non-static member array of a literal type w constexpr ctor
+ constexpr B() : array{} { } // here is the problem
+};
+
+int main()
+{
+ constexpr B b{}; // won't compile
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C
new file mode 100644
index 000000000..4605b4be9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C
@@ -0,0 +1,9 @@
+// PR c++/56582
+// { dg-do compile { target c++11 } }
+
+// Reliable ICE
+constexpr int n[3] = {};
+constexpr int k = n[-1]; // { dg-error "negative" }
+
+// Some random byte
+constexpr char c = "foo"[-1000]; // { dg-error "negative" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C
new file mode 100644
index 000000000..cda0e926b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C
@@ -0,0 +1,63 @@
+// { dg-do compile { target c++11 } }
+
+//A few constexpr's
+constexpr int foo() { return __alignof__(int); }
+
+template<typename T>
+constexpr int fooT() { return __alignof__(T); }
+
+template<int N>
+constexpr int fooN() { return N; }
+
+//Now the attributes
+
+//with normal variables,
+int a __attribute__((aligned(foo())));
+int b __attribute__((aligned(fooT<int>())));
+int c __attribute__((aligned(fooN<__alignof__(int)>())));
+
+//with variables inside a template,
+template <typename T>
+void fun()
+{
+ T a __attribute__((aligned(foo())));
+ T b __attribute__((aligned(fooT<T>())));
+ T c __attribute__((aligned(fooN<__alignof__(T)>())));
+ T d __attribute__((aligned(fooT<int>())));
+ T e __attribute__((aligned(fooN<__alignof__(int)>())));
+}
+
+//instantiate it,
+void bar()
+{
+ fun<int>();
+}
+
+//with classes
+struct __attribute__((aligned(foo()))) S0
+{
+ char dummy;
+};
+S0 s0;
+
+struct __attribute__((aligned(fooT<int>()))) S1
+{
+ char dummy;
+};
+S1 s1;
+
+//and class templates
+template <typename T>
+struct __attribute__((aligned(foo()))) S2
+{
+ char dummy;
+};
+
+S2<int> s2;
+
+template <typename T>
+struct __attribute__((aligned(fooT<T>()))) S3
+{
+ char dummy;
+};
+S3<int> s3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C
new file mode 100644
index 000000000..c174cb3eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target init_priority } }
+// { dg-require-effective-target c++11 }
+
+struct t { t(); };
+
+constexpr int prio = 123;
+constexpr int size = 8;
+constexpr int pos = 1;
+enum A { zero = 0, one, two };
+__attribute__((init_priority(prio))) t a;
+
+enum class E1 : int {
+ first = 101,
+ second,
+ third,
+};
+__attribute__((init_priority(E1::second))) t b; // Should not compile?
+
+enum E2 {
+ E2_first = 141,
+ E2_second,
+ E2_third,
+};
+__attribute__((init_priority(E2_second))) t c;
+
+void* my_calloc(unsigned, unsigned) __attribute__((alloc_size(pos,two)));
+void* my_realloc(void*, unsigned) __attribute__((alloc_size(two)));
+
+typedef char vec __attribute__((vector_size(size)));
+
+void f(char*) __attribute__((nonnull(pos)));
+
+char g __attribute__((aligned(size)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C
new file mode 100644
index 000000000..ae270dc1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C
@@ -0,0 +1,2 @@
+// { dg-do compile { target c++11 } }
+constexpr auto value = 0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C
new file mode 100644
index 000000000..5f0b5cacf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C
@@ -0,0 +1,17 @@
+// Test base/member class and static_assert with constexpr
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int i;
+ constexpr A(int _i): i(_i) { }
+};
+struct B: A {
+ A a;
+ int j;
+ constexpr B(int _ib, int _ia, int _j): A(_ib), a(_ia), j(_j) { }
+};
+
+constexpr B b (12, 24, 36);
+
+#define SA(X) static_assert (X, #X)
+SA(b.i==12 && b.a.i==24 && b.j==36);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C
new file mode 100644
index 000000000..217687a3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C
@@ -0,0 +1,19 @@
+// PR c++/46293
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+};
+
+struct C
+{
+ int i;
+ constexpr C(int i): i(i) {}
+};
+
+struct B: A, C
+{
+ constexpr B(): A(), C(42) { }
+};
+
+constexpr B b{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C
new file mode 100644
index 000000000..db867d4ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C
@@ -0,0 +1,26 @@
+// PR c++/46526
+// { dg-do run { target c++11 } }
+
+struct Base
+{
+ virtual int getid () = 0;
+};
+
+struct A : public Base
+{
+ virtual int getid () { return 1; }
+};
+
+struct B : public Base
+{
+ virtual int getid () { throw "here"; }
+};
+
+int
+main ()
+{
+ A a;
+ B b;
+ Base& ar = a;
+ ar.getid ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C
new file mode 100644
index 000000000..ab664394e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C
@@ -0,0 +1,27 @@
+// PR c++/46626
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ virtual void f () = 0;
+ virtual ~A () { }
+};
+
+struct B : A
+{
+ virtual void f () { }
+};
+
+static void
+foo (A *a)
+{
+ a->f ();
+}
+
+int
+main ()
+{
+ B b;
+ foo (&b);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C
new file mode 100644
index 000000000..a50ac3636
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C
@@ -0,0 +1,10 @@
+// PR c++/46369
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ unsigned i : 1;
+};
+
+constexpr A f() { return { 1 }; }
+constexpr bool b = (f().i == 1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C
new file mode 100644
index 000000000..5b667208e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C
@@ -0,0 +1,18 @@
+// PR c++/49136
+// { dg-do compile { target c++11 } }
+
+struct day
+{
+ unsigned d : 5;
+ unsigned n : 3;
+ constexpr explicit day (int dd) : d(dd), n(7) {}
+};
+
+struct date {
+ int d;
+ constexpr date (day dd) : d(dd.n != 7 ? 7 : dd.d) {}
+};
+
+constexpr day d(0);
+constexpr date dt(d);
+static_assert (dt.d == 0, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C
new file mode 100644
index 000000000..c393db4e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C
@@ -0,0 +1,32 @@
+// PR c++/49136
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ unsigned : 1; unsigned s : 27; unsigned : 4;
+ constexpr S (unsigned int x) : s(x) {}
+};
+
+template <typename S>
+struct T
+{
+ unsigned int t;
+ constexpr T (S s) : t(s.s != 7 ? 0 : s.s) {}
+ constexpr T (S s, S s2) : t(s.s != s2.s ? 0 : s.s) {}
+};
+
+constexpr S s (7), s2 (7);
+constexpr T<S> t (s), t2 (s, s2);
+static_assert (t.t == 7, "Error");
+static_assert (t2.t == 7, "Error");
+
+struct U
+{
+ int a : 1; int s : 1;
+ constexpr U (int x, int y) : a (x), s (y) {}
+};
+
+constexpr U u (0, -1), u2 (-1, -1);
+constexpr T<U> t3 (u), t4 (u, u2);
+static_assert (t3.t == 0, "Error");
+static_assert (t4.t == -1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C
new file mode 100644
index 000000000..d663f8823
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C
@@ -0,0 +1,25 @@
+// PR c++/49813
+// { dg-do compile { target c++11 } }
+
+inline constexpr bool
+isinf(long double __x)
+{ return __builtin_isinf(__x); }
+
+inline constexpr bool
+isinf(double __x)
+{ return __builtin_isinf(__x); }
+
+inline constexpr bool
+isnan(long double __x)
+{ return __builtin_isnan(__x); }
+
+int main()
+{
+ constexpr long double num1 = __builtin_isinf(1.l); // Ok.
+
+ constexpr long double num2 = isinf(1.l); // Error.
+
+ constexpr double num3 = isinf(1.); // Ok.
+
+ constexpr long double num4 = isnan(1.l); // Ok.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C
new file mode 100644
index 000000000..dde38f05a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C
@@ -0,0 +1,16 @@
+// PR c++/54021
+// { dg-do compile { target c++11 } }
+
+extern int nonconst_func(int);
+constexpr int identity(int x) { return x; }
+constexpr int zero() { return identity(0); }
+constexpr int one() { return identity(1); }
+
+// These are the same. Only the latter is accepted, though.
+constexpr int rejected_const_4(int x)
+{ return __builtin_constant_p(x) ? 4 : nonconst_func(x); }
+constexpr int accepted_const_4(int x)
+{ return identity(__builtin_constant_p(x)) ? 4 : nonconst_func(x); }
+
+// This is rejected. I would like it to work.
+constexpr int four = accepted_const_4(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C
new file mode 100644
index 000000000..8038b8814
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C
@@ -0,0 +1,9 @@
+// PR c++/51433
+// { dg-do compile { target c++11 } }
+
+constexpr int f();
+constexpr int g() { return f(); }
+extern const int n = g(); // dynamic initialization
+constexpr int f() { return 42; }
+extern const int m = g();
+static_assert(m == 42, "m == 42");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C
new file mode 100644
index 000000000..bfba6fc9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ ~A();
+};
+
+constexpr int i = A().i; // { dg-error "non-literal" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C
new file mode 100644
index 000000000..fa393484d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C
@@ -0,0 +1,18 @@
+// Make sure C99 complex works with constexpr
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct complex
+{
+ typedef float value_type;
+ typedef __complex__ float _ComplexT;
+
+ constexpr complex(_ComplexT __z) : _M_value(__z) { }
+
+ constexpr complex(float __r = 0.0f, float __i = 0.0f)
+ : _M_value(__r + __i * 1.0fi) { }
+
+private:
+ _ComplexT _M_value;
+};
+constexpr complex c1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C
new file mode 100644
index 000000000..bfe4e13d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int f()
+{
+ { // { dg-error "" }
+ return 1;
+ }
+ { } // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C
new file mode 100644
index 000000000..388a73488
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+// Core DR 948
+
+constexpr int something() { return 3; }
+
+int main() {
+ if (constexpr long v = something()) {}
+ if (static long v = something()) { } // { dg-error "decl-specifier invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C
new file mode 100644
index 000000000..3ce9b4c45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C
@@ -0,0 +1,18 @@
+// PR c++/48909
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert((X),#X)
+
+constexpr int const * is_sorted_until(int const * first, int const * last)
+{
+ return first == last || first + 1 == last ? last
+ : (*(first + 1) < *first) != false ? first + 1
+ : is_sorted_until(first + 1, last);
+}
+
+int main()
+{
+ static constexpr int array[2] = {0, 1};
+ constexpr int const * last = is_sorted_until(array, array + 2);
+ SA(last==array+2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C
new file mode 100644
index 000000000..6ee72256e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C
@@ -0,0 +1,7 @@
+// PR c++/54086
+// { dg-do compile { target c++11 } }
+
+static constexpr const char Data[] = {
+ 'D', 'A', 'T', 'A',
+};
+static constexpr const char *data_func() { return Data; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C
new file mode 100644
index 000000000..659e733cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ constexpr A() { } // { dg-error "uninitialized member .A::i" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C
new file mode 100644
index 000000000..1dbc3355e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C
@@ -0,0 +1,6 @@
+// PR c++/52599
+// { dg-do compile { target c++11 } }
+
+struct foo {
+ constexpr foo() try { } catch(...) { }; // { dg-error "constexpr" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C
new file mode 100644
index 000000000..e22c55f7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C
@@ -0,0 +1,16 @@
+// PR c++/55856
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(const char *);
+};
+
+template <class T>
+struct B
+{
+ T t;
+ template <class U> constexpr B(U&& u): t(u) { }
+};
+
+B<A&&> b("");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C
new file mode 100644
index 000000000..45e1ed27f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C
@@ -0,0 +1,14 @@
+// PR c++/55753
+// { dg-do compile { target c++11 } }
+
+template <typename Tp>
+struct C {
+ constexpr C(const Tp& r) { }
+};
+
+template <typename Tp>
+struct B {
+ B() {
+ C<double> cpl = C<double>((true ? 1.0 : C<double>()));
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C
new file mode 100644
index 000000000..299db8832
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C
@@ -0,0 +1,15 @@
+// PR c++/55753
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ double r,i;
+ constexpr A(double r = 0.0, double i = 0.0): r(r), i(i) {}
+};
+
+template <typename Tp>
+struct B {
+ B() {
+ A((true ? 1.0 : A()));
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C
new file mode 100644
index 000000000..30b01091f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+};
+
+struct B : A
+{
+ constexpr B(): A() { } // { dg-error "A::A" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C
new file mode 100644
index 000000000..36d1de4ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C
@@ -0,0 +1,10 @@
+// PR c++/46348
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int arr[1];
+
+ constexpr A()
+ : arr() { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C
new file mode 100644
index 000000000..c4947126b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C
@@ -0,0 +1,15 @@
+// PR c++/46873
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ int i:1;
+};
+
+struct T
+{
+ const S s;
+ constexpr T (S a = S ()) : s (a) { }
+};
+
+T t;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C
new file mode 100644
index 000000000..abfc72c8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C
@@ -0,0 +1,30 @@
+// PR c++/46877
+// { dg-do compile { target c++11 } }
+
+struct new_allocator
+{
+ constexpr new_allocator ();
+};
+
+struct string
+{
+ constexpr string ()
+ {
+ }
+ new_allocator a;
+};
+
+struct pair
+{
+ const string first;
+ constexpr pair ()
+ {
+ }
+};
+
+constexpr
+new_allocator::new_allocator ()
+{
+}
+
+pair p;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C
new file mode 100644
index 000000000..fd87fe495
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C
@@ -0,0 +1,10 @@
+// PR c++/47041
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-elide-constructors" }
+
+struct S
+{
+ int i;
+};
+
+S s = S ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C
new file mode 100644
index 000000000..5d18e5643
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C
@@ -0,0 +1,18 @@
+// PR c++/47199
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-elide-constructors" }
+
+template < int > struct S
+{
+ constexpr S (int r):rr (r)
+ {
+ }
+ S (const S &) = default;
+ static constexpr S s ()
+ {
+ return -1;
+ }
+ int rr;
+};
+
+static const int d = S < 0 >::s ().rr;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C
new file mode 100644
index 000000000..5b75e6475
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C
@@ -0,0 +1,7 @@
+// PR c++/46466
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-elide-constructors" }
+
+struct S { bool b; };
+constexpr S f() { return S{true}; }
+static_assert(f().b, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C
new file mode 100644
index 000000000..0763ee4bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C
@@ -0,0 +1,19 @@
+// PR c++/47774
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A() {}
+};
+
+template <typename T>
+struct array
+{
+ constexpr array() : mem() {}
+ T mem[7];
+};
+
+int main()
+{
+ array<A> ar;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C
new file mode 100644
index 000000000..f49c56a4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// 1
+struct A2
+{
+ static const int eights = 888;
+ static constexpr int nines = 999;
+};
+
+A2 a;
+
+// 2
+struct pixel
+{
+ int x, y;
+};
+constexpr pixel ur = { 1294, 1024 }; // OK
+
+// p4
+struct Length
+{
+ explicit constexpr Length(int i = 0) : val(i) { }
+private:
+ int val;
+};
+
+constexpr int myabs(int x)
+{ return x < 0 ? -x : x; } // OK
+
+Length l(myabs(-97)); // OK
+
+// p6
+class debug_flag
+{
+public:
+ explicit debug_flag(bool);
+ constexpr bool is_on(); // { dg-error "enclosing class .* not a literal type" }
+private:
+ bool flag;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C
new file mode 100644
index 000000000..312760a37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C
@@ -0,0 +1,46 @@
+// { dg-do compile { target c++11 } }
+
+template<typename _Tp, _Tp v>
+ struct A3
+ {
+ typedef _Tp value_type;
+ typedef A3<value_type,v> type;
+
+ static constexpr value_type value = v;
+
+ constexpr operator value_type() { return value; }
+ };
+
+// Partial specialization.
+template<typename _Tp, _Tp v>
+ struct A3<_Tp*, v>
+ {
+ typedef _Tp* value_type;
+ typedef A3<value_type,v> type;
+
+ static constexpr value_type value = v;
+
+ constexpr operator value_type() { return value; }
+ };
+
+// Explicit specialization.
+template<>
+ struct A3<unsigned short, 0>
+ {
+ typedef unsigned short value_type;
+ typedef A3<value_type, 0> type;
+
+ static constexpr value_type value = 0;
+
+ constexpr operator value_type() { return value; }
+ };
+
+// Explicitly instantiate.
+template struct A3<int, 415>;
+
+// Extern explicitly instantiate.
+extern template struct A3<int, 510>;
+
+// Use.
+A3<int, 1111> a31;
+A3<char, 9999> a32; // { dg-warning "overflow" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C
new file mode 100644
index 000000000..2c88fe689
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C
@@ -0,0 +1,9 @@
+// PR c++/46930
+// { dg-do compile { target c++11 } }
+
+struct S {
+ static constexpr int size; // { dg-error "must have an initializer" "must have" }
+};
+
+const int limit = 2 * S::size;
+constexpr int S::size = 256;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C
new file mode 100644
index 000000000..eaa3fbdfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C
@@ -0,0 +1,12 @@
+// PR c++/46335
+// { dg-do compile { target c++11 } }
+
+struct T { };
+struct A {
+ A(const T &tr =T()) {}
+};
+struct B {
+ A k;
+};
+B kk_;
+A fk_;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C
new file mode 100644
index 000000000..f1ca05fe9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C
@@ -0,0 +1,44 @@
+// PR c++/46368
+// { dg-do compile { target c++11 } }
+
+class A;
+
+class B
+{
+ A foo ();
+ A bar ();
+};
+
+class C
+{
+};
+
+struct D
+{
+ D (C);
+};
+
+struct A : D
+{
+ A (const C & n) : D (n) {}
+};
+
+A baz (const char *, A = C ());
+
+A
+B::foo ()
+{
+ try
+ {
+ baz ("foo");
+ }
+ catch (...)
+ {
+ }
+}
+
+A
+B::bar ()
+{
+ baz ("bar");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C
new file mode 100644
index 000000000..a67505d74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int i;
+ constexpr A():i(42) { };
+};
+struct B: A { };
+constexpr int f(B b) { return b.i; }
+
+struct C { C(); }; // { dg-message "calls non-constexpr" }
+struct D: C { }; // { dg-message "no constexpr constructor" }
+constexpr int g(D d) { return 42; } // { dg-error "invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C
new file mode 100644
index 000000000..68d50b61b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C
@@ -0,0 +1,22 @@
+// PR c++/53464
+// { dg-do compile { target c++11 } }
+
+template <int value>
+struct bar
+{
+ static constexpr int get()
+ {
+ return value;
+ }
+};
+
+template <typename A, int value = A::get()>
+struct foo
+{
+};
+
+int main()
+{
+ typedef foo<bar<0>> type;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C
new file mode 100644
index 000000000..f32dde60e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C
@@ -0,0 +1,15 @@
+// PR c++/51526
+// { dg-do compile { target c++11 } }
+
+const int j = 42;
+
+struct S {
+ int i;
+ constexpr S(int i) : i(i) {}
+ constexpr S() : S(j) {}
+};
+
+constexpr S s{};
+
+#define SA(X) static_assert((X),#X)
+SA(s.i == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C
new file mode 100644
index 000000000..35439423f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C
@@ -0,0 +1,28 @@
+// PR c++/51723
+// { dg-do compile { target c++11 } }
+
+template <int... V>
+struct A
+{
+ static constexpr int a[sizeof...(V)] = { V... };
+};
+
+template <int... V> constexpr int A<V...>::a[];
+
+struct B
+{
+ const int* const b;
+
+ template <unsigned int N>
+ constexpr B(const int(&b)[N])
+ : b(b)
+ { }
+
+ template <int... V>
+ constexpr B(A<V...>)
+ : B(A<V...>::a)
+ { }
+};
+
+constexpr B b1 = A<10, 20, 30>::a;
+constexpr B b2 = A<10, 20, 30>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C
new file mode 100644
index 000000000..3cc4f55d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+constexpr bool never() = delete; // useless, but OK
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C
new file mode 100644
index 000000000..ce898abfc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ const int *p[2];
+};
+
+constexpr const int * f(const int *p) { return p; }
+
+int main()
+{
+ constexpr int i = 42;
+ constexpr int j = *&i; // OK
+ constexpr int k = *A{{&i}}.p[0]; // OK
+ constexpr int l = *f(&i); // OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
new file mode 100644
index 000000000..34cdb733e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C
@@ -0,0 +1,20 @@
+// Test that we explain why a template instantiation isn't constexpr
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ T t;
+ constexpr int f() { return 42; } // { dg-error "enclosing class" }
+};
+
+struct B { B(); operator int(); };
+
+constexpr A<int> ai = { 42 };
+constexpr int i = ai.f();
+
+constexpr int b = A<B>().f(); // { dg-error "non-constexpr function" }
+
+template <class T>
+constexpr int f (T t) { return 42; } // { dg-error "parameter" }
+constexpr int x = f(B()); // { dg-error "constexpr" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C
new file mode 100644
index 000000000..04db4b331
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C
@@ -0,0 +1,5 @@
+// PR c++/47207
+// { dg-do compile { target c++11 } }
+
+constexpr int X (X); // { dg-error "not usable" }
+// { dg-message "own initializer" "" { target *-*-* } 4 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
new file mode 100644
index 000000000..2a1897b6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C
@@ -0,0 +1,54 @@
+// PR c++/45923
+// { dg-do compile { target c++11 } }
+
+int f(int);
+
+template <class T>
+constexpr T g(T t) { return f(t); } // { dg-error "f.int" }
+
+int main()
+{
+ constexpr int i = g(1); // { dg-error "g.T" }
+}
+
+// --------------------
+
+struct complex // { dg-message "no constexpr constructor" }
+{
+ complex(double r, double i) : re(r), im(i) { }
+ constexpr double real() { return re; } // { dg-error "not a literal type" }
+ double imag() const { return im; }
+
+private:
+ double re;
+ double im;
+};
+
+constexpr complex co1(0, 1); // { dg-error "not literal" }
+constexpr double dd2 = co1.real(); // { dg-error "non-constexpr function" }
+
+// --------------------
+
+struct base // { dg-message "no constexpr constructor" }
+{
+ int _M_i;
+ base() : _M_i(5) { }
+};
+
+struct derived : public base // { dg-message "base class" }
+{
+ constexpr derived(): base() { } // { dg-error "non-constexpr function" }
+};
+
+constexpr derived obj; // { dg-error "not literal" }
+
+// --------------------
+
+struct Def
+{
+ int _M_i; // { dg-message "does not initialize" }
+
+ constexpr Def() = default; // { dg-error "implicit declaration is not constexpr" }
+};
+
+constexpr Def defobj; // { dg-error "uninitialized" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C
new file mode 100644
index 000000000..29f574df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C
@@ -0,0 +1,25 @@
+// Origin: PR c++/51633
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ ~A();
+};
+
+struct B
+{
+ A a;
+ constexpr B() {}
+};
+
+struct A1
+{
+ int a;
+ ~A1();
+};
+
+struct B1
+{
+ A1 a1;
+ constexpr B1() {} // { dg-error "uninitialized member" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C
new file mode 100644
index 000000000..c8043e3bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C
@@ -0,0 +1,48 @@
+// Origin: PR c++/51633
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr A() {}
+ ~A();
+};
+
+struct B
+{
+ A a;
+ A b;
+ A c;
+ constexpr B() {}
+};
+
+struct C
+{
+ A a;
+ constexpr C() {}
+};
+
+struct D
+{
+ constexpr D() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D1
+{
+ A a;
+ constexpr D1() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D2
+{
+ A a;
+ A b;
+ constexpr D2() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D3
+{
+ A a;
+ A b;
+ A c;
+ constexpr D3() { return;} // { dg-error "does not have empty body" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C
new file mode 100644
index 000000000..93224b0c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<class T> class my_limits {
+public:
+ static constexpr T min() throw() { return T(); }
+ static constexpr T max() noexcept { return T(); }
+};
+
+constexpr double var_min = my_limits<double>::min(); // #1 OK
+constexpr double var_max = my_limits<double>::max(); // #2 Error
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C
new file mode 100644
index 000000000..8c0783c9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+constexpr int ellipsis(...) { return 1; }
+
+constexpr int ellipsis_c = ellipsis(); // OK
+constexpr int ellipsis_c2 = ellipsis(42); // Internal error
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C
new file mode 100644
index 000000000..b6a5323b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+ A(const A&);
+ bool empty();
+};
+
+constexpr int ellipsis(...) { return 1; }
+
+static_assert(ellipsis(A().empty()), "Error"); // { dg-error "non-constant condition|empty" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C
new file mode 100644
index 000000000..42f873bb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+struct Empty {};
+
+constexpr bool f(Empty) { return true; }
+
+constexpr bool x(f(Empty{}));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C
new file mode 100644
index 000000000..51f3f554d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+struct IsLiteral {};
+
+constexpr IsLiteral bar(IsLiteral x) { return x; }
+
+constexpr auto xy = bar(IsLiteral()); // #1 Error, but should be OK
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C
new file mode 100644
index 000000000..a9cd98fa4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct IsLiteral {};
+
+constexpr auto ab = IsLiteral();
+
+constexpr IsLiteral bar(IsLiteral x) { return x; }
+
+constexpr auto xy = bar(ab);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C
new file mode 100644
index 000000000..f61aa6932
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C
@@ -0,0 +1,34 @@
+// { dg-do compile { target c++11 } }
+
+typedef decltype(sizeof(char)) size_type;
+
+template<class T, size_type N, class Pred>
+constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p);
+
+template<class T, size_type N, class Pred>
+constexpr size_type do_find_if(T (&x)[N], size_type i, Pred p) {
+ return p(x[i]) ? i : do_find_if_or_stop(x, i + 1, p); // line 8
+}
+
+template<class T, size_type N, class Pred>
+constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p) {
+ return i == N ? N : do_find_if(x, i, p);
+} // Line 14
+
+template<class T, size_type N, class Pred>
+constexpr size_type find_if(T (&x)[N], Pred p) {
+ return do_find_if(x, 0, p); // Line 18
+}
+
+constexpr long items_long[] = {1, 2, 3, 4, -5, 6, -7, 8};
+
+template<class T>
+struct IsNegative {
+ constexpr bool operator()(const T& x) {
+ return x < T(0);
+ }
+};
+
+constexpr auto pos1 = find_if(items_long, IsNegative<long>{}); // Line 30
+
+static_assert(pos1 == 4, "find_if failure");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C
new file mode 100644
index 000000000..e74f5ba1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+struct A { };
+struct B: A { };
+
+constexpr B b { };
+constexpr A a = b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C
new file mode 100644
index 000000000..be9a6c6ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C
@@ -0,0 +1,11 @@
+// PR c++/55993
+// { dg-do compile { target c++11 } }
+
+struct A {};
+struct B:A {};
+struct C:A {};
+struct D:B,C {};
+
+constexpr D d {};
+constexpr const C& e=d; // OK
+constexpr auto f=static_cast<const C&>(d); // FAIL
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
new file mode 100644
index 000000000..e541bf9fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
@@ -0,0 +1,93 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// 4.1 constant-expression functions
+// 1 examples
+
+
+
+
+
+// 2 defined before first use
+// NOTE: this is only needed in contexts that require a constant-expression
+struct S {
+ constexpr int twice();
+ constexpr int t(); // { dg-message "used but never defined" }
+private:
+ static constexpr int val = 7; // constexpr variable
+};
+
+constexpr int S::twice() { return val + val; }
+constexpr S s = { };
+int x1 = s.twice(); // ok
+int x2 = s.t(); // error: S::t() not defined
+constexpr int x2a = s.t(); // { dg-error "S::t" } error: S::t() not defined
+constexpr int ff(); // ok
+constexpr int gg(); // ok
+int x3 = ff(); // error: ff() not defined
+constexpr int x3a = ff(); // { dg-error "ff" } error: ff() not defined
+constexpr int ff() { return 1; } // too late
+constexpr int gg() { return 2; }
+int x4 = gg(); // ok
+
+
+// 4.2 const-expression data
+
+// 2
+// storage not allocated untill address taken
+constexpr double x = 9484.748;
+const double* p = &x; // the &x forces x into memory
+
+// 4.3 constant-expression constructors
+
+// 1
+struct complex {
+ constexpr complex(double r, double i) : re(r), im(i) { }
+ constexpr double real() { return re; }
+ constexpr double imag() { return im; }
+private:
+ double re;
+ double im;
+};
+constexpr complex I(0, 1); // OK -- literal complex
+
+
+// 2 invoked with non-const args
+double x5 = 1.0; // { dg-message "not declared .constexpr" }
+constexpr complex unit(x5, 0); // { dg-error "x5|argument" } error: x5 non-constant
+const complex one(x5, 0); // OK, ‘‘ordinary const’’ -- dynamic
+ // initialization
+constexpr double xx = I.real(); // OK
+complex z(2, 4); // OK -- ordinary variable
+
+// 3
+constexpr complex v[] = {
+ complex(0, 0), complex(1, 1), complex(2, 2)
+};
+constexpr double x6 = v[2].real(); // OK
+
+// 4
+ constexpr int i = 98;
+ typedef __INTPTR_TYPE__ intptr_t;
+ constexpr intptr_t ip = (intptr_t) &i; // { dg-error "constant" }
+
+// 4.3.2 copy-constructor
+constexpr complex operator+(complex z, complex w)
+{
+ return complex(z.real() + w.real(), z.imag() + w.imag()); // fine
+}
+constexpr complex I2 = I + I; // OK
+struct resource {
+ int id;
+ constexpr resource(int i) : id(i) { } // fine
+ resource(const resource& r) : id(r.id) // oops, not constexpr
+ {
+ //cout << id << " copied" << endl;
+ }
+};
+constexpr resource f(resource d)
+{ return d; } // { dg-error "non-constexpr" }
+constexpr resource d = f(9); // { dg-message "constexpr" }
+
+// 4.4 floating-point constant expressions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C
new file mode 100644
index 000000000..9e99d6da4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// 4.5.3 constant expressions
+
+// p 4
+struct A {
+ constexpr A(int i) : val(i) { }
+ constexpr operator int() { return val; }
+ constexpr operator long() { return -1; }
+private:
+ int val;
+};
+
+template<int I> struct X { static const int i = I; };
+constexpr A a = 42;
+
+X<a> x; // OK: unique conversion to int
+int ar[X<a>::i]; // also OK
+int ary[a]; // { dg-error "ambiguous|conversion|array" } ambiguous conversion
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
new file mode 100644
index 000000000..3e2685b1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
@@ -0,0 +1,31 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-ftrack-macro-expansion=0" }
+
+#define SA(X) static_assert (X, #X)
+
+struct A
+{
+ int i;
+ constexpr A(int _i) { i = _i; } // { dg-error "empty body|uninitialized member" }
+};
+
+template <class T>
+struct B
+{
+ T t;
+ constexpr B(T _t): t(_t) { }
+};
+
+B<int> b(1); // { dg-message "not declared .constexpr" }
+SA(b.t==1); // { dg-error "non-constant condition|'b'" }
+constexpr B<int> b2(1);
+SA(b2.t==1);
+
+template <class T>
+constexpr T f(T a, T b)
+{
+ typedef T myT;
+ return a + b;
+}
+
+SA(f(1,2)==3);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C
new file mode 100644
index 000000000..7a9086cb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr A(int) { }
+ constexpr operator int() { return 1; };
+};
+
+template <class T>
+struct B
+{
+ static constexpr A a = A(1);
+ int ar[a];
+};
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C
new file mode 100644
index 000000000..08a0fe022
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+// Error: Explicit instantiation of a function template shall not use the
+// inline or constexpr specifiers
+template<class T> constexpr inline T bar(T x) { return x; }
+template constexpr inline float bar(float x); // { dg-error "specifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C
new file mode 100644
index 000000000..f5137b352
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template<class T> constexpr inline T bar(T x) { return x; }
+
+template short bar(short x); // #EI
+
+constexpr auto yz = bar(0); // OK
+constexpr auto ab = bar(short()); // #1 Error, but should be OK
+constexpr auto mn = bar(short{}); // #2 Error, but should be OK
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C
new file mode 100644
index 000000000..2b08478ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+constexpr bool is_negative(int x) { return x < 0; }
+
+constexpr bool check(int x, bool (*p)(int)) { return p(x); } // #1
+
+static_assert(check(-2, is_negative), "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C
new file mode 100644
index 000000000..36799b435
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T> void f(T);
+
+template <class T> class A {
+ friend constexpr void f<>(int); // { dg-error "'constexpr' is not allowed" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C
new file mode 100644
index 000000000..55a2329eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C
@@ -0,0 +1,23 @@
+// PR c++/48948
+// { dg-do compile { target c++11 } }
+
+struct A { A(); };
+
+struct B {
+ friend constexpr int f(B) { return 0; } // OK
+ friend constexpr int f(A) { return 0; } // { dg-error "constexpr" }
+};
+
+template <class T>
+struct C
+{
+ friend constexpr int f(C) { return 0; }
+ friend constexpr int g(C, A) { return 0; } // { dg-error "double" }
+ constexpr int m(C) { return 0; }
+ constexpr int m(A) { return 0; } // { dg-error "double" }
+};
+
+constexpr int i = f(C<int>());
+constexpr int j = C<int>().m(C<int>());
+constexpr int k = C<double>().m(A()); // { dg-error "constexpr" }
+constexpr int l = g(C<double>(),A()); // { dg-error "constexpr" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C
new file mode 100644
index 000000000..ce4520d55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+constexpr int veryabs(int x) { return x < 0 ? -x : x; }
+
+constexpr long long_max() { return 2147483647; }
+
+constexpr int verysquare(int x) { return x * x; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
new file mode 100644
index 000000000..8cb32c9ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C
@@ -0,0 +1,49 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// Mess with the builtin by redeclaring.
+constexpr int abs(int x) { return x < 0 ? -x : x; }
+
+extern "C"
+{
+ constexpr float
+ squaref(float x) { return x * x; }
+}
+
+// implicitly inline, already: warn?
+inline constexpr double
+squared(double x) { return x * x; }
+
+constexpr int squarei(int x) { return x * x; }
+extern const int side; // { dg-message "not initialized with a constant expression" }
+constexpr int area = squarei(side); // { dg-error "side|argument" }
+// error: squarei(side) is not a constant expression
+
+int next(constexpr int x) // { dg-error "parameter" }
+{ return x + 1; }
+
+constexpr void f(int x) // { dg-error "return type .void" }
+{ /* ... */ }
+
+constexpr int prev(int x)
+{ return --x; } // { dg-error "--" }
+
+constexpr int g(int x, int n) // error: body not just ‘‘return expr’’
+{
+ int r = 1;
+ while (--n > 0) r *= x;
+ return r;
+} // { dg-error "not a return-statement" }
+
+constexpr int
+bar(int x, int y) { return x + y + x * y; } // { dg-message "previously" }
+
+int bar(int x, int y) // { dg-error "redefinition" }
+{ return x * 2 + 3 * y; }
+
+constexpr int twice(int x); // { dg-message "never defined" }
+enum { bufsz = twice(256) }; // { dg-error "" } twice() isn’t (yet) defined
+
+constexpr int fac(int x)
+{ return x > 2 ? x * fac(x - 1) : 1; } // OK
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C
new file mode 100644
index 000000000..ea4f4abae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C
@@ -0,0 +1,29 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// function template 1
+template<typename T>
+ constexpr int bytesize(T t)
+ { return sizeof (t); } // OK
+
+char buf[bytesize(0)]; // OK -- not C99 VLA
+
+
+// function template 2
+template<typename _Tp>
+ constexpr _Tp
+ square(_Tp x) { return x; }
+
+// Explicit specialization
+template<>
+ constexpr unsigned long
+ square(unsigned long x) { return x * x; }
+
+// Explicit instantiation
+template int square(int);
+
+class A { };
+template A square(A);
+
+template long square(long);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C
new file mode 100644
index 000000000..39be3ed57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> struct A
+{
+ constexpr T f ();
+};
+
+int g();
+
+// We should complain about this.
+template<> constexpr int A<int>::f()
+{ return g(); } // { dg-error "non-constexpr" }
+
+// But not about this.
+struct B
+{
+ int i;
+ constexpr B(int i = g()):i(i) { }
+};
+struct C: B { };
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C
new file mode 100644
index 000000000..fb7570f5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C
@@ -0,0 +1,11 @@
+// We used to crash on this instead of giving a decent error.
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+
+struct B {
+ const A *a;
+ constexpr B(const A& a): a(&a) { }
+};
+
+constexpr B b{A{42}}; // { dg-error "constant|expansion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C
new file mode 100644
index 000000000..f6fc80cdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C
@@ -0,0 +1,8 @@
+// PR c++/60225
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr A() {}
+ static constexpr A a[2] = {}; // { dg-error "incomplete" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C
new file mode 100644
index 000000000..3e32bf640
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C
@@ -0,0 +1,9 @@
+// PR c++/58610
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename> A();
+};
+
+constexpr A a; // { dg-error "literal|matching" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C
new file mode 100644
index 000000000..98f53b14c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C
@@ -0,0 +1,9 @@
+// PR c++/58609
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ static constexpr int&& i = 0; // { dg-error "initialization" }
+};
+
+int j = A::i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C
new file mode 100644
index 000000000..4fe371696
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C
@@ -0,0 +1,8 @@
+// PR c++/59571
+// { dg-do compile { target c++11 } }
+
+template <class>
+struct foo
+{
+ static constexpr int bar{(int)-1};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C
new file mode 100644
index 000000000..f936fb9cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C
@@ -0,0 +1,11 @@
+// PR c++/60305
+// { dg-do compile { target c++11 } }
+
+template<int I> int foo() { return I; }
+
+template<int... I> void bar()
+{
+ constexpr int (*X[])() = { foo<I>... };
+}
+
+template void bar<1,3,5>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C
new file mode 100644
index 000000000..dee4817f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+int x;
+constexpr int& rx = x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C
new file mode 100644
index 000000000..fccd12085
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C
@@ -0,0 +1,13 @@
+// PR c++/46289
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+};
+
+struct B
+{
+ A a;
+ constexpr B(): a({1,2}) { } // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
new file mode 100644
index 000000000..a083c85e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
@@ -0,0 +1,9 @@
+// PR c++/51612
+// { dg-do compile { target c++11 } }
+
+struct A {};
+
+struct B : virtual A
+{
+ constexpr B() { } // { dg-error "has virtual base classes" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C
new file mode 100644
index 000000000..c5a117c02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C
@@ -0,0 +1,13 @@
+// PR c++/51621
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A() {}
+};
+
+struct B
+{
+ A a[1];
+ constexpr B() : a() {} // { dg-error "non-constant|non-constexpr" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
new file mode 100644
index 000000000..30e0a643b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
@@ -0,0 +1,11 @@
+// PR c++/51327
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(int);
+};
+
+struct B : A {}; // { dg-error "no matching" }
+
+constexpr int foo(B) { return 0; } // { dg-error "invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C
new file mode 100644
index 000000000..4fa3a8314
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C
@@ -0,0 +1,15 @@
+// PR c++/57827
+// { dg-do compile { target c++11 } }
+
+struct C
+{
+ constexpr int fun (int x)
+ {
+ return x + 1;
+ }
+
+ int a = 2;
+ int b = fun(a);
+};
+
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C
new file mode 100644
index 000000000..84bfae000
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C
@@ -0,0 +1,17 @@
+// PR c++/53349
+// { dg-do compile { target c++11 } }
+
+template <int N>
+struct Foo {
+ constexpr Foo(const Foo<N-1> a) : m_a(a) {}
+ constexpr Foo(const Foo<N> &a) : m_a(a.m_a) {}
+
+ Foo<N-1> m_a;
+};
+
+template <> struct Foo<0> {};
+
+constexpr Foo<1> catty1(Foo<1> x) { return x; }
+constexpr Foo<2> catty2(Foo<1> x) { return Foo<2>(catty1(x)); }
+
+constexpr auto res = catty2(Foo<1>(Foo<0>()));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C
new file mode 100644
index 000000000..50de3720b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C
@@ -0,0 +1,7 @@
+// PR c++/58607
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr A() { i; } // { dg-error "declared|empty body" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C
new file mode 100644
index 000000000..514cca59c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ static constexpr A a = 1; // { dg-error "incomplete" }
+ constexpr A(int i) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C
new file mode 100644
index 000000000..a8af2e66f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C
@@ -0,0 +1,31 @@
+// A constructor that might or might not be constexpr still makes
+// its class literal.
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct B
+{
+ constexpr B(T) { }
+ constexpr B() {}
+};
+
+struct A
+{
+ B<A> b;
+};
+
+constexpr A a {};
+
+template <class T>
+struct C
+{
+ constexpr C(T) { }
+ C() {}
+};
+
+struct D
+{
+ C<D> c;
+};
+
+constexpr D d {}; // { dg-error "non-constexpr function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C
new file mode 100644
index 000000000..c0516f089
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C
@@ -0,0 +1,12 @@
+// PR c++/49015
+// { dg-do compile { target c++11 } }
+
+class A;
+
+class B {
+ friend constexpr B f(A); // Line 5
+};
+
+class A {};
+
+constexpr B f(A) { return B(); } // Line 10
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C
new file mode 100644
index 000000000..52fc9ea8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C
@@ -0,0 +1,64 @@
+// { dg-do run { target c++11 } }
+
+namespace xstd {
+
+typedef decltype(sizeof(char)) size_t;
+
+template<class E>
+class initializer_list {
+private:
+ size_t sz;
+ const E* start;
+
+public:
+ typedef E value_type;
+ typedef const E& reference;
+ typedef const E& const_reference;
+ typedef size_t size_type;
+ typedef const E* iterator;
+ typedef const E* const_iterator;
+
+ constexpr initializer_list() : sz(), start(nullptr) {}
+
+ template<size_t N>
+ constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {}
+
+ constexpr size_t size() { return sz; }
+
+ constexpr const E* begin() { return start; }
+
+ constexpr const E* end() { return start + sz; }
+};
+
+template<class E, size_t N>
+constexpr initializer_list<E> make_list(const E(&array)[N]) {
+ return initializer_list<E>(array);
+}
+
+template<class E>
+E min(initializer_list<E> list)
+{
+ // static_assert(list.size() > 0, "Invalid list");
+ auto it = list.begin();
+ E result = *it;
+ for (++it; it != list.end(); ++it) {
+ if (*it < result) {
+ result = *it;
+ }
+ }
+ return result;
+}
+
+}
+
+constexpr int global_i[] = {2, 4, -5, 6, 10};
+constexpr xstd::initializer_list<int> list(global_i);
+#define SA(X) static_assert(X, #X)
+SA(list.size() == 5);
+SA(list.begin()[2] == -5);
+SA(list.end()[-1] == 10);
+
+int main() {
+ if (xstd::min(xstd::make_list(global_i)) != -5)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C
new file mode 100644
index 000000000..65a7036ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+constexpr auto list = { 1, 2, 3, 4 };
+
+#define SA(X) static_assert(X, #X)
+SA(list.size() == 4);
+SA(list.begin()[2] == 3);
+SA(list.end()[-1] == 4);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C
new file mode 100644
index 000000000..912cf910e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+#define SA(X) static_assert(X,#X)
+
+constexpr int f(std::initializer_list<int> l) { return l.begin()[0]; }
+
+int main()
+{
+ constexpr int i = f({42});
+ SA(i==42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C
new file mode 100644
index 000000000..d4019b2b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+struct B: A { constexpr B(): A{} {} };
+struct B2: A { constexpr B2(): A{1} {} };
+
+struct C { protected: int i; };
+struct D: C { constexpr D(): C{} {} };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C
new file mode 100644
index 000000000..901510e10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C
@@ -0,0 +1,15 @@
+// PR c++/50024
+// { dg-do compile { target c++11 } }
+
+template< class T >
+struct Container
+{
+ Container(){
+ int* ptr = new int{};
+ }
+};
+
+int main() {
+ Container< int > c;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C
new file mode 100644
index 000000000..8c344c0b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C
@@ -0,0 +1,27 @@
+// PR c++/55419
+// { dg-do compile { target c++11 } }
+
+struct P
+{
+ P () = default;
+ explicit constexpr P (int x) : p (x) {}
+ int p;
+};
+
+struct Q
+{
+ constexpr Q () : q (0x7f) {}
+ int q;
+};
+
+struct R
+{
+ Q q;
+ P p;
+};
+
+void
+foo (R *x)
+{
+ *x = {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C
new file mode 100644
index 000000000..6fea82f51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C
@@ -0,0 +1,7 @@
+// PR c++/60186
+// { dg-require-effective-target c++11 }
+
+template<typename> void foo(int i)
+{
+ constexpr int a[] = { i }; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C
new file mode 100644
index 000000000..e0ede738a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C
@@ -0,0 +1,36 @@
+// PR c++/55879
+// { dg-do compile { target c++11 } }
+
+class CAddress
+{
+public:
+ constexpr CAddress(unsigned long begin) : m_Begin(begin) {}
+ constexpr CAddress(const CAddress &other) : m_Begin(other.m_Begin) {}
+
+private:
+ unsigned long m_Begin;
+};
+
+extern "C" char _lnkDDRRAM;
+/* internal compiler error on gcc 4.6.3 */
+const CAddress s_Memmap[2]
+{
+ {(unsigned long)&_lnkDDRRAM}, /* segmentation fault */
+ {0x40000000},
+};
+
+class CNested {
+public:
+ constexpr CNested(const CAddress primary)
+ : m_PrimaryBlock(primary) {}
+
+private:
+ CAddress m_PrimaryBlock;
+};
+
+/* internal compiler error on gcc 4.7.2 */
+const CNested s_taskDescriptions[2]
+{
+ {{0x42000000}},
+ {{0x43000000}},
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C
new file mode 100644
index 000000000..f255b8d15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C
@@ -0,0 +1,39 @@
+// { dg-do compile { target c++11 } }
+
+#include <type_traits>
+
+#define IS_LIT(T) (std::is_literal_type<T>::value)
+#define SA(X) static_assert (X, #X)
+#define YES(T) SA(IS_LIT(T))
+#define NO(T) SA(!IS_LIT(T))
+
+enum E1 { };
+enum class E2 { };
+struct Literal {};
+
+struct NotLiteral {
+ ~NotLiteral();
+};
+
+YES(int);
+YES(int[]);
+YES(int[3]);
+YES(double);
+YES(void *);
+YES(decltype (nullptr));
+YES(int Literal::*);
+YES(void (Literal::*)());
+YES(E1);
+YES(E2);
+YES(Literal);
+NO (NotLiteral);
+YES(NotLiteral *);
+YES(NotLiteral NotLiteral::*);
+YES(NotLiteral (NotLiteral::*)(NotLiteral));
+
+struct A {
+ A(const A&) = default;
+ A(int);
+};
+
+NO(A); // no constexpr ctor other than copy
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C
new file mode 100644
index 000000000..42720adc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int main (); // { dg-error "constexpr" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C
new file mode 100644
index 000000000..775c10316
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C
@@ -0,0 +1,18 @@
+// PR c++/48296
+// { dg-do compile { target c++11 } }
+
+struct X
+{
+ constexpr X() { }
+ constexpr X f(X x) { return x; }
+ constexpr X g(X x);
+};
+
+constexpr X X::g(X x) { return x; }
+
+struct Y
+{
+ Y() { }
+ constexpr Y f(Y y); // { dg-error "not a literal type" }
+ static constexpr Y g(Y y) {} // { dg-error "constexpr" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C
new file mode 100644
index 000000000..afaf2e30e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C
@@ -0,0 +1,38 @@
+// PR c++/48911
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert((X),#X)
+
+struct A
+{
+ constexpr A () : a (6) {}
+ int a;
+};
+
+int
+main ()
+{
+ constexpr int a[2] = { 42 };
+ constexpr int i = a[1];
+ SA(i==0);
+ constexpr int b[1] = { };
+ constexpr int j = b[0];
+ SA(j==0);
+ constexpr char c[2] = "a";
+ constexpr char k = c[1];
+ SA(k==0);
+ constexpr char d[2] = "";
+ constexpr char l = d[1];
+ SA(l==0);
+ constexpr wchar_t e[2] = L"a";
+ constexpr wchar_t m = e[1];
+ SA(m==0);
+ constexpr wchar_t f[2] = L"";
+ constexpr wchar_t n = f[1];
+ SA(n==0);
+ constexpr A g[2] = { A () };
+ constexpr A o = g[0];
+ SA(o.a == 6);
+ constexpr A p = g[1];
+ SA(p.a == 6);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C
new file mode 100644
index 000000000..832a16197
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ mutable int j;
+};
+
+constexpr A a = { 0, 1 };
+constexpr A b = a; // { dg-error "mutable" }
+constexpr int i = a.i;
+constexpr int j = a.j; // { dg-error "mutable" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
new file mode 100644
index 000000000..fb4c01274
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
@@ -0,0 +1,69 @@
+// Negative examples from N3092 (FCD)
+// { dg-do compile { target c++11 } }
+
+// OK: declaration
+constexpr int square(int x); // { dg-message "never defined" }
+
+// error: pixel is a type
+constexpr struct pixel {
+ int x;
+ int y;
+ // OK: declaration
+ constexpr pixel(int);
+}; // { dg-error "constexpr" }
+constexpr pixel::pixel(int a)
+// OK: definition
+ : x(square(a)), y(square(a)) // { dg-error "square" }
+{ }
+
+// error: square not defined, so small(2) not constant (5.19), so constexpr
+// not satisfied
+constexpr pixel small(2); // { dg-message "in constexpr expansion" }
+
+// error: not for parameters
+int next(constexpr int x) { // { dg-error "parameter" }
+ return x + 1;
+}
+
+// error: not a definition
+extern constexpr int memsz; // { dg-error "definition" }
+
+// error: return type is void
+constexpr void f(int x) // { dg-error "void" }
+{ /* ... */ }
+// error: use of decrement
+constexpr int prev(int x)
+{ return --x; } // { dg-error "-- x" }
+
+// error: body not just return expr
+constexpr int g(int x, int n) {
+ int r = 1;
+ while (--n > 0) r *= x;
+ return r;
+} // { dg-error "body of constexpr function" }
+
+class debug_flag {
+public:
+ explicit debug_flag(bool);
+ constexpr bool is_on(); // { dg-error "not a literal type" } debug_flag not literal type
+private:
+ bool flag;
+};
+// OK
+constexpr int bar(int x, int y) // { dg-message "previously defined here" }
+{ return x + y + x*y; }
+// ...
+// error: redefinition of bar
+int bar(int x, int y) // { dg-error "redefinition" }
+{ return x * 2 + 3 * y; }
+
+struct pixel2 { // { dg-message "no user-provided default constructor" }
+ int x, y;
+};
+constexpr pixel2 ur = { 1294, 1024 };// OK
+constexpr pixel2 origin; // { dg-error "uninitialized const" }
+
+constexpr const int* addr(const int& ir) { return &ir; } // OK
+
+// error, initializer for constexpr variable not a constant
+extern constexpr const int* tp = addr(5); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C
new file mode 100644
index 000000000..793b4c3f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C
@@ -0,0 +1,27 @@
+// PR c++/54020
+// { dg-do compile { target c++11 } }
+
+// Preliminaries.
+extern int nonconst_func(int);
+constexpr int identity(int x) { return x; }
+constexpr int zero() { return identity(0); }
+constexpr int one() { return identity(1); }
+
+// Correctly accepted.
+constexpr int three = one() ? 3 : nonconst_func(0);
+
+// Incorrectly accepted. See [dcl.constexpr] #5:
+// For a constexpr function, if no function argument values exist
+// such that the function invocation sub-stitution would produce a
+// constant expression (5.19), the program is ill-formed; no diagnostic
+// required.
+constexpr int bogus() { return zero () ? 3 : nonconst_func(0); } // { dg-error "nonconst_func" }
+
+// Correctly rejected (not sure why).
+constexpr int correct_error() { return nonconst_func(0); } // { dg-error "nonconst_func" }
+
+// Correctly rejected.
+constexpr int z = bogus(); // { dg-error "" }
+
+// This is also correctly rejected.
+constexpr int correct_failure() { return 0 ? 3 : nonconst_func(0); } // { dg-error "nonconst_func" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C
new file mode 100644
index 000000000..dbadaa8e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct is_funny {
+ static constexpr bool value = false;
+};
+
+template<class T>
+constexpr T value(T t) noexcept(is_funny<T>::value) { return t; } // Line 7
+
+constexpr bool ok = noexcept(value(42));
+
+static_assert(ok, "Assertion failure");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C
new file mode 100644
index 000000000..d10039a92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+constexpr T value(T t) { return t; }
+
+template<class T>
+struct is_funny {
+ static constexpr bool value = false;
+};
+
+template<class T>
+void eval() noexcept(value(is_funny<T>::value)) {}
+
+constexpr bool ok = noexcept(eval<int>()); // line 12
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C
new file mode 100644
index 000000000..9541bc078
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int f(int i) { return i; }
+#define SA(X) static_assert (X, #X)
+SA(noexcept(f(42)));
+int j;
+SA(!noexcept(f(j)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C
new file mode 100644
index 000000000..eb7190023
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+// A call is noexcept if it is a valid subexpression of a constant
+// expression, even if it is not itself a constant expression.
+
+#define SA(X) static_assert(X,#X)
+
+constexpr const int* f(const int *p) { return p; }
+
+int main()
+{
+ constexpr int i = 42;
+ SA(noexcept(*f(&i)));
+ SA(noexcept(f(&i)));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C
new file mode 100644
index 000000000..7b0c83599
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+struct booleable {
+ bool data;
+ constexpr explicit operator bool() { return data; }
+};
+
+constexpr booleable truthy_func() { return {true}; }
+
+void funky() noexcept(truthy_func()) {}
+
+int main() {
+ funky();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C
new file mode 100644
index 000000000..76d9246d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C
@@ -0,0 +1,10 @@
+// PR c++/51305
+// { dg-do compile { target c++11 } }
+
+constexpr bool ok() noexcept
+{
+ typedef int type;
+ return true;
+}
+
+constexpr auto x = ok();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C
new file mode 100644
index 000000000..2a70d7bb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C
@@ -0,0 +1,9 @@
+// PR c++/53473
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct A
+{
+ static constexpr T foo() noexcept { return 0; }
+};
+
+template<> constexpr int A<int>::foo() noexcept { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
new file mode 100644
index 000000000..0f68643f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C
@@ -0,0 +1,24 @@
+// Example from issue 1125 drafting; D() and v were well-formed with the
+// wording approved in Rapperswil, now seems they should be ill-formed.
+// { dg-do compile { target c++11 } }
+
+struct B {
+ constexpr B(int x) : i(0) { } // "x" is unused
+ int i;
+};
+
+int global; // { dg-message "not const" }
+
+struct D : B {
+ constexpr D() : B(global) { } // { dg-error "global|argument" }
+};
+
+struct A2 {
+ constexpr A2(bool b, int x) : m(b ? 42 : x) { }
+ int m;
+};
+
+// ok, constructor call initializes m with the value 42 after substitution
+constexpr int v = A2(true, global).m; // { dg-error "global" }
+// error: initializer for m is "x", which is non-constant
+constexpr int w = A2(false, global).m; // { dg-error "global" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C
new file mode 100644
index 000000000..32a023b9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C
@@ -0,0 +1,17 @@
+// PR c++/47200
+// { dg-do compile { target c++11 } }
+// { dg-options "-w" }
+
+template < int > struct duration
+{
+ constexpr int count ();
+ static constexpr duration min ();
+};
+
+constexpr int
+f (duration < 0 > d, duration < 0 > )
+{
+ return d.count ();
+}
+
+static_assert (f (duration < 0 >::min (), duration < 0 > ()), ""); // { dg-error "non-constant|before its definition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C
new file mode 100644
index 000000000..d8603f838
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C
@@ -0,0 +1,22 @@
+// PR c++/49988
+// { dg-do run { target c++11 } }
+
+template<int ... I> struct X { };
+
+struct A {
+ char data[3];
+ template<int ... I>
+ constexpr
+ A(const char (&s)[3], X<I...> x) : data{ s[I]...} { }
+};
+struct B {
+ A a;
+ B(const char (&s)[3]) : a{s,X<0,1,2>{}} { }
+};
+
+int main()
+{
+ B b{"12"};
+ if (b.a.data[0] != '1')
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C
new file mode 100644
index 000000000..0534b41ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C
@@ -0,0 +1,13 @@
+// FIXME this is currently invalid, but seems like it should be OK
+// { dg-do compile { target c++11 } }
+
+struct A { A() { } };
+
+template<class T>
+constexpr bool ignore(T&&) { return true; }
+
+static_assert(ignore(10), "Error"); // OK
+
+A s;
+
+static_assert(ignore(s), "Error"); // Currently an error
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C
new file mode 100644
index 000000000..2d712b64a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ ~A();
+};
+
+template<class T>
+struct W {
+ T t;
+ template<class U>
+ constexpr W(U&& u) : t(u) {}
+};
+
+template <class T>
+constexpr W<T> make_w(T& w) { return W<T>(w); }
+
+A a;
+constexpr auto w = make_w(a); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C
new file mode 100644
index 000000000..bb0743adb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr int i; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C
new file mode 100644
index 000000000..8ff89982d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int zero() { return 0; }
+
+void* ptr1 = zero(); // { dg-error "int" }
+constexpr void* ptr2 = zero(); // { dg-error "int" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
new file mode 100644
index 000000000..41afbe969
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
@@ -0,0 +1,29 @@
+// { dg-do compile { target c++11 } }
+
+// From N2235
+
+// 4.5.2 semantics
+
+// p 1 constexpr specifier
+// objects, static const data
+struct A1 { int i; }; // { dg-message "no user-provided default constructor" }
+
+constexpr int i1 = 1024;
+constexpr A1 a1 = A1();
+
+// error: not a definition
+extern constexpr int i2; // { dg-error "definition" }
+
+// error: missing initializer
+constexpr A1 a2; // { dg-error "uninitialized const" }
+
+const constexpr A1 a3 = A1();
+
+volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" }
+
+// error: on type declaration
+constexpr struct pixel
+{
+ int x;
+ int y;
+}; // { dg-error "cannot be used for type declarations" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C
new file mode 100644
index 000000000..d52967a7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int verysquare(int x) { return x * x; }
+
+const double mass = 9.8;
+constexpr double energy = mass * verysquare(56.6); // { dg-error "mass" "" { xfail *-*-* } }
+
+int arr[(int)mass]; // { dg-error "mass" "" { xfail *-*-* } }
+
+float array[verysquare(9)]; // OK -- not C99 VLA
+
+extern const int medium;
+const int high = verysquare(medium); // OK -- dynamic initialization
+
+enum { Max = verysquare(7) }; // OK
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C
new file mode 100644
index 000000000..8406e4924
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-w -ftrack-macro-expansion=0" }
+
+#include <limits.h>
+extern constexpr int max_s = INT_MAX + 1; // { dg-error "" }
+extern constexpr unsigned max_u = UINT_MAX + 1u; // OK
+extern constexpr int abs_s = -INT_MIN; // { dg-error "" } overflows on 2's complement machines
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C
new file mode 100644
index 000000000..bd2e6875a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C
@@ -0,0 +1,8 @@
+// PR c++/47504
+// { dg-do compile { target c++11 } }
+
+char constexpr sub(char arg)
+{ return char(arg - char(1)); }
+
+int main()
+{ static char constexpr m = sub(-1); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C
new file mode 100644
index 000000000..21f4c83b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C
@@ -0,0 +1,17 @@
+// The FCD doesn't allow typedefs and static_assert in constexpr functions,
+// but it should.
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+template <class T>
+constexpr T f(T t)
+{
+ typedef T T2; // { dg-warning "constexpr" "" { xfail *-*-* } }
+ static_assert (T2(0) == T(0), ""); // { dg-warning "constexpr" "" { xfail *-*-* } }
+ return t;
+}
+
+int main()
+{
+ constexpr int i = f(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C
new file mode 100644
index 000000000..8e82ef59e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C
@@ -0,0 +1,60 @@
+// Positive examples from N3092 (FCD)
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X, #X)
+
+constexpr int bufsz = 1024; // OK: definition
+SA (bufsz == 1024);
+
+constexpr int square(int x); // OK: declaration
+
+struct pixel {
+ int x;
+ int y;
+ // OK: declaration
+ constexpr pixel(int);
+};
+constexpr pixel::pixel(int a) // OK: definition
+ : x(square(a)), y(square(a))
+{ }
+
+constexpr int square(int x) // OK: definition
+{ return x * x; }
+
+constexpr pixel large(4); // OK: square defined
+SA(large.x == 16 && large.y==16);
+
+constexpr long long_max() // OK
+{ return 2147483647; }
+
+SA(long_max() == 2147483647);
+
+constexpr int abs(int x) // OK
+{ return x < 0 ? -x : x; }
+
+SA(abs(-1) == 1);
+SA(abs(24) == 24);
+
+struct Length {
+ explicit constexpr Length(int i = 0) : val(i) { }
+private:
+ int val;
+};
+
+constexpr Length l1;
+constexpr Length l2(12);
+
+struct pixel2 {
+ int x, y;
+};
+constexpr pixel2 ur = { 1294, 1024 };// OK
+
+SA(ur.x == 1294 && ur.y == 1024);
+
+constexpr const int* addr(const int& ir) { return &ir; } // OK
+static const int x = 5;
+extern constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x
+ // is an address contant expression
+SA(xp == &x);
+extern constexpr int x2 = *addr(5);
+SA(x2 == 5);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C
new file mode 100644
index 000000000..f960e3afb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// We decided in Rapperswil that it's OK if any value of decide can produce
+// a constant expression.
+
+constexpr int may_throw(bool decide) {
+ return decide ? 42 : throw -1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C
new file mode 100644
index 000000000..c16fb15e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+struct C { // literal type
+ int m;
+ int n;
+ constexpr C(int m) : m(m), n(-m) {}
+ constexpr bool is_neg() { return m < 0; }
+};
+
+constexpr bool check1(const C& c, int C:: *pm) { return c.*pm < 0; } // #1
+
+constexpr bool check2(const C* pc, bool (C::*pm)() const) { return
+(pc->*pm)(); } // #2
+
+constexpr C c(-1);
+
+static_assert(!check1(c, &C::n), "Error");
+static_assert(check1(c, &C::m), "Error");
+
+static_assert(check2(&c, &C::is_neg), "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C
new file mode 100644
index 000000000..18648d92d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C
@@ -0,0 +1,14 @@
+// PR c++/51489
+// DR 1313
+// { dg-do compile { target c++11 } }
+
+struct array
+{
+ constexpr array() :x(0) {}
+ constexpr int const* begin() { return &x; }
+ int x;
+};
+constexpr array aa;
+constexpr auto b = aa.begin();
+static_assert(b-b == 0, "compiles just fine");
+static_assert(aa.begin()-aa.begin() == 0, "compiler thinks it's not a constant expression");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C
new file mode 100644
index 000000000..f54b7c59f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ virtual void f() = 0;
+};
+
+struct B: A
+{
+ void f() { }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C
new file mode 100644
index 000000000..e3e13f755
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C
@@ -0,0 +1,6 @@
+// Test that we catch excessive recursion.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fconstexpr-depth=5" }
+// { dg-prune-output "in constexpr expansion" }
+constexpr int f (int i) { return f (i-1); }
+constexpr int i = f(42); // { dg-error "constexpr evaluation depth" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C
new file mode 100644
index 000000000..6010b2075
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C
@@ -0,0 +1,10 @@
+// PR c++/59123
+// { dg-do compile { target c++11 } }
+
+// Fwd-declarations
+struct S;
+extern const S s;
+
+// (... later) definitions
+struct S {};
+constexpr S s {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C
new file mode 100644
index 000000000..f3e4cead1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C
@@ -0,0 +1,44 @@
+// PR c++/49172
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert((X),#X)
+
+constexpr int g() { return 42; }
+constexpr int(&rg)() = g; // #1
+
+SA(rg() == 42);
+
+constexpr int i = 24;
+constexpr int const& ri = i; // #2
+
+SA(&ri == &i);
+SA(ri == 24);
+
+void f()
+{
+ constexpr int(&rg)() = g; // #1
+
+ SA(rg() == 42);
+
+ constexpr static int i = 24;
+ constexpr int const& ri = i; // #2
+
+ SA(&ri == &i);
+ SA(ri == 24);
+}
+
+template <class T>
+void f2()
+{
+ constexpr int(&rg)() = g; // #1
+
+ SA(rg() == 42);
+
+ constexpr static int i = 24;
+ constexpr int const& ri = i; // #2
+
+ SA(&ri == &i);
+ SA(ri == 24);
+}
+
+template void f2<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C
new file mode 100644
index 000000000..76973638d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C
@@ -0,0 +1,17 @@
+// Negative reference variable tests.
+// { dg-do compile { target c++11 } }
+
+extern int *p;
+constexpr int& ri = *p; // { dg-error "p" }
+
+extern constexpr int &er; // { dg-error "not a definition" }
+constexpr int& ri2 = er; // { dg-error "er" }
+
+void f(int j)
+{
+ constexpr int i = 42;
+ constexpr int const& ri = i; // { dg-error "" }
+
+ constexpr int& rj = j; // { dg-error "" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C
new file mode 100644
index 000000000..793653604
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C
@@ -0,0 +1,10 @@
+// PR c++/50298
+// { dg-do compile { target c++11 } }
+
+int global_variable;
+
+template <class T> struct X {
+ static constexpr T r = global_variable;
+};
+
+X<int&> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C
new file mode 100644
index 000000000..ce1ce5235
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C
@@ -0,0 +1,18 @@
+// PR c++/54777
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ int s[1];
+ constexpr const int &foo (unsigned i) { return (i < 1 ? 0 : throw 1), s[i]; }
+ constexpr const int &bar (unsigned i) { return i < 1 ? s[i] : (throw 0, s[i]); }
+};
+
+int
+main ()
+{
+ constexpr S a {};
+ constexpr int i = a.foo (0);
+ constexpr int j = a.bar (0);
+ static_assert (i == j, "Ouch");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C
new file mode 100644
index 000000000..69db98bc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C
@@ -0,0 +1,37 @@
+// PR c++/56728
+// { dg-require-effective-target c++11 }
+
+class B {
+public:
+ static B instance;
+ class Inner
+ {
+ public:
+ class Wuzi
+ {
+ unsigned int m;
+ } m_Class[3];
+ unsigned m_Int[4];
+ };
+
+ constexpr static Inner & getInner()
+ {
+ /* I am surprised this is considered a constexpr */
+ return *((Inner *)4);
+ } // { dg-error "reinterpret_cast" }
+};
+
+B B::instance;
+
+class A
+{
+public:
+ constexpr A(B &bridge, B::Inner &bridge2, unsigned char index)
+ : m_Bridge(bridge), m_Wuz(bridge2.m_Class[index])
+ {}
+
+ B &m_Bridge;
+ B::Inner::Wuzi &m_Wuz;
+};
+A works{B::instance, B::getInner(), 3};
+A crashnkill[1]{{B::instance, B::getInner(), 3}};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C
new file mode 100644
index 000000000..697203d72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C
@@ -0,0 +1,13 @@
+// PR c++/49673: check that test_data goes into .rodata
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -G0 { target { { alpha*-*-* frv*-*-* ia64-*-* lm32*-*-* m32r*-*-* microblaze*-*-* mips*-*-* nios2-*-* powerpc*-*-* rs6000*-*-* score*-*-* } && { ! { *-*-darwin* *-*-aix* alpha*-*-*vms* } } } } }
+// { dg-final { scan-assembler "\\.rdata" { target mips*-*-* } } }
+// { dg-final { scan-assembler "rodata" { target { { *-*-linux-gnu *-*-gnu* *-*-elf } && { ! mips*-*-* } } } } }
+
+struct Data
+{
+ int i;
+ constexpr Data(int i = 0) : i(i+1) {}
+};
+
+extern const Data test_data = { 1 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C
new file mode 100644
index 000000000..7f82671b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C
@@ -0,0 +1,13 @@
+// Allow static_assert in constexpr constructors, too.
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct A
+{
+ int i;
+
+ constexpr A(int i) : i(i)
+ {
+ static_assert(sizeof(T) == 1, "");
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C
new file mode 100644
index 000000000..80f56a196
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C
@@ -0,0 +1,12 @@
+// PR c++/56871
+// { dg-do compile { target c++11 } }
+
+template<typename T> constexpr int foo(T);
+template<> int foo(int);
+template<> int foo(int); // { dg-error "previous" }
+template<> constexpr int foo(int); // { dg-error "redeclaration" }
+
+template<typename T> int bar(T);
+template<> constexpr int bar(int);
+template<> constexpr int bar(int); // { dg-error "previous" }
+template<> int bar(int); // { dg-error "redeclaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C
new file mode 100644
index 000000000..24174aca0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C
@@ -0,0 +1,24 @@
+// Test for constant initialization of non-literal class (e.g. mutex)
+// { dg-options "-save-temps" }
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i;
+ constexpr A(int _i): i(_i) { }
+ A(const A&); // non-trivial copy ctor makes A non-literal
+};
+
+A a(42); // constexpr constructor allows constant initialization
+A ar[3] = { { 1 }, { 2 }, { 3 } };
+// { dg-final { scan-assembler-not "static_initialization" } }
+// { dg-final cleanup-saved-temps }
+
+int main()
+{
+ if (a.i != 42
+ || ar[0].i != 1
+ || ar[1].i != 2
+ || ar[2].i != 3)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C
new file mode 100644
index 000000000..e908fb3cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C
@@ -0,0 +1,19 @@
+// PR c++/55944
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct Test
+{
+ constexpr Test(T val) : value(val) {}
+ static void test()
+ {
+ static constexpr Test<int> x(42); // ICE
+ }
+ T value;
+};
+
+int main()
+{
+ static constexpr Test<int> x(42); // OK
+ Test<double>::test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C
new file mode 100644
index 000000000..91cc25a71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C
@@ -0,0 +1,14 @@
+// PR c++/54532
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X,#X)
+
+struct A {
+ int i;
+ constexpr static int A::*p = &A::i;
+};
+
+constexpr A a = { 42 };
+SA(a.*A::p == 42);
+
+constexpr int A::* A::p;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C
new file mode 100644
index 000000000..70a254c5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+struct IsLiteral {};
+
+struct ShouldBeLiteral {
+ constexpr ShouldBeLiteral(int){}
+};
+
+struct StaticDataMember {
+ static constexpr IsLiteral one = IsLiteral(); // #1
+ static constexpr ShouldBeLiteral two= ShouldBeLiteral(-1); // #2
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C
new file mode 100644
index 000000000..6d65a62e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C
@@ -0,0 +1,18 @@
+// Test for constant initialization of class with vtable
+// { dg-options "-save-temps" }
+// { dg-final { scan-assembler-not "static_initialization" } }
+// { dg-final cleanup-saved-temps }
+// { dg-do run { target c++11 } }
+
+int r = 1;
+// implicit default constructor for A and B is constexpr
+struct A { virtual void f() {} };
+struct B: A { virtual void f() { r = 0; } };
+
+B b;
+
+int main()
+{
+ b.f();
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C
new file mode 100644
index 000000000..fa1a4c746
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C
@@ -0,0 +1,19 @@
+// { dg-do run { target c++11 } }
+
+extern "C" void abort ();
+extern int ar[2];
+
+int f()
+{
+ if (ar[0] != 42 || ar[1] != 0)
+ abort ();
+ return 1;
+}
+
+int i = f();
+
+int ar[2] = { 42, i };
+
+int main()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C
new file mode 100644
index 000000000..d161cf544
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ constexpr static T t = T(); // { dg-error "literal" }
+};
+template <class T>
+constexpr T A<T>::t;
+
+struct B
+{
+ ~B();
+};
+
+B b = A<B>::t;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C
new file mode 100644
index 000000000..78065c306
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ constexpr operator int() { return 4; }
+};
+
+template <int I>
+struct C;
+
+template<>
+struct C<4> { typedef int TP; };
+
+template <class T>
+struct A
+{
+ constexpr static B t = B();
+ C<t>::TP tp;
+};
+
+A<B> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C
new file mode 100644
index 000000000..272ebd901
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C
@@ -0,0 +1,10 @@
+// PR c++/48945
+// { dg-do compile { target c++11 } }
+
+struct A {
+ static constexpr bool is();
+ static constexpr bool is_not();
+};
+
+constexpr bool A::is() { return true; }
+constexpr bool A::is_not() const { return true; } // { dg-error "static" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
new file mode 100644
index 000000000..34aa5afc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C
@@ -0,0 +1,8 @@
+// PR c++/50258
+// { dg-do compile { target c++11 } }
+// { dg-options "-fpermissive" }
+
+struct Foo {
+ static const double d = 3.14; // { dg-warning "constexpr" }
+};
+const double Foo::d; // { dg-warning "constexpr" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C
new file mode 100644
index 000000000..bebd4f6f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C
@@ -0,0 +1,9 @@
+// PR c++/46977
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template < typename > void
+foo ()
+{
+ ({int i;}), 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C
new file mode 100644
index 000000000..0f561a436
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+constexpr char c1 = "hi"[1];
+constexpr char c2 = "hi"[2];
+constexpr char c3 = "hi"[3]; // { dg-error "out of bound" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C
new file mode 100644
index 000000000..ee94159f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+constexpr T value(T t = T()) { return t; }
+
+enum us_enum { us_item = value<short>() }; // OK
+
+void func(us_enum n) {
+ switch (n) {
+ case value(us_item): ; // #1 Error
+ default: ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C
new file mode 100644
index 000000000..652a08d92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C
@@ -0,0 +1,23 @@
+// Test for constexpr conversion in case context
+// { dg-do compile { target c++11 } }
+
+enum class E { e1, e2 };
+
+struct A
+{
+ E e;
+ constexpr operator E() { return e; }
+ constexpr A(E e): e(e) { }
+};
+
+E e;
+
+int main()
+{
+ switch (e)
+ {
+ case A(E::e1):
+ case A(E::e2):
+ ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C
new file mode 100644
index 000000000..27375e2cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C
@@ -0,0 +1,14 @@
+// PR c++/46472
+// { dg-do compile { target c++11 } }
+
+template<class T> struct A {
+ T t;
+ constexpr A(){}
+};
+
+struct B
+{
+ A<int> a;
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C
new file mode 100644
index 000000000..b5171141f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr operator double() { return 1.0; }
+};
+
+template <int I>
+struct B
+{ };
+
+constexpr A a { };
+B<a> b; // { dg-error "template argument|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C
new file mode 100644
index 000000000..d06543632
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+constexpr A f2 (const A& a) { return a; }
+constexpr int f1 (const A &a) { return f2(a).i; }
+A g(const A &a)
+{
+ return { f1(a) };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C
new file mode 100644
index 000000000..b949bd66b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C
@@ -0,0 +1,27 @@
+// PR c++/50248, DR 1358
+// { dg-do compile { target c++11 } }
+
+template<class Elt, unsigned max>
+struct earray
+{
+ Elt elts[max];
+ earray() = default;
+ template<typename... Elt2>
+ constexpr earray(Elt2&& ... e): elts(0) { }
+};
+
+struct SessionData
+{
+ SessionData(SessionData&) = delete;
+ SessionData() = default;
+};
+
+struct MapSessionData : SessionData
+{
+ earray<short, 11> equip_index;
+};
+
+void test()
+{
+ MapSessionData *sd = new MapSessionData;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C
new file mode 100644
index 000000000..a316b34bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> struct A
+{
+ T t;
+ constexpr A() { } // { dg-error "uninitialized" }
+};
+
+int main()
+{
+ constexpr A<int> a; // { dg-error "A()" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C
new file mode 100644
index 000000000..f0ac2224a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A { constexpr operator int() { return 42; } };
+
+template<class T>
+struct B {
+ static const int versionConst = A();
+ enum { versionEnum = versionConst };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C
new file mode 100644
index 000000000..7adcae83a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C
@@ -0,0 +1,26 @@
+// PR c++/55931
+// { dg-do compile { target c++11 } }
+
+#include <type_traits>
+
+template<typename Type>
+class Test
+{
+ public:
+ constexpr Test(const Type val) : _value(val) {}
+ constexpr Type get() const {return _value;}
+ static void test()
+ {
+ static constexpr Test<int> x(42);
+ std::integral_constant<int, x.get()> i; // This is not working
+ }
+ protected:
+ Type _value;
+};
+
+int main()
+{
+ static constexpr Test<int> x(42);
+ std::integral_constant<int, x.get()> i; // This is working
+ Test<double>::test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C
new file mode 100644
index 000000000..aa8065803
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C
@@ -0,0 +1,6 @@
+// PR c++/54946
+// { dg-do compile { target c++11 } }
+
+template<const char*s> static void testfunc();
+constexpr struct testtype { const char* str; } test = { "abc"} ;
+void (*functionpointer)() = testfunc<(const char*) test.str>; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C
new file mode 100644
index 000000000..fd0c957b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C
@@ -0,0 +1,19 @@
+// PR c++/59268
+// { dg-do compile { target c++11 } }
+
+template <typename>
+struct A
+{
+ constexpr A (int) {}
+ virtual void foo ()
+ {
+ constexpr A<void> a (0);
+ }
+};
+
+void
+bar ()
+{
+ A<int> a (3);
+ a.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
new file mode 100644
index 000000000..5666629ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+constexpr int may_throw(bool decide) {
+ return decide ? 42 : throw -1; // { dg-error "throw" }
+}
+
+constexpr int x = may_throw(false); // { dg-message "may_throw" }
+constexpr int y = may_throw(true);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C
new file mode 100644
index 000000000..f59cd8453
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C
@@ -0,0 +1,106 @@
+// PR c++/53202
+// { dg-do run { target c++11 } }
+
+#include <tuple>
+
+template<typename Callable>
+ struct Bind_simple
+ {
+ explicit
+ Bind_simple(const Callable& callable)
+ : _M_bound(callable)
+ { }
+
+ Bind_simple(const Bind_simple&) = default;
+ Bind_simple(Bind_simple&&) = default;
+
+ auto operator()() -> decltype((*(Callable*)0)())
+ {
+ return std::get<0>(_M_bound)();
+ }
+
+ private:
+
+ std::tuple<Callable> _M_bound;
+ };
+
+template<typename Callable>
+ Bind_simple<Callable>
+ bind_simple(Callable& callable)
+ {
+ return Bind_simple<Callable>(callable);
+ }
+
+struct thread
+{
+ struct ImplBase { };
+
+ template<typename T>
+ struct Impl : ImplBase {
+ T t;
+ Impl(T&& t) : t(std::move(t)) { }
+ };
+
+ template<typename T>
+ thread(T& t)
+ {
+ auto p = make_routine(bind_simple(t));
+
+ p->t();
+
+ delete p;
+ }
+
+ template<typename Callable>
+ Impl<Callable>*
+ make_routine(Callable&& f)
+ {
+ return new Impl<Callable>(std::forward<Callable>(f));
+ }
+};
+
+
+int c;
+class background_hello
+{
+public:
+ background_hello()
+ {
+ __builtin_printf("default ctor called, this=%p\n", this);
+ ++c;
+ }
+
+ background_hello(const background_hello &)
+ {
+ __builtin_printf("copy ctor called\n");
+ ++c;
+ }
+
+ background_hello(background_hello &&)
+ {
+ __builtin_printf("move ctor called\n");
+ ++c;
+ }
+
+ void operator ()() const
+ {
+ __builtin_printf("void background_hello::operator()() called, this=%p\n", this);
+ }
+
+ ~background_hello()
+ {
+ __builtin_printf("destructor called, this=%p\n", this);
+ --c;
+ }
+
+};
+
+int main()
+{
+ {
+ background_hello bh;
+ thread t(bh);
+ }
+ if (c != 0)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C
new file mode 100644
index 000000000..98c2309ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C
@@ -0,0 +1,11 @@
+// PR c++/50508
+// { dg-do compile { target c++11 } }
+
+template <class T>
+ struct integral_constant {
+ typedef T value_type;
+ constexpr operator value_type() { return true; }
+ };
+
+static constexpr bool value = integral_constant<bool>()
+ && true;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C
new file mode 100644
index 000000000..32af84eac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+#include <typeinfo>
+
+struct A { virtual void f(); };
+
+extern constexpr const std::type_info* p1 = &typeid(int);
+extern constexpr const std::type_info* p2 = &typeid(A);
+// typeid-expression whose operand is of a polymorphic class type
+extern constexpr const std::type_info* p3 = &typeid((A())); // { dg-error "" "" { xfail *-*-* } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C
new file mode 100644
index 000000000..0c3548c0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C
@@ -0,0 +1,16 @@
+// Test that we don't have to deal with type punning
+// DR 1188 says this is ill-formed
+// { dg-do compile { target c++11 } }
+
+union U
+{
+ float f;
+ unsigned char ca[sizeof(float)];
+};
+
+constexpr U u = { 1.0 };
+constexpr float f = u.f;
+constexpr unsigned char c = u.ca[0]; // { dg-error "U::ca" }
+
+constexpr double d = 1.0;
+constexpr unsigned char c2 = (unsigned char&)d; // { dg-error "char. glvalue" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C
new file mode 100644
index 000000000..1a5e832ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C
@@ -0,0 +1,18 @@
+// PR c++/51675
+// { dg-do compile { target c++11 } }
+
+union foo
+{
+ int x = 0;
+ short y;
+
+ constexpr foo() = default;
+};
+
+union bar
+{
+ int x;
+ short y;
+
+ constexpr bar() = default; // { dg-error "constexpr" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C
new file mode 100644
index 000000000..ecae28dcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C
@@ -0,0 +1,12 @@
+// PR c++/51675
+// { dg-do compile { target c++11 } }
+
+union foo
+{
+ int x;
+ short y;
+
+ constexpr foo(): x(0) { }
+};
+
+constexpr foo f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C
new file mode 100644
index 000000000..a8d6b8d3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C
@@ -0,0 +1,18 @@
+// PR c++/54922
+// { dg-do compile { target c++11 } }
+
+struct nullable_int
+{
+ bool init_;
+ union {
+ unsigned char for_value_init;
+ int value_;
+ };
+
+ constexpr nullable_int() : init_(false), for_value_init() {}
+};
+
+#define SA(X) static_assert(X,#X)
+
+constexpr nullable_int n;
+SA((n.for_value_init == 0));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C
new file mode 100644
index 000000000..57796664e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C
@@ -0,0 +1,42 @@
+// PR c++/54922
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+#define SA(X) static_assert(X,#X)
+
+struct A
+{
+ union {
+ union {
+ union {
+ unsigned char i;
+ int j;
+ };
+ };
+ };
+
+ constexpr A() : i(42) {}
+};
+
+constexpr A a;
+SA((a.i == 42));
+
+struct B
+{
+ struct {
+ int h;
+ struct {
+ union {
+ unsigned char i;
+ int j;
+ };
+ int k;
+ }; // { dg-warning "anonymous struct" }
+ }; // { dg-warning "anonymous struct" }
+ int l;
+
+ constexpr B(): h(1), i(2), k(3), l(4) {}
+};
+
+constexpr B b;
+SA((b.h == 1 && b.i == 2 && b.k == 3 && b.l == 4));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C
new file mode 100644
index 000000000..e8e7de31e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C
@@ -0,0 +1,27 @@
+// Core issue 898
+// { dg-do compile { target c++11 } }
+
+namespace N { const int i = 42; }
+namespace M { const int j = 42; }
+
+constexpr int g() {
+ using namespace N;
+ using M::j;
+ static_assert (i == 42, "i == 42");
+ return i + j;
+}
+
+template <class T>
+constexpr int h() {
+ using namespace N;
+ using M::j;
+ static_assert (i == 42, "i == 42");
+ return i + j;
+}
+
+constexpr int i = g();
+constexpr int i2 = h<int>();
+
+static_assert (i == 84, "i == 84");
+static_assert (i2 == 84, "i2 == 84");
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C
new file mode 100644
index 000000000..59a65e505
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C
@@ -0,0 +1,18 @@
+// PR c++/49520
+// { dg-do compile { target c++11 } }
+
+namespace x { void foo(); }
+
+template<typename T>
+struct traits
+{
+ static constexpr bool f() { return true; }
+
+ static constexpr bool g()
+ {
+ using x::foo;
+ return f() && noexcept(foo());
+ }
+};
+
+template struct traits<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C
new file mode 100644
index 000000000..87311876e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+struct HopefullyLiteral {
+ HopefullyLiteral() = default; // Should be a constexpr c'tor as of 12.1/6 and 8.4.2/4
+};
+
+constexpr HopefullyLiteral var1{}; // OK
+constexpr HopefullyLiteral var2 = HopefullyLiteral{}; // #1
+constexpr HopefullyLiteral var3 = HopefullyLiteral(); // #2
+constexpr HopefullyLiteral var4 = HopefullyLiteral(var3); // #3
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C
new file mode 100644
index 000000000..00797fa00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+constexpr T value_init() { return T(); }
+
+template<class T>
+constexpr inline T bar(T x) { return x; }
+
+union EmptyUnion {};
+union Union1 { int i; };
+union Union3 { double d; int i; char* c; };
+
+constexpr auto u1 = value_init<EmptyUnion>();
+constexpr auto u2 = value_init<Union1>();
+constexpr auto u3 = value_init<Union3>();
+constexpr auto u4 = bar(EmptyUnion{});
+constexpr auto u5 = bar(Union1{});
+constexpr auto u6 = bar(Union3{});
+constexpr auto u7 = bar(u1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C
new file mode 100644
index 000000000..8fd9c7445
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C
@@ -0,0 +1,10 @@
+// PR c++/50234
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert((X),#X)
+
+struct A { int i; };
+
+constexpr int f(A a) { return a.i; }
+
+SA(f({}) == 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C
new file mode 100644
index 000000000..1fc373855
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C
@@ -0,0 +1,16 @@
+// PR c++/57901
+// { dg-require-effective-target c++11 }
+
+struct Z {
+ Z() = default;
+ Z(Z const&) = default;
+ constexpr Z(Z&&) {} /* non-trivial (constexpr) move ctor */
+};
+
+template<typename T>
+constexpr int fn0(T v) { return 0; }
+template<typename T>
+constexpr int fn (T v) { return fn0(v); }
+
+constexpr auto t0 = fn0(Z()); // OK!
+constexpr auto t = fn (Z()); // error! (GCC 4.8.1)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C
new file mode 100644
index 000000000..495c6e2b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<class... T>
+constexpr bool variadics(T&&...) { return true; }
+
+struct IsLiteral {};
+
+constexpr bool variadic_var = variadics(0, true, 1.2, IsLiteral{}); // Error, so below
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C
new file mode 100644
index 000000000..2c13e3ef1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C
@@ -0,0 +1,14 @@
+// PR c++/47067
+// { dg-do compile { target c++11 } }
+
+struct X {
+ virtual void x();
+ virtual ~X();
+};
+
+struct Y {
+ virtual void y();
+ virtual ~Y();
+};
+
+struct Z: X, Y {} z;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C
new file mode 100644
index 000000000..86040a31b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C
@@ -0,0 +1,24 @@
+// PR c++/54341
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct enable_shared_from_this
+{
+ constexpr enable_shared_from_this(); // { dg-warning "used but never defined" }
+
+private:
+ int mem;
+};
+
+class VTableClass {
+public:
+ virtual void someVirtualMethod() { }
+};
+
+class SomeClass : public enable_shared_from_this< SomeClass >, public
+VTableClass { };
+
+SomeClass* createInstance()
+{
+ return new SomeClass;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C
new file mode 100644
index 000000000..de446bcfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C
@@ -0,0 +1,42 @@
+// PR c++/54253
+// { dg-do compile { target c++11 } }
+
+namespace A {
+ class Base {
+ int x;
+ public:
+ constexpr Base(int x) : x(x) {}
+ };
+
+ class Base2 {
+ public:
+ virtual void fun() {}
+ };
+
+ class Derived : public Base2, public Base {
+ public:
+ constexpr Derived() : Base2(), Base(5) {}
+ };
+
+ constexpr Derived der;
+}
+
+namespace B {
+ class Base {
+ int x;
+ public:
+ constexpr Base() : x(5) {}
+ };
+
+ class Base2 {
+ public:
+ virtual void fun() {}
+ };
+
+ class Derived : public Base, public Base2 {
+ public:
+ constexpr Derived() {}
+ };
+
+ constexpr Derived der;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C
new file mode 100644
index 000000000..b938d6535
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C
@@ -0,0 +1,18 @@
+// PR c++/56291
+// { dg-do compile { target c++11 } }
+
+class Base
+{
+public:
+ constexpr Base() : v(1) {};
+ int v;
+};
+
+class Derived : public Base
+{
+public:
+ constexpr Derived() : Base() {};
+ virtual void function();
+};
+
+Derived d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C
new file mode 100644
index 000000000..dc1b7080a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C
@@ -0,0 +1,33 @@
+// PR c++/48570
+// { dg-do run { target c++11 } }
+
+extern "C" void abort ();
+constexpr wchar_t foo (int i) { return L"0123"[i]; }
+constexpr char16_t bar (int i) { return u"0123"[i]; }
+constexpr char32_t baz (int i) { return U"0123"[i]; }
+const wchar_t foo0 = foo (0);
+const wchar_t foo1 = foo (1);
+const wchar_t foo2 = foo (2);
+const wchar_t foo3 = foo (3);
+const wchar_t foo4 = foo (4);
+const char16_t bar0 = bar (0);
+const char16_t bar1 = bar (1);
+const char16_t bar2 = bar (2);
+const char16_t bar3 = bar (3);
+const char16_t bar4 = bar (4);
+const char32_t baz0 = baz (0);
+const char32_t baz1 = baz (1);
+const char32_t baz2 = baz (2);
+const char32_t baz3 = baz (3);
+const char32_t baz4 = baz (4);
+
+int
+main ()
+{
+ if (foo0 != L'0' || foo1 != L'1' || foo2 != L'2' || foo3 != L'3' || foo4 != L'\0')
+ abort ();
+ if (bar0 != u'0' || bar1 != u'1' || bar2 != u'2' || bar3 != u'3' || bar4 != u'\0')
+ abort ();
+ if (baz0 != U'0' || baz1 != U'1' || baz2 != U'2' || baz3 != U'3' || baz4 != U'\0')
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C
new file mode 100644
index 000000000..db79a9c75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C
@@ -0,0 +1,6 @@
+// PR c++/48570
+// { dg-do compile { target c++11 } }
+
+constexpr wchar_t c1 = L"hi"[3]; // { dg-error "out of bound" }
+constexpr char16_t c2 = u"hi"[3]; // { dg-error "out of bound" }
+constexpr char32_t c3 = U"hi"[3]; // { dg-error "out of bound" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C
new file mode 100644
index 000000000..e7ccb64a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+struct B {
+ int i;
+ B (int _i) : i(_i) { }
+ ~B () { i = 0; }
+};
+
+struct A : public B {
+ A () : B(-1) { }
+ A (int i) : A() { }
+ A (double b) : A(static_cast<int>(b)) { }
+ A (double b, double b2) : A(b2) { }
+ ~A () { }
+};
+
+void f_A () { A a(2.0, 3.0); }
+
+struct C {
+ C () { }
+ virtual ~C() { }
+ virtual int f () = 0;
+};
+
+struct D : public C {
+ int i;
+ D (int _i) : C(), i(_i) { }
+ D () : D(-1) { }
+ virtual ~D() { }
+ virtual int f () { }
+};
+
+void f_D () { C* c = new D(); }
+
+template <typename T>
+struct E {
+ T t;
+ E () : E(T()) { }
+ E (T _t) : t(_t) { }
+};
+
+void f_E () { E<int> e; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C
new file mode 100644
index 000000000..665f79d42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int i, j;
+ A () : A(0), j(0) { } // { dg-error "constructor delegation" }
+ A (int _i) : i(_i) { }
+};
+
+struct B {
+ int i, j;
+ B () : i(0), B(0) { } // { dg-error "constructor delegation" }
+ B (int _j) : j(_j) { }
+
+};
+
+struct C {};
+
+struct D : public C {
+ D () : C() { }
+ D (float) : D(), C() { } // { dg-error "constructor delegation" }
+ D (float, float): C(), D() { } // { dg-error "constructor delegation" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C
new file mode 100644
index 000000000..9c6fd5656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C
@@ -0,0 +1,62 @@
+// { dg-do compile { target c++11 } }
+
+struct X {};
+
+struct B {
+ int i;
+ B (int _i) : i(_i) { }
+ ~B () { i = 0; }
+};
+
+template <typename T>
+struct A : public B {
+ A () : B(-1) { }
+ ~A () { }
+};
+
+template <typename T>
+struct A<T*> : public B {
+ A () : B(-1) { }
+ A (int i) : A() { }
+ A (double b) : A(static_cast<int>(b)) { }
+ A (double b, double b2) : A(b2) { }
+ ~A () { }
+};
+
+void f_A () { A<X*> a(2.0, 3.0); }
+
+struct C {
+ C () { }
+ virtual ~C() { }
+ virtual int f () = 0;
+};
+
+template <typename T>
+struct D : public C {
+ int i;
+ D (int _i) : C(), i(_i) { }
+};
+
+template <>
+struct D<X> : public C {
+ int i;
+ D (int _i) : C(), i(_i) { }
+ D () : D(-1) { }
+ virtual ~D() { }
+ virtual int f () { }
+};
+
+void f_D () { D<X>* d = new D<X>(); }
+
+template <typename T>
+struct E {
+};
+
+template <>
+struct E<int> {
+ int i;
+ E () : E(0) { }
+ E (int _i) : i(_i) { }
+};
+
+void f_E () { E<int> e; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C
new file mode 100644
index 000000000..634b5498d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "--std=c++98" }
+
+struct X {
+ X() {}
+ X(int) : X() {} // { dg-warning "delegating constructors" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C
new file mode 100644
index 000000000..57321626e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C
@@ -0,0 +1,27 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+int count = 0;
+struct VB
+{
+ VB() {++count;}
+};
+
+struct B : virtual VB
+{
+ B() : B(42) {}
+ B(int) {}
+};
+
+struct D : B
+{
+ D() {}
+ D(int) : D() {}
+};
+
+int main()
+{
+ D d{42};
+ assert(count == 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C
new file mode 100644
index 000000000..b16c0b47b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C
@@ -0,0 +1,40 @@
+// { dg-do run { target c++11 } }
+
+int a_ct;
+
+struct A
+{
+ A(int i): i(i) { ++a_ct; }
+ A(const A& a): i(a.i) { ++a_ct; }
+ ~A() { --a_ct; }
+ int i;
+};
+
+struct V
+{
+ V() { }
+};
+
+struct B: virtual V
+{
+ A a;
+ B(A a): a(a) { }
+ B(int i): B(A(i)) { }
+};
+
+struct C: B
+{
+ C(int i): B(i) { }
+};
+
+int main()
+{
+ {
+ B b(42);
+ C c(24);
+ if (b.a.i != 42
+ ||c.a.i != 24)
+ __builtin_abort ();
+ }
+ return a_ct;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C
new file mode 100644
index 000000000..e48741e07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C
@@ -0,0 +1,7 @@
+// PR c++/58255
+// { dg-do compile { target c++11 } }
+
+struct A {
+ explicit A() { }
+ A(int x) : A() { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C
new file mode 100644
index 000000000..e483f3e4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C
@@ -0,0 +1,66 @@
+// PR c++/51424
+// { dg-do compile { target c++11 } }
+
+template <class T >
+struct S
+{
+ S() : S() {} // { dg-error "delegates to itself" }
+ S(int x) : S(x) {} // { dg-error "delegates to itself" }
+};
+
+struct B1
+{
+ B1() : B1() {} // { dg-error "delegates to itself" }
+ B1(int y) : B1(y) {} // { dg-error "delegates to itself" }
+};
+
+struct V1 : virtual B1
+{
+ V1() : B1() {}
+ V1(int x) : B1(x) {}
+};
+
+struct B2
+{
+ B2() : B2() {} // { dg-error "delegates to itself" }
+ B2(int y) : B2(y) {} // { dg-error "delegates to itself" }
+};
+
+struct V2 : virtual B2
+{
+ V2() : V2() {} // { dg-error "delegates to itself" }
+ V2(int x) : V2(x) {} // { dg-error "delegates to itself" }
+};
+
+struct B3
+{
+ B3() {}
+ B3(int y) {}
+};
+
+struct V3 : virtual B3
+{
+ V3() : V3() {} // { dg-error "delegates to itself" }
+ V3(int x) : V3(x) {} // { dg-error "delegates to itself" }
+};
+
+struct CE1
+{
+ constexpr CE1() : CE1() {} // { dg-error "delegates to itself" }
+ constexpr CE1(int x) : CE1(x) {} // { dg-error "delegates to itself" }
+};
+
+struct CEB2
+{
+ constexpr CEB2() : CEB2() {} // { dg-error "delegates to itself" }
+ constexpr CEB2(int x) : CEB2(x) {} // { dg-error "delegates to itself" }
+};
+
+struct CE2 : CEB2
+{
+ constexpr CE2() : CEB2() {}
+ constexpr CE2(int x) : CEB2(x) {}
+};
+
+S<int> s1;
+S<int> s2(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C
new file mode 100644
index 000000000..f9c879e95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C
@@ -0,0 +1,11 @@
+// Core 1212
+// { dg-do compile { target c++11 } }
+
+template <class T, class U> struct assert_same_type;
+template <class T> struct assert_same_type<T,T> {};
+
+int main()
+{
+ int i;
+ assert_same_type<int&&,decltype(static_cast<int&&>(i))>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
new file mode 100644
index 000000000..fbbc6a149
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// PR c++/33837
+void foo()
+{
+ __decltype (A::foo()); // { dg-error "was not declared|expected" }
+ __decltype (B); // { dg-error "was not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C
new file mode 100644
index 000000000..effe08dcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+// PR c++/33838
+template<typename T> struct A
+{
+ __decltype (T* foo()); // { dg-error "expected|no arguments|accept" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C
new file mode 100644
index 000000000..3b8455bc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C
@@ -0,0 +1,4 @@
+// PR c++/38655
+// { dg-options "" }
+
+__decltype(0r)* p = 1; // { dg-error "not supported|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C
new file mode 100644
index 000000000..4b81b5ab8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C
@@ -0,0 +1,28 @@
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-Wall" } */
+
+typedef float v4f __attribute__((vector_size(4*sizeof(float))));
+
+template <class T> void eat (T&&) {}
+
+void test1 ()
+{
+ v4f x = {0,1,2,3};
+ typedef decltype (x < x) v4i;
+ v4i y = {4,5,6,7}; // v4i is not opaque
+ eat (y);
+}
+
+template<class V>
+void test2 ()
+{
+ V x = {0,1,2,3};
+ typedef decltype (x < x) v4i;
+ v4i y = {4,5,6,7}; // v4i is not opaque
+ eat (y);
+}
+
+int main(){
+ test1();
+ test2<v4f>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C
new file mode 100644
index 000000000..2616bb090
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C
@@ -0,0 +1,32 @@
+// PR c++/52748
+// N3276
+// { dg-do compile { target c++11 } }
+
+struct A; // { dg-error "forward declaration" }
+A f();
+
+decltype(f()) g1(); // OK
+decltype(((f()))) g2b(); // OK
+decltype(42,f()) g3(); // OK
+decltype(42,45,f()) g3b(); // OK
+decltype(42,45,(f())) g3c(); // OK
+decltype(42,((45,(f())))) g3c(); // OK
+
+decltype(f(),42) g4(); // { dg-error "" }
+decltype(45,f(),42) g4b(); // { dg-error "" }
+
+class B
+{
+ ~B(); // { dg-error "private" }
+public:
+ int i;
+ void operator[](int);
+};
+B h();
+
+void i(const B&);
+
+decltype(h()) g5a(); // OK
+decltype(h().i) g5(); // { dg-error "" }
+decltype(h()[0]) g6(); // { dg-error "" }
+decltype(i(h())) g7(); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C
new file mode 100644
index 000000000..ad2322090
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C
@@ -0,0 +1,7 @@
+// PR c++/52748
+// We don't want to instantiate A<T> here.
+// { dg-require-effective-target c++11 }
+
+template <class T> struct A: T { };
+template <class T> A<T> f(T);
+decltype(f(42)) *p;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C
new file mode 100644
index 000000000..27797a2fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C
@@ -0,0 +1,132 @@
+// Testcase for N3276 and operator overloading
+// { dg-require-effective-target c++11 }
+
+struct A;
+struct B {
+ A operator()(int);
+ A operator[](int);
+ A operator=(int);
+ A operator+=(int);
+ A operator-=(int);
+ A operator*=(int);
+ A operator/=(int);
+ A operator^=(int);
+ A operator&=(int);
+ A operator|=(int);
+ A operator<<=(int);
+ A operator>>=(int);
+};
+
+A operator-(B);
+A operator+(B);
+A operator*(B);
+A operator&(B);
+A operator!(B);
+A operator~(B);
+A operator++(B);
+A operator--(B);
+
+A operator+(B,B);
+A operator-(B,B);
+A operator*(B,B);
+A operator/(B,B);
+A operator%(B,B);
+A operator^(B,B);
+A operator&(B,B);
+A operator|(B,B);
+A operator<(B,B);
+A operator>(B,B);
+A operator,(B,B);
+A operator<<(B,B);
+A operator>>(B,B);
+A operator==(B,B);
+A operator->*(B,B);
+
+#define TRY(E) static_cast<decltype(E)*>(0)
+
+template <class B>
+void f()
+{
+ B b;
+ TRY(b(0));
+ TRY(b[0]);
+ TRY(b=0);
+ TRY(b+=0);
+ TRY(b-=0);
+ TRY(b*=0);
+ TRY(b/=0);
+ TRY(b^=0);
+ TRY(b&=0);
+ TRY(b|=0);
+ TRY(b<<=0);
+ TRY(b>>=0);
+
+ TRY(-b);
+ TRY(+b);
+ TRY(*b);
+ TRY(&b);
+ TRY(!b);
+ TRY(~b);
+ TRY(++b);
+ TRY(--b);
+
+ TRY(b+b);
+ TRY(b-b);
+ TRY(b*b);
+ TRY(b/b);
+ TRY(b%b);
+ TRY(b^b);
+ TRY(b&b);
+ TRY(b|b);
+ TRY(b>b);
+ TRY(b<b);
+ TRY((b,b));
+ TRY(b<<b);
+ TRY(b>>b);
+ TRY(b==b);
+ TRY(b->*b);
+}
+
+int main()
+{
+ B b;
+ TRY(b(0));
+ TRY(b[0]);
+ TRY(b=0);
+ TRY(b+=0);
+ TRY(b-=0);
+ TRY(b*=0);
+ TRY(b/=0);
+ TRY(b^=0);
+ TRY(b&=0);
+ TRY(b|=0);
+ TRY(b<<=0);
+ TRY(b>>=0);
+
+ TRY(-b);
+ TRY(+b);
+ TRY(*b);
+ TRY(&b);
+ TRY(!b);
+ TRY(~b);
+ TRY(++b);
+ TRY(--b);
+
+ TRY(b+b);
+ TRY(b-b);
+ TRY(b*b);
+ TRY(b/b);
+ TRY(b%b);
+ TRY(b^b);
+ TRY(b&b);
+ TRY(b|b);
+ TRY(b>b);
+ TRY(b<b);
+ TRY((b,b));
+ TRY(b<<b);
+ TRY(b>>b);
+ TRY(b==b);
+ TRY(b->*b);
+
+ f<B>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C
new file mode 100644
index 000000000..f46d0ba41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C
@@ -0,0 +1,9 @@
+// PR c++/59270
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ struct B b; // { dg-error "incomplete type" }
+};
+
+decltype(A()) a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C
new file mode 100644
index 000000000..cecff3c29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// PR c++/33045
+int && f ();
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+static_assert(is_same<decltype(f()), int&&>::value, "decltype of rvalue reference");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C
new file mode 100644
index 000000000..84c7a03f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C
@@ -0,0 +1,27 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+const int& foo();
+int i;
+struct A { double x; };
+const A* a = new A();
+
+static_assert(is_same<decltype(foo()), const int&>::value,
+ "type should be const int&");
+static_assert(is_same<decltype(i), int>::value,
+ "type should be int");
+static_assert(is_same<decltype(a->x), double>::value,
+ "type should be double");
+static_assert(is_same<decltype((a->x)), const double&>::value,
+ "type should be const double&");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C
new file mode 100644
index 000000000..846d0bf57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C
@@ -0,0 +1,9 @@
+// PR c++/34271
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ static int i;
+};
+
+template<int N> int A<N>::i(decltype (A::i; // { dg-error "expected primary-expression before" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C
new file mode 100644
index 000000000..9fa8e230f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C
@@ -0,0 +1,12 @@
+// PR c++/35316
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ int i : 2;
+
+ void foo()
+ {
+ decltype(i) j;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C
new file mode 100644
index 000000000..eae318db2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C
@@ -0,0 +1,37 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+int&& f(const int&) {}
+int&& (*fp)(const int&) = f;
+int&& (&fr)(const int&) = f;
+
+struct X { int&& f(const int&); };
+
+int&& (X::*mfp)(const int&) = &X::f;
+
+void g(X& xr, X* xp)
+{
+ int i;
+ static_assert(is_same<decltype(f(i)), int&&>::value, "direct call");
+ static_assert(is_same<decltype(fp(i)), int&&>::value, "pointer");
+ static_assert(is_same<decltype((*fp)(i)), int&&>::value,
+ "dereferenced pointer");
+ static_assert(is_same<decltype(fr(i)), int&&>::value,
+ "reference");
+ static_assert(is_same<decltype(xr.f(i)), int&&>::value,
+ "member function call");
+ static_assert(is_same<decltype((xr.*mfp)(i)), int&&>::value,
+ "member function pointer with .*");
+ static_assert(is_same<decltype((xp->*mfp)(i)), int&&>::value,
+ "member function pointer with ->*");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C
new file mode 100644
index 000000000..8e6c6d2bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C
@@ -0,0 +1,38 @@
+// PR c++/34269
+// { dg-do compile }
+
+void
+f1 ()
+{
+ __decltype; // { dg-error "expected" }
+}
+
+void
+f2 ()
+{
+ __decltype (; // { dg-error "expected" }
+}
+
+void
+f3 ()
+{
+ __decltype (); // { dg-error "expected" }
+}
+
+void
+f4 ()
+{
+ __typeof__; // { dg-error "expected" }
+}
+
+void
+f5 ()
+{
+ __typeof__ (; // { dg-error "expected" }
+}
+
+void
+f6 ()
+{
+ __typeof__ (); // { dg-error "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C
new file mode 100644
index 000000000..9484173cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C
@@ -0,0 +1,17 @@
+// PR c++/37540
+
+struct A
+{
+ int g() {return 0;}
+};
+
+template <typename T_>
+void f(A a)
+{
+ __decltype(a.g()) i;
+}
+
+int main()
+{
+ f<int>(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C
new file mode 100644
index 000000000..f19819cfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C
@@ -0,0 +1,12 @@
+// PR c++/38640
+// { dg-do compile { target c++11 } }
+
+template<int N> void foo (decltype (N));
+template<long int N> void foo (decltype (N));
+
+void
+bar (void)
+{
+ foo<5> (6);
+ foo<5L> (6L);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C
new file mode 100644
index 000000000..5cf843953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C
@@ -0,0 +1,10 @@
+// PR c++/39070
+// { dg-do compile { target c++11 } }
+
+template<typename X> struct junk {
+ template<typename Z> static Z y();
+ template<typename Y> static int test(...);
+ template<typename Y> static char test(decltype(y<Y>())*);
+ static int const value=sizeof(test<X>(0));
+};
+typedef char type[junk<int>::value==sizeof(char) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C
new file mode 100644
index 000000000..6e5854db6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C
@@ -0,0 +1,28 @@
+// PR c++/36628
+// { dg-do run { target c++11 } }
+
+#include <typeinfo>
+#include <string.h>
+
+int rvalue();
+int& lvalueref();
+int&& rvalueref();
+
+decltype(true ? rvalue() : rvalue()) f()
+{}
+
+decltype(true ? lvalueref() : lvalueref()) g()
+{}
+
+decltype(true ? rvalueref() : rvalueref()) h()
+{}
+
+int main()
+{
+ if (strcmp (typeid(f).name(), "FivE") != 0)
+ return 1;
+ if (strcmp (typeid(g).name(), "FRivE") != 0)
+ return 2;
+ if (strcmp (typeid(h).name(), "FOivE") != 0)
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C
new file mode 100644
index 000000000..4c1571a56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C
@@ -0,0 +1,5 @@
+// PR c++/37875
+// { dg-do compile { target c++11 } }
+
+template <typename> struct X {};
+X<decltype(1 > 2)> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C
new file mode 100644
index 000000000..41d602f34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C
@@ -0,0 +1,24 @@
+// PR c++/42013
+
+template<typename _Tp>
+ _Tp
+__attribute ((const)) declval();
+
+template<typename _Tp, typename _Up>
+ struct common_type
+ {
+ typedef __decltype(true ? declval<_Tp>() : declval<_Up>()) typet;
+ typedef __decltype(false ? declval<_Tp>() : declval<_Up>()) typef;
+ };
+
+template<typename, typename> struct is_same;
+
+template<typename _Tp> struct is_same<_Tp, _Tp> { typedef _Tp type; };
+
+void f()
+{
+ typedef common_type<int, const int>::typet typet;
+ typedef common_type<int, const int>::typef typef;
+
+ typedef is_same<typet, typef>::type type;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C
new file mode 100644
index 000000000..f316f50a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C
@@ -0,0 +1,58 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define CHECK_DECLTYPE(DECLTYPE,RESULT) \
+ static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT)
+
+struct A {};
+
+int a;
+int& b = a;
+const int& c = a;
+const int d = 5;
+const A e = A();
+CHECK_DECLTYPE(decltype(a), int);
+CHECK_DECLTYPE(decltype(b), int&);
+CHECK_DECLTYPE(decltype(c), const int&);
+CHECK_DECLTYPE(decltype(d), const int);
+CHECK_DECLTYPE(decltype(e), const A);
+
+CHECK_DECLTYPE(decltype(a), int);
+CHECK_DECLTYPE(decltype((a)), int&);
+
+void foo_check(int a, int& b, float& c, int* d)
+{
+ CHECK_DECLTYPE(decltype(a), int);
+ CHECK_DECLTYPE(decltype(b), int&);
+ CHECK_DECLTYPE(decltype(c), float&);
+ CHECK_DECLTYPE(decltype(d), int*);
+}
+
+int foo(char);
+int bar(char);
+int bar(int);
+CHECK_DECLTYPE(decltype(foo), int(char));
+
+decltype(bar) z; // { dg-error "overload" "overload" }
+// { dg-error "invalid type" "invalid" { target *-*-* } 47 }
+
+CHECK_DECLTYPE(decltype(&foo), int(*)(char));
+CHECK_DECLTYPE(decltype(*&foo), int(&)(char));
+
+void array_types()
+{
+ int a[10];
+ CHECK_DECLTYPE(decltype(a), int[10]);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C
new file mode 100644
index 000000000..5fb354042
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C
@@ -0,0 +1,10 @@
+// PR c++/42277
+// { dg-do compile { target c++11 } }
+
+struct S { int s; };
+template <int N>
+void foo ()
+{
+ S s;
+ decltype (s.s) i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C
new file mode 100644
index 000000000..e4dc2011e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C
@@ -0,0 +1,34 @@
+// PR c++/6709 (DR 743)
+// PR c++/42603 (DR 950)
+// { dg-do compile { target c++11 } }
+
+template <class T>
+T make();
+
+struct p { typedef int t; };
+struct c : decltype(make<p>()) {};
+
+decltype(make<p>())::t t;
+
+// PR c++/49823
+
+template < typename T >
+auto f( const T &x )
+ -> typename decltype( x )::type; // ICE on here
+
+template < typename T >
+typename decltype( T{} )::type // ICE on here
+f( T );
+
+template < typename T >
+void f( T x )
+{ typename decltype( x )::type t; } // ICE on here
+
+// Negative tests
+
+int f();
+decltype(f())::t t2; // { dg-error "not a class" }
+
+struct D: decltype(f()) { }; // { dg-error "not a class" }
+
+// { dg-prune-output "expected initializer" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C
new file mode 100644
index 000000000..b3ff8b84a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C
@@ -0,0 +1,13 @@
+// PR c++/42761
+// { dg-do compile { target c++11 } }
+
+template<typename _Tp> _Tp* fn();
+
+template <class T> struct A
+{
+ template <class U,
+ class S = decltype(fn<T>())>
+ struct B { };
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C
new file mode 100644
index 000000000..731eed708
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+int x, &&y = static_cast<int &&>(x);
+typedef decltype((y)) myInt; // `y' is a parenthesized id-expression of type int that is an lvalue
+typedef int &myInt;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C
new file mode 100644
index 000000000..0ff9963e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C
@@ -0,0 +1,7 @@
+// PR c++/47068
+// { dg-do compile { target c++11 } }
+
+template <class T> struct broken {
+ int member;
+ typedef decltype(~ member) gcc_crashes_here;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C
new file mode 100644
index 000000000..e57376f9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C
@@ -0,0 +1,20 @@
+// PR c++/47851
+// { dg-do compile { target c++11 } }
+
+struct Type {
+ void display_type();
+ void display_type() const { }
+};
+
+typedef Type const ConstType;
+
+struct ConvertibleToType {
+ operator Type&() { return *reinterpret_cast<Type*>(this); }
+};
+
+int main ()
+{
+ // Both lines should call the const variant.
+ (true ? ConvertibleToType() : ConstType()).display_type();
+ decltype((true ? ConvertibleToType() : ConstType()))().display_type();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C
new file mode 100644
index 000000000..0d320dadd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+struct A { };
+
+template <class T>
+decltype(f(T())) f(T t) // { dg-error "depth" }
+{
+ return f(t);
+}
+
+int main()
+{
+ f(A()); // { dg-error "no match" }
+}
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C
new file mode 100644
index 000000000..3174a89cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C
@@ -0,0 +1,9 @@
+// PR c++/48617
+// { dg-do compile { target c++11 } }
+
+template<class T, decltype(T())> // #
+struct A {};
+
+A<int, 0> a;
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C
new file mode 100644
index 000000000..c1c5a1b30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C
@@ -0,0 +1,16 @@
+// PR c++/44175
+// { dg-do compile { target c++11 } }
+
+template <bool, class T> struct enable_if { };
+template <class T> struct enable_if <true, T> { typedef T type; };
+
+template <class F, int N>
+void ft (F f, typename enable_if<N!=0, int>::type) {}
+
+template< class F, int N >
+decltype(ft<F, N-1> (F(), 0)) // { dg-error "depth" }
+ft (F f, typename enable_if<N==0, int>::type) {}
+
+int main() {
+ ft<struct a*, 2> (0, 0); // { dg-message "from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C
new file mode 100644
index 000000000..d87299ccc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C
@@ -0,0 +1,19 @@
+// PR c++/44175
+// { dg-do compile { target c++11 } }
+
+template <bool, class T> struct enable_if { };
+template <class T> struct enable_if <true, T> { typedef T type; };
+
+template <int x>
+typename enable_if<x==0,int>::type
+ft() {}
+
+template<class F, int N>
+decltype (ft<F> (F())) // { dg-error "depth" }
+ft() {}
+
+int main() {
+ ft<struct a*, 0>(); // { dg-error "no match|wrong number" }
+}
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C
new file mode 100644
index 000000000..aaff5df59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C
@@ -0,0 +1,71 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define CHECK_DECLTYPE(DECLTYPE,RESULT) \
+ static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT)
+
+class A {
+public:
+ int a;
+ int& b;
+ static int c;
+
+ A(int& b) : b(b) { }
+
+ void foo() {
+ CHECK_DECLTYPE(decltype(a), int);
+ CHECK_DECLTYPE(decltype(this->a), int);
+ CHECK_DECLTYPE(decltype((*this).a), int);
+ CHECK_DECLTYPE(decltype(b), int&);
+ CHECK_DECLTYPE(decltype(c), int);
+ }
+ void bar() const {
+ CHECK_DECLTYPE(decltype(a), int);
+ CHECK_DECLTYPE(decltype(b), int&);
+ CHECK_DECLTYPE(decltype(c), int);
+ }
+};
+
+int b;
+A aa(b);
+const A& caa = aa;
+CHECK_DECLTYPE(decltype(aa.a), int);
+CHECK_DECLTYPE(decltype(aa.b), int&);
+CHECK_DECLTYPE(decltype(caa.a), int);
+
+class B {
+public:
+ int a;
+ enum B_enum { b };
+ decltype(a) c;
+ decltype(a) foo() { }
+ decltype(b) enums_are_in_scope() { return b; } // ok
+};
+
+CHECK_DECLTYPE(decltype(aa.*&A::a), int&);
+decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" "cannot" }
+// { dg-error "invalid type" "invalid type" { target *-*-* } 57 }
+CHECK_DECLTYPE(decltype(caa.*&A::a), const int&);
+
+class X {
+ void foo() {
+ CHECK_DECLTYPE(decltype(this), X*);
+ CHECK_DECLTYPE(decltype(*this), X&);
+ }
+ void bar() const {
+ CHECK_DECLTYPE(decltype(this), const X*);
+ CHECK_DECLTYPE(decltype(*this), const X&);
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C
new file mode 100644
index 000000000..25eeb9d29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C
@@ -0,0 +1,17 @@
+// PR c++/49369
+// { dg-do compile { target c++11 } }
+
+template <class,class> struct assert_same;
+template <class T> struct assert_same<T,T> {};
+
+struct B {
+ int member;
+};
+
+struct C: B {
+ void method() const;
+};
+
+void C::method() const {
+ assert_same<decltype((B::member)), const int&> a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C
new file mode 100644
index 000000000..bffcf1c0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C
@@ -0,0 +1,13 @@
+// PR c++/49921
+// { dg-do compile { target c++11 } }
+
+struct Local
+{
+ void f();
+};
+
+Local *l;
+void (Local::*ptr)();
+decltype((l->*ptr)) i; // { dg-error "member function" }
+
+// { dg-prune-output "invalid type in declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C
new file mode 100644
index 000000000..02c6316e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C
@@ -0,0 +1,13 @@
+// PR c++/50075
+// { dg-do compile { target c++11 } }
+// { dg-options "-ftemplate-depth=10" }
+
+template <typename T>
+auto make_array(const T& il) ->
+decltype(make_array(il)) // { dg-error "not declared|no matching|exceeds" }
+{ }
+
+int main()
+{
+ int z = make_array(1); // { dg-error "no matching" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C
new file mode 100644
index 000000000..63d5a4913
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C
@@ -0,0 +1,19 @@
+// PR c++/50084
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-inline" }
+
+template<typename> struct remove_reference;
+template<typename T> struct remove_reference<T&> { typedef T type; };
+
+template <class T> void f(T) { }
+
+void g()
+{
+ struct { } * v = 0;
+
+ typedef remove_reference<decltype(*v)>::type at;
+
+ // The typedef should't assign the name "at" to the struct.
+ // { dg-final { scan-assembler "_Z1fIZ1gvEUt_EvT_" } }
+ f(at());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C
new file mode 100644
index 000000000..028e50669
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C
@@ -0,0 +1,19 @@
+// PR c++/50870
+// { dg-do compile { target c++11 } }
+
+struct impl
+{
+ template <class T> static T create();
+};
+
+template<class T, class U,
+ class = decltype(impl::create<T>()->impl::create<U>())>
+struct tester{};
+
+tester<impl*, int> ti;
+
+template<class T, class U,
+ class = decltype(impl::create<T>()->impl::create<U>())>
+int test() { return 0; }
+
+int i = test<impl*, int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C
new file mode 100644
index 000000000..daffaf030
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C
@@ -0,0 +1,15 @@
+// PR c++/50870
+// { dg-do compile { target c++11 } }
+
+template <class V>
+ struct impl
+ {
+ template <class T> static T create();
+ };
+
+template <class T, class U, class V, class
+ = decltype(impl<V>::template create<T>()
+ -> impl<V>::template create<U>())>
+struct tester { };
+
+tester<impl<float>*, int, float> ti;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C
new file mode 100644
index 000000000..c426f69a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C
@@ -0,0 +1,21 @@
+// PR c++/51265
+// { dg-do compile { target c++11 } }
+
+struct Funny
+{
+ int print(int);
+};
+
+template<typename X>
+void c();
+
+template<typename X, X ff>
+void xx()
+{
+ c<decltype(ff)>();
+}
+
+int main()
+{
+ xx<int(Funny::*)(int), &Funny::print>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C
new file mode 100644
index 000000000..c885e9a07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C
@@ -0,0 +1,14 @@
+// PR c++/53651
+// { dg-do compile { target c++11 } }
+
+template<typename> struct wrap { void bar(); };
+
+template<typename T> auto foo(T* t) -> wrap<T>* { return 0; }
+
+template<typename T>
+struct holder : decltype(*foo((T*)0)) // { dg-error "class type" }
+{
+ using decltype(*foo((T*)0))::bar; // { dg-error "is not a base" }
+};
+
+holder<int> h;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C
new file mode 100644
index 000000000..97ebb33a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C
@@ -0,0 +1,17 @@
+// PR c++/53498
+// { dg-do compile { target c++11 } }
+
+template<typename... Args>
+struct B
+{
+ template<typename U>
+ static
+ void b(const U& u, const Args&... args,
+ decltype(u.f(args...)) dummy)
+ {
+ }
+};
+
+int main() {
+ B<int> b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C
new file mode 100644
index 000000000..4676d2de9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C
@@ -0,0 +1,19 @@
+// PR c++/53788
+// { dg-do compile { target c++11 } }
+
+struct t { static const bool value = true; };
+struct f { static const bool value = false; };
+
+template<typename T>
+struct has_static {
+ template<typename X>
+ static t check(X*, decltype(T::fun())* = 0); // { dg-error "without object" }
+ static f check(...);
+
+ typedef decltype(check((T*)(0))) ret;
+ static const bool value = ret::value;
+};
+
+struct test { int fun() { return 0; } };
+
+bool b = has_static<test>::value;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C
new file mode 100644
index 000000000..c14e15646
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C
@@ -0,0 +1,82 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define CHECK_DECLTYPE(DECLTYPE,RESULT) \
+ static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT)
+
+struct A {
+ int x;
+ int& y;
+ int foo(char);
+ int& bar() const;
+};
+
+CHECK_DECLTYPE(decltype(&A::x), int A::*);
+decltype(&A::y) Ay; // { dg-error "cannot create pointer to reference member|invalid type" }
+CHECK_DECLTYPE(decltype(&A::foo), int (A::*) (char));
+CHECK_DECLTYPE(decltype(&A::bar), int& (A::*) () const);
+
+CHECK_DECLTYPE(decltype("decltype"), const char(&)[9]);
+CHECK_DECLTYPE(decltype(1), int);
+
+int an_int = 5;
+int& i = an_int;
+const int j = an_int;
+
+CHECK_DECLTYPE(decltype(i)&, int&);
+CHECK_DECLTYPE(const decltype(j), const int);
+
+int foo();
+CHECK_DECLTYPE(decltype(foo()), int);
+float& bar(int);
+CHECK_DECLTYPE(decltype (bar(1)), float&);
+const A bar();
+CHECK_DECLTYPE(decltype (bar()), const A);
+const A& bar2();
+CHECK_DECLTYPE(decltype (bar2()), const A&);
+
+void wibble() {
+ CHECK_DECLTYPE(decltype(1+2), int);
+ int* p;
+ CHECK_DECLTYPE(decltype(*p), int&);
+ int a[10];
+ CHECK_DECLTYPE(decltype(a[3]), int&);
+ int i; int& j = i;
+ CHECK_DECLTYPE(decltype (i = 5), int&);
+ CHECK_DECLTYPE(decltype (j = 5), int&);
+
+ CHECK_DECLTYPE(decltype (++i), int&);
+ CHECK_DECLTYPE(decltype (i++), int);
+}
+
+struct B {
+ B () : bit(), cbit() {}
+ int bit : 2;
+ const int cbit : 3;
+
+ void foo()
+ {
+ CHECK_DECLTYPE(decltype(bit), int);
+ CHECK_DECLTYPE(decltype((bit)), int&);
+ CHECK_DECLTYPE(decltype(cbit), const int);
+ CHECK_DECLTYPE(decltype((cbit)), const int&);
+ }
+};
+
+B b;
+const B& bc = b;
+CHECK_DECLTYPE(decltype(b.bit), int);
+CHECK_DECLTYPE(decltype(bc.bit), int);
+CHECK_DECLTYPE(decltype((b.bit)), int&);
+CHECK_DECLTYPE(decltype((bc.bit)), const int&);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C
new file mode 100644
index 000000000..1b194ab1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C
@@ -0,0 +1,101 @@
+// PR c++/51222
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rref {
+ typedef T&& type;
+};
+
+template<>
+struct add_rref<void> {
+ typedef void type;
+};
+
+template<class T>
+typename add_rref<T>::type declval();
+
+template<class T, class U, class =
+ decltype(::delete ::new T(declval<U>()))
+>
+auto f(int) -> char;
+
+template<class, class>
+auto f(...) -> char(&)[2];
+
+template<class T, class =
+ decltype(::delete ::new T())
+>
+auto g(int) -> char;
+
+template<class>
+auto g(...) -> char(&)[2];
+
+template<class T, class U>
+auto f2(int) -> decltype(::delete ::new T(declval<U>()), char());
+
+template<class, class>
+auto f2(...) -> char(&)[2];
+
+template<class T>
+auto g2(int) -> decltype(::delete ::new T(), char());
+
+template<class>
+auto g2(...) -> char(&)[2];
+
+struct C { };
+
+struct A {
+ virtual ~A() = 0;
+};
+
+struct D1 {
+ D1() = delete;
+};
+
+struct D2 {
+ ~D2() = delete;
+};
+
+static_assert(sizeof(g<void>(0)) == 2, "Ouch");
+static_assert(sizeof(g<void()>(0)) == 2, "Ouch");
+static_assert(sizeof(g<void() const>(0)) == 2, "Ouch");
+static_assert(sizeof(g<A>(0)) == 2, "Ouch");
+static_assert(sizeof(g<D1>(0)) == 2, "Ouch");
+static_assert(sizeof(g<D2>(0)) == 2, "Ouch");
+static_assert(sizeof(g<int&>(0)) == 2, "Ouch");
+static_assert(sizeof(g<int&&>(0)) == 2, "Ouch");
+static_assert(sizeof(g<void(&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(g<void(&&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(f<void, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f<void(), void()>(0)) == 2, "Ouch");
+//static_assert(sizeof(f<void() const, void() const>(0)) == 2, "Ouch");
+static_assert(sizeof(f<int, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f<void, int>(0)) == 2, "Ouch");
+static_assert(sizeof(f<C, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f<C, int>(0)) == 2, "Ouch");
+static_assert(sizeof(f<int&, int&>(0)) == 2, "Ouch");
+static_assert(sizeof(f<int&&, int&&>(0)) == 2, "Ouch");
+static_assert(sizeof(f<void(&)(), void(&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(f<void(&&)(), void(&&)()>(0)) == 2, "Ouch");
+
+static_assert(sizeof(g2<void>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<void()>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<void() const>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<A>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<D1>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<D2>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<int&>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<int&&>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<void(&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(g2<void(&&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<void, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<void(), void()>(0)) == 2, "Ouch");
+//static_assert(sizeof(f2<void() const, void() const>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<int, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<void, int>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<C, void>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<C, int>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<int&, int&>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<int&&, int&&>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<void(&)(), void(&)()>(0)) == 2, "Ouch");
+static_assert(sizeof(f2<void(&&)(), void(&&)()>(0)) == 2, "Ouch");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C
new file mode 100644
index 000000000..1439e15c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C
@@ -0,0 +1,43 @@
+// Core 1273
+// { dg-do compile { target c++11 } }
+
+template <class T> struct C;
+template <class T> struct D;
+
+class A
+{
+ int i;
+ static int j;
+ friend struct C<int>;
+ friend struct D<int>;
+} a;
+
+class B
+{
+ int i;
+ static int j;
+ friend struct C<float>;
+ friend struct D<float>;
+} b;
+
+template <class T>
+struct C
+{
+ template <class U> decltype (a.i) f() { } // #1
+ template <class U> decltype (b.i) f() { } // #2
+};
+
+template <class T>
+struct D
+{
+ template <class U> decltype (A::j) f() { } // #1
+ template <class U> decltype (B::j) f() { } // #2
+};
+
+int main()
+{
+ C<int>().f<int>(); // calls #1
+ C<float>().f<float>(); // calls #2
+ D<int>().f<int>(); // calls #1
+ D<float>().f<float>(); // calls #2
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C
new file mode 100644
index 000000000..6c1aa4364
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C
@@ -0,0 +1,31 @@
+// PR c++/50545
+// { dg-do compile { target c++11 } }
+
+template< class T >
+T&& declval();
+
+// #1
+template< class T >
+auto f( int )
+ -> decltype( int{ declval<T>() } );
+
+// #2
+template< class >
+void f( ... );
+
+
+#define STATIC_ASSERT( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ )
+
+template< class T, class U >
+struct is_same {
+ static constexpr bool value = false;
+};
+
+template< class T >
+struct is_same<T, T> {
+ static constexpr bool value = true;
+};
+
+
+STATIC_ASSERT( is_same< decltype( f<int>(0) ), int >::value ); // OK; f<int>(0) calls #1.
+STATIC_ASSERT( is_same< decltype( f<int*>(0) ), void >::value ); // static assertion fails; f<int*>(0) should call #2, because int{ (int*)0 } is ill-formed, but calls #1.
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C
new file mode 100644
index 000000000..4df95a104
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C
@@ -0,0 +1,27 @@
+// PR c++/53763
+// { dg-do compile { target c++11 } }
+
+template<typename TYPE>
+struct A
+{
+ static int a(TYPE value)
+ {
+ return value;
+ }
+};
+
+template<typename... ARGS>
+struct B
+{
+ static int b(ARGS...)
+ {
+ return 0;
+ }
+};
+
+int main()
+{
+ int x = B<decltype(A<int>::a(1))>::b(A<int>::a(1));
+ int y = B<decltype(A ::a(2))>::b(A<int>::a(2)); // { dg-error "template argument" }
+ return x + y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C
new file mode 100644
index 000000000..2b2e62213
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C
@@ -0,0 +1,44 @@
+// PR c++/53307
+// { dg-do compile { target c++11 } }
+
+template <class...Ts> struct tuple{};
+
+struct funct
+{
+ template <class T, class...argTs>
+ T operator()(T arg1, argTs...)
+ {
+ return arg1;
+ }
+};
+
+template <class...>class test;
+
+template < template <class...> class tp,
+ class...arg1Ts,
+ class...arg2Ts>
+class test<tp<arg1Ts...>, tp<arg2Ts...>>
+{
+ public:
+ template <class func>
+ auto test_pass(func fun, arg2Ts...arg2s)
+ -> decltype(fun(arg2s...))
+ {
+ return fun(arg2s...);
+ }
+
+ template <class func, class...arg3Ts>
+ auto testbug(func fun, arg2Ts...arg2s, arg3Ts...arg3s)
+ -> decltype(fun(arg2s..., arg3s...))
+ {
+ return fun(arg2s..., arg3s...);
+ }
+};
+
+int main()
+{
+ test<tuple<>, tuple<char, int>> t;
+ t.test_pass (funct(), 'a', 2);
+ t.testbug (funct(), 'a', 2, "fine");
+ t.testbug (funct(), 'a', 2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C
new file mode 100644
index 000000000..f768d8554
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C
@@ -0,0 +1,40 @@
+// PR c++/51878
+// { dg-do compile { target c++11 } }
+
+template<class F, class... T>
+auto indirect_call(F f, T... t) -> decltype(f(t...))
+{
+ return f(t...);
+}
+
+template<class F, class T>
+struct VariadicBind
+{
+ F f;
+ T t;
+
+ template<class... A>
+ auto operator()(A... a) -> decltype(indirect_call(f, t, a...))
+ {
+ return indirect_call(f, t, a...);
+ }
+};
+
+template<class F>
+void apply(F f)
+{
+ f();
+}
+
+template<class F, class V1, class... V>
+void apply(F f, V1 v1, V... v)
+{
+ apply(VariadicBind<F, int>{f, v1}, v...);
+}
+
+void func(int, int) { }
+
+int main()
+{
+ apply(func, 0, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C
new file mode 100644
index 000000000..f18354dfa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C
@@ -0,0 +1,12 @@
+// PR c++/55558
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ static int member;
+};
+
+template<typename T> void foobar ()
+{
+ typedef decltype (A::member) myType;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C
new file mode 100644
index 000000000..f6700a33c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C
@@ -0,0 +1,12 @@
+// PR c++/55564
+// { dg-do compile { target c++11 } }
+
+template <typename T, decltype(sizeof(T)) N>
+auto array_size(T(&)[N]) -> decltype(N) { return N; }
+
+int main() {
+ int simple[4] = {};
+ int result = array_size(simple);
+
+ return result;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C
new file mode 100644
index 000000000..39fc4ebf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C
@@ -0,0 +1,16 @@
+// PR c++/56059
+// { dg-do compile { target c++11 } }
+
+typedef int Int;
+template<typename T> struct baz { };
+template<typename T> T bar();
+
+template<typename T, typename ... U>
+baz<decltype(bar<Int>(bar<U>() ...))> // { dg-error "no match" }
+foo();
+
+int main()
+{
+ foo<int, int>(); // { dg-error "no match" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C
new file mode 100644
index 000000000..c3174982f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C
@@ -0,0 +1,10 @@
+// PR c++/45282
+// { dg-require-effective-target c++11 }
+
+struct A { int i; };
+int A::*ipm = &A::i;
+
+template <class T, class U> class assert_same_type;
+template <class T> class assert_same_type<T,T> { };
+
+assert_same_type<decltype(A().*ipm),int> x2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C
new file mode 100644
index 000000000..3842e09c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C
@@ -0,0 +1,37 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define CHECK_DECLTYPE(DECLTYPE,RESULT) \
+ static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT)
+
+template<typename F> F create_a();
+
+template<typename F, typename T1>
+decltype(create_a<F&>()(create_a<const T1&>())) forward(F f, const T1& a1)
+{
+ return f(a1);
+}
+
+struct identity {
+ template<typename T>
+ const T& operator()(const T& x) { return x; }
+};
+
+
+identity id;
+int i;
+float f;
+
+CHECK_DECLTYPE(decltype(forward(id, i)), const int&);
+CHECK_DECLTYPE(decltype(forward(id, f)), const float&);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C
new file mode 100644
index 000000000..dc3332ac5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C
@@ -0,0 +1,18 @@
+// PR c++/52597
+// { dg-require-effective-target c++11 }
+
+struct A {
+ int zip();
+
+ decltype(zip) bar0; // { dg-error "invalid use of non-static member function" }
+ void bar1() {
+ typedef decltype(this->A::zip) x; // { dg-error "invalid use of non-static member function" }
+ }
+ void bar2() {
+ typedef decltype(A::zip) x; // { dg-error "invalid use of non-static member function" }
+ }
+};
+
+typedef decltype(A().zip) x; // { dg-error "invalid use of non-static member function" }
+
+// { dg-prune-output "invalid type in declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C
new file mode 100644
index 000000000..9ab41467a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C
@@ -0,0 +1,10 @@
+// PR c++/53721
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ void f() {};
+ auto g() -> decltype(this->f())
+ {
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C
new file mode 100644
index 000000000..e6b5a4caf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C
@@ -0,0 +1,18 @@
+// PR c++/56450
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+T&& declval();
+
+template<typename, typename>
+struct is_same
+{ static constexpr bool value = false; };
+
+template<typename T>
+struct is_same<T, T>
+{ static constexpr bool value = true; };
+
+struct A { static const int dummy = 0; };
+
+static_assert(is_same<decltype(declval<A>().dummy), const int>::value, "");
+static_assert(!is_same<decltype(declval<A>().dummy), const int&>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C
new file mode 100644
index 000000000..4580e97b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C
@@ -0,0 +1,11 @@
+// PR c++/57092
+// { dg-do compile { target c++11 } }
+
+template <void (*F)(int)>
+class B {
+ decltype(F) v;
+};
+
+void foo(int) {}
+
+B<foo> o;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C
new file mode 100644
index 000000000..9d301c0a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C
@@ -0,0 +1,26 @@
+// PR c++/51908
+// { dg-do compile { target c++11 } }
+
+struct foo1
+{
+ template <typename Ret, typename... Args>
+ operator decltype(static_cast<Ret (*)(Args...)>(nullptr)) () const;
+};
+
+struct foo2
+{
+ template <typename Ret, typename... Args>
+ operator decltype(static_cast<Ret (*)(Args... args)>(nullptr)) () const;
+};
+
+struct foo3
+{
+ template <typename Ret, typename Arg>
+ operator decltype(static_cast<Ret (*)(Arg)>(nullptr)) () const;
+};
+
+struct foo4
+{
+ template <typename Ret, typename Arg>
+ operator decltype(static_cast<Ret (*)(Arg arg)>(nullptr)) () const;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C
new file mode 100644
index 000000000..95427fc00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C
@@ -0,0 +1,20 @@
+// PR c++/53211
+// { dg-do compile { target c++11 } }
+
+template<typename A, typename B>
+ struct is_same { static const bool value = false; };
+
+template<typename A>
+ struct is_same<A, A> { static const bool value = true; };
+
+template<typename... Args>
+void func(Args... args)
+{
+ int arr[] = { args... };
+ static_assert (is_same<decltype(arr), int[sizeof...(Args)]>::value, "");
+}
+
+int main()
+{
+ func(1, 2, 3, 4);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C
new file mode 100644
index 000000000..b44fad098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C
@@ -0,0 +1,11 @@
+// PR c++/52816
+// { dg-do compile { target c++11 } }
+
+class c {
+ int f;
+ public:
+ template <typename A>
+ decltype(f) m(A) const;
+};
+
+decltype(c{}.m(0)) i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C
new file mode 100644
index 000000000..353cc72c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C
@@ -0,0 +1,8 @@
+// PR c++/58633
+// { dg-do compile { target c++11 } }
+
+void foo(int i)
+{
+ typedef int I;
+ decltype(i.I::~I())* p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C
new file mode 100644
index 000000000..10086c5fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C
@@ -0,0 +1,35 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+template<typename T> const T& foo();
+
+
+int i;
+
+template<typename T>
+struct A
+{
+ double x;
+};
+
+const A<double>* a = new A<double>();
+
+static_assert(is_same<decltype(foo<int>()), const int&>::value,
+ "type should be const int&");
+static_assert(is_same<decltype(i), int>::value,
+ "type should be int");
+static_assert(is_same<decltype(a->x), double>::value,
+ "type should be double");
+static_assert(is_same<decltype((a->x)), const double&>::value,
+ "type should be const double&");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C
new file mode 100644
index 000000000..f757c9e10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C
@@ -0,0 +1,14 @@
+// PR c++/34268
+// { dg-do compile }
+
+struct A
+{
+ __decltype (A); // { dg-error "must be an expression" }
+ __decltype (~A); // { dg-error "must be an expression" }
+};
+
+struct B
+{
+ __typeof__ (B);
+ __typeof__ (~B); // { dg-error "expected primary-expression" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C
new file mode 100644
index 000000000..368068926
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C
@@ -0,0 +1,12 @@
+// PR c++/34267
+// { dg-do compile }
+
+struct A {};
+__decltype (A); // { dg-error "must be an expression" }
+template<int> struct B
+{
+ __decltype (A); // { dg-error "must be an expression" }
+ __decltype (~A); // { dg-error "must be an expression" }
+ __decltype (B); // { dg-error "must be an expression" }
+ __decltype (~B); // { dg-error "must be an expression" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C
new file mode 100644
index 000000000..9db3db039
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C
@@ -0,0 +1,9 @@
+// PR c++/34271
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ static int i;
+};
+
+template<int N> int A<N>::i(decltype (A::i)); // { dg-error "member function|must be an expression" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C
new file mode 100644
index 000000000..380ca280b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C
@@ -0,0 +1,36 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename U> struct same_type;
+template<typename T> struct same_type<T, T> {};
+
+int lval_int;
+int rval_int();
+int const lval_const_int=0;
+int const&& rval_const_int();
+
+template <typename T> void deduce_lval_int(T && t)
+{
+ same_type<T, int &>();
+}
+
+template <typename T> void deduce_rval_int(T && t)
+{
+ same_type<T, int>();
+}
+
+template <typename T> void deduce_lval_const_int(T && t)
+{
+ same_type<T, const int &>();
+}
+
+template <typename T> void deduce_rval_const_int(T && t)
+{
+ same_type<T, const int>();
+}
+
+void f()
+{
+ deduce_lval_int(lval_int);
+ deduce_rval_int(rval_int());
+ deduce_lval_const_int(lval_const_int);
+ deduce_rval_const_int(rval_const_int());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C
new file mode 100644
index 000000000..4956e88ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C
@@ -0,0 +1,42 @@
+// Positive test for defaulted/deleted fns
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i;
+ A() = default;
+ A(const A&) = delete;
+ A& operator=(const A&) = default;
+ ~A();
+};
+
+A::~A() = default;
+
+void f() = delete;
+
+struct B
+{
+ int i;
+ B() = default;
+};
+
+int main()
+{
+ A a1, a2;
+ B b = {1};
+ a1 = a2;
+}
+
+// fns defaulted in class defn are trivial
+struct C
+{
+ C() = default;
+ C(const C&) = default;
+ C& operator=(const C&) = default;
+ ~C() = default;
+};
+
+union U
+{
+ C c;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C
new file mode 100644
index 000000000..853726862
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C
@@ -0,0 +1,14 @@
+// PR c++/40381
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename T> void foo(T) = delete; // { dg-error "previously|declared" }
+};
+
+template<typename T> void A::foo(T) {} // { dg-error "redefinition" }
+
+void bar()
+{
+ A().foo(0); // { dg-error "use" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C
new file mode 100644
index 000000000..cd4e293f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C
@@ -0,0 +1,15 @@
+// Core issue 901
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(); ~A();
+ void operator delete (void *) = delete;
+ void operator delete[] (void *) = delete;
+};
+
+int main()
+{
+ A* ap = new A;
+ ap = new A[2];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C
new file mode 100644
index 000000000..68dc5d0a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C
@@ -0,0 +1,29 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct NonCopyable {
+ NonCopyable() = default;
+ NonCopyable(NonCopyable const&);
+};
+
+template<>
+NonCopyable<int>::NonCopyable(NonCopyable<int> const&) = delete; // { dg-message "declared" }
+
+template<typename T>
+NonCopyable<T>::NonCopyable(NonCopyable<T> const&) = default;
+
+template<>
+NonCopyable<double>::NonCopyable(NonCopyable<double> const&) = delete; // { dg-message "declared" }
+
+
+int main()
+{
+ NonCopyable<double> nc_dbl;
+ NonCopyable<double> nc_dbl_cpy(nc_dbl); // { dg-error "use" }
+
+ NonCopyable<int> nc_int;
+ NonCopyable<int> nc_int_cpy(nc_int); // { dg-error "use" }
+
+ NonCopyable<char> nc_char;
+ NonCopyable<char> nc_char_cpy(nc_char);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C
new file mode 100644
index 000000000..0c07fa701
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C
@@ -0,0 +1,20 @@
+// PR c++/39866
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A& operator=(const A&) = delete; // { dg-bogus "" }
+
+ void operator=(int) {} // { dg-message "" }
+ void operator=(char) {} // { dg-message "" }
+};
+
+struct B {};
+
+int main()
+{
+ A a;
+ a = B(); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 16 }
+ a = 1.0; // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 18 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C
new file mode 100644
index 000000000..fabcc23a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C
@@ -0,0 +1,58 @@
+// PR c++/38796
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert ((X), #X)
+
+struct A
+{
+ A (int);
+ A (const A& = 1) = default; // { dg-error "default argument" }
+ void operator= (const A&) = default; // { dg-error "defaulted|match" }
+};
+
+struct B
+{
+private:
+ B() = default;
+};
+
+SA(__has_trivial_constructor(B));
+
+struct C
+{
+protected:
+ ~C() = default;
+};
+
+SA(__has_trivial_destructor(C));
+
+struct D
+{
+private:
+ D& operator= (const D&) = default;
+};
+
+SA(__has_trivial_assign(D));
+
+struct E
+{
+ explicit E (const E&) = default;
+};
+
+SA(__has_trivial_copy(E));
+
+struct F
+{
+ F(F&) = default;
+};
+
+struct G: public F
+{
+ // Can't be const because F copy ctor isn't.
+ G(const G&) = default; // { dg-error "const" }
+};
+
+struct H
+{
+ virtual ~H() = default;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C
new file mode 100644
index 000000000..f866c8e98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C
@@ -0,0 +1,13 @@
+// Test that non-inline default causes the function to be defined even if
+// it isn't used.
+
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_ZN1AC1Ev" } }
+
+struct A
+{
+ A();
+};
+
+A::A() = default;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C
new file mode 100644
index 000000000..0a3c0de26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct A // { dg-error "const|operator=" }
+{
+ const int i;
+};
+
+int main()
+{
+ A a = { 0 };
+ a = a; // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C
new file mode 100644
index 000000000..6d84a1e88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+void f(char i, int j) = delete; // { dg-message "<deleted>" }
+void f(int i, ...); // { dg-message "void f" }
+
+int main()
+{
+ f(1,1); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C
new file mode 100644
index 000000000..2b93a7b09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C
@@ -0,0 +1,21 @@
+// We don't allocate a cookie to help us run the destructor if it's trivial,
+// even if it's deleted.
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ ~A() = delete;
+};
+
+void *p = 0;
+void *operator new[](__SIZE_TYPE__ t)
+{
+ p = ::operator new (t);
+ return p;
+}
+
+int main()
+{
+ A* ap = new A[5];
+ return ap != p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C
new file mode 100644
index 000000000..a082d51ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C
@@ -0,0 +1,23 @@
+// We allocate a cookie to help us run the destructor if it's non-trivial,
+// even if it's deleted.
+// { dg-do run { target c++11 } }
+
+struct B { ~B() {} };
+struct A
+{
+ B b;
+ ~A() = delete;
+};
+
+void *p = 0;
+void *operator new[](__SIZE_TYPE__ t)
+{
+ p = ::operator new (t);
+ return p;
+}
+
+int main()
+{
+ A* ap = new A[5];
+ return ap == p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C
new file mode 100644
index 000000000..bd83c7fb2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C
@@ -0,0 +1,69 @@
+// Negative test for defaulted/deleted fns.
+// { dg-do compile { target c++11 } }
+
+void f(); // { dg-message "previous" }
+void f() = delete; // { dg-error "deleted" }
+
+struct A
+{
+ A() { } // { dg-message "previous" }
+ void f() = default; // { dg-error "default" }
+};
+
+A::A() = default; // { dg-error "redefinition" }
+
+void g() {} // { dg-message "previous" }
+void g() = delete; // { dg-error "redefinition" }
+
+struct B // { dg-message "user-provided default constructor" }
+{
+ int i;
+ B() = default; // { dg-message "not user-provided" }
+};
+
+const B b; // { dg-error "uninitialized const" }
+
+struct C
+{
+ virtual void f() = delete; // { dg-error "overriding deleted" }
+};
+
+struct D: public C
+{
+ virtual void f(); // { dg-error "non-deleted function" }
+};
+
+struct E
+{
+ const B b;
+ E() { } // { dg-error "uninitialized" }
+};
+
+struct F
+{
+ F() = default;
+ F(const F&) = delete; // { dg-message "declared" }
+};
+
+struct G
+{
+ G();
+};
+
+// ctor defaulted after class defn is not trivial
+G::G() = default;
+
+union U
+{
+ G g; // { dg-error "union member.*non-trivial" }
+};
+
+int main()
+{
+ F f;
+ F f2(f); // { dg-error "use" }
+ const B* b = new const B; // { dg-error "uninitialized const" }
+ U u; // { dg-error "deleted" }
+}
+
+// { dg-prune-output "implicitly deleted because" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C
new file mode 100644
index 000000000..affda20fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C
@@ -0,0 +1,19 @@
+// PR c++/46497
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A(A&&) = default;
+};
+struct B {
+ const A a;
+ B(const B&) = default;
+ B(B&&) = default; // { dg-error "implicitly deleted|use of deleted" }
+};
+
+void g(B); // { dg-error "argument 1" }
+B&& f();
+
+int main()
+{
+ g(f()); // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C
new file mode 100644
index 000000000..63c98e676
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C
@@ -0,0 +1,21 @@
+// PR c++/46736
+// { dg-do compile { target c++11 } }
+
+struct U {
+ U();
+private:
+ U(U const&); // { dg-error "private" }
+};
+
+struct X {
+ U const u;
+ X();
+ X(X&&);
+};
+
+X::X(X&&)=default; // { dg-message "implicitly deleted" }
+// { dg-prune-output "within this context" }
+
+X f() {
+ return X();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C
new file mode 100644
index 000000000..5afcd1dea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C
@@ -0,0 +1,22 @@
+// Test that a virtual defaulted constructor is still virtual.
+// { dg-do run { target c++11 } }
+
+int r = 1;
+
+struct A
+{
+ virtual ~A() = default;
+};
+
+struct B: A
+{
+ ~B() noexcept { r = 0; }
+};
+
+A* ap = new B();
+
+int main()
+{
+ delete ap;
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C
new file mode 100644
index 000000000..9e6cbc37d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C
@@ -0,0 +1,37 @@
+// Test for checking of exception specifications on defaulted fns
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A() noexcept = default;
+};
+
+A a;
+
+struct B
+{
+ B() throw (int) = default; // { dg-message "exception-specification" }
+};
+
+B b; // { dg-error "deleted" }
+
+struct C
+{
+ C() throw (int) { }
+};
+
+C c;
+
+struct D: C
+{
+ D() throw (int) = default;
+};
+
+D d;
+
+struct E
+{
+ E() = default;
+};
+
+E e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C
new file mode 100644
index 000000000..32c6f2e54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C
@@ -0,0 +1,6 @@
+// PR c++/48280
+// { dg-do compile { target c++11 } }
+
+struct S {
+ template < typename > S (const S &) = default; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C
new file mode 100644
index 000000000..644fe1bb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C
@@ -0,0 +1,10 @@
+// PR c++/48930
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+struct A
+{
+ A(const A&) = default;
+};
+
+A a; // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C
new file mode 100644
index 000000000..f14a0e885
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C
@@ -0,0 +1,7 @@
+// PR c++/49066
+// { dg-do compile { target c++11 } }
+
+void foo() = delete; // { dg-message "declared here" }
+void foo();
+
+int main() { foo(); } // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C
new file mode 100644
index 000000000..d26e744da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C
@@ -0,0 +1,19 @@
+// PR c++/47544
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_ZN1sIiEC2Ev" } }
+// { dg-final { scan-assembler-not "_ZN1sIiED2Ev" } }
+
+template <typename T>
+struct s {
+ s();
+ ~s() = default;
+};
+
+extern template struct s<int>;
+
+template <typename T>
+s<T>::s() = default;
+
+template struct s<int>;
+
+s<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C
new file mode 100644
index 000000000..aa900998d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C
@@ -0,0 +1,17 @@
+// PR c++/49102
+// PR c++/50034
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A() = default;
+
+private:
+ A(A const&) = default; // { dg-error "private" }
+};
+
+int f(...) { }
+int main() {
+ A a;
+ f(a); // { dg-error "this context" }
+ sizeof(f(a)); // OK because unevaluated
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C
new file mode 100644
index 000000000..8e2989bac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C
@@ -0,0 +1,20 @@
+// PR c++/46696
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A& operator= (A const&);
+};
+
+struct B
+{
+ A ar[1];
+ B& operator= (B const&) = default;
+};
+
+int main()
+{
+ B x;
+ B y;
+ y = x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C
new file mode 100644
index 000000000..75e89c8ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C
@@ -0,0 +1,16 @@
+// PR c++/37006
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct A {
+ template<class U>
+ bool operator==(const A<U>&) = delete; // { dg-message "declared" }
+ operator bool () { return true; }
+};
+
+int main()
+{
+ A<int> a1;
+ A<void> a2;
+ if(a1 == a2) {} // { dg-error "use" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C
new file mode 100644
index 000000000..ce86f5757
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C
@@ -0,0 +1,16 @@
+// PR c++/49507
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct ConcretePoolKey
+{
+ virtual ~ConcretePoolKey();
+};
+
+template<typename T>
+ConcretePoolKey<T>::~ConcretePoolKey() = default;
+
+int main()
+{
+ ConcretePoolKey<int> foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C
new file mode 100644
index 000000000..2ac28baf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C
@@ -0,0 +1,16 @@
+// PR c++/39164
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A() { } // { dg-message "defined" }
+ ~A() = default; // { dg-error "defaulted" }
+};
+
+A::A() = default; // { dg-error "redefinition" }
+A::~A() noexcept (true) { } // { dg-error "defaulted" }
+
+int main()
+{
+ A a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C
new file mode 100644
index 000000000..e5b94b635
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C
@@ -0,0 +1,21 @@
+// PR c++/50531
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+class DataFilter
+{
+ public:
+ inline virtual ~DataFilter();
+};
+
+template<typename T>
+inline DataFilter<T>::~DataFilter() = default;
+
+class ARCalculator : public DataFilter<ARCalculator>
+{
+ public:
+ virtual void dataStart(int, int);
+};
+
+void ARCalculator::dataStart(int, int)
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C
new file mode 100644
index 000000000..2f11c1369
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C
@@ -0,0 +1,32 @@
+// PR c++/50973
+// { dg-do compile { target c++11 } }
+
+class HD
+{
+ public:
+ virtual ~HD() {};
+};
+class InputHD : public virtual HD
+{
+};
+class OutputHD : public virtual HD
+{
+};
+class IOHD : public InputHD, public OutputHD
+{
+};
+template <typename T, unsigned int N>
+class ArrayNHD : public IOHD
+{
+ public:
+ ~ArrayNHD() = default;
+};
+class TLText
+{
+ ~TLText();
+ ArrayNHD<int, 1>* m_argsHD;
+};
+TLText::~TLText()
+{
+ delete m_argsHD;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C
new file mode 100644
index 000000000..ff777f6cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "__cxa_deleted_virtual" } }
+
+struct A
+{
+ virtual void f();
+ virtual ~A() = delete;
+};
+
+void A::f() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C
new file mode 100644
index 000000000..adf9c82ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C
@@ -0,0 +1,8 @@
+// PR c++/53096
+// { dg-do compile { target c++11 } }
+
+struct foo
+{
+ foo(foo&) = default;
+ foo& operator=(foo&) = default;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C
new file mode 100644
index 000000000..1360f608e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C
@@ -0,0 +1,24 @@
+// PR c++/53733
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct wrap
+{
+ wrap() = default;
+ wrap(wrap&&) = default; // Line 5
+ wrap(const wrap&) = default;
+
+ T t;
+};
+
+struct S {
+ S() = default;
+ S(const S&){}
+ S(S&&) = default;
+};
+
+typedef wrap<const S> W;
+
+W get() { return W(); } // Line 19
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C
new file mode 100644
index 000000000..1926f2eb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C
@@ -0,0 +1,19 @@
+// DR 1402
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A& operator=(A&&);
+};
+
+struct B: virtual A { B& operator=(B&&) = default; }; // { dg-warning "virtual base" }
+struct C: virtual A { }; // { dg-warning "virtual base" }
+
+int main()
+{
+ B b1, b2;
+ b2 = static_cast<B&&>(b1);
+
+ C c1, c2;
+ c2 = static_cast<C&&>(c1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C
new file mode 100644
index 000000000..39424f641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C
@@ -0,0 +1,14 @@
+// PR c++/50893
+// { dg-do compile { target c++11 } }
+
+class Base
+{
+ public:
+ virtual ~Base() = default;
+};
+
+class Derived : public Base
+{
+ public:
+ virtual ~Derived() = default;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C
new file mode 100644
index 000000000..a4963c4d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C
@@ -0,0 +1,23 @@
+// DR 1402
+// { dg-do compile { target c++11 } }
+
+template <class T> T&& move(T& t);
+
+struct A
+{
+ A(const A&);
+};
+
+struct B
+{
+ B(B&&);
+};
+
+struct C
+{
+ A a;
+ B b;
+};
+
+extern C c1;
+C c2(move(c1));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C
new file mode 100644
index 000000000..ca07d76d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C
@@ -0,0 +1,25 @@
+// PR c++/37208: SFINAE and deleted functions.
+
+// { dg-do compile { target c++11 } }
+template<int> struct A { };
+
+template<typename T>
+int& int_if_addable(A<sizeof((*(T*)0) + (*(T*)0))>*);
+
+template<typename T>
+float& int_if_addable(...);
+
+struct X { };
+
+struct Y { };
+Y operator+(Y, Y);
+
+struct Z { };
+Z operator+(Z, Z) = delete;
+
+void f()
+{
+ float& x = int_if_addable<X>(0);
+ int& y = int_if_addable<Y>(0);
+ float& z = int_if_addable<Z>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C
new file mode 100644
index 000000000..8da1364d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C
@@ -0,0 +1,23 @@
+// DR 1402
+// { dg-do compile { target c++11 } }
+
+template <class T> T&& move(T& t);
+
+struct A
+{
+ A(const A&);
+};
+
+struct B
+{
+ B(B&&) = delete; // { dg-prune-output "declared" }
+};
+
+struct C // { dg-error "deleted" }
+{
+ A a;
+ B b;
+};
+
+extern C c1;
+C c2(move(c1)); // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C
new file mode 100644
index 000000000..4272012d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C
@@ -0,0 +1,14 @@
+// PR c++/56343
+// { dg-do compile { target c++11 } }
+
+class B
+{
+public:
+ virtual ~B() noexcept(false) { }
+};
+
+class D : public B
+{
+public:
+ virtual ~D() = default;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C
new file mode 100644
index 000000000..1ac25a90b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C
@@ -0,0 +1,10 @@
+// DR 941
+// { dg-require-effective-target c++11 }
+
+template <class T> T f(T) = delete;
+template<> int f(int) { return 42; }
+
+int main()
+{
+ f(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C
new file mode 100644
index 000000000..f2846fe39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C
@@ -0,0 +1,60 @@
+// PR c++/53903
+// { dg-do compile { target c++11 } }
+
+struct T
+{
+ T() noexcept(false) { }
+ ~T() noexcept(false) { }
+};
+
+T t;
+
+struct A
+{
+ A() noexcept;
+ ~A() noexcept;
+
+ T t;
+};
+
+A::A() noexcept = default; // { dg-error "defaulted" }
+A::~A() noexcept = default; // { dg-error "defaulted" }
+
+struct U
+{
+ U() noexcept(false) { }
+ ~U() noexcept(false) { }
+};
+
+U u;
+
+struct B
+{
+ B() noexcept(false);
+ ~B() noexcept(false);
+
+ U u;
+};
+
+B::B() noexcept(false) = default;
+B::~B() noexcept(false) = default;
+
+B b;
+
+struct V
+{
+ V() noexcept(false) { }
+ ~V() noexcept(false) { }
+};
+
+V v;
+
+struct C
+{
+ C() noexcept = default; // { dg-message "exception-specification" }
+ ~C() noexcept = default; // { dg-message "exception-specification" }
+
+ V v;
+};
+
+C c; // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C
new file mode 100644
index 000000000..213c1393e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C
@@ -0,0 +1,24 @@
+// PR c++/57319
+// { dg-require-effective-target c++11 }
+
+namespace N1 {
+ struct A { };
+ struct B: virtual A { };
+ struct C: virtual B { };
+
+ struct D: C
+ {
+ void operator= (D &);
+ };
+}
+
+namespace N2 {
+ struct A { A& operator=(A&&); };
+ struct B: virtual A { }; // { dg-warning "move assignment" }
+ struct C: virtual B { }; // { dg-warning "move assignment" }
+
+ struct D: C
+ {
+ void operator= (D &);
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C
new file mode 100644
index 000000000..e91b3a182
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C
@@ -0,0 +1,20 @@
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int i;
+ A() = default;
+ A(int i): i{i} { }
+ ~A() {}
+};
+
+int main(int argc, char **argv)
+{
+ { int i[4] = { 42, 42, 42, 42 }; }
+ {
+ A a[4] = { argc };
+ if (a[1].i != 0)
+ __builtin_abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C
new file mode 100644
index 000000000..d4562c959
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C
@@ -0,0 +1,17 @@
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+protected:
+ A() = default;
+ int i;
+};
+
+struct B: A {
+ B() = default;
+};
+
+int main()
+{
+ B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C
new file mode 100644
index 000000000..f4b62a3c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C
@@ -0,0 +1,16 @@
+// PR c++/54812
+// { dg-do compile { target c++11 } }
+
+class A
+{
+ A() = default; // { dg-error "private" }
+};
+
+A a; // { dg-error "context" }
+
+class B
+{
+ ~B() = default; // { dg-error "private" }
+};
+
+B b; // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C
new file mode 100644
index 000000000..727afc5ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C
@@ -0,0 +1,17 @@
+// PR c++/60108
+// { dg-require-effective-target c++11 }
+
+template<int> struct A
+{
+ virtual ~A();
+};
+
+template<typename> struct B : A<0>, A<1>
+{
+ ~B() = default;
+};
+
+struct C : B<bool>
+{
+ C() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C
new file mode 100644
index 000000000..96394ea5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C
@@ -0,0 +1,19 @@
+// PR c++/37234
+// { dg-do link { target c++11 } }
+
+template <typename T>
+class foo {
+ public:
+ foo() =default;
+ ~foo();
+};
+
+template <typename T>
+foo<T>::~foo() =default;
+
+int main() {
+
+ foo<int> fi;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C
new file mode 100644
index 000000000..440c58db4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C
@@ -0,0 +1,13 @@
+// PR c++/37906
+// { dg-do compile { target c++11 } }
+
+struct b
+{
+ b() = default;
+ b(const b&) = delete;
+};
+
+void test01()
+{
+ static_assert(__has_trivial_constructor(b), "default ctor not trivial");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C
new file mode 100644
index 000000000..089d61848
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C
@@ -0,0 +1,12 @@
+// PR c++/38701, 38702
+// { dg-do compile { target c++11 } }
+
+void foo() = default; // { dg-error "cannot be defaulted" }
+namespace
+{
+ void bar() = default; // { dg-error "cannot be defaulted" }
+}
+
+enum E { e };
+
+E& operator |= (E&, const E&) = default; // { dg-error "cannot be defaulted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C
new file mode 100644
index 000000000..383766de2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C
@@ -0,0 +1,8 @@
+// PR c++/38649
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(...) = default; // { dg-error "cannot be defaulted" }
+ A(const A&, ...) = default; // { dg-error "cannot be defaulted" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C
new file mode 100644
index 000000000..8d3aef890
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C
@@ -0,0 +1,21 @@
+// PR c++/39153
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-inline" }
+
+struct _Impl_base
+{
+ _Impl_base() = default;
+ virtual ~_Impl_base();
+};
+
+inline _Impl_base::~_Impl_base() = default;
+
+template<typename _Tp>
+class _Impl : public _Impl_base
+{ };
+
+int main()
+{
+ _Impl<int> i;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C
new file mode 100644
index 000000000..0a632bfb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C
@@ -0,0 +1,6 @@
+// PR c++/58581
+// { dg-do compile { target c++11 } }
+
+template<typename T> int foo(T) noexcept(T()) = delete;
+
+int i = foo(0); // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C
new file mode 100644
index 000000000..8590c49f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C
@@ -0,0 +1,9 @@
+// PR c++/52707
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int m;
+ A() = delete;
+};
+
+A a = {1};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C
new file mode 100644
index 000000000..67836773a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C
@@ -0,0 +1,11 @@
+// PR c++/60216
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ template<typename T> A(T) = delete;
+};
+
+template<> A::A<int>(int) {}
+
+A a(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C
new file mode 100644
index 000000000..629b125f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C
@@ -0,0 +1,25 @@
+// PR c++/48319
+// { dg-do compile { target c++11 } }
+// We were failing to recognize declval<_Args1> as dependent.
+
+template<typename Tp> Tp declval() noexcept;
+
+template<typename _Tp>
+class __is_constructible_helper
+{
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+
+ template<typename _Tp1, typename... _Args1>
+ static decltype(_Tp1(declval<_Args1>()...), __one()) __test(int);
+
+ template<typename, typename...>
+ static __two __test(...);
+
+public:
+ static const bool __value = sizeof(__test<_Tp>(0)) == 1;
+};
+
+int main() {
+ return __is_constructible_helper<int>::__value;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C
new file mode 100644
index 000000000..9bf7cfe5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target c++11 } }
+
+template <int U>
+struct TypeA
+{
+ typedef int type;
+};
+
+template <int N>
+struct TypeB
+{
+ template <int U> typename TypeA<U>::type fn();
+};
+
+struct TypeC
+{
+ TypeB<10> b;
+ // This was being printed as:
+ // template<int N>
+ // decltype (((TypeC*)this)->
+ // TypeC::b.
+ // template<int U> typename TypeA<U>::type TypeB::fn [with int U = U, int N = 10, typename TypeA<U>::type = TypeA<U>::type]())
+ // TypeC::fn()
+ // we don't want to see the template header, return type, or parameter bindings
+ // for TypeB::fn.
+ template <int N> auto fn() -> decltype(b.fn<N>()); // { dg-bogus "typename|with" }
+};
+
+int main()
+{
+ TypeC().fn<4>(1); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C
new file mode 100644
index 000000000..1224f361f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C
@@ -0,0 +1,31 @@
+// PR c++/57599
+// { dg-do compile { target c++11 } }
+
+struct A { };
+struct B : public A { };
+
+template<class, class>
+struct is_same { static constexpr bool value = false; };
+
+template<class T>
+struct is_same<T, T> { static constexpr bool value = true; };
+
+template<class T>
+T val();
+
+static_assert(is_same<decltype(dynamic_cast<A*>(val<B*>())),
+ A*>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<A&>(val<B&>())),
+ A&>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<const A*>(val<B*>())),
+ const A*>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<const A&>(val<B&>())),
+ const A&>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<volatile A*>(val<B*>())),
+ volatile A*>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<volatile A&>(val<B&>())),
+ volatile A&>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<const volatile A*>(val<B*>())),
+ const volatile A*>::value, "Ouch");
+static_assert(is_same<decltype(dynamic_cast<const volatile A&>(val<B&>())),
+ const volatile A&>::value, "Ouch");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C
new file mode 100644
index 000000000..4cc5653e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C
@@ -0,0 +1,75 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test: Implicit cast to rvalue when eliding copy
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+
+class move_only
+{
+ move_only(const move_only&);
+ move_only& operator=(const move_only&);
+public:
+ move_only() {}
+ move_only(move_only&&) {}
+ move_only& operator=(move_only&&) {return *this;}
+};
+
+move_only
+test1()
+{
+ return move_only();
+}
+
+move_only
+test2()
+{
+ move_only x;
+ return x;
+}
+
+move_only
+test3(bool b)
+{
+ move_only x1;
+ if (b)
+ {
+ move_only x2;
+ return x2;
+ }
+ return x1;
+}
+
+void
+test4(bool b)
+{
+ if (!b)
+ throw move_only();
+}
+
+void
+test5(bool b)
+{
+ move_only x;
+ if (!b)
+ throw x;
+}
+
+extern bool b;
+
+int main()
+{
+ move_only t1 = test1();
+ move_only t2 = test2();
+ move_only t3 = test3(b);
+ test4(b);
+ test5(b);
+ return 0;
+}
+
+bool b = true;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C
new file mode 100644
index 000000000..b3d13fb18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C
@@ -0,0 +1,13 @@
+// Core 1148: should be able to move from value parameter on return
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(const A&) = delete;
+ A(A&&);
+};
+
+A f (A a)
+{
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C
new file mode 100644
index 000000000..0870a8093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C
@@ -0,0 +1,43 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test: Implicit cast to rvalue when eliding copy
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+
+class move_only
+{
+ move_only(const move_only&); // { dg-error "is private" }
+ move_only& operator=(const move_only&);
+public:
+ move_only() {}
+ move_only(move_only&&) {}
+ move_only& operator=(move_only&&) {return *this;}
+};
+
+move_only
+test1()
+{
+ static move_only x;
+ return x; // { dg-error "within this context" }
+}
+
+move_only
+test2(move_only&& x)
+{
+ return x; // { dg-error "within this context" }
+}
+
+int main()
+{
+ move_only t1 = test1();
+ move_only t2 = test2(move_only());
+ return 0;
+}
+
+bool b = true;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C
new file mode 100644
index 000000000..e8ba7551d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+struct S
+{
+ S() {}
+ S(S&) {}
+};
+
+S f()
+{
+ S s;
+ return s;
+}
+
+void g()
+{
+ S s;
+ throw s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C
new file mode 100644
index 000000000..bf1742952
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C
@@ -0,0 +1,5 @@
+// PR c++/38021
+// { dg-do compile { target c++11 } }
+
+enum : { }; // { dg-error "expected" }
+enum : 3 { }; // { dg-error "expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C
new file mode 100644
index 000000000..daffd1922
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C
@@ -0,0 +1,9 @@
+// PR c++/48534
+// { dg-do compile { target c++11 } }
+
+enum class OpSE : bool;
+
+int main()
+{
+ return static_cast<bool>(OpSE());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C
new file mode 100644
index 000000000..a449f1c39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C
@@ -0,0 +1,15 @@
+// PR c++/48969
+// { dg-do compile { target c++11 } }
+// { dg-options "-ftemplate-depth=10" }
+
+template<unsigned int N> struct Pair { };
+struct Foo { enum { Mask = 1 }; } foo;
+template<typename A, typename B> class Pair<A::Mask | B::Mask>
+operator|(const A &, const B &) // { dg-message "substitution" }
+{ }
+
+Pair<Foo::Mask> f = foo|foo; // { dg-message "no match" }
+
+// { dg-prune-output "note" }
+// { dg-prune-output "here" }
+// { dg-prune-output "instantiation depth" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C
new file mode 100644
index 000000000..ea55cfe97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C
@@ -0,0 +1,19 @@
+// PR c++/48780
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+enum struct A : short { X };
+
+void foo(int x, ...) {
+ va_list vl;
+ __builtin_va_start(vl, x);
+ enum A t = __builtin_va_arg(vl, enum A);
+ __builtin_va_end(vl);
+}
+
+int main() {
+ foo(0, A::X);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C
new file mode 100644
index 000000000..5e4a532ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C
@@ -0,0 +1,21 @@
+// PR c++/48780
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5 -Wabi" }
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+enum struct A : short { X };
+
+void foo(int x, ...) {
+ va_list vl;
+ __builtin_va_start(vl, x);
+ enum A t = __builtin_va_arg(vl, enum A); // { dg-warning "promote" }
+ __builtin_va_end(vl);
+}
+
+int main() {
+ foo(0, A::X); // { dg-warning "will not promote" }
+}
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C
new file mode 100644
index 000000000..2be758db3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C
@@ -0,0 +1,12 @@
+// PR c++/48106
+// { dg-do compile { target c++11 } }
+
+enum class E : char
+{
+ e
+};
+
+bool operator&(E e, char m)
+{
+ return static_cast<int>(e) & m;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C
new file mode 100644
index 000000000..07beee53a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C
@@ -0,0 +1,20 @@
+// PR c++/44311
+// { dg-do compile { target c++11 } }
+
+enum class A { Val0, Val1 };
+
+void foo (A a, int i)
+{
+ switch (a)
+ {
+ case A::Val0: break;
+ case 1: break; // { dg-error "" }
+ }
+
+ switch (i)
+ {
+ case A::Val0: break; // { dg-error "" }
+ case 1: break;
+ case 2.0: break; // { dg-error "" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C
new file mode 100644
index 000000000..207fcab2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C
@@ -0,0 +1,6 @@
+// PR c++/48935
+// { dg-do compile { target c++11 } }
+
+enum class ENUM { a };
+
+ENUM::Type func() { return ENUM::a; } // { dg-error "does not name a type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C
new file mode 100644
index 000000000..32c46096f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C
@@ -0,0 +1,17 @@
+// PR c++/48536
+// { dg-do compile { target c++11 } }
+
+#include <climits>
+
+// According to C++11 / Clause 7.2/5 the following enumeration is
+// well-formed. It is also well-formed in C++03 if UINT_MAX < ULONG_MAX,
+// but C++11 adds long long.
+
+enum Enum_Inc { EI_1=UINT_MAX, EI_2 }; // #1
+
+// It is not equivalent to the following.
+enum Enum_Inc2 { FI_1=UINT_MAX, FI_2=FI_1+1 }; // #2
+
+#define SA(X) static_assert(X,#X)
+SA (EI_2 != 0);
+SA (FI_2 == 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C
new file mode 100644
index 000000000..de16596df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C
@@ -0,0 +1,8 @@
+// PR c++/47277
+// { dg-do compile { target c++11 } }
+
+int main(void) {
+ enum e {};
+ e ev;
+ ev.e::~e_u(); // { dg-error "e_u. has not been declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C
new file mode 100644
index 000000000..b04fd523f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C
@@ -0,0 +1,13 @@
+// We shouldn't give an ABI warning about promotion in switch.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5 -Wabi" }
+
+enum class Foo { X };
+void test(Foo val)
+{
+ switch(val)
+ {
+ case Foo::X:
+ break;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C
new file mode 100644
index 000000000..c101134f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C
@@ -0,0 +1,4 @@
+// PR c++/38637
+// { dg-do compile { target c++11 } }
+
+template<int> enum E : int { e }; // { dg-error "declaration|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C
new file mode 100644
index 000000000..8937cc7a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C
@@ -0,0 +1,5 @@
+// PR c++/47635
+// { dg-do compile { target c++11 } }
+
+enum A { };
+void A::f() { } // { dg-error "not a class" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C
new file mode 100644
index 000000000..5526811a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-pedantic -std=c++98" }
+
+enum x { y, }; // { dg-warning "comma at end of enumerator list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C
new file mode 100644
index 000000000..ac449f050
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+enum x { y, };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C
new file mode 100644
index 000000000..e87a31ce6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C
@@ -0,0 +1,12 @@
+// PR c++/56155
+// { dg-do compile { target c++11 } }
+
+enum e_ : unsigned char { Z_, E_=sizeof(Z_) };
+static_assert( E_ == 1, "E_ should be 1");
+
+template <class T>
+struct A {
+ enum e_ : unsigned char { Z_, E_=sizeof(Z_) };
+};
+
+static_assert ( A<double>::E_ == 1, "E_ should be 1");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C
new file mode 100644
index 000000000..b2378e1b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C
@@ -0,0 +1,9 @@
+// PR c++/51242
+// { dg-do compile { target c++11 } }
+
+enum class MyEnum { A = 1 };
+
+struct MyClass
+{
+ MyEnum Field1 : 3; // { dg-bogus "warning: 'MyClass::Field1' is too small" "" { xfail *-*-* } }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C
new file mode 100644
index 000000000..60996563f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C
@@ -0,0 +1,57 @@
+// PR c++/56749
+// { dg-require-effective-target c++11 }
+
+enum normal_enum
+{
+ not_scoped1,
+ not_scoped2
+};
+
+enum class scoped_enum
+{
+ scoped1,
+ scoped2
+};
+
+template <normal_enum N=not_scoped1>
+class A
+{
+public:
+ template <typename T>
+ void fun ()
+ {
+ }
+};
+
+template <scoped_enum N=scoped_enum::scoped1>
+class B
+{
+public:
+ template <typename T>
+ void fun ()
+ {
+ }
+};
+
+
+template <typename T>
+void tfun ()
+{
+ A<> a;
+ a.fun<char>(); //<------------ THIS IS FINE
+
+ B<> b_defaulted;
+ B<scoped_enum::scoped1> b_explicited;
+
+ b_defaulted.fun<char>(); //<------------ UNEXPECTED: THIS FAILS
+ b_defaulted.template fun<char>(); //<------------ THIS IS FINE
+
+ b_explicited.fun<char>(); //<------------ UNEXPECTED: THIS FAILS
+ b_explicited.template fun<char>();//<------------ THIS IS FINE
+}
+
+int main(int argc, char const *argv[])
+{
+ tfun<int>();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C
new file mode 100644
index 000000000..cb2cf8f53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C
@@ -0,0 +1,18 @@
+// PR c++/56793
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ enum struct B {X, Y} b;
+} a;
+
+enum struct D {X,Y};
+struct C { } c;
+
+int main ()
+{
+ if (a.b == a.B::Y)
+ a.b = A::B::X;
+
+ c.D::Y; // { dg-error "not a member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C
new file mode 100644
index 000000000..cfc5df3a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C
@@ -0,0 +1,9 @@
+// PR c++/54216
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+enum {}; // { dg-warning "empty anonymous" }
+
+enum class {}; // { dg-error "anonymous" }
+
+enum class { x }; // { dg-error "anonymous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C
new file mode 100644
index 000000000..80ac98fc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C
@@ -0,0 +1,4 @@
+// PR c++/53745
+// { dg-do compile { target c++11 } }
+
+enum E : unsigned { e = -1 }; // { dg-error "outside the range" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C
new file mode 100644
index 000000000..3967699dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C
@@ -0,0 +1,17 @@
+// PR c++/51912
+// { dg-do compile { target c++11 } }
+
+constexpr double g() { return 2.0; }
+
+void f(int i)
+{
+ switch (i)
+ {
+ case 1.0:; // { dg-error "could not convert" }
+ }
+
+ switch (i)
+ {
+ case g():; // { dg-error "could not convert" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C
new file mode 100644
index 000000000..940bc047a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C
@@ -0,0 +1,26 @@
+// PR c++/38064
+// { dg-do run { target c++11 } }
+
+enum class E { elem };
+
+template <class T>
+void f (T t);
+
+bool f (bool b) { return b; }
+
+int main()
+{
+ E e = E::elem;
+ if (!f (e == E::elem))
+ return 1;
+ if (!f (e <= E::elem))
+ return 1;
+ if (!f (e >= E::elem))
+ return 1;
+ if (f (e < E::elem))
+ return 1;
+ if (f (e > E::elem))
+ return 1;
+ if (f (e != E::elem))
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C
new file mode 100644
index 000000000..9e908c080
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C
@@ -0,0 +1,8 @@
+// PR c++/40633
+// { dg-do compile { target c++11 } }
+
+template< typename T >
+struct wrap {
+ enum class E { val };
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C
new file mode 100644
index 000000000..f896440fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C
@@ -0,0 +1,20 @@
+// PR c++/40639
+// { dg-do compile { target c++11 } }
+
+template< typename T >
+struct wrap {
+ enum E : T { val };
+};
+
+template< typename T >
+struct dependant {
+ enum E : typename T::type { val };
+};
+
+template<typename T>
+struct identity {
+ typedef T type;
+};
+
+wrap<int> x;
+dependant<identity<int>> y;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C
new file mode 100644
index 000000000..c3832ae43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C
@@ -0,0 +1,15 @@
+// PR c++/37946
+// { dg-do compile { target c++11 } }
+
+enum class E : char
+{
+ e1,
+ e2
+};
+
+inline E operator| (E a1, E a2)
+{
+ char ret = static_cast<char> (a1)
+ | static_cast<char> (a2);
+ return static_cast<E>(ret);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C
new file mode 100644
index 000000000..6788f8acc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C
@@ -0,0 +1,11 @@
+// PR c++/37816
+// { dg-do compile { target c++11 } }
+
+class A
+{
+ enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
+ enum class Alert { Green, Yellow, Red };
+ static const Color x = Red; // { dg-error "" }
+ static const Color y = Color::Red;
+ static const Alert z = Alert::Red;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C
new file mode 100644
index 000000000..15bee8334
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C
@@ -0,0 +1,9 @@
+// PR c++/47704
+// { dg-do compile { target c++11 } }
+
+void
+foo ()
+{
+ enum class E { A, B };
+ new E;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C
new file mode 100644
index 000000000..f359b425f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+enum class E { };
+E f();
+bool b2 = static_cast<bool>(f());
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C
new file mode 100644
index 000000000..8e23179e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+typedef unsigned volatile long long uvlonglong;
+
+enum E1 : char { };
+enum E2 : signed const short { };
+enum E3 : uvlonglong { };
+enum E4 : char {
+ val = 500 // { dg-error "outside the range" }
+};
+
+enum class E5 {
+ val = (unsigned long long)-1 // { dg-error "outside the range" }
+};
+
+typedef float Float;
+
+enum class E6 : Float { }; // { dg-error "must be an integral type" }
+
+static_assert (sizeof(E1) == sizeof(char), "char-sized enum");
+static_assert (sizeof(E2) == sizeof(signed short), "short-sized enum");
+static_assert (sizeof(E3) == sizeof(unsigned long long),
+ "long long-sized enum");
+static_assert (sizeof(E4) == sizeof(char), "char-sized enum");
+static_assert (sizeof(E5) == sizeof(int), "scoped enum with int size");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C
new file mode 100644
index 000000000..8c6a9011d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C
@@ -0,0 +1,9 @@
+// PR c++/60187
+// { dg-require-effective-target c++11 }
+
+template<typename... T> struct A
+{
+ enum E : T {}; // { dg-error "parameter pack" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C
new file mode 100644
index 000000000..82878a6bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C
@@ -0,0 +1,25 @@
+// { dg-do run { target c++11 } }
+// { dg-options "-O2 -Wtype-limits" }
+extern void link_error (void);
+
+enum Alpha : unsigned char {
+ ZERO = 0, ONE, TWO, THREE
+};
+
+Alpha a2;
+
+int m1 = -1;
+int GetM1() {
+ return m1;
+}
+
+int main() {
+ a2 = static_cast<Alpha>(GetM1());
+ if (a2 == -1) { // { dg-warning "always false due" }
+ link_error ();
+ }
+ if (-1 == a2) { // { dg-warning "always false due" }
+ link_error ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C
new file mode 100644
index 000000000..33557f2f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C
@@ -0,0 +1,10 @@
+// PR c++/34395
+// { dg-do compile { target c++11 } }
+
+template<int... N> void foo (int... x[N]) // { dg-message "int \\\[N\\\]\\.\\.\\. x" }
+{
+ struct A
+ {
+ A () { x; } // { dg-error "use of parameter from containing function" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C
new file mode 100644
index 000000000..e6af294c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C
@@ -0,0 +1,9 @@
+// PR c++/38656
+// { dg-do compile { target c++11 } }
+
+template<int> int foo();
+
+template<typename F> void bar(F f)
+{
+ f((foo<0>()=0)...); // { dg-error "pattern '\\(foo\\<0\\>\\)\\(\\)=0'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C
new file mode 100644
index 000000000..75390f0bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C
@@ -0,0 +1,24 @@
+// PR c++/47336
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+void g(T t)
+{
+ t+1; // { dg-error "no match" }
+}
+
+template <typename S>
+class C
+{
+ struct D {} d;
+public:
+ decltype(g(d)) h()
+ {
+ return g(d);
+ }
+};
+
+int main()
+{
+ C<int>().h();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C
new file mode 100644
index 000000000..bd73b2a76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C
@@ -0,0 +1,22 @@
+// PR c++/49156
+// { dg-do compile { target c++11 } }
+
+template<typename T> T declval();
+
+template<typename T>
+struct S {
+
+ template<typename U>
+ static U get(const volatile T&);
+
+ template<typename U>
+ static decltype(*declval<U>()) get(...); // { dg-error "operator*" }
+
+ typedef decltype(get<T>(declval<T>())) type; // { dg-error "no match" }
+};
+
+struct X { };
+
+S<X>::type x;
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C
new file mode 100644
index 000000000..e46c46d92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C
@@ -0,0 +1,107 @@
+// PR c++/49181
+// { dg-do compile { target c++11 } }
+
+namespace std
+{
+ typedef __SIZE_TYPE__ size_t;
+
+ template<typename _Tp, _Tp>
+ struct integral_constant;
+
+ template<typename _Tp, _Tp __v>
+ struct integral_constant
+ {
+ static constexpr _Tp value = __v;
+ typedef _Tp value_type;
+ typedef integral_constant<_Tp, __v> type;
+ constexpr operator value_type() { return value; }
+ };
+
+ typedef integral_constant<bool, true> true_type;
+
+ typedef integral_constant<bool, false> false_type;
+
+ template<typename _Tp, _Tp __v>
+ constexpr _Tp integral_constant<_Tp, __v>::value;
+
+ template<bool, typename _Tp = void>
+ struct enable_if
+ { };
+
+ template<typename _Tp>
+ struct enable_if<true, _Tp>
+ { typedef _Tp type; };
+
+ template<typename _Tp>
+ inline _Tp
+ declval();
+
+struct bad_alloc { };
+}
+
+void* operator new(std::size_t) throw (std::bad_alloc);
+
+namespace std
+{
+
+ template<typename _Tp>
+ class allocator
+ {
+ public:
+ typedef _Tp* pointer;
+ typedef _Tp value_type;
+
+ pointer
+ allocate(size_t, const void* = 0);
+ };
+
+ template<typename _Alloc>
+ struct allocator_traits
+ {
+ typedef typename _Alloc::value_type value_type;
+
+ template<typename _Tp> static typename _Tp::pointer
+_S_pointer_helper(_Tp*);
+ static value_type* _S_pointer_helper(...);
+ typedef decltype(_S_pointer_helper((_Alloc*)0)) __pointer;
+
+ typedef __pointer pointer;
+
+ typedef const void* const_void_pointer;
+
+ private:
+ template<typename _Alloc2>
+ struct __allocate_helper
+ {
+ template<typename _Alloc3,
+ typename = decltype(std::declval<_Alloc3*>()->allocate(
+ std::declval<size_t>(),
+ std::declval<const_void_pointer>()))>
+ static true_type __test(int);
+
+ template<typename>
+ static false_type __test(...);
+
+ typedef decltype(__test<_Alloc>(0)) type;
+ static const bool value = type::value;
+ };
+
+ template<typename _Alloc2>
+ static typename
+ enable_if<__allocate_helper<_Alloc2>::value, pointer>::type
+ _S_allocate(_Alloc2& __a, size_t __n, const_void_pointer __hint)
+ { return __a.allocate(__n, __hint); }
+
+ public:
+ static pointer
+ allocate(_Alloc& __a, size_t __n, const_void_pointer __hint)
+ { return _S_allocate(__a, __n, __hint); }
+ };
+
+}
+
+namespace std
+{
+ typedef short test_type;
+ template struct allocator_traits<allocator<test_type>>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C
new file mode 100644
index 000000000..515f8f5dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C
@@ -0,0 +1,8 @@
+// PR c++/48284
+// { dg-do compile { target c++11 } }
+
+template<typename C>
+auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-message "decltype .c\\.f" }
+
+template<typename C>
+auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-error "decltype .c\\.f" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C
new file mode 100644
index 000000000..3c9b8ba34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C
@@ -0,0 +1,10 @@
+// Test for printing the type of T{} in error messages.
+// { dg-do compile { target c++11 } }
+
+template <class T, T t> struct A { };
+template <class T> A<T,T{}> f(T t); // { dg-message "T{}" }
+
+int main()
+{
+ f(); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C
new file mode 100644
index 000000000..a99207792
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C
@@ -0,0 +1,7 @@
+// PR c++/39681
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int* p = new foo; // { dg-error "16:foo. does not name a type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C
new file mode 100644
index 000000000..ea4fa8a85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C
@@ -0,0 +1,58 @@
+// Test for explicit conversion ops from N2437.
+// { dg-do compile { target c++11 } }
+
+class U; class V;
+class T
+{
+public:
+ T( U const & );
+ //implicit converting ctor
+ explicit T( V const & );
+ // explicit ctor
+};
+class U
+{
+};
+class V
+{
+};
+class W
+{
+public:
+ operator T() const;
+};
+class X
+{
+public:
+ explicit operator T() const; // theoretical
+};
+int main()
+{
+ U u; V v; W w; X x;
+ // Direct initialization:
+ T t1( u );
+ T t2( v );
+ T t3( w );
+ T t4( x );
+ // Copy initialization:
+ T t5 = u;
+ T t6 = v; // { dg-error "" }
+ T t7 = w;
+ T t8 = x; // { dg-error "" }
+ // Cast notation:
+ T t9 = (T) u;
+ T t10 = (T) v;
+ T t11 = (T) w;
+ T t12 = (T) x;
+ // Static cast:
+ T t13 = static_cast<T>( u );
+ T t14 = static_cast<T>( v );
+ T t15 = static_cast<T>( w );
+ T t16 = static_cast<T>( x );
+ // Function-style cast:
+ T t17 = T( u );
+ T t18 = T( v );
+ T t19 = T( w );
+ T t20 = T( x );
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C
new file mode 100644
index 000000000..715855cfe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C
@@ -0,0 +1,29 @@
+// Test for explicit conversion ops in various conversion situations.
+// { dg-do compile { target c++11 } }
+
+typedef void (*pfn)();
+
+struct A
+{
+ explicit operator int() const;
+ explicit operator pfn() const;
+};
+
+int main()
+{
+ A a;
+ int i = a; // { dg-error "" }
+ const int &ir = a; // { dg-error "" }
+ a(); // { dg-error "" }
+ a + 1; // { dg-message "" } (error and note on same line)
+
+ int j (a);
+ (int)a;
+ static_cast<int>(a);
+}
+
+struct B
+{
+ int i;
+ B(const A& a): i(a) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C
new file mode 100644
index 000000000..678076c8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C
@@ -0,0 +1,50 @@
+// Test for "contextually converted to bool"
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ explicit operator bool();
+};
+
+void f (bool);
+
+struct B
+{
+ bool b;
+};
+
+struct C
+{
+ operator int();
+};
+
+struct D
+{
+ operator int();
+};
+
+int main()
+{
+ A a; C c; D d;
+ // These contexts use an explicit bool conversion.
+ if (a) {}
+ for (; a; ) {}
+ do {} while (a);
+ while (a) {}
+ a ? 1 : 0;
+ a || true;
+ a && true;
+ !a;
+
+ a ? c : 1;
+ a ? c : d;
+
+ // These do not.
+ switch (a); // { dg-error "" }
+ bool b = a; // { dg-error "" }
+ f(a); // { dg-error "" }
+ B b2 = { a }; // { dg-error "" }
+ a + true; // { dg-error "5:no match" }
+ b ? a : true; // { dg-error "5:no match" }
+ a ? a : true; // { dg-error "5:no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C
new file mode 100644
index 000000000..663878e55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C
@@ -0,0 +1,18 @@
+// Negative explicit conv test.
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A(const A&, int = 0); // { dg-message "note" }
+};
+struct B
+{
+ explicit operator A();
+};
+
+int main()
+{
+ B b;
+ (A(b)); // OK
+ (A(b,1)); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 16 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C
new file mode 100644
index 000000000..1adb8d67e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C
@@ -0,0 +1,24 @@
+// test for extension of DR 899 to handle template ctors
+// { dg-do run { target c++11 } }
+
+int r = 1;
+
+struct C {
+ C() { }
+ template <class T = int> C(C&, T = 0) { r = 0; }
+};
+
+C c;
+
+struct A
+{
+ explicit operator C&() const { return c; }
+};
+
+int main()
+{
+ A a;
+ C c2 (a);
+
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C
new file mode 100644
index 000000000..18f31b42d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C
@@ -0,0 +1,12 @@
+// PR c++/47080
+// { dg-options "" }
+// { dg-do compile { target c++11 } }
+
+struct A {
+ explicit operator int(); // { dg-message "qualification conversion" }
+};
+
+int main() {
+ bool b((A())); // { dg-error "invalid user-defined" }
+ !A(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C
new file mode 100644
index 000000000..574796d11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C
@@ -0,0 +1,18 @@
+// [over.match.conv]: For direct-initialization, those explicit conversion
+// functions that are not hidden within S and yield type T or a type that
+// can be converted to type T with a qualification conversion (4.4) are
+// also candidate functions.
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct A { };
+struct B: A { };
+struct C {
+ explicit operator B*(); // { dg-message "explicit" }
+ explicit operator B&(); // { dg-message "explicit" }
+};
+
+C c;
+A* ap (c); // { dg-error "" }
+A& ar (c); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C
new file mode 100644
index 000000000..2779a2b5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+template <typename> void f() {}
+extern template void f<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C
new file mode 100644
index 000000000..3eb870bb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+template <typename> class S {};
+extern template class S<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C
new file mode 100644
index 000000000..1b7ad0e01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C
@@ -0,0 +1,16 @@
+// PR c++/37256
+// { dg-options "-O" }
+
+template <typename T_>
+struct B
+{
+ T_ f();
+};
+
+extern template class B<int>;
+
+void f()
+{
+ B<int> t;
+ t.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C
new file mode 100644
index 000000000..3081d67c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C
@@ -0,0 +1,7 @@
+// PR c++/37766
+// { dg-do compile { target c++11 } }
+
+int a = 1;
+template<int& b = a> void f() {
+ f<>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C
new file mode 100644
index 000000000..663f40048
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C
@@ -0,0 +1,25 @@
+// PR c++/46831
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct B { };
+struct D : B { };
+struct A {
+ template<typename T = void> operator D&(); // { dg-message "template conversion" }
+ operator long();
+};
+
+void f(long);
+void f(B&);
+
+struct A2 {
+ template<typename T = void> operator B&();
+};
+
+void f2(const B&);
+
+int main() {
+ f(A());
+ f2(A2());
+ f2(A()); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C
new file mode 100644
index 000000000..8e9b76fe0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+
+template <class T, class = typename T::I> void f(T) {}
+template <class T, class = typename T::I> void g(T) {}
+template <class T, class = typename T::I> void h(T) {}
+template <class T, class = typename T::I> void i(T) {}
+template <class T, class = typename T::I> void j(T) {} // { dg-error "this context" }
+
+class A
+{
+ typedef int I; // { dg-error "private" }
+ template <class T, class> friend void f(T);
+ friend void g<A,I>(A);
+ friend void h<A>(A);
+ friend void i<>(A);
+};
+
+int main()
+{
+ A a;
+ f(a);
+ g(a);
+ h(a);
+ i(a);
+ j(a); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C
new file mode 100644
index 000000000..52e6f38a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C
@@ -0,0 +1,6 @@
+// PR c++/55724
+// { dg-do compile { target c++11 } }
+
+template<int N> struct S {};
+template<typename T = int, T N> void f(S<N>) {}
+int main() { S<1> s; f(s); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C
new file mode 100644
index 000000000..0821fc094
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C
@@ -0,0 +1,17 @@
+// Only print template subst context when it isn't redundant.
+// { dg-require-effective-target c++11 }
+// { dg-prune-output "error" }
+
+template<class T> struct A { typedef typename T::type type; };
+
+template <class T, class U = typename A<T>::type>
+void f(T);
+
+template <class T, class U = typename T::type>
+void g(T);
+
+int main()
+{
+ f(1); // { dg-message "required from here" }
+ g(1); // { dg-bogus "required from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C
new file mode 100644
index 000000000..7ec5884ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C
@@ -0,0 +1,44 @@
+// { dg-do compile { target c++11 } }
+
+// opaque enum declarations
+enum class E1;
+enum class E2 : int;
+enum class E3 : short;
+enum E4 : int;
+enum E5 : short;
+
+// can be repeated
+enum class E1;
+enum class E2 : int;
+enum class E3 : short;
+enum E4 : int;
+enum E5 : short;
+
+// are complete so we can declare variables
+E1 b1;
+E2 b2;
+E3 b3;
+E4 b4;
+E5 b5;
+
+//even with elaborated-type-specifiers
+enum E1 a1;
+enum E2 a2;
+enum E3 a3;
+enum E4 a4;
+enum E5 a5;
+
+// and the list can be added later
+enum class E1 { e11, e12 };
+enum class E2 : int { e21, e22 };
+enum class E3 : short {e31, e32 };
+enum E4 : int { e41, e42 };
+enum E5 : short { e51, e52 };
+
+// more repetitions allowed
+enum class E1;
+enum class E2 : int;
+enum class E3 : short;
+enum E4 : int;
+enum E5 : short;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C
new file mode 100644
index 000000000..609c27289
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C
@@ -0,0 +1,30 @@
+// { dg-do compile { target c++11 } }
+
+//This error is diagnosed at instantiation time
+template<typename T> struct S1
+{
+ enum E : T; // { dg-error "previous definition" }
+ enum E : int; // { dg-error "different underlying type" }
+};
+template struct S1<short>; // { dg-message "required from here" }
+
+template<typename T> struct S2
+{
+ enum E : T;
+ enum E : T;
+};
+template struct S2<short>;
+
+template<typename T1, typename T2> struct S3
+{
+ enum E : T1;
+ enum E : T2;
+};
+template struct S3<short,short>;
+
+template<typename T1, typename T2> struct S4
+{
+ enum E : T1; // { dg-error "previous definition" }
+ enum E : T2; // { dg-error "different underlying type" }
+};
+template struct S4<short,char>; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C
new file mode 100644
index 000000000..8cabc038f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+enum { A = 1 };
+struct T
+{
+ int i1, i2, i3, i4, i5, i6, i7;
+ enum E2 : int;
+
+ void f();
+};
+
+enum T::E2 : int { A1 = A, A2 = 23 };
+
+static_assert(int(T::A1) == 1, "error");
+static_assert(int(T::A2) == 23, "error");
+
+void T::f()
+{
+ static_assert(int(T::A1) == 1, "error");
+ static_assert(int(T::A2) == 23, "error");
+ static_assert(int(A1) == 1, "error");
+ static_assert(int(A2) == 23, "error");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C
new file mode 100644
index 000000000..b8f062e11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C
@@ -0,0 +1,43 @@
+// { dg-do compile { target c++11 } }
+
+struct S1
+{
+ struct S2
+ {
+ // opaque enum declarations
+ enum class E1;
+ enum class E2 : int;
+ enum class E3 : short;
+ enum E4 : int;
+ enum E5 : short;
+
+ // can be repeated
+ enum class E1;
+ enum class E2 : int;
+ enum class E3 : short;
+ enum E4 : int;
+ enum E5 : short;
+ };
+};
+
+// are complete so we can declare variables
+S1::S2::E1 b1;
+S1::S2::E2 b2;
+S1::S2::E3 b3;
+S1::S2::E4 b4;
+S1::S2::E5 b5;
+
+//even with elaborated-type-specifiers
+enum S1::S2::E1 a1;
+enum S1::S2::E2 a2;
+enum S1::S2::E3 a3;
+enum S1::S2::E4 a4;
+enum S1::S2::E5 a5;
+
+// and the list can be added later
+enum class S1::S2::E1 { e11, e12 };
+enum class S1::S2::E2 : int { e21, e22 };
+enum class S1::S2::E3 : short {e31, e32 };
+enum S1::S2::E4 : int { e41, e42 };
+enum S1::S2::E5 : short { e51, e52 };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C
new file mode 100644
index 000000000..c8cd6f61f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C
@@ -0,0 +1,43 @@
+// { dg-do compile { target c++11 } }
+
+namespace S1
+{
+ namespace S2
+ {
+ // opaque enum declarations
+ enum class E1;
+ enum class E2 : int;
+ enum class E3 : short;
+ enum E4 : int;
+ enum E5 : short;
+
+ // can be repeated
+ enum class E1;
+ enum class E2 : int;
+ enum class E3 : short;
+ enum E4 : int;
+ enum E5 : short;
+ }
+}
+
+// are complete so we can declare variables
+S1::S2::E1 b1;
+S1::S2::E2 b2;
+S1::S2::E3 b3;
+S1::S2::E4 b4;
+S1::S2::E5 b5;
+
+//even with elaborated-type-specifiers
+enum S1::S2::E1 a1;
+enum S1::S2::E2 a2;
+enum S1::S2::E3 a3;
+enum S1::S2::E4 a4;
+enum S1::S2::E5 a5;
+
+// and the list can be added later
+enum class S1::S2::E1 { e11, e12 };
+enum class S1::S2::E2 : int { e21, e22 };
+enum class S1::S2::E3 : short {e31, e32 };
+enum S1::S2::E4 : int { e41, e42 };
+enum S1::S2::E5 : short { e51, e52 };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C
new file mode 100644
index 000000000..aee916e9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C
@@ -0,0 +1,44 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct S1
+{
+ struct S2
+ {
+ // opaque enum declarations
+ enum class E1;
+ enum class E2 : T;
+ enum class E3 : short;
+ enum E4 : T;
+ enum E5 : short;
+
+ // can be repeated
+ enum class E1;
+ enum class E2 : T;
+ enum class E3 : short;
+ enum E4 : T;
+ enum E5 : short;
+ };
+
+ // are complete so we can declare variables
+ typename S2::E1 b1;
+ typename S2::E2 b2;
+ typename S2::E3 b3;
+ typename S2::E4 b4;
+ typename S2::E5 b5;
+
+ //even with elaborated-type-specifiers
+ enum S1::S2::E1 a1;
+ enum S1::S2::E2 a2;
+ enum S1::S2::E3 a3;
+ enum S1::S2::E4 a4;
+ enum S1::S2::E5 a5;
+
+ // and the list can be added later
+ enum class S1::S2::E1 { e11, e12 };
+ enum class S1::S2::E2 : T { e21, e22 };
+ enum class S1::S2::E3 : short {e31, e32 };
+ enum S1::S2::E4 : T { e41, e42 };
+ enum S1::S2::E5 : short { e51, e52 };
+};
+
+template struct S1<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C
new file mode 100644
index 000000000..d1d6230ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C
@@ -0,0 +1,62 @@
+// { dg-do compile { target c++11 } }
+
+namespace one
+{
+ struct S
+ {
+ enum { A = 1, B = 2 };
+ struct T
+ {
+ enum { B = 102 };
+
+ enum class E1;
+ enum E2 : int;
+ };
+ };
+
+ enum class S::T::E1 { A1 = A, B1 = B, C1 };
+ enum S::T::E2 : int { A1 = A, B1 = B, C1 };
+
+ static_assert(int(S::T::E1::A1) == 1, "error");
+ static_assert(int(S::T::E1::B1) == 102, "error");
+ static_assert(int(S::T::E1::C1) == 103, "error");
+
+ static_assert(int(S::T::E2::A1) == 1, "error");
+ static_assert(int(S::T::E2::B1) == 102, "error");
+ static_assert(int(S::T::E2::C1) == 103, "error");
+ static_assert(int(S::T::A1) == 1, "error");
+ static_assert(int(S::T::B1) == 102, "error");
+ static_assert(int(S::T::C1) == 103, "error");
+}
+
+
+namespace two
+{
+ namespace S
+ {
+ enum { A = 1, B = 2 };
+ namespace T
+ {
+ enum { B = 102 };
+
+ enum class E1;
+ enum E2 : int;
+ }
+ }
+
+ enum class S::T::E1 { A1 = A, B1 = B, C1 };
+ enum S::T::E2 : int { A1 = A, B1 = B, C1 };
+
+ static_assert(int(S::T::E1::A1) == 1, "error");
+ static_assert(int(S::T::E1::B1) == 102, "error");
+ static_assert(int(S::T::E1::C1) == 103, "error");
+
+ static_assert(int(S::T::E2::A1) == 1, "error");
+ static_assert(int(S::T::E2::B1) == 102, "error");
+ static_assert(int(S::T::E2::C1) == 103, "error");
+ static_assert(int(S::T::A1) == 1, "error");
+ static_assert(int(S::T::B1) == 102, "error");
+ static_assert(int(S::T::C1) == 103, "error");
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C
new file mode 100644
index 000000000..ccce13a79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C
@@ -0,0 +1,73 @@
+// { dg-do compile { target c++11 } }
+
+enum class E1 : int; // { dg-error "previous definition" }
+enum E1 : int; // { dg-error "scoped/unscoped mismatch" }
+
+enum E2 : int; // { dg-error "previous definition" }
+enum class E2 : int; // { dg-error "scoped/unscoped mismatch" }
+
+enum struct E3 : int;
+enum class E3 : int; //ok
+
+enum class E4 : int; // { dg-error "previous definition" }
+enum class E4 : long; // { dg-error "different underlying type" }
+
+enum E5 : int; // { dg-error "previous definition" }
+enum E5 : long; // { dg-error "different underlying type" }
+
+enum E6 : int;
+enum E6 : int; //ok
+
+enum class E7;
+enum class E7 : int; //ok
+
+enum class E3 e3; // { dg-error "scoped enum must not use" }
+enum struct E3 e4; // { dg-error "scoped enum must not use" }
+enum E5 : int e5; // { dg-error "expected|invalid type" }
+
+enum E6 : int { a, b, c }; // { dg-error "previous definition" }
+enum E6 : int { a, b, c }; // { dg-error "multiple definition" }
+
+enum class E7 { }; // { dg-error "previous definition" }
+enum class E7 { a, b, c }; // { dg-error "multiple definition" }
+
+namespace N1
+{
+ struct D;
+ enum class E6;
+ enum E7 : int;
+}
+
+enum class N1::E6; // { dg-error "must use a simple identifier" }
+enum N1::E6 e6_1; //ok
+enum ::N1::E6 e6_2; //ok
+
+namespace N2
+{
+ enum class N1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" }
+ enum N1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" }
+}
+
+enum class N1::E6 { e1, e2, e3 };
+enum N1::E7 : int { e1, e2, e3 };
+
+struct S1
+{
+ struct D;
+ enum class E6;
+ enum E7 : int;
+};
+
+enum class S1::E6; // { dg-error "must use a simple identifier" }
+enum S1::E6 e6_3; //ok
+enum ::S1::E6 e6_4; //ok
+
+struct S2
+{
+ enum class S1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" }
+ enum S1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" }
+};
+
+enum class S1::E6 { e1, e2, e3 };
+enum S1::E7 : int { e1, e2, e3 };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C
new file mode 100644
index 000000000..3c67f5470
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename T> struct S1
+{
+ enum E1 : int;
+ enum E1 : T;
+ enum class E2 : int;
+ enum class E2 : T;
+};
+
+template<typename T> enum S1<T>::E1 : int { e1 };
+template<typename T> enum class S1<T>::E2 : T { e2 };
+
+S1<int>::E1 x1 = S1<int>::e1;
+S1<int>::E1 x11 = S1<int>::E1::e1;
+S1<int>::E2 x2 = S1<int>::E2::e2;
+
+enum S1<int>::E1 ex1 = S1<int>::e1;
+enum S1<int>::E1 ex11 = S1<int>::E1::e1;
+enum S1<int>::E2 ex2 = S1<int>::E2::e2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C
new file mode 100644
index 000000000..5174226a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+//This instatiation is ok
+template<typename T> struct S1
+{
+ enum E : int;
+ enum E : T;
+};
+template struct S1<int>; //ok
+
+//This error is diagnosed at instantiation time
+template<typename T> struct S2
+{
+ enum E : int; // { dg-error "previous definition" }
+ enum E : T; // { dg-error "different underlying type" }
+};
+template struct S2<short>; // { dg-message "required from here" }
+
+//This error is diagnosed at compilation time
+template<typename T> struct S3
+{
+ enum E : int; // { dg-error "previous definition" }
+ enum E : short; // { dg-error "different underlying type" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C
new file mode 100644
index 000000000..4f1475acf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename T> struct S1
+{
+ enum E1 : int;
+ enum class E2 : int;
+};
+
+template<typename T> enum S1<T>::E1 : int { e1 };
+template<typename T> enum class S1<T>::E2 : T { e2 };
+
+template<> enum S1<int>::E1 : int { i1 };
+template<> enum class S1<int>::E2 : int { i2 };
+
+S1<char>::E1 xci = S1<char>::e1;
+S1<int>::E1 xi1 = S1<int>::i1;
+
+S1<char>::E2 xc2 = S1<char>::E2::e2;
+S1<int>::E2 xi2 = S1<int>::E2::i2;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C
new file mode 100644
index 000000000..ae2c603aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C
@@ -0,0 +1,22 @@
+// From N1791
+// { dg-do compile { target c++11 } }
+
+class C;
+typedef C Ct;
+class X1 {
+ friend C; // OK: class C is a friend
+};
+
+class X2
+{
+ friend Ct; // OK: class C is a friend
+ friend D; // { dg-error "" } no type-name D in scope
+ friend class D; // OK: elaborated-type-specifier declares new class
+};
+
+template <typename T> class R {
+ friend T;
+};
+
+R<C> rc; // class C is a friend of R<C>
+R<int> Ri; // OK: "friend int;" is ignored
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C
new file mode 100644
index 000000000..c4df8a0f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C
@@ -0,0 +1,40 @@
+// PR c++/47721
+// { dg-do compile { target c++11 } }
+
+// template type parameter friend:
+
+template<class W>
+class Q
+{
+ static const int I = 2;
+public:
+ friend W;
+};
+
+struct B
+{
+ int ar[Q<B>::I];
+};
+
+// bonus template template parameter friend:
+
+template <class T> struct A;
+
+template<template <class> class W>
+class P
+{
+ static const int I = 2;
+public:
+ // I'm not sure this is well-formed, but I can't find anything
+ // that says otherwise.
+ template <class T> friend class W;
+};
+
+template <class T>
+struct A
+{
+ int ar[P<A>::I];
+};
+
+A<int> a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C
new file mode 100644
index 000000000..a55698c93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+int **** [[gnu::format(printf, 1, 2)]] foo(const char *, ...); // { dg-warning "ignored" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C
new file mode 100644
index 000000000..cac568e0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C
@@ -0,0 +1,9 @@
+// PR c++/12795
+// { dg-do compile { target c++11 } }
+// { dg-require-alias "" }
+
+void foo()
+{
+ extern void bar [[gnu::__alias__ ("BAR")]] (); // { dg-warning "ignored" }
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C
new file mode 100644
index 000000000..504b45656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// PR c++/13791
+
+template <typename T> struct O {
+ struct [[gnu::packed]] I {
+ int i;
+ char c;
+ };
+
+ I* foo();
+};
+
+template <typename T>
+typename O<T>::I*
+O<T>::foo() { return 0; }
+
+template class O<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C
new file mode 100644
index 000000000..504b45656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// PR c++/13791
+
+template <typename T> struct O {
+ struct [[gnu::packed]] I {
+ int i;
+ char c;
+ };
+
+ I* foo();
+};
+
+template <typename T>
+typename O<T>::I*
+O<T>::foo() { return 0; }
+
+template class O<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C
new file mode 100644
index 000000000..a1b4a84b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+// PR c++/13854
+
+extern char *rindex [[gnu::__pure__]] (__const char *__s, int __c) throw ();
+extern char *rindex [[gnu::__pure__]] (__const char *__s, int __c) throw ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C
new file mode 100644
index 000000000..d646d274d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+// PR c++/13170
+// The bogus attribute is ignored, but was in TYPE_ATTRIBUTES during
+// parsing of the class, causing some variants to have it and some not.
+
+struct [[gnu::bogus]] A // { dg-warning "ignored" "" }
+{
+ virtual ~A();
+ void foo(const A&);
+ void bar(const A&);
+};
+
+void A::foo(const A&) {}
+void A::bar(const A& a) { foo(a); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C
new file mode 100644
index 000000000..bf05dbeb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+// PR c++/15317
+
+struct A
+{
+ A(char);
+};
+A::A([[gnu::unused]] char i2)
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C
new file mode 100644
index 000000000..4adefdb32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+// Origin: <rguenth at tat dot physik dot uni-tuebingen dot de>
+// PR c++/10479: use of non dependent expressions in attributes in templates
+
+template <int i>
+struct foo2 {
+ float bar [[gnu::aligned(alignof(double))]];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C
new file mode 100644
index 000000000..636f9a9ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org>
+// PR c++/17743: Attributes applied to typedefs.
+
+struct A {
+ typedef char layout_type[sizeof(double)]
+ [[gnu::aligned(alignof(double)]]); // { dg-error "expected" }
+ layout_type data;
+};
+
+struct B {
+ typedef char layout_type[sizeof(double)];
+ layout_type data [[gnu::aligned(alignof(double))]];
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<alignof(A) == alignof(B)> a1;// { dg-error "incomplete type and cannot be defined" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C
new file mode 100644
index 000000000..566461b0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org>
+// PR c++/17743: Attributes applied to typedefs.
+
+struct A {
+ typedef char layout_type[sizeof(double)]
+ [[gnu::aligned(alignof(double))]];
+ layout_type data;
+};
+
+struct B {
+ typedef char layout_type[sizeof(double)];
+ layout_type data [[gnu::aligned(alignof(double))]];
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<alignof(A) == alignof(B)> a1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C
new file mode 100644
index 000000000..3df13e644
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C
@@ -0,0 +1,10 @@
+// PR c++/17542
+// Test that we warn when an attribute preceding the class-key is ignored.
+// { dg-do compile { target c++11 } }
+
+[[gnu::packed]] struct A // { dg-warning "attribute" }
+{
+ char c;
+ int x;
+ void f();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C
new file mode 100644
index 000000000..5ac93d845
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C
@@ -0,0 +1,11 @@
+// PR c++/19739
+// { dg-do compile { target c++11 } }
+
+void Dummy() [[ , ]];
+void Dummy() {}
+
+int main (int argc, char **argv)
+{
+ Dummy();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C
new file mode 100644
index 000000000..2f47b3255
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+struct [[gnu::unused]] A {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C
new file mode 100644
index 000000000..8c777c1df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+struct [[gnu::packed]] A
+{
+ void f () const;
+};
+
+void
+A::f () const
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C
new file mode 100644
index 000000000..f989ab207
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+// Origin: <jan at etpmod dot phys dot tue dot nl>
+// PR c++/19508: avoid attributes for template parameters
+
+template <typename T>
+struct BVector
+{
+ typedef T T2;
+ typedef T value_type [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" }
+ typedef T2 value_type2 [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" }
+ value_type v;
+};
+BVector<int> m;
+
+template <template <class> class T>
+struct BV2
+{
+ typedef T<float> value_type [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" }
+ value_type v;
+};
+BV2<BVector> m2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C
new file mode 100644
index 000000000..2d5ad04b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C
@@ -0,0 +1,21 @@
+// PR c++/20763
+// { dg-do compile { target c++11 } }
+
+typedef void *voidp;
+
+struct S
+{
+ char a;
+ voidp b [[gnu::aligned (16)]];
+};
+
+struct T
+{
+ char a;
+ void * b [[gnu::aligned (16)]];
+};
+
+static_assert (sizeof (S) == sizeof (T),
+ "struct S and T should have the same size");
+
+static_assert (sizeof (S) == 32, "sizeof (S) == 8 + 16 + 8");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C
new file mode 100644
index 000000000..4c07df995
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C
@@ -0,0 +1,7 @@
+// PR c++/27648
+// { dg-do compile { target c++11 } }
+
+void f()
+{
+ static_cast<float *[[gnu::unused]]>(0); // { dg-warning "ignored" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C
new file mode 100644
index 000000000..57ea6b809
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C
@@ -0,0 +1,11 @@
+// PR c++/28112
+// { dg-do compile { target c++11 } }
+
+int i [[gnu::init_priority(;)]]; // { dg-error "before" }
+int j [[gnu::vector_size(;)]]; // { dg-error "before" }
+int k [[gnu::visibility(;)]]; // { dg-error "before" }
+struct A {} [[gnu::aligned(;)]]; // { dg-error "before" }
+struct B {} [[gnu::mode(;)]]; // { dg-error "before" }
+void foo() [[gnu::alias(;)]]; // { dg-error "before" }
+void bar() [[gnu::nonnull(;)]]; // { dg-error "before" }
+void baz() [[gnu::section(;)]]; // { dg-error "before" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C
new file mode 100644
index 000000000..e1f26c3d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C
@@ -0,0 +1,4 @@
+// PR c++/28387
+// { dg-do compile { target c++11 } }
+
+enum [[gnu::unused]] E; // { dg-error "without previous declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C
new file mode 100644
index 000000000..09486d66b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C
@@ -0,0 +1,12 @@
+// PR c++/28559
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct A
+{
+ struct B;
+};
+
+struct C
+{
+ template<typename T> friend struct [[gnu::packed]] A<T>::B; // { dg-warning "uninstantiated" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C
new file mode 100644
index 000000000..00069b8f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C
@@ -0,0 +1,15 @@
+// PR c++/28659
+// The attribute was causing us to get confused in merge_types when
+// combining the template type with an uninstantiated version.
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct [[gnu::aligned(1)]] A
+{
+ A& operator=(const A &t);
+};
+
+template<class T>
+A<T>& A<T>::operator=(const A<T> &t)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C
new file mode 100644
index 000000000..e38d8d3f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C
@@ -0,0 +1,6 @@
+//PR c++/29980
+// { dg-do compile { target c++11 } }
+
+struct A { typedef int X; }; // { dg-message "previous declaration" }
+
+struct [[gnu::unused]] A::X; // { dg-error "typedef-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C
new file mode 100644
index 000000000..94f1756ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C
@@ -0,0 +1,13 @@
+// PR c++/28558
+// { dg-options "" }
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(int) { }
+};
+
+int main()
+{
+ A a = (A [[gnu::unused]])0; // { dg-warning "attribute" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C
new file mode 100644
index 000000000..f3da45229
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C
@@ -0,0 +1,10 @@
+// PR c++/33506
+// { dg-do compile { target c++11 } }
+
+extern int f1 [[gnu::warn_unused_result]] (char *) ;
+extern int f2 [[gnu::warn_unused_result]] (char *) throw () ;
+extern int f2 (char *) throw ();
+
+extern int f3 [[gnu::nonnull (1)]] (char *) ;
+extern int f4 [[gnu::nonnull (1)]] (char *) throw ();
+extern int f4 (char *) throw ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C
new file mode 100644
index 000000000..edd106726
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C
@@ -0,0 +1,22 @@
+// Test that attributes work in a variety of situations.
+// { dg-options "-O -ftrack-macro-expansion=0" }
+// { dg-do run { target c++11 } }
+
+#define attrib [[gnu::mode (QI)]]
+#define gnu_attrib __attribute((mode (QI)))
+
+attrib signed int a;
+static unsigned int b attrib;
+
+int foo(attrib int o)
+{
+ return (sizeof (a) != 1
+ || sizeof (b) != 1
+ || sizeof (o) != 1
+ || sizeof ((gnu_attrib signed int) b) != 1);
+}
+
+int main ()
+{
+ return foo (42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C
new file mode 100644
index 000000000..537dec50e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+// PR c++/35074
+
+template<typename T> struct A
+{
+ void foo() const;
+} [[gnu::aligned(4)]]; // { dg-warning "ignored" }
+
+template<typename T> void A<T>::foo() const {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C
new file mode 100644
index 000000000..ab58e6e2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C
@@ -0,0 +1,16 @@
+// PR c++/35097
+// { dg-do compile { target c++11 } }
+
+template<int> struct A;
+
+template<> struct A<0>
+{
+ typedef int X [[gnu::aligned(4)]];
+};
+
+template<typename T> void foo(const A<0>::X&, T);
+
+void bar()
+{
+ foo(A<0>::X(), 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C
new file mode 100644
index 000000000..6a1b235d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C
@@ -0,0 +1,37 @@
+// PR c++/35315
+// { dg-do compile { target c++11 } }
+
+typedef union { int i; } U [[gnu::transparent_union]]; // { dg-warning "ignored" }
+
+static void foo(U) {}
+static void foo(int) {}
+
+void bar()
+{
+ foo(0);
+}
+
+typedef union U1 { int i; } U2 [[gnu::transparent_union]]; // { dg-warning "ignored" }
+
+static void foo2(U1) {} // { dg-message "previously defined" }
+static void foo2(U2) {} // { dg-error "redefinition" }
+
+void bar2(U1 u1, U2 u2)
+{
+ foo2(u1);
+ foo2(u2);
+}
+
+// PR c++/36410
+struct A
+{
+ typedef union [[gnu::transparent_union]]
+ {
+ int i;
+ } B;
+};
+
+void foo(A::B b)
+{
+ b.i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C
new file mode 100644
index 000000000..efb2a1ad6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C
@@ -0,0 +1,19 @@
+// PR c++/35546
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+
+template <int N>
+struct T
+{
+ void foo [[gnu::format (printf,2,3)]] (char const * ...);
+};
+
+template struct T<3>;
+
+template <typename T>
+struct U
+{
+ typedef T V [[gnu::mode (SI)]];
+};
+
+U<int>::V v;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C
new file mode 100644
index 000000000..ae8e99090
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C
@@ -0,0 +1,19 @@
+// PR c/37171
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+unsigned int f1 [[gnu::const]] ();
+unsigned int f2 [[gnu::__const]] () ;
+unsigned int f3 [[gnu::__const__]] () ;
+
+unsigned int f4 ()
+{
+ return f1 () + f1 () + f1 () + f1 ()
+ + f2 () + f2 () + f2 () + f2 ()
+ + f3 () + f3 () + f3 () + f3 ();
+}
+
+// { dg-final { scan-tree-dump-times "= f1 \\(\\)" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "= f2 \\(\\)" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "= f3 \\(\\)" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C
new file mode 100644
index 000000000..ccae6f0c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target c++11 }
+// { dg-options "-O3 -msse2" }
+// { dg-require-effective-target sse2 }
+
+// You can make NON-template typedefs with a large alignment.
+typedef double AlignedDoubleType [[gnu::aligned(16)]];
+
+template <typename RealType>
+RealType f(const RealType* p)
+{
+ // But if you use a template parameter it complains.
+ typedef RealType AlignedRealType [[gnu::aligned(16)]];
+
+ return p[0];
+}
+
+double f2(const double* p)
+{
+ return f<double>(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C
new file mode 100644
index 000000000..2aae9cae0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+struct S;
+
+typedef int (*F [[gnu::warn_unused_result]]) (int);
+
+typedef int (*F2 [[gnu::warn_unused_result]]) (int);
+
+typedef int (S::*F3 [[gnu::warn_unused_result]]) (int); // { dg-warning "only applies to function types" }
+
+typedef int [[gnu::warn_unused_result]] (*F5) (int); // { dg-warning "ignored" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C
new file mode 100644
index 000000000..3f0ef1461
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C
@@ -0,0 +1,26 @@
+// PR c++/43031
+// { dg-options "-pedantic" }
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-require-effective-target c++11 }
+
+// c++11 attributes that apply to types are ignored for now
+
+class T;
+class L { };
+class P : public L
+{
+ typedef void (T::* [[gnu::__stdcall__]] F2) (L*); // { dg-warning "ignored" }
+ typedef void (T::*F) (L*) [[gnu::__stdcall__]]; // { dg-warning "ignored" }
+ void f(bool aAdd);
+};
+
+class T
+{
+public:
+ virtual void A(L *listener) [[gnu::__stdcall__]] = 0; // { dg-warning "ignored" }
+ virtual void R(L *listener) [[gnu::__stdcall__]] = 0; // { dg-warning "ignored" }
+};
+void P::f(bool aAdd)
+{
+ F addRemoveEventListener = (aAdd ? &T::A : &T::R);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C
new file mode 100644
index 000000000..59626b254
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C
@@ -0,0 +1,18 @@
+// PR c++/43093
+// { dg-options "-pedantic" }
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-require-effective-target c++11 }
+
+// c++11 attributes that apply to types are ignored for now
+
+struct S {
+ int x;
+ S(const S &s) {}
+};
+
+S getS() [[gnu::__stdcall__]]; // { dg-warning "ignored" }
+
+void test()
+{
+ S s = getS();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C
new file mode 100644
index 000000000..3db981aeb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// PR c++/36625
+
+template <int N>
+struct A {
+ struct S { short f[3]; } [[gnu::aligned (N)]]; // { dg-warning "ignored" }
+};
+
+int main ()
+{
+ A<4>::S s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C
new file mode 100644
index 000000000..453fc01a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+int fragile_block(void) {
+ typedef
+ [[gnu::aligned (16)]] // { dg-warning "ignored" }
+ struct {
+ int i;
+ } XmmUint16;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C
new file mode 100644
index 000000000..83fa8b5e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C
@@ -0,0 +1,10 @@
+// PR debug/43370
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+
+int fragile_block(void) {
+ typedef struct [[gnu::aligned (16)]] {
+ int i;
+ } XmmUint16;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C
new file mode 100644
index 000000000..eb585a89b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C
@@ -0,0 +1,30 @@
+// { dg-options "-Wunused -pedantic-errors" }
+// { dg-do compile { target c++11 } }
+// Test for syntax support of various attribute permutations.
+
+int
+[[noreturn]] // { dg-warning "ignored" }
+one
+[[gnu::unused]]
+(void);
+
+int one_third [[noreturn]] [[gnu::unused]] (void);
+
+int [[gnu::unused]] one_half(); // { dg-warning "ignored" }
+
+static
+[[noreturn]] // { dg-warning "ignored" }
+void two [[gnu::unused]] (void) {}
+
+
+
+[[gnu::unused]]
+int
+five(void)
+[[noreturn]] // { dg-warning "ignored" }
+{}
+
+[[noreturn]]
+void
+six (void)
+;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C
new file mode 100644
index 000000000..f3ccb727d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C
@@ -0,0 +1,5 @@
+// PR c++/46803
+// { dg-do compile { target c++11 } }
+
+int strftime(char *, int, const char *, const struct tm *)
+ [[gnu::__bounded__(__string__,1,2)]]; // { dg-warning "ignored" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C
new file mode 100644
index 000000000..6e47a1e3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C
@@ -0,0 +1,20 @@
+// PR c++/45267
+// { dg-do compile { target c++11 } }
+// { dg-options "-O" }
+
+template<typename T> struct Vector {
+ Vector(long long x);
+ inline Vector<T> operator<< [[gnu::always_inline]] (int x) const;
+};
+long long bar (long long);
+template<> inline Vector<int> Vector<int>::operator<<(int x) const {
+ return bar(x);
+}
+bool b;
+int main() {
+ Vector<int> a(1);
+ if ((a << 2), b) {
+ a << 2;
+ throw 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C
new file mode 100644
index 000000000..ec98ece58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C
@@ -0,0 +1,14 @@
+// { dg-options "-pedantic" }
+// { dg-do compile { target { i?86-*-* && ilp32 } } }
+// { dg-require-effective-target c++11 }
+
+struct A {
+ [[gnu::fastcall]]
+ void f();
+};
+
+int main()
+{
+ typedef void (A::*FP)();
+ FP fp[] = {&A::f}; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C
new file mode 100644
index 000000000..c85062272
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+template <class T> struct A { };
+
+template [[gnu::packed]] struct A<int>; // { dg-warning "ignored in explicit instantiation" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C
new file mode 100644
index 000000000..81d70e52b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C
@@ -0,0 +1,3 @@
+// PR c++/52671
+// { dg-do compile { target c++11 } }
+[[gnu::deprecated]] enum E { E0 }; // { dg-warning "ignored in declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C
new file mode 100644
index 000000000..573a1ab6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C
@@ -0,0 +1,4 @@
+// PR c++/52906
+// { dg-do compile { target c++11 } }
+
+[[gnu::deprecated]]; // { dg-error "does not declare anything" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C
new file mode 100644
index 000000000..53fcb77ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C
@@ -0,0 +1,5 @@
+// PR c++/40821
+// { dg-do compile { target c++11 } }
+
+struct [[gnu::aligned(8)] S1 { int i; }; // { dg-error "" }
+struct [aligned(8) S2 { int i; }; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C
new file mode 100644
index 000000000..4a5d73a19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+int
+foo ()
+{
+ int i [[and, bitor, xor_eq, compl, bitand]]; // { dg-warning "ignored" }
+ i = 0;
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C
new file mode 100644
index 000000000..af74abd18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+// Example taken from dcl.attr.grammar:
+
+int p[10];
+void f()
+{
+ int x = 42, y[5];
+ /* Here, the '[[' should have introduced an attribute, on a
+ lambda invocation an array subscripting expression. */
+ int(p[[x] { return x; }()]); // { dg-error "expected|consecutive" }
+ /* Likewise, the '[[gnu::' is invalid here. */
+ y[[] { return 2; }()] = 2; // { dg-error "expected|consecutive" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C
new file mode 100644
index 000000000..3cc58976b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C
@@ -0,0 +1,4 @@
+// Origin: PR c++/54955
+// { dg-do compile { target c++11 } }
+
+alignas(double) int f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C
new file mode 100644
index 000000000..360c093bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+typedef char layout_type;
+
+struct A {
+ layout_type member alignas (double);
+};
+
+static_assert (alignof (A) == alignof (double),
+ "alignment of struct A must be alignof (double)");
+
+struct alignas (alignof (long double)) B {
+ layout_type member;
+};
+
+static_assert (alignof (B) == alignof (long double),
+ "alignment of struct A must be alignof (double double)");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C
new file mode 100644
index 000000000..8b68f9273
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+typedef char layout_type;
+
+template<class> struct A {
+ layout_type member alignas (double);
+};
+
+static_assert (alignof (A<int>) == alignof (double),
+ "alignment of struct A must be alignof (double)");
+
+template<class> struct alignas (alignof (long double)) B {
+ layout_type member;
+};
+
+static_assert (alignof (B<int>) == alignof (long double),
+ "alignment of struct A must be alignof (double double)");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C
new file mode 100644
index 000000000..83de121df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+//
+// There were two related problems here, depending on the vintage. At
+// one time:
+//
+// typedef struct A { ... } A [[gnu::aligned (16)]];
+//
+// would cause original_types to go into an infinite loop. At other
+// times, the attributes applied to an explicit typedef would be lost
+// (check_b3 would have a negative size).
+
+// First check that the declaration is accepted and has an effect.
+typedef struct A { int i; } A [[gnu::aligned (16)]];
+int check_A[alignof (A) >= 16 ? 1 : -1];
+
+// Check that the alignment is only applied to the typedef.
+struct B { int i; };
+struct B b1;
+typedef struct B B [[gnu::aligned (16)]];
+struct B b2;
+B b3;
+int check_b1[__alignof__ (b1) == __alignof__ (b2) ? 1 : -1];
+int check_b3[__alignof__ (b3) >= 16 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C
new file mode 100644
index 000000000..2479dfdf1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+typedef char layout_type;
+
+template<class> struct A {
+ layout_type member alignas (double) alignas (int);
+};
+
+// Here, the spec says that A<int> should have the stricter alignment,
+// so that would be the alignment of 'double', not 'int'.
+static_assert (alignof (A<int>) == alignof (double),
+ "alignment of struct A must be alignof (double)");
+
+template<class> struct alignas (1) alignas (alignof (long double)) B {
+ layout_type member;
+};
+
+// Similarly, the B<int> should have the stricter alignment, so that would
+// so that would be the alignment of 'long double', not '1'.
+static_assert (alignof (B<int>) == alignof (long double),
+ "alignment of struct A must be alignof (double double)");
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C
new file mode 100644
index 000000000..f2b66029e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+typedef char layout_type;
+struct A
+{
+ layout_type member [[gnu::aligned (16)]];
+};
+
+static_assert (sizeof (A) == 16, "Alignment should be 16");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C
new file mode 100644
index 000000000..0f87fd490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+struct A {int i;} a [[gnu::aligned(16)]];
+struct B {int i;} __attribute__((aligned(16))) b;
+
+int
+main ()
+{
+ A aa;
+ B bb;
+
+ static_assert (sizeof (a) == 4, "sizeof (a) should be 4");
+ static_assert (sizeof (b) == 16, "sizeof (b) should be 16");
+ static_assert (sizeof (aa) == 4, "sizeof (aa) should be 4");
+ static_assert (sizeof (bb) == 16, "sizeof (bb) should be 16");
+
+ static_assert (__alignof__ (a) == 16, "alignof (a) should be 16");
+ static_assert (__alignof__ (b) == 16, "alignof (b) should be 16");
+ static_assert (__alignof__ (aa) == 4, "alignof (aa) should be 4");
+ static_assert (__alignof__ (bb) == 16, "alignof (bb) should be 16");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C
new file mode 100644
index 000000000..723c8ef8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C
@@ -0,0 +1,39 @@
+// { dg-do compile { target c++11 } }
+
+int
+toto ()
+{
+ [[gnu::unused]] good:
+ return 0;
+}
+
+int
+foo ()
+{
+ [[gnu::unused]] good:
+ int i = 0;
+
+ // A C++11 attribute at the beginning of the return statement is
+ // syntactically correct, appertains to the return statement (not to
+ // the label) but is currently ignored by this implementation.
+ good_ignored : [[gnu::unused]] // { dg-warning "attributes at the beginning of statement are ignored" }
+ return i;
+}
+
+int
+bar ()
+{
+ // A GNU attribute after the label appertains to the label.
+ good: __attribute__((unused));
+ return 0;
+}
+
+int
+baz ()
+{
+ // The c++ attribute after the label appertains to the (empty)
+ // statement.
+ bad: [[gnu::unused]]; // { dg-warning "attributes at the beginning of statement are ignored" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C
new file mode 100644
index 000000000..45aa8e475
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C
@@ -0,0 +1,14 @@
+// PR c++/56859
+// { dg-require-effective-target c++11 }
+
+template<unsigned size, unsigned alignment>
+struct aligned_storage
+{
+ using type = struct { alignas(alignment) unsigned char data[size]; };
+};
+
+#define SA(X) static_assert((X),#X)
+SA(alignof(aligned_storage<8,1>::type) == 1);
+SA(alignof(aligned_storage<8,2>::type) == 2);
+SA(alignof(aligned_storage<8,4>::type) == 4);
+SA(alignof(aligned_storage<8,8>::type) == 8);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C
new file mode 100644
index 000000000..c4e6deabe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C
@@ -0,0 +1,12 @@
+// PR c++/58584
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i alignas(this); // { dg-error "17:invalid use of 'this'" }
+};
+
+template<int> struct B
+{
+ int j alignas(this); // { dg-error "17:invalid use of 'this'" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C
new file mode 100644
index 000000000..f331ed369
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C
@@ -0,0 +1,5 @@
+// PR c++/58724
+// { dg-do compile { target c++11 } }
+
+namespace foo __attribute__((visibility("default"))) {}
+namespace bar [[gnu::visibility("default")]] {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C
new file mode 100644
index 000000000..12b4f4c84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C
@@ -0,0 +1,9 @@
+// PR c++/59096
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct A
+{
+ typedef T B [[mode]]; // { dg-warning "ignored" }
+};
+
+A<int>::B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C
new file mode 100644
index 000000000..54071d5ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2002 Free Software Foundation.
+//
+// Test that the nothrow attribute is working correctly.
+//
+// Written by Richard Henderson, 26 May 2002.
+
+// { dg-do link { target c++11} }
+extern void foo [[gnu::nothrow]] ();
+extern void link_error();
+
+int main()
+{
+ try {
+ foo();
+ } catch (...) {
+ link_error();
+ }
+}
+
+void foo() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C
new file mode 100644
index 000000000..334125068
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-parameter" }
+
+void f (int i [[gnu::__unused__]]) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C
new file mode 100644
index 000000000..9c834a4a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C
@@ -0,0 +1,7 @@
+// { dg-options "-pedantic" }
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-require-effective-target c++11 }
+
+extern int * ([[gnu::stdcall]] *fooPtr)( void); // { dg-error "expected" }
+int * [[gnu::stdcall]] myFn01( void) { return 0; }// { dg-warning "ignored" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C
new file mode 100644
index 000000000..3dc51eef9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+class C;
+struct S;
+union U;
+enum e {};
+enum [[gnu::unused]] e; // { dg-warning "already defined" }
+
+struct [[gnu::unused]] B *p; // { dg-warning "attributes" }
+
+template <class T> struct A { };
+struct [[gnu::unused]] A<int>; // { dg-warning "attributes" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
new file mode 100644
index 000000000..6a8398b89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
@@ -0,0 +1,115 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+// Integer imaginary...
+
+constexpr unsigned long long
+operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 0; }
+
+constexpr unsigned long long
+operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 1; }
+
+constexpr unsigned long long
+operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 2; }
+
+constexpr unsigned long long
+operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 3; }
+
+// Floating-point imaginary...
+
+constexpr long double
+operator"" i(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 0.0L; }
+
+constexpr long double
+operator"" I(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 1.0L; }
+
+constexpr long double
+operator"" j(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 2.0L; }
+
+constexpr long double
+operator"" J(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 3.0L; }
+
+// Fixed-point...
+
+constexpr long double
+operator"" k(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 0; }
+
+constexpr long double
+operator"" K(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 1; }
+
+constexpr long double
+operator"" r(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 2; }
+
+constexpr long double
+operator"" R(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 3; }
+
+// Machine-defined...
+
+constexpr long double
+operator"" w(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 0; }
+
+constexpr long double
+operator"" W(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 1; }
+
+constexpr long double
+operator"" q(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 2; }
+
+constexpr long double
+operator"" Q(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 3; }
+
+int
+main()
+{
+ auto ii = 1i;
+ auto Ii = 1I;
+ auto ji = 1j;
+ auto Ji = 1J;
+
+ auto ifp = 1.0i;
+ auto Ifp = 1.0I;
+ auto jfp = 1.0j;
+ auto Jfp = 1.0J;
+
+ auto kfp = 1.0k; // { dg-error "fixed-point types not supported" }
+ auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" }
+ auto rfp = 1.0r; // { dg-error "fixed-point types not supported" }
+ auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" }
+
+ auto wfp = 1.0w; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } }
+ auto Wfp = 1.0W; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } }
+ auto qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } }
+ auto Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } }
+}
+
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
new file mode 100644
index 000000000..c738a484d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
@@ -0,0 +1,115 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-ext-numeric-literals" }
+
+// Integer imaginary...
+
+constexpr unsigned long long
+operator"" i(unsigned long long n)
+{ return 4 * n + 0; }
+
+constexpr unsigned long long
+operator"" I(unsigned long long n)
+{ return 4 * n + 1; }
+
+constexpr unsigned long long
+operator"" j(unsigned long long n)
+{ return 4 * n + 2; }
+
+constexpr unsigned long long
+operator"" J(unsigned long long n)
+{ return 4 * n + 3; }
+
+// Floating-point imaginary...
+
+constexpr long double
+operator"" i(long double n)
+{ return 4.0L * n + 0.0L; }
+
+constexpr long double
+operator"" I(long double n)
+{ return 4.0L * n + 1.0L; }
+
+constexpr long double
+operator"" j(long double n)
+{ return 4.0L * n + 2.0L; }
+
+constexpr long double
+operator"" J(long double n)
+{ return 4.0L * n + 3.0L; }
+
+// Fixed-point...
+
+constexpr long double
+operator"" k(long double n)
+{ return 4 * (n + 1) + 0; }
+
+constexpr long double
+operator"" K(long double n)
+{ return 4 * (n + 1) + 1; }
+
+constexpr long double
+operator"" r(long double n)
+{ return 4 * (n + 1) + 2; }
+
+constexpr long double
+operator"" R(long double n)
+{ return 4 * (n + 1) + 3; }
+
+// Machine-defined...
+
+constexpr long double
+operator"" w(long double n)
+{ return 4 * (n + 2) + 0; }
+
+constexpr long double
+operator"" W(long double n)
+{ return 4 * (n + 2) + 1; }
+
+constexpr long double
+operator"" q(long double n)
+{ return 4 * (n + 2) + 2; }
+
+constexpr long double
+operator"" Q(long double n)
+{ return 4 * (n + 2) + 3; }
+
+int
+main()
+{
+ auto ii = 1i;
+ auto Ii = 1I;
+ auto ji = 1j;
+ auto Ji = 1J;
+
+ auto ifp = 1.0i;
+ auto Ifp = 1.0I;
+ auto jfp = 1.0j;
+ auto Jfp = 1.0J;
+
+ auto kfp = 1.0k;
+ auto Kfp = 1.0K;
+ auto rfp = 1.0r;
+ auto Rfp = 1.0R;
+
+ auto wfp = 1.0w;
+ auto Wfp = 1.0W;
+ auto qfp = 1.0q;
+ auto Qfp = 1.0Q;
+}
+
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C
new file mode 100644
index 000000000..d4cd2e88d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+struct S
+{
+ S();
+private:
+ S(S const &&);
+ S & operator=(S const &&);
+};
+
+void f()
+{
+ S a;
+ S b(a); // { dg-error "deleted" }
+ a = b; // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C
new file mode 100644
index 000000000..23921c703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C
@@ -0,0 +1,23 @@
+// PR c++/46807
+// { dg-do compile { target c++11 } }
+// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial,
+// even though doing overload resolution would mean calling the template
+// constructor. In C++11, we do overload resolution to determine triviality.
+
+struct A
+{
+ A() {}
+private:
+ template <class T> A(T&); // { dg-error "private" }
+};
+
+struct B // { dg-error "implicitly deleted|this context" }
+{
+ mutable A a;
+};
+
+int main()
+{
+ B b;
+ B b2(b); // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C
new file mode 100644
index 000000000..7eb337179
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C
@@ -0,0 +1,26 @@
+// Test for implicitly deleted destructors.
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "default definition would be ill-formed" }
+// { dg-prune-output "within this context" }
+
+class C
+{
+ void operator delete (void *); // { dg-error "private" }
+public:
+ virtual ~C(); // { dg-error "overriding" }
+};
+
+struct D: C { }; // { dg-error "deleted" }
+D d; // { dg-error "deleted" }
+
+struct E
+{
+ ~E() = delete; // { dg-message "declared here" }
+};
+
+struct F
+{
+ virtual ~F(); // { dg-error "overriding" }
+};
+
+struct G: E, F { }; // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C
new file mode 100644
index 000000000..6a0c711a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C
@@ -0,0 +1,19 @@
+// PR c++/46103
+// { dg-do compile { target c++11 } }
+
+struct MoveOnly {
+ MoveOnly(const MoveOnly&) = delete;
+ MoveOnly(MoveOnly&&) { }
+ MoveOnly() = default;
+};
+
+struct A {
+ MoveOnly mo[1];
+ A() = default;
+ A(A&&) = default;
+};
+
+int main() {
+ A a;
+ A aa = static_cast<A&&>(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C
new file mode 100644
index 000000000..3471ad98f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C
@@ -0,0 +1,17 @@
+// Test that we consider base dtors in determining whether
+// a derived ctor is deleted even if the ctor is trivial.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ ~A() = delete; // { dg-message "declared here" }
+};
+
+struct B: A { }; // { dg-error "deleted" }
+
+extern B eb;
+int main()
+{
+ B* b1 = new B; // { dg-error "use of deleted function" }
+ B* b2 = new B(eb); // { dg-error "use of deleted function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C
new file mode 100644
index 000000000..d52f1532d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C
@@ -0,0 +1,54 @@
+// PR c++/50500
+// { dg-do compile { target c++11 } }
+
+// If a class declares move operations, the implicitly declared copy
+// operations are deleted.
+struct A
+{
+ A();
+ A(A&&);
+ A& operator=(A&&);
+};
+
+// But they can still be explicitly defaulted.
+struct B
+{
+ B();
+ B(B&&);
+ B(const B&) = default;
+ B& operator=(B&&);
+ B& operator=(const B&) = default;
+};
+
+struct C
+{
+ C();
+ C(C&&);
+};
+
+struct D
+{
+ D();
+ D& operator=(D&&);
+};
+
+int main()
+{
+ A a;
+ A a2 (a); // { dg-error "deleted" }
+ a2 = a; // { dg-error "deleted" }
+
+ B b;
+ B b2 (b);
+ b2 = b;
+
+ C c;
+ C c2(c); // { dg-error "deleted" }
+ c2 = c; // { dg-error "deleted" }
+
+ D d;
+ D d2(d); // { dg-error "deleted" }
+ d2 = d; // { dg-error "deleted" }
+}
+
+// { dg-prune-output "because" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C
new file mode 100644
index 000000000..3165863c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C
@@ -0,0 +1,32 @@
+// Make sure that A's destructor doesn't affect constexpr
+// or exception-spec on D's default constructor.
+// { dg-do compile { target c++11 } }
+
+struct A {
+ constexpr A() noexcept: i(0) { }
+ int i;
+ ~A() noexcept(false);
+};
+
+struct B: A { };
+
+// Should get static initialization, so no constructor call.
+// { dg-final { scan-assembler-not "_ZN1BC1Ev" } }
+B b;
+
+struct C { C() noexcept; ~C() noexcept(false); };
+struct D: C { };
+extern D d;
+
+void *operator new(__SIZE_TYPE__, void*) noexcept;
+
+#define SA(X) static_assert((X),#X)
+SA(noexcept(new (&d) D));
+
+struct E: virtual C { };
+extern E e;
+SA(noexcept (new (&e) E));
+
+struct F { C c; };
+extern F f;
+SA(noexcept (new (&f) F));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C
new file mode 100644
index 000000000..8a5624463
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C
@@ -0,0 +1,26 @@
+// PR c++/54506
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ A() {}
+
+ A(A const volatile &&) = delete;
+ A &operator =(A const volatile &&) = delete;
+
+ template <class U> A(A<U> &&) {}
+ template <class U> A &operator =(A<U> &&) { return *this; }
+};
+
+struct B
+{
+ A<int> a;
+ B() = default;
+};
+
+int main()
+{
+ B b = B();
+ b = B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C
new file mode 100644
index 000000000..299589442
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C
@@ -0,0 +1,32 @@
+// Test that the synthesized C copy constructor calls the A template
+// constructor and has the appropriate exception specification.
+// { dg-do run { target c++11 } }
+
+int r = 1;
+
+struct A
+{
+ A() {}
+ A(const A&) throw () { }
+ template <class T>
+ A(T& t) { r = 0; }
+};
+
+struct B
+{
+ B() {}
+ B(B&) throw () { }
+};
+
+struct C: A, B { };
+
+#define SA(E) static_assert(E, #E)
+
+C c;
+SA (!noexcept(C(c)));
+
+int main()
+{
+ (C(c));
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C
new file mode 100644
index 000000000..8176a6e18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C
@@ -0,0 +1,55 @@
+// Basic runtime test for implicit move constructor
+// { dg-do run { target c++11 } }
+
+int m;
+
+struct A
+{
+ A() = default;
+ A(A&&) { ++m; }
+ A& operator=(A&&) { ++m; return *this; }
+};
+
+struct B
+{
+ B() = default;
+ B(const B&);
+ B(B&&) { ++m; }
+ B& operator=(const B&);
+ B& operator=(B&&) { ++m; return *this; }
+};
+
+struct C
+{
+ C() = default;
+ C(C&);
+ C(C&&) { ++m; }
+ C& operator=(C&);
+ C& operator=(C&&) { ++m; return *this; }
+};
+
+struct D: public A, public B
+{
+ C c;
+ int i;
+};
+
+struct E: public A, public B
+{
+ C c;
+ int i;
+ E() = default;
+ E(E&&) = default;
+ E& operator=(E&&) = default;
+};
+
+int main()
+{
+ D d1;
+ D d2 (static_cast<D&&>(d1));
+ d1 = static_cast<D&&>(d2);
+ E e1;
+ E e2 (static_cast<E&&>(e1));
+ e1 = static_cast<E&&>(e2);
+ return m != 12;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C
new file mode 100644
index 000000000..eeb4aa9d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C
@@ -0,0 +1,20 @@
+// Test that a base with only a move constructor causes the implicit copy
+// constructor to be deleted.
+// { dg-do compile { target c++11 } }
+
+struct A // { dg-message "declares a move" }
+{
+ A();
+ A(A&&);
+};
+
+struct B: A // { dg-error "use of deleted" }
+{
+};
+
+int main()
+{
+ B b1;
+ B b2(b1); // { dg-error "deleted function .B::B.const" }
+ B b3(static_cast<B&&>(b1));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C
new file mode 100644
index 000000000..f9ae5351f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C
@@ -0,0 +1,19 @@
+// Test that the default B copy constructor calls the deleted A
+// copy constructor.
+// { dg-do compile { target c++11 } }
+
+struct A // { dg-message "declares a move" }
+{
+ A() = default;
+ A(A&&) = default;
+ template <class T>
+ A(const T& t) { t.i; }
+};
+
+struct B: A { }; // { dg-error "implicitly|use of deleted" }
+
+int main()
+{
+ B b;
+ B b2(b); // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C
new file mode 100644
index 000000000..d3e85d0e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C
@@ -0,0 +1,23 @@
+// Circular implicit declarations were causing errors
+// { dg-do compile { target c++11 } }
+
+struct Ray;
+
+struct Vector
+{
+ virtual void f(); // make non-trivially-copyable
+ Vector(const Ray &) ;
+};
+
+struct array
+{
+ Vector v;
+};
+
+struct Ray
+{
+ array a;
+};
+
+extern Ray r1;
+Ray r2=r1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C
new file mode 100644
index 000000000..eaa7d82ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C
@@ -0,0 +1,37 @@
+// PR c++/44909
+// { dg-do compile { target c++11 } }
+// Declaring A<D<E>>'s copy ctor means choosing a ctor to initialize D<E>,
+// which means choosing a ctor for C<B<E>>, which meant considering
+// C(const B<E>&) which means choosing a ctor for B<E>, which means choosing
+// a ctor for A<D<E>>. Cycle.
+
+template<typename T>
+struct A
+{
+ T t;
+};
+
+template <typename T>
+struct B
+{
+ typename T::U u;
+};
+
+template <typename T>
+struct C
+{
+ C(const T&);
+};
+
+template <typename T>
+struct D
+{
+ C<B<T> > v;
+};
+
+struct E {
+ typedef A<D<E> > U;
+};
+
+extern A<D<E> > a;
+A<D<E> > a2(a);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C
new file mode 100644
index 000000000..68575ca13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C
@@ -0,0 +1,32 @@
+// The hack for PR c++/44909 breaks this testcase. We need feedback
+// from the C++ committee to know how to proceed.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+ A(A&);
+};
+
+struct B;
+struct BP
+{
+ BP(const B&);
+};
+
+struct B
+{
+ B();
+ B(B&&);
+ B(const BP&);
+};
+
+// If B(B&&) suppresses the B copy constructor, then copying the B
+// subobject of C should use B(const BP&). But we ignore that constructor
+// in order to break the cycle in 44909. Perhaps the move ctor shouldn't
+// suppress the copy ctor?
+// As of DR 1082, it doesn't suppress it.
+struct C: A, B { }; // { dg-error "use of deleted" }
+
+C c;
+C c2(c); // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C
new file mode 100644
index 000000000..0952a4208
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C
@@ -0,0 +1,12 @@
+// Test that private base dtor makes derived ctor deleted
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+private:
+ ~A(); // { dg-error "private" }
+};
+
+struct B: A { }; // { dg-error "implicitly deleted|context" }
+B * b = new B; // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C
new file mode 100644
index 000000000..c656fb9a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ constexpr A(int i): i(i) {}
+};
+
+struct B: A
+{
+ using A::A;
+};
+
+constexpr B b(42);
+
+#define SA(X) static_assert((X),#X)
+SA(b.i == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C
new file mode 100644
index 000000000..48e95a0b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+
+struct A
+{
+ template <class... Ts> A(Ts...);
+};
+
+struct B: A
+{
+ using A::A;
+};
+
+B b1(42);
+B b2(1.0, 42, (void*)0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C
new file mode 100644
index 000000000..228e8ec66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A(int, ...); // { dg-message "declared here" }
+};
+
+struct B: A
+{
+ using A::A; // { dg-warning "ellipsis" }
+};
+
+B b1(42);
+B b2(42, 1.0); // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C
new file mode 100644
index 000000000..cc23d4b19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C
@@ -0,0 +1,25 @@
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i;
+ template <class T>
+ A(T t) noexcept : i(t) {}
+};
+
+struct C
+{
+ C() { throw 42; }
+};
+
+struct B: A, C
+{
+ using A::A;
+};
+
+int main()
+{
+ try { B b(24); }
+ catch (int) { return 0; }
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C
new file mode 100644
index 000000000..bd021e6e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ template <class T> A(T t);
+};
+
+struct C
+{
+ C() = delete; // { dg-message "declared here" }
+};
+
+struct B: A, C
+{
+ using A::A; // { dg-error "C::C" }
+};
+
+int main()
+{
+ B b(24); // { dg-error "B::B" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C
new file mode 100644
index 000000000..04048800d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C
@@ -0,0 +1,10 @@
+// PR c++/55261
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+};
+struct B : A
+{
+ using A::A;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C
new file mode 100644
index 000000000..c2d33bff4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C
@@ -0,0 +1,15 @@
+// Discussions on the core reflector indicate that not inheriting base copy
+// constructors was a deliberate choice.
+
+// { dg-do compile { target c++11 } }
+
+struct A { A(int); };
+struct B: public A
+{
+ using A::A;
+};
+
+A a (42);
+
+B b1 (24); // inherited
+B b2 (a); // not inherited { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C
new file mode 100644
index 000000000..ba6849f03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C
@@ -0,0 +1,15 @@
+// PR c++/56285
+// { dg-do compile { target c++11 } }
+
+struct foo {
+ explicit foo(int&&) {}
+};
+
+struct bar: private foo {
+ using foo::foo;
+};
+
+int main()
+{
+ bar b { 42 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C
new file mode 100644
index 000000000..22eda3af5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C
@@ -0,0 +1,45 @@
+// PR c++/56323
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A(int i);
+};
+
+typedef A B;
+
+struct C : B {
+ using B::B;
+};
+
+struct D : B {
+ using B::A;
+};
+
+C c(0);
+D d(0);
+
+template <class T>
+struct E {
+ typedef T type;
+};
+
+template <class T>
+struct F : E<T>::type {
+ using E<T>::type::type; // error: E<T>::type is a typedef
+};
+
+F<A> f(0);
+
+template <class T>
+struct AT
+{
+ AT(T);
+};
+
+template <template <class> class T>
+struct G : T<int>
+{
+ using T<int>::T;
+};
+
+G<AT> g(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C
new file mode 100644
index 000000000..05735559a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C
@@ -0,0 +1,22 @@
+// PR c++/56358
+// { dg-do compile { target c++11 } }
+
+struct foo {
+ explicit foo(int) {}
+};
+
+template<typename T>
+struct bar: T {
+ using T::T;
+
+ // Bad
+ explicit bar(): T(0) {}
+
+ void baz()
+ {
+ // Also bad
+ using qux = T;
+ }
+};
+
+bar<foo> b, b2(42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
new file mode 100644
index 000000000..7a22f8830
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
@@ -0,0 +1,14 @@
+// PR c++/60389
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename...T> A(T...) {}
+};
+
+struct B : A
+{
+ using A::A; // { dg-error "inherited" }
+};
+
+constexpr B b; // { dg-error "literal" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C
new file mode 100644
index 000000000..15e5657a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ constexpr A(int, int i = num): i(i) {}
+private:
+ static const int num = 42;
+};
+
+struct B: A
+{
+ using A::A;
+};
+
+constexpr B b(24);
+
+#define SA(X) static_assert((X),#X)
+SA(b.i == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C
new file mode 100644
index 000000000..e8dc84d32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+struct B1 {
+ B1(int);
+};
+struct B2 {
+ B2(int);
+};
+struct D1 : B1, B2 {
+ using B1::B1; // { dg-error "inherited" }
+ using B2::B2; // { dg-error "inherited" }
+}; // ill-formed: attempts to declare D1(int) twice
+struct D2 : B1, B2 {
+ using B1::B1;
+ using B2::B2;
+ D2(int); // OK: user declaration supersedes both implicit declarations
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C
new file mode 100644
index 000000000..16dc19731
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C
@@ -0,0 +1,18 @@
+// From N3337
+// { dg-do compile { target c++11 } }
+
+struct B1 {
+ B1(int);
+};
+struct B2 {
+ B2(int = 13, int = 42);
+};
+struct D1 : B1 {
+ using B1::B1;
+};
+struct D2 : B2 {
+ using B2::B2;
+};
+
+D1 d1(1);
+D2 d2a(2), d2b(3,4);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
new file mode 100644
index 000000000..8c79c833a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+struct B1 {
+ B1(int) { }
+};
+struct B2 {
+ B2(double) { }
+};
+struct D1 : B1 { // { dg-error "no match" }
+ using B1::B1; // implicitly declares D1(int)
+ int x;
+};
+void test() {
+ D1 d(6); // OK: d.x is not initialized
+ D1 e; // { dg-error "deleted" } D1 has no default constructor
+}
+struct D2 : B2 {
+ using B2::B2; // { dg-error "no match" } implicitly declares D2(double)
+ B1 b;
+};
+D2 f(1.0); // { dg-error "deleted" } B1 has no default constructor
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C
new file mode 100644
index 000000000..98ac1885a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+extern "C" int printf (const char *, ...);
+template< class T >
+struct D : T {
+ using T::T;
+ // declares all constructors from class T
+ ~D() { printf ("Destroying wrapper\n"); }
+};
+
+struct A {
+ A(int);
+};
+
+D<A> d(42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C
new file mode 100644
index 000000000..280ccfebe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ template <class T>
+ constexpr A(T t): i(t) {}
+};
+
+struct B: A
+{
+ using A::A;
+};
+
+constexpr B b(42);
+
+#define SA(X) static_assert((X),#X)
+SA(b.i == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C
new file mode 100644
index 000000000..74c949670
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ explicit A(int i): i(i) {}
+};
+
+struct B: A
+{
+ using A::A;
+};
+
+void f(B);
+
+int main()
+{
+ f(B(42)); // OK
+ f(42); // { dg-error "could not convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C
new file mode 100644
index 000000000..39751013b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+class A
+{
+ int i;
+protected:
+ A(int i): i(i) {}
+};
+
+struct B: A
+{
+ using A::A; // { dg-error "protected" }
+};
+
+B b(42); // { dg-error "this context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C
new file mode 100644
index 000000000..1e25eb220
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+typedef int IA[2];
+typedef double DA[2];
+
+void f(const IA&) { }
+void f(const DA&);
+
+int main()
+{
+ f({1,2});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C
new file mode 100644
index 000000000..1a94f4ed5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C
@@ -0,0 +1,10 @@
+// PR c++/52743
+// { dg-do compile { target c++11 } }
+
+void composite (int const (&) [2]);
+void composite (int const (&) [3]);
+
+int main ()
+{
+ composite({0,1}); // { dg-error "ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C
new file mode 100644
index 000000000..925ab16be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+typedef int IRT[2];
+
+const IRT& ir = IRT{1,2};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C
new file mode 100644
index 000000000..bc6d27202
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C
@@ -0,0 +1,13 @@
+// PR c++/52905
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+enum E { e1, e2 };
+struct A
+{
+ A(std::initializer_list<E>); // { dg-message "A::A" }
+ A(int, E); // { dg-message "A::A" }
+};
+
+A a{e1,2}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C
new file mode 100644
index 000000000..6ae32a6c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C
@@ -0,0 +1,28 @@
+// Test for deduction of T as std::initializer_list. This isn't currently
+// supported by the working draft, but is necessary for perfect forwarding
+// of initializer-lists to things that can take a std::initializer_list.
+
+// { dg-options "-fdeduce-init-list" }
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ A(std::initializer_list<int>) { }
+};
+
+void f (A a) { }
+
+template <class T>
+auto g (T&& t) -> decltype (f(t)) // { dg-warning "call" }
+{
+ return f(t);
+}
+
+int main()
+{
+ g({1}); // { dg-warning "deduc" }
+}
+
+// { dg-prune-output "-fno-deduce-init-list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C
new file mode 100644
index 000000000..45eb2d5e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C
@@ -0,0 +1,36 @@
+// PR c++/56614
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+namespace std
+{
+ template<typename T>
+ struct allocator
+ { };
+
+ template<typename T, typename Alloc = std::allocator<T> >
+ struct vector
+ {
+ vector(std::initializer_list<T>, const Alloc& = Alloc()) { }
+ };
+}
+
+void func() { }
+
+enum E { ee };
+
+struct C
+{
+ template<typename T>
+ C(T, std::vector<E> = std::vector<E>({ ee }))
+ { }
+};
+
+struct G
+{
+ void gen()
+ {
+ C c(&func);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C
new file mode 100644
index 000000000..78ec8cbd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C
@@ -0,0 +1,46 @@
+// { dg-do compile { target c++11 } }
+template<typename _Tp>
+_Tp&& declval() noexcept;
+
+template<bool b>
+struct bt {
+ static constexpr bool value = b;
+};
+
+template <typename To_, typename... From_>
+class my_is_convertible_many {
+ private:
+ template <typename To>
+ struct indirector {
+ indirector(To);
+ };
+
+ template <typename To, typename... From>
+ struct tag {};
+
+ template <typename To, typename... From>
+ static auto test(tag<To, From...>)
+ -> decltype(indirector<To>({declval<From>()...}), bt<true>());
+ static auto test(...)
+ -> bt<false>;
+
+ public:
+ static constexpr bool value = decltype(test(tag<To_, From_...>()))::value;
+};
+
+struct A {};
+struct B {};
+struct C {};
+
+struct Test {
+ Test(A, A);
+ //Test(B, B);
+ explicit Test(C, C);
+};
+
+int main() {
+ static_assert(my_is_convertible_many<Test, A, A>::value,""); // true, correct
+ static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct
+ static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C
new file mode 100644
index 000000000..d3b0fc360
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C
@@ -0,0 +1,33 @@
+// Test that we properly extend the lifetime of the initializer_list
+// array even if the initializer_list is a subobject.
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+extern "C" void abort();
+bool ok;
+
+bool do_throw;
+
+struct A {
+ A(int) { if (do_throw) throw 42; }
+ ~A() { if (!ok) abort(); }
+};
+
+typedef std::initializer_list<A> AL;
+typedef std::initializer_list<AL> AL2;
+typedef std::initializer_list<AL2> AL3;
+
+struct B {
+ AL al;
+ const AL& alr;
+};
+
+int main(int argc, const char** argv)
+{
+ do_throw = (argc > 1); // always false, but optimizer can't tell
+ AL ar[] = {{1,2},{3,4}};
+ B b = {{5,6},{7,8}};
+ AL3 al3 = {{{1},{2},{3}}};
+ ok = true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C
new file mode 100644
index 000000000..77fc961c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C
@@ -0,0 +1,63 @@
+// Test that we properly extend the lifetime of the initializer_list
+// array even if the initializer_list is a subobject.
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+extern "C" void abort();
+bool ok;
+
+bool do_throw;
+
+struct A {
+ A(int) { if (do_throw) throw 42; }
+ ~A() { if (!ok) abort(); }
+};
+
+typedef std::initializer_list<A> AL;
+typedef std::initializer_list<AL> AL2;
+typedef std::initializer_list<AL2> AL3;
+
+struct B {
+ AL al;
+ const AL& alr;
+};
+
+struct A2
+{
+ const A& a1;
+ const A& a2;
+};
+
+struct C {
+ AL ar[2];
+ B b;
+ AL3 al3;
+ A2 a2;
+ A2 a2r[2];
+ C():
+ ar{{1,2},{3,4}},
+ b{{5,6},{7,8}},
+ al3{{{1},{2},{3}}},
+ a2{1,2},
+ a2r{{1,2},{3,4}}
+ { ok = true; }
+};
+
+struct D {
+ AL ar[2] = {{1,2},{3,4}};
+ B b = {{5,6},{7,8}};
+ AL3 al3 = {{{1},{2},{3}}};
+ A2 a2 = {1,2};
+ A2 a2r[2] = {{1,2},{3,4}};
+ D() { ok = true; }
+};
+
+int main(int argc, const char** argv)
+{
+ do_throw = (argc > 1); // always false, but optimizer can't tell
+ ok = false;
+ C c;
+ ok = false;
+ D d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C
new file mode 100644
index 000000000..3a5e90856
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C
@@ -0,0 +1,20 @@
+// PR c++/41997
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -fdump-tree-optimized" }
+// { dg-final { scan-tree-dump-not "_0" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
+
+#include <initializer_list>
+
+inline int max_val(std::initializer_list<int> il)
+{
+ int i = *(il.begin());
+ int j = *(il.begin() + 1);
+ return (i > j ? i : j);
+}
+
+int main(void)
+{
+ return max_val({1,2});
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C
new file mode 100644
index 000000000..b43ffc33b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C
@@ -0,0 +1,18 @@
+// PR c++/51738
+// { dg-do compile { target c++11 } }
+
+struct Index
+{
+ Index(unsigned, unsigned){ }
+};
+
+struct Matrix
+{
+ void operator[](Index){ }
+};
+
+int main()
+{
+ Matrix m;
+ m[{0,1}];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C
new file mode 100644
index 000000000..5d121634a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C
@@ -0,0 +1,23 @@
+// PR c++/54325
+// { dg-do compile { target c++11 } }
+
+class base
+{
+ protected:
+ base()
+ {}
+};
+
+class derived : public base
+{
+ public:
+ derived()
+ : base{} // <-- Note the c++11 curly brace syntax
+ {}
+};
+
+int main()
+{
+ derived d1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
new file mode 100644
index 000000000..a9dbc9083
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
@@ -0,0 +1,25 @@
+// PR c++/54325
+// { dg-do compile { target c++11 } }
+
+class Base {
+public:
+ Base() {};
+ virtual ~Base() {};
+
+ virtual void do_stuff() = 0;
+};
+
+class Derived: public Base {
+public:
+ Derived() : Base{} {};
+ virtual ~Derived() {};
+
+ virtual void do_stuff() {};
+};
+
+int
+main() {
+ Derived d;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C
new file mode 100644
index 000000000..ac8426616
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C
@@ -0,0 +1,34 @@
+// Test for value-initialization via {}
+// { dg-do run { target c++11 } }
+
+void * operator new (__SIZE_TYPE__, void *p) { return p; }
+void * operator new[] (__SIZE_TYPE__, void *p) { return p; }
+
+// Empty base so A isn't an aggregate
+struct B {};
+struct A: B {
+ int i;
+};
+
+struct C: A {
+ C(): A{} {}
+};
+
+int f(A a) { return a.i; }
+
+int main()
+{
+ A a{};
+ C c;
+ int space = 42;
+ A* ap = new (&space) A{};
+ int space1[1] = { 42 };
+ A* a1p = new (space1) A[1]{};
+ if (a.i != 0
+ || c.i != 0
+ || ap->i != 0
+ || a1p[0].i != 0
+ || A{}.i != 0
+ || f({}) != 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C
new file mode 100644
index 000000000..1b4cde769
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C
@@ -0,0 +1,19 @@
+// Test that we properly value-initialize a class with a user-provided
+// constructor but defaulted default constructor. The FDIS got this
+// wrong; see c++std-core-19883.
+
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i;
+ A() = default;
+ A(int);
+};
+
+int main()
+{
+ A a{};
+ if (a.i != 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C
new file mode 100644
index 000000000..fb8e85b32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C
@@ -0,0 +1,71 @@
+// Basic uses of initializer lists
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+extern "C" void abort();
+
+using namespace std;
+
+struct A { int i,j; A(int _i,int _j): i(_i), j(_j) {} };
+struct B { A a; B(A _a): a(_a) {} };
+struct C { B b; C(B _b): b(_b) {} };
+
+struct D
+{
+ int ia[3];
+ D (initializer_list<int> l)
+ {
+ const int *p = l.begin();
+ for (int i = 0; i < 3; ++i)
+ ia[i] = *p++;
+ }
+};
+
+void f(C c)
+{
+ if (c.b.a.i != 1) abort();
+ if (c.b.a.j != 2) abort();
+}
+void f(int);
+
+void g(D d)
+{
+ if (d.ia[0] != 1 || d.ia[1] != 2 || d.ia[2] != 3)
+ abort();
+}
+
+struct E
+{
+ int i, j, k;
+};
+
+void h(E e)
+{
+ if (e.i != 1 || e.j != 2 || e.k != 3)
+ abort();
+}
+
+void i(initializer_list<int> l)
+{
+ const int *p = l.begin();
+ if (*p++ != 1) abort();
+ if (*p++ != 2) abort();
+ if (*p++ != 3) abort();
+ if (p != l.end()) abort();
+}
+
+struct U { U(int, int) {} };
+U ua[] = { { 3, 2 } };
+
+int main()
+{
+ g({1,2,3});
+
+ h({1,2,3});
+
+ f({{{1,2}}});
+ f({{A{1,2}}});
+
+ i({1,2,3});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C
new file mode 100644
index 000000000..80a8837d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C
@@ -0,0 +1,53 @@
+// PR c++/38380
+// { dg-do compile { target c++11 } }
+
+namespace std
+{
+ struct atomic_bool
+ {
+ bool _M_i;
+
+ atomic_bool() = default;
+ ~atomic_bool() = default;
+ atomic_bool(const atomic_bool&) = delete;
+ atomic_bool& operator=(const atomic_bool&) = delete;
+
+ explicit atomic_bool(bool __i) { _M_i = __i; }
+
+ operator bool() const volatile
+ { return true; }
+ };
+}
+
+namespace __gnu_test
+{
+ struct direct_list_initializable
+ {
+ template<typename _Ttype, typename _Tvalue>
+ void
+ operator()()
+ {
+ struct _Concept
+ {
+ void __constraint()
+ {
+ _Ttype __v1 = { }; // default ctor
+ _Ttype __v2 { __a }; // single-argument ctor
+ }
+
+ _Tvalue __a;
+ };
+
+ void (_Concept::*__x)() __attribute__((unused))
+ = &_Concept::__constraint;
+ }
+ };
+}
+
+int main()
+{
+ __gnu_test::direct_list_initializable test;
+
+ test.operator()<std::atomic_bool, bool>();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C
new file mode 100644
index 000000000..024466ea8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C
@@ -0,0 +1,18 @@
+// PR c++/38684
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct Y {};
+
+struct X : Y {
+ X(std::initializer_list<int>) {}
+};
+
+struct A {
+ X v;
+};
+
+int main() {
+ A a{ {1,2,3} };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C
new file mode 100644
index 000000000..5efdc6711
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C
@@ -0,0 +1,21 @@
+// PR c++/38698
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+struct A
+{
+ int i;
+};
+
+A a({1,2}); // { dg-error "no match" }
+
+union U
+{
+ int i,j;
+};
+
+U u({1,2}); // { dg-error "no match" }
+
+union V {};
+
+V v({1}); // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C
new file mode 100644
index 000000000..bba226798
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C
@@ -0,0 +1,7 @@
+// PR c++/39056
+// { dg-do compile { target c++11 } }
+
+#include <complex>
+
+__complex__ int i {0};
+std::complex<int> i2 {0};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C
new file mode 100644
index 000000000..41331c4f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C
@@ -0,0 +1,19 @@
+// Bug: We weren't doing the normal replacement of array with pointer
+// for deduction in the context of a call because of the initializer list.
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct string
+{
+ string (const char *);
+};
+
+template <class T>
+struct vector
+{
+ template <class U>
+ vector (std::initializer_list<U>);
+};
+
+vector<string> v = { "a", "b", "c" };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C
new file mode 100644
index 000000000..acd04956b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+// Just discard errors pointing at header files
+// { dg-prune-output "include" }
+
+#include <vector>
+#include <typeinfo>
+
+using namespace std;
+
+template< typename ... ArgTypes >
+void test( ArgTypes ... args ) {
+ vector<type_info*> x = { &typeid(ArgTypes)... }; // { dg-error "" }
+}
+
+int main()
+{
+ test( 1, 3.14f, 2.78 );
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C
new file mode 100644
index 000000000..9132bd216
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C
@@ -0,0 +1,11 @@
+// { dg-do run { target c++11 } }
+
+extern "C" void abort();
+
+void f(int i) { if (i != 42) abort(); }
+
+int main()
+{
+ f({42});
+ return {0};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C
new file mode 100644
index 000000000..6ff468989
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+void f(int i);
+
+int main()
+{
+ f({42.0}); // { dg-error "narrowing" }
+ return {1.0}; // { dg-error "narrowing" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C
new file mode 100644
index 000000000..bcf90c83a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C
@@ -0,0 +1,18 @@
+// PR c++/40308, 40311
+// { dg-do run { target c++11 } }
+
+template< typename T >
+struct test {
+ test() : data{} {}
+
+ T data;
+};
+
+int main()
+{
+ test<int> x;
+ test<int*> y;
+ int * a = new int{};
+ int * b = new int{5};
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C
new file mode 100644
index 000000000..ef47d3ec0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+// Allow other errors, too
+// { dg-prune-output "error" }
+
+void f(double);
+int main()
+{
+ f({{1}}); // { dg-error "too many braces" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C
new file mode 100644
index 000000000..550c8f646
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C
@@ -0,0 +1,31 @@
+// Test that conversion to std::initializer_list takes priority over other
+// user-defined conversions.
+
+// { dg-do link { target c++11 } }
+
+#include <initializer_list>
+
+struct string
+{
+ string (const char *) {}
+ template <class Iter> string (Iter, Iter);
+};
+
+template <class T, class U>
+struct pair
+{
+ pair (T t, U u) {}
+};
+
+template<class T, class U>
+struct map
+{
+ void insert (pair<T,U>);
+ void insert (std::initializer_list<pair<T,U> >) {}
+};
+
+int main()
+{
+ map<string,string> m;
+ m.insert({ {"this","that"}, {"me","you"} });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C
new file mode 100644
index 000000000..0ee37e586
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C
@@ -0,0 +1,17 @@
+// PR c++/40689
+// { dg-do compile { target c++11 } }
+
+class X
+{
+ public:
+ X(): data {1,2,3,4,5} {}
+ private:
+ const short data[5];
+};
+
+int main()
+{
+ const float * pData = new const float[4] { 1.5, 2.5, 3.5, 4.5 };
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C
new file mode 100644
index 000000000..6492b2664
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C
@@ -0,0 +1,17 @@
+// PR c++/40689
+// { dg-do compile { target c++11 } }
+
+class X
+{
+ public:
+ X(): data {1,2} {} // { dg-error "too many initializers" }
+ private:
+ const short data[1];
+};
+
+int f(int n)
+{
+ const float * pData = new const float[1] { 1.5, 2.5 }; // { dg-error "too many initializers" }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C
new file mode 100644
index 000000000..0cbfe24a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C
@@ -0,0 +1,24 @@
+// Core issue 934/1288
+// { dg-do compile { target c++11 } }
+
+int i;
+
+int& r1{ i }; // OK, direct binding
+int&& r2{ i }; // { dg-error "" } binding && to lvalue
+
+int& r3{ }; // { dg-error "" } reference to temporary
+int&& r4{ }; // OK, reference to temporary
+
+struct A { int i; } a;
+
+A& r5 { i }; // { dg-error "" } reference to temporary
+A&& r6 { i }; // OK, aggregate initialization of temporary
+A& r7 { a }; // OK, direct-initialization
+A&& r8 { a }; // { dg-error "lvalue" } binding && to lvalue
+
+struct B { B(int); int i; } b(0);
+
+B& r9 { i }; // { dg-error "" } reference to temporary
+B&& r10 { i }; // OK, make temporary with B(int) constructor
+B& r11 { b }; // OK, direct-initialization
+B&& r12 { b }; // { dg-error "lvalue" } binding && to lvalue
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C
new file mode 100644
index 000000000..7e73df06e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ A& operator=(int i);
+ A& operator=(std::initializer_list<int> l) { return *this; }
+};
+
+int main()
+{
+ A a;
+ a = { };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C
new file mode 100644
index 000000000..d88574436
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C
@@ -0,0 +1,9 @@
+// PR c++/39923
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+void test3()
+{
+ std::initializer_list<int> list{move}; // { dg-error "not declared|could not convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C
new file mode 100644
index 000000000..dd41db1f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C
@@ -0,0 +1,16 @@
+// PR c++/41754
+// { dg-do run { target c++11 } }
+
+#include <map>
+#include <string>
+#include <iostream>
+
+using namespace std;
+
+int main()
+{
+ map<string, string> m;
+ m.insert({{"t", "t"}, {"y", "y"}});
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C
new file mode 100644
index 000000000..81d304f0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C
@@ -0,0 +1,10 @@
+// PR c++/42059
+// { dg-do compile { target c++11 } }
+// { dg-options "" { target { ! c++1y } } }
+
+void
+foo (int i)
+{
+ int a[i];
+ a = { }; // { dg-error "assign" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C
new file mode 100644
index 000000000..8567119c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C
@@ -0,0 +1,4 @@
+// PR c++/42061
+// { dg-do compile { target c++11 } }
+
+int& i = { j }; // { dg-error "invalid initialization|was not declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C
new file mode 100644
index 000000000..3bf995ad2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C
@@ -0,0 +1,8 @@
+// PR c++/42060
+// { dg-do compile { target c++11 } }
+
+void foo()
+{
+ int a[1];
+ throw a = {}; // { dg-error "assign" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C
new file mode 100644
index 000000000..9174164aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C
@@ -0,0 +1,14 @@
+// PR c++/42331
+// { dg-do compile { target c++11 } }
+
+class Mesh
+{
+public:
+ Mesh(const char*)
+ { typele={0}; } // { dg-error "" }
+
+private:
+ int typele[7][2];
+};
+
+Mesh m(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C
new file mode 100644
index 000000000..e62e0cc33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+template <class T> void f(std::initializer_list<T>);
+
+void g()
+{
+ f({1,2,3});
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C
new file mode 100644
index 000000000..eb78f3c1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C
@@ -0,0 +1,12 @@
+// Testcase for variadic init list deduction.
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+template <class... Ts>
+void f (std::initializer_list<Ts>... ls);
+
+int main()
+{
+ f({1},{2.0});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C
new file mode 100644
index 000000000..f34a0ca18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C
@@ -0,0 +1,13 @@
+// PR c++/43028
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct string { string(std::initializer_list<char>) { } };
+
+void f() {
+ auto y =
+ {
+ string(Equation()) // { dg-error "not declared" }
+ }; // { dg-error "unable to deduce" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C
new file mode 100644
index 000000000..c5c02fc63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C
@@ -0,0 +1,21 @@
+// Test that we try normal init if no list ctor is viable.
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct B {};
+
+struct C
+{
+ C(B);
+};
+
+struct A
+{
+ A(std::initializer_list<int>);
+ A(B) { }
+ A(C);
+};
+
+B b;
+A a{b};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C
new file mode 100644
index 000000000..9ab4b55d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C
@@ -0,0 +1,13 @@
+// PR c++/44045
+// { dg-do compile { target c++11 } }
+
+struct base
+{
+ virtual ~base() { }
+};
+
+int main()
+{
+ base ptr_array[1];
+ ptr_array = { base() }; // { dg-error "assign" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C
new file mode 100644
index 000000000..335a7dab8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C
@@ -0,0 +1,14 @@
+// PR c++/44157
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+template<typename T>
+void f(T) { }
+
+int main() {
+ std::initializer_list<int> a = { 0 };
+ f(a);
+
+ f<std::initializer_list<int> >({ 0 });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C
new file mode 100644
index 000000000..f8b824d45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C
@@ -0,0 +1,24 @@
+// PR c++/41510
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ B(int, int);
+};
+struct A
+{
+ A(int, int);
+ A(const B&);
+};
+
+void f()
+{
+ A a = { 1, 2 };
+}
+
+template <class T> void g()
+{
+ A a = { 1, 2 };
+}
+
+template void g<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C
new file mode 100644
index 000000000..2a2b20816
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C
@@ -0,0 +1,23 @@
+// PR c++/44358
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ A(int);
+};
+
+struct B
+{
+ B(std::initializer_list<A>);
+};
+
+void f (B b);
+int main()
+{
+ B b0 = {{1}};
+ B b1 = {{1.0}}; // { dg-error "narrowing" }
+ B b2 {1.0}; // { dg-error "narrowing" }
+ A a {1.0}; // { dg-error "narrowing" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C
new file mode 100644
index 000000000..dfe6d4a4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C
@@ -0,0 +1,24 @@
+// DR 990
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct S {
+ S(std::initializer_list<double>); // #1
+ S(std::initializer_list<int>); // #2
+ S(); // #3
+ // ...
+};
+S s1 = { 1.0, 2.0, 3.0 }; // invoke #1
+S s2 = { 1, 2, 3 }; // invoke #2
+S s3 = { }; // invoke #3 (for value-initialization)
+
+
+// Test some other situations, too.
+void f (S);
+int main()
+{
+ S s4 { };
+ f({ });
+ S {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C
new file mode 100644
index 000000000..816f94cf2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C
@@ -0,0 +1,21 @@
+// DR 990
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A {
+ A(std::initializer_list<int>); // #1
+};
+struct B {
+ A a;
+};
+
+void f (B);
+int main()
+{
+ B{};
+ f({});
+ B b0 = { };
+ B b1 { }; // OK, uses #1
+ B b2 { 1 }; // { dg-error "could not convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C
new file mode 100644
index 000000000..169c063a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+
+void f (const A &);
+void f (A &&);
+
+void g (A, int);
+void g (A, double);
+
+int main()
+{
+ f ( { 1 } );
+ g ( { 1 }, 1 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C
new file mode 100644
index 000000000..22e6b456a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C
@@ -0,0 +1,32 @@
+// Test for initializer-list 'explicit' rule
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ explicit A(int,int);
+ operator bool();
+};
+
+A f(A)
+{
+ A{1,2};
+ A a1{1,2};
+ new A{1,2};
+ if (A a5{1,2});
+
+ A({1,2}); // { dg-error "explicit" }
+ A a2({1,2}); // { dg-error "explicit" }
+ A a3 = {1,2}; // { dg-error "explicit" }
+ new A({1,2}); // { dg-error "explicit" }
+ f({1,2}); // { dg-error "explicit" }
+ a1 = {1,2}; // { dg-error "explicit" }
+ if (A a4 = {1,2}); // { dg-error "explicit" }
+ return {1,2}; // { dg-error "explicit" }
+}
+
+struct B
+{
+ A a;
+ B(): a{1,2} {}
+ B(const B&): a({1,2}) {} // { dg-error "explicit" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C
new file mode 100644
index 000000000..6e6a11a64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C
@@ -0,0 +1,13 @@
+// PR c++/54835, DR 1518
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ explicit A(int = 42);
+};
+
+int main()
+{
+ A a1 = { }; // { dg-error "explicit" }
+ A a2 = { 24 }; // { dg-error "explicit" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C
new file mode 100644
index 000000000..7ae4928f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C
@@ -0,0 +1,14 @@
+// PR c++/44703
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+typedef std::initializer_list<int> type ;
+void f(type) {}
+
+int main()
+{
+// error: could not convert '{1, 2, 3}' to 'type'
+ f({1,2,3}) ;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C
new file mode 100644
index 000000000..fcd71cc76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+enum Unscoped { };
+enum class Scoped { };
+
+Unscoped bar(Unscoped x) { return x; }
+Scoped bar(Scoped x) { return x; }
+
+auto var1u = bar(Unscoped()); // OK
+auto var1s = bar(Scoped()); // OK
+
+auto var2u = bar(Unscoped{}); // #1 Error, but should work
+auto var2s = bar(Scoped{}); // #2 Error, but should work
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C
new file mode 100644
index 000000000..1cae23a43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C
@@ -0,0 +1,7 @@
+// Test that using T{} at file scope doesn't create a static temporary.
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler-not "local" } }
+
+struct A { };
+
+A a = A{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C
new file mode 100644
index 000000000..609e07b72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+auto value = std::initializer_list<int>{ 1, 2, 3 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C
new file mode 100644
index 000000000..31bd18d99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C
@@ -0,0 +1,13 @@
+// PR c++/46289
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i[2];
+};
+
+struct B
+{
+ A a;
+ B(): a({{1,2}}) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C
new file mode 100644
index 000000000..39a3b5ebd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C
@@ -0,0 +1,14 @@
+// PR c++/48281
+// { dg-options "-O2" }
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+typedef std::initializer_list<int> int1;
+typedef std::initializer_list<int1> int2;
+static int2 ib = {{42,2,3,4,5},{2,3,4,5,1},{3,4,5,2,1}};
+
+int main()
+{
+ return *(ib.begin()->begin()) != 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C
new file mode 100644
index 000000000..0b34ff91c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A { ~A() = delete; }; // { dg-message "declared" }
+
+int main()
+{
+ typedef const A cA[2];
+ cA{}; // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C
new file mode 100644
index 000000000..7a79c6776
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C
@@ -0,0 +1,11 @@
+// PR c++/48726
+// { dg-do compile { target c++11 } }
+
+#include <memory>
+
+struct Foo{
+ int i;
+};
+typedef std::unique_ptr<Foo> up;
+
+std::initializer_list<up> il{up{new Foo}, up{new Foo}};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C
new file mode 100644
index 000000000..0fa4e3f33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C
@@ -0,0 +1,17 @@
+// Test for non-trivial list-initialization with array new.
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ enum E { c_string, number } e;
+ A(const char *): e(c_string) {}
+ A(int): e(number) {}
+};
+
+int main()
+{
+ A* ap = new A[2]{1, ""};
+ if (ap[0].e != A::number || ap[1].e != A::c_string)
+ return 1;
+ delete[] ap;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C
new file mode 100644
index 000000000..5f253ca48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C
@@ -0,0 +1,35 @@
+// Test for narrowing diagnostics
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A { int i; int j; };
+A a2 { 1.2 }; // { dg-error "narrowing" }
+A a1 { 1, 2 }; // aggregate initialization
+struct B {
+ B(std::initializer_list<int>);
+};
+B b1 { 1, 2 }; // creates initializer_list<int> and calls constructor
+B b2 { 1, 2.0 }; // { dg-error "narrowing" }
+struct C {
+ C(int i, double j);
+};
+C c1 = { 1, 2.2 }; // calls constructor with arguments (1, 2.2)
+C c2 = { 1.1, 2 }; // { dg-error "narrowing" }
+
+int j { 1 }; // initialize to 1
+int k {}; // initialize to 0
+
+// PR c++/36963
+double d = 1.1;
+float fa[] = { d, 1.1 }; // { dg-error "narrowing conversion of 'd'" }
+constexpr double d2 = 1.1;
+float fa2[] = { d2, 1.1 };
+
+// PR c++/49577
+unsigned u{ -1 }; // { dg-error "narrowing" }
+char c = char{ u }; // { dg-error "narrowing" }
+
+// PR c++/50011
+short unsigned su;
+int i { su };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C
new file mode 100644
index 000000000..41fb03ba0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C
@@ -0,0 +1,21 @@
+// PR c++/45418
+// { dg-do compile { target c++11 } }
+
+struct A1 { };
+struct A2 {
+ A2();
+};
+
+template <class T> struct B {
+ T ar[1];
+ B(T t):ar{t} {}
+};
+
+int main(){
+ B<int> bi{1};
+ A1 a1;
+ B<A1> ba1{a1};
+ A2 a2;
+ A2 a2r[1]{{a2}};
+ B<A2> ba2{a2};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C
new file mode 100644
index 000000000..9fd750df2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C
@@ -0,0 +1,15 @@
+// PR c++/47184
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ int a;
+};
+struct T
+{
+ T(S s) {}
+};
+int main()
+{
+ T t(S{1});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C
new file mode 100644
index 000000000..3ca878106
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C
@@ -0,0 +1,7 @@
+// PR c++/45378
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ int x { 22.2 }; // { dg-error "narrowing" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C
new file mode 100644
index 000000000..998e4c81d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C
@@ -0,0 +1,21 @@
+// PR c++/49216
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+extern "C" void abort();
+void * operator new[] (__SIZE_TYPE__, void *p) { return p; }
+
+bool constructed;
+
+struct A
+{
+ A(std::initializer_list<int>) { constructed = true; }
+};
+
+int main() {
+ new A[1]{};
+ int space[1] = { 42 };
+ int *p = new (space) int[1]{};
+ if (p[0] != 0 || !constructed)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C
new file mode 100644
index 000000000..52a8ff94d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C
@@ -0,0 +1,13 @@
+// PR c++/49355
+// { dg-do compile { target c++11 } }
+
+#include <string>
+
+struct T {
+ std::string foobar;
+};
+
+int main()
+{
+ T* x = new T({""});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C
new file mode 100644
index 000000000..a40edd3e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C
@@ -0,0 +1,6 @@
+// Test for -Wno-narrowing
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic-errors -Wno-narrowing" }
+
+int i;
+float d = { i };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C
new file mode 100644
index 000000000..5339dbfa4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C
@@ -0,0 +1,37 @@
+// PR c++/47453
+// { dg-do compile { target c++11 } }
+
+// invalid
+int a({0}); // { dg-error "" }
+
+// invalid
+int const &b({0}); // { dg-error "" }
+
+// invalid
+struct A1 { int a[2]; A1(); };
+A1::A1():a({1, 2}) { } // { dg-error "" }
+
+struct A { explicit A(int, int); A(int, long); };
+
+// invalid
+A c({1, 2}); // { dg-error "" }
+
+// valid (by copy constructor).
+A d({1, 2L});
+
+// valid
+A e{1, 2};
+
+#include <initializer_list>
+
+struct B {
+ template<typename ...T>
+ B(std::initializer_list<int>, T ...);
+};
+
+// invalid (the first phase only considers init-list ctors)
+// (for the second phase, no constructor is viable)
+B f{1, 2, 3}; // { dg-error "" }
+
+// valid (T deduced to <>).
+B g({1, 2, 3});
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C
new file mode 100644
index 000000000..5c59f403d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C
@@ -0,0 +1,8 @@
+// PR c++/50054
+// { dg-do compile { target c++11 } }
+
+void g( const int& (a)[1] ) {} // { dg-error "array of references" }
+
+int main () {
+ g( { 1, 2 } ); // { dg-error "initializer list" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C
new file mode 100644
index 000000000..aab21e35d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C
@@ -0,0 +1,17 @@
+// PR c++/50209
+// { dg-do compile { target c++11 } }
+
+struct S { int i,j; };
+
+struct A
+{
+ static void f (S = {1,2});
+};
+
+void f (S = {3,4});
+
+int main()
+{
+ A::f();
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C
new file mode 100644
index 000000000..6371c1650
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C
@@ -0,0 +1,18 @@
+// PR c++/49996
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ ~A()
+ { }
+};
+
+struct B
+{
+ const A& ref;
+};
+
+int main()
+{
+ B* p = new B{A()};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C
new file mode 100644
index 000000000..3d02960b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C
@@ -0,0 +1,29 @@
+// Test for initlist lifetime
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+int c;
+
+struct A
+{
+ A(int,int) { ++c; }
+ ~A() { --c; }
+};
+
+void f (std::initializer_list<A> l) { }
+
+int main()
+{
+ f({ {1,2}, {3,4} });
+ if (c != 0)
+ return 1;
+
+ {
+ std::initializer_list<A> l { {1,2}, {3,4} };
+ if (c != 2)
+ return 2;
+ }
+ if (c != 0)
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C
new file mode 100644
index 000000000..28eccc263
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct N { N(int); };
+struct A { N i,j; };
+
+int main()
+{
+ A* ap = new A{1,2};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C
new file mode 100644
index 000000000..d739ea392
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C
@@ -0,0 +1,10 @@
+// PR c++/51399
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ std::initializer_list<int> x[1] = { 0 }; // { dg-error "could not convert" }
+ A() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C
new file mode 100644
index 000000000..00940479a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C
@@ -0,0 +1,16 @@
+// Origin PR c++/51475
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+ A(int*);
+};
+
+struct B
+{
+ const std::initializer_list<A>& x;
+};
+
+B b = {{1}}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C
new file mode 100644
index 000000000..78e530859
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C
@@ -0,0 +1,29 @@
+// PR c++/51553
+// { dg-do compile { target c++11 } }
+
+struct X
+{
+ X();
+};
+
+struct Y
+{
+ operator X() const;
+};
+
+struct Z
+{
+ explicit operator X() const;
+};
+
+X a = { Y() };
+X aa = Y();
+
+X b{ Y() };
+X bb(Y());
+
+X c = { Z() }; // { dg-error "" }
+X cc = Z(); // { dg-error "" }
+
+X d{ Z() };
+X dd( Z() );
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C
new file mode 100644
index 000000000..061734f36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C
@@ -0,0 +1,9 @@
+// Core 1270
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i[2];
+};
+
+A f() { return {1,2}; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C
new file mode 100644
index 000000000..4fc162e10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C
@@ -0,0 +1,29 @@
+// PR c++/52510
+// { dg-do compile { target c++11 } }
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+typedef uint64_t upad64_t;
+
+typedef struct _pthread_cond {
+ struct {
+ uint8_t __pthread_cond_flag[4];
+ uint16_t __pthread_cond_type;
+ uint16_t __pthread_cond_magic;
+ } __pthread_cond_flags;
+ upad64_t __pthread_cond_data;
+} pthread_cond_t;
+
+class gtm_rwlock
+{
+ pthread_cond_t c_readers;
+ public:
+ gtm_rwlock();
+};
+
+gtm_rwlock::gtm_rwlock()
+ : c_readers ({{{0, 0, 0, 0}, 0, 0x4356}, 0})
+{ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C
new file mode 100644
index 000000000..491d4cf06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C
@@ -0,0 +1,27 @@
+// PR c++/50478
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+namespace std
+{
+ template<typename _Key>
+ struct set
+ {
+ void insert(const _Key&);
+ void insert(initializer_list<_Key>);
+ };
+
+ struct string
+ {
+ string(const string&, __SIZE_TYPE__, __SIZE_TYPE__ = -1);
+ string(const char*);
+ string(initializer_list<char>);
+ };
+}
+
+int main()
+{
+ std::set<std::string> s;
+ s.insert( { "abc", "def", "hij"} );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C
new file mode 100644
index 000000000..7cfe1a34b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C
@@ -0,0 +1,20 @@
+// PR c++/56772
+// { dg-require-effective-target c++11 }
+
+typedef __SIZE_TYPE__ size_t;
+void* operator new[](size_t, void *p) { return p; }
+template <typename T = size_t>
+void f ()
+{
+ size_t coord [2][2];
+ new (&coord) size_t [2][2]
+ {
+ {0,0},
+ {0,0},
+ };
+}
+
+int main ()
+{
+ f<>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C
new file mode 100644
index 000000000..5d59dfeaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C
@@ -0,0 +1,29 @@
+// PR c++/50261
+// { dg-require-effective-target c++11 }
+
+template <typename T>
+struct ca {
+ T elem[1];
+
+ ca(const T (&s)[1]): elem{{s}} { } // { dg-error "braces" }
+ ca(const T (&s)[1],int): elem({{s}}) { } // { dg-error "paren|invalid" }
+ ca(const T (&s)[1],char): elem(s) { } // { dg-error "array" }
+ ca(const T (&s)[1],double): elem{s} { } // { dg-error "invalid" }
+
+ ca(const T &v): elem{{v}} { } // { dg-error "braces" }
+ ca(const T &v,int): elem{{{v}}} { } // { dg-error "braces" }
+ ca(const T &v,char): elem{v} { } // OK
+ ca(const T &v,double): elem({v}) { } // { dg-error "paren" }
+};
+
+int main() {
+ int a[1] = {0};
+ ca<int> d(a);
+ ca<int> d1(a,1);
+ ca<int> d2(a,'2');
+ ca<int> d3(a,3.0);
+ ca<int> e(a[0]);
+ ca<int> e1(a[0],1);
+ ca<int> e2(a[0],'2');
+ ca<int> e3(a[0],3.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C
new file mode 100644
index 000000000..7dbbf2d22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C
@@ -0,0 +1,12 @@
+// PR c++/37932
+// { dg-do compile { target c++11 } }
+
+typedef enum { AA=1, BB=2 } my_enum;
+
+typedef struct { my_enum a:4 ; unsigned b:28; } stru;
+
+void foo (char c, my_enum x, int i)
+{
+ char arr[2] = {c+'0', 0}; // { dg-error "narrowing" }
+ stru s = {x,0};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C
new file mode 100644
index 000000000..f215b9d79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C
@@ -0,0 +1,27 @@
+// PR c++/57196
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+template<class T>
+struct set {
+ set() = default;
+ set(std::initializer_list<T>){}
+};
+
+struct string {
+ string(const char*){}
+ ~string(){}
+};
+
+typedef decltype(sizeof(0)) size_t;
+
+template <size_t> struct EqHelper { };
+
+int IsNullLiteralHelper(...);
+
+void Fn() {
+ EqHelper<sizeof IsNullLiteralHelper(set<int>{1})> eq1; // ok
+ EqHelper<sizeof IsNullLiteralHelper(set<string>())> eq2; // ok
+ EqHelper<sizeof IsNullLiteralHelper(set<string>{"foo"})> eq3; // error
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C
new file mode 100644
index 000000000..1d143906d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C
@@ -0,0 +1,10 @@
+// PR c++/56930
+// { dg-require-effective-target c++11 }
+// { dg-options -Wconversion }
+
+int main()
+{
+ int x = sizeof(int);
+ int y { sizeof(int) };
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C
new file mode 100644
index 000000000..98fc79f1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C
@@ -0,0 +1,22 @@
+// DR 1589
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+struct Pair
+{
+ Pair(const char *, const char *);
+};
+
+struct String
+{
+ String(const char *);
+};
+
+void f1(int); // #1
+int f1(std::initializer_list<long>); // #2
+int g1() { return f1({42}); } // chooses #2
+
+void f2(Pair); // #3
+int f2(std::initializer_list<String>); // #4
+int g2() { return f2({"foo","bar"}); } // chooses #4
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C
new file mode 100644
index 000000000..de9748d8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C
@@ -0,0 +1,13 @@
+// PR c++/57682
+// { dg-do compile { target c++11 } }
+
+struct Class
+{
+ Class (int func)
+ try
+ : f { func } { }
+ catch ( ... ) { }
+
+private:
+ int f;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C
new file mode 100644
index 000000000..4305b59a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C
@@ -0,0 +1,7 @@
+// Core 1591
+// { dg-require-effective-target c++11 }
+
+template<class T, int N> void g(T const (&)[N]);
+void f() {
+ g( { 1, 2, 3, 4 } );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C
new file mode 100644
index 000000000..f185401c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C
@@ -0,0 +1,6 @@
+// PR c++/59080
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+auto foo[] = {}; // { dg-error "auto|unable to deduce" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C
new file mode 100644
index 000000000..ac419dde8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C
@@ -0,0 +1,5 @@
+// PR c++/58812
+// { dg-require-effective-target c++11 }
+
+int i;
+int&& j{{ i }}; // { dg-error "too many braces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C
new file mode 100644
index 000000000..49b9079fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C
@@ -0,0 +1,10 @@
+// PR c++/58651
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int i;
+ A(int j) : i{{j}} {} // { dg-error "too many braces" }
+};
+
+A a(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C
new file mode 100644
index 000000000..648ec5307
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C
@@ -0,0 +1,12 @@
+// PR c++/58639
+// { dg-require-effective-target c++11 }
+
+struct node {
+ node &parent;
+};
+
+struct vector {
+ node n;
+};
+
+vector v({}); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C
new file mode 100644
index 000000000..5a1914dda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C
@@ -0,0 +1,8 @@
+// PR c++/59646
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+struct A {};
+
+std::initializer_list<volatile A> x = {{}};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C
new file mode 100644
index 000000000..ca0bc464f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C
@@ -0,0 +1,19 @@
+// PR c++/37740
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+};
+
+struct B
+{
+ double d;
+ A i;
+};
+
+int main()
+{
+ A a;
+ new B{3.2, a};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C
new file mode 100644
index 000000000..7947f1f81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C
@@ -0,0 +1,6 @@
+// PR c++/60051
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+auto x[2] = {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C
new file mode 100644
index 000000000..bb6414c62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C
@@ -0,0 +1,29 @@
+// PR c++/37860
+// { dg-do compile { target c++11 } }
+
+struct b
+{
+ bool t;
+
+ b() = default;
+ ~b() = default;
+ b& operator=(const b&) = delete;
+ b(const b&) = delete; // { dg-message "declared" }
+
+ b(bool _t): t (_t) { }
+};
+
+int main()
+{
+ // copy list initialization
+ b tst1 = { false };
+
+ // copy initialization.
+ b tst2 = false; // { dg-error "use" }
+
+ // direct list initialization
+ b tst3 { false };
+
+ // default initialization
+ b tst4;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C
new file mode 100644
index 000000000..69813b6ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_ZN1Q2V11fEv" } }
+// { dg-final { scan-assembler "_ZN1Q2V11iE" } }
+
+namespace Q {
+ inline namespace V1 {
+ extern int i;
+ void f();
+ }
+}
+int Q::i = 1;
+void Q::f() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
new file mode 100644
index 000000000..6ad9d65a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+namespace Q {
+ inline namespace V1 {
+ extern int i; // { dg-message "" }
+ extern int j; // { dg-message "" }
+ void f(); // { dg-message "" }
+ void g(); // { dg-message "" }
+ }
+ inline namespace V2 {
+ extern int j; // { dg-message "" }
+ void g(); // { dg-message "" }
+ }
+ extern int i; // { dg-message "" }
+ void f(); // { dg-message "" }
+ void h();
+}
+namespace R {
+ using namespace Q;
+}
+int Q::i = 1; // { dg-error "ambiguous" }
+int Q::j = 1; // { dg-error "ambiguous" }
+void Q::f() { } // { dg-error "ambiguous" }
+void Q::g() { } // { dg-error "ambiguous" }
+void R::h() { } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C
new file mode 100644
index 000000000..7e24e806e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+
+namespace C
+{
+ void f();
+}
+
+namespace B
+{
+ using namespace C;
+
+ inline namespace B1
+ {
+ void f();
+ }
+}
+
+namespace A
+{
+ using namespace B;
+}
+
+int main()
+{
+ A::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C
new file mode 100644
index 000000000..25caefc0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C
@@ -0,0 +1,2 @@
+// { dg-options "-std=gnu++98 -pedantic" }
+inline namespace { } // { dg-warning "inline namespaces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C
new file mode 100644
index 000000000..20a3dc6bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C
@@ -0,0 +1,2 @@
+// { dg-options "-std=gnu++98 -pedantic-errors" }
+inline namespace { } // { dg-error "inline namespaces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C
new file mode 100644
index 000000000..0a78be9f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C
@@ -0,0 +1,41 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test that the implicit object parameter is *not* an rvalue reference, but is instead
+// identical to that specified in C++03. That is, the implicit object parameter is
+// an lvalue reference that can bind to an rvalue. :-\
+// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html under the
+// section "Revision 1 Summary and Rationale" for more details.
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+
+struct os
+{
+ one operator<<(int);
+};
+
+struct A
+{
+ A(int);
+};
+
+two operator<<(os&, const A&);
+
+void test()
+{
+ os o;
+ sa<sizeof(o << 1) == 1 * sizeof(long)> t1; // Calls os::operator<<(int)
+ // Would be ambiguous if the implicit object parameter
+ // was an rvalue reference.
+}
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C
new file mode 100644
index 000000000..4da9d4691
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C
@@ -0,0 +1,9 @@
+// PR c++/50220
+// { dg-do compile { target c++11 } }
+
+template<typename Foo> struct Foobar {};
+
+void foobar(const Foobar<void>& obj)
+{
+ [obj](){}();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C
new file mode 100644
index 000000000..ff1085f30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C
@@ -0,0 +1,8 @@
+// PR c++/46159
+// { dg-options -std=c++98 }
+
+void
+f()
+{
+ int **p = new(int(*[2]));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C
new file mode 100644
index 000000000..52bb874c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C
@@ -0,0 +1,8 @@
+// PR c++/44160
+// { dg-do link { target c++11 } }
+
+int main()
+{
+ const char *p = []() { return __func__; }();
+ return p == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C
new file mode 100644
index 000000000..482193e97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C
@@ -0,0 +1,18 @@
+// DR 1612
+// { dg-require-effective-target c++11 }
+
+int main() {
+ static int result;
+ struct A { int x; };
+ struct B { int y; };
+ union {
+ A a; B b;
+ };
+ a.x = 1;
+ [=]() mutable {
+ a.x = 2; // { dg-error "anonymous union" }
+ result = b.y; // { dg-error "anonymous union" }
+ }();
+ if (result == 1) return 0;
+ throw 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C
new file mode 100644
index 000000000..adb40ed6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C
@@ -0,0 +1,19 @@
+// Test that array capture by copy works.
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i;
+ A(int i): i(i) {}
+ A(const A& a): i(a.i+1) {}
+};
+
+int main()
+{
+ A ar[4][3] = { { 10, 20, 30 },
+ { 40, 50, 60 },
+ { 70, 80, 90 },
+ { 100, 110, 120 } };
+ int i = [ar] { return ar[1][1]; }().i;
+ return (i!= 52);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C
new file mode 100644
index 000000000..d13e2c0da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C
@@ -0,0 +1,14 @@
+// PR c++/50437
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+void f()
+{
+ auto g = [](T t){ return t == 0; };
+ g(T());
+}
+
+int main()
+{
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C
new file mode 100644
index 000000000..05fadf5d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C
@@ -0,0 +1,16 @@
+// PR c++/56901
+// { dg-require-effective-target c++11 }
+
+template <typename>
+void foo_impl()
+{
+ int data;
+ auto L = [&](){ return data; };
+ [&](){ L(); }();
+ [&L](){ L(); }();
+}
+
+void foo()
+{
+ foo_impl<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C
new file mode 100644
index 000000000..013ed5264
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C
@@ -0,0 +1,24 @@
+// PR c++/57526
+// { dg-require-effective-target c++11 }
+
+template<class T>
+struct A
+{
+ void bar( ) { }
+
+ void foo( )
+ {
+ auto* this_ptr = this;
+ auto lc = [&]( )
+ {
+ this_ptr->bar();
+ };
+ lc();
+ }
+};
+
+int main()
+{
+ A<int> a;
+ a.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C
new file mode 100644
index 000000000..9c9632cd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+#include <cassert>
+
+int main() {
+ int i = 1, j = 2;
+ const int& ci = i;
+ [&ci, &j] () -> void { j = ci; } ();
+ assert(i == 1);
+ assert(j == 1);
+ [&ci] () -> void { ci = 0; } (); // { dg-error "" "cannot assign to const int&" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C
new file mode 100644
index 000000000..16fd0a713
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C
@@ -0,0 +1,14 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+int main() {
+ int i = 1, j = 2;
+ const int& ci = i;
+ [&ci, &j] () -> void { j = ci; } ();
+ assert(i == 1);
+ assert(j == 1);
+ //[&ci] () -> void { ci = 0; } (); { dg-error: cannot assign to const int& }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C
new file mode 100644
index 000000000..3f9da7e46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C
@@ -0,0 +1,15 @@
+// PR c++/50736
+// { dg-do compile { target c++11 } }
+
+int i;
+void f();
+typedef int T;
+
+int main()
+{
+ [i]{}; // { dg-error "non-automatic" }
+ [f]{}; // { dg-error "non-variable" }
+ [T]{}; // { dg-error "non-variable" }
+}
+
+struct A { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C
new file mode 100644
index 000000000..49fbdf320
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C
@@ -0,0 +1,13 @@
+// FDIS 5.1.2/8
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic-errors" }
+
+struct S2 { void f(int i); };
+void S2::f(int i) {
+ [&, i]{ }; // OK
+ [&, &i]{ }; // { dg-error "" } i preceded by & when & is the default
+ [=, i]{ }; // { dg-error "" } i not preceded by & when = is the default
+ [=, this]{ }; // { dg-error "" } this when = is the default
+ [i, i]{ }; // { dg-error "" } i repeated
+ [this, this]{ }; // { dg-error "" } i repeated
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C
new file mode 100644
index 000000000..28ea53363
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+#include <cassert>
+
+template<typename F>
+void call(const F& f) { f(); }
+
+int main() {
+ call([] () -> void {});
+ call([] () mutable -> void {});
+
+ int i = -1;
+ call([&i] () -> void { i = 0; });
+ assert(i == 0);
+ call([i] () -> void { i = 0; }); // { dg-error "" "assignment to non-reference capture in const lambda" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C
new file mode 100644
index 000000000..c6150f174
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C
@@ -0,0 +1,19 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+template<typename F>
+void call(const F& f) { f(); }
+
+int main() {
+ call([] () -> void {});
+ //call([] () mutable -> void {}); // { dg-error: "`f' does not have const `operator()'" }
+
+ int i = -1;
+ call([&i] () -> void { i = 0; });
+ assert(i == 0);
+ //call([i] () -> void { i = 0; }); // { dg-error: "assignment to non-reference capture in const lambda" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C
new file mode 100644
index 000000000..884163a29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C
@@ -0,0 +1,15 @@
+// PR c++/52026
+// { dg-options "-O" }
+// { dg-do run { target c++11 } }
+
+template<bool B>
+int func() {
+ const int constVal1 = B ? 100 : -100;
+ const int constVal = constVal1;
+ return [] { return constVal; }();
+}
+
+int main() {
+ if (func<true>() != 100)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C
new file mode 100644
index 000000000..08d8bbfc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C
@@ -0,0 +1,14 @@
+// Test for conversion from stateless lambda to function pointer.
+
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1fvENKUlvE_cvPFvvEEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin *-*-hpux10* } } } } }
+
+inline void f()
+{
+ void (*pfn)() = []{};
+}
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C
new file mode 100644
index 000000000..cd4cf7e61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C
@@ -0,0 +1,11 @@
+// Test for conversion from stateless lambda to function pointer.
+
+// { dg-do run { target c++11 } }
+
+typedef int (*pfn)(int);
+
+int main()
+{
+ pfn p = [](int i) { return i-42; };
+ return p (42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C
new file mode 100644
index 000000000..ebc6c14d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C
@@ -0,0 +1,12 @@
+// Conversion to a function pointer uses a generic thunk, which doesn't
+// work properly for variadics. Make sure that we can still use the lambda
+// normally.
+
+// { dg-do compile { target c++11 } }
+
+void f()
+{
+ auto l = [](...){};
+ void (*p1)(...) = l; // { dg-bogus "sorry" "" { xfail *-*-* } }
+ l(); // OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C
new file mode 100644
index 000000000..66c09102d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C
@@ -0,0 +1,13 @@
+// PR c++/43641
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ int i;
+};
+
+void func()
+{
+ [](const B& b) -> const int& { return b.i; };
+ [](const B& b) { return b; };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C
new file mode 100644
index 000000000..f5408a962
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C
@@ -0,0 +1,15 @@
+// PR c++/45080
+// { dg-do compile { target c++11 } }
+
+typedef void(*pfn)();
+
+template<typename=int>
+void f()
+{
+ pfn fn = []{};
+}
+
+void test()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C
new file mode 100644
index 000000000..3b3fda9f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C
@@ -0,0 +1,6 @@
+// PR c++/55015
+// { dg-do link { target c++11 } }
+
+typedef void (*VoidFunc)();
+inline VoidFunc GetFunc() { return [](){}; }
+int main() { VoidFunc func = GetFunc(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C
new file mode 100644
index 000000000..89e4e4bab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C
@@ -0,0 +1,20 @@
+// PR c++/55710
+// { dg-do link { target c++11 } }
+
+template <class T>
+struct X {
+ static void (*code) ();
+};
+
+template <class T>
+void (*X<T>::code) () = []{}; // Line 7
+
+struct Y {
+ void (*code) () = []{} ; // Line 10
+ void operator()() { code(); }
+};
+
+int main () {
+ X<int>::code();
+ Y()();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C
new file mode 100644
index 000000000..abe272a8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C
@@ -0,0 +1,15 @@
+// PR c++/56447
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f()
+{
+ int i;
+ // This lambda should not have a conversion op, since it captures i
+ int (*p)() = [=]{ return i; }; // { dg-error "cannot convert" }
+}
+
+int main()
+{
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C
new file mode 100644
index 000000000..91f5d621b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+int main() {
+ int i;
+ const char* s;
+ [=] () -> void { i; s; i; s; } ();
+
+ [] () -> void { i; } (); // { dg-error "" "`i' is not captured" }
+ [1] () -> void {} (); // { dg-error "expected identifier" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C
new file mode 100644
index 000000000..232c56b46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C
@@ -0,0 +1,13 @@
+// { dg-do run { target c++11 } }
+
+int main() {
+ int i;
+ const char* s;
+ [=] () -> void { i; s; i; s; } ();
+
+ //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" }
+ //[1] () -> void {} (); // { dg-error: "expected identifier" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C
new file mode 100644
index 000000000..caffb7f25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+int main() {
+ int i;
+ const char* s;
+ [i, s] () -> void { i; s; } ();
+
+ [] () -> void { i; } (); // { dg-error "" "`i' is not captured" }
+ [1] () -> void {} (); // { dg-error "expected identifier" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C
new file mode 100644
index 000000000..6d27d75fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C
@@ -0,0 +1,13 @@
+// { dg-do run { target c++11 } }
+
+int main() {
+ int i;
+ const char* s;
+ [i, s] () -> void { i; s; } ();
+
+ //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" }
+ //[1] () -> void {} (); // { dg-error: "expected identifier" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C
new file mode 100644
index 000000000..4a63d000f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+void f()
+{
+ int i;
+ auto lam = [i]{}; // { dg-message "" }
+ decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" }
+ decltype(lam) lam3; // { dg-error "" "deleted default ctor" }
+ lam3 = lam; // { dg-error "" "deleted assignment op" }
+}
+
+template <class T>
+void g(T i)
+{
+ auto lam = [i]{}; // { dg-message "" }
+ decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" }
+ decltype(lam) lam3; // { dg-error "" "deleted default ctor" }
+ lam3 = lam; // { dg-error "" "deleted assignment op" }
+}
+
+int main()
+{
+ f();
+ g(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C
new file mode 100644
index 000000000..8dfb2fa6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C
@@ -0,0 +1,17 @@
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ A() { }
+ A(A&) { }
+ A(A&&) { }
+};
+
+int main()
+{
+ A a;
+ auto lam4 = [a]{}; // OK, implicit move ctor
+ lam4();
+ auto lam5 = lam4; // OK, implicit copy ctor
+ lam5();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C
new file mode 100644
index 000000000..b8b15d01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C
@@ -0,0 +1,16 @@
+// PR c++/43502
+// { dg-do compile { target c++11 } }
+// { dg-options "-fcompare-debug" }
+
+void g (int n)
+{
+ int bef ([]{return 0;}());
+}
+struct S {
+ void f (int = []{return 0;}(), int = [] { return 0;}());
+};
+int main ()
+{
+ S ().f ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C
new file mode 100644
index 000000000..b36ca2167
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C
@@ -0,0 +1,22 @@
+// PR c++/59791
+// We force the gimple dump to trigger use of lang_decl_name.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fdump-tree-gimple" }
+// { dg-final { cleanup-tree-dump "gimple" } }
+
+template < class T > void
+f (T t)
+{
+ int i = t;
+ [](int)->decltype (i + t)
+ {
+ return 0;
+ }
+ (0);
+}
+
+void
+foo ()
+{
+ f (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C
new file mode 100644
index 000000000..88970a933
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C
@@ -0,0 +1,22 @@
+// Testcase for DR 975.
+
+// { dg-do compile { target c++11 } }
+
+bool b;
+struct A { int fn1(); const int& fn2(); };
+struct B { int fn1(); long fn2(); };
+
+template <class T> int f (T t) {
+ return [](T t){
+ if (b)
+ return t.fn1();
+ else
+ return t.fn2(); // { dg-error "inconsistent types" }
+ }(t);
+}
+
+int main()
+{
+ f(A()); // { dg-bogus "" } int and const int& are compatible
+ f(B()); // { dg-message "from here" } int and long are not
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C
new file mode 100644
index 000000000..fdbb4e1e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C
@@ -0,0 +1,22 @@
+// Test that this is accepted even when pedantic now that it's part
+// of the standard.
+
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+bool b;
+template <class T>
+T f (T t)
+{
+ [=] { return t+1; }; // OK
+ return [=] {
+ auto i = t+1;
+ return i+1;
+ }();
+}
+
+int main()
+{
+ if (f(1) != 3)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C
new file mode 100644
index 000000000..6ada75756
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+int main() {
+ int i = 0;
+ int& r = [&] () { return i; } (); // { dg-error "" "invalid initialization of non-const reference of type .int&. from a temporary of type .int." }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C
new file mode 100644
index 000000000..b0e2d9fba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C
@@ -0,0 +1,28 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+int main() {
+ [] {};
+ [] {} ();
+ [] () {};
+ [] () {} ();
+ [] () { return "lambda"; };
+
+ int i = 1, j = 2;
+ [&i, j] () { i = j; } ();
+ assert(i == 2);
+ assert(j == 2);
+
+ i = [] () { return 3; } ();
+ assert(i == 3);
+
+ int k = [&] () { return i; } ();
+
+ []{ return; };
+
+ int array[] = { 1, 2, 3 };
+ int* p = [&] () { return array; } ();
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C
new file mode 100644
index 000000000..5cf016cb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C
@@ -0,0 +1,11 @@
+// PR c++/43875
+// { dg-do compile { target c++11 } }
+
+void f();
+void f(int);
+
+int main()
+{
+ auto x1 = []{ return f; }; // { dg-error "return|overloaded" }
+ auto x2 = []{ return { 1, 2 }; }; // { dg-error "return|list" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C
new file mode 100644
index 000000000..cefa24d43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ [](int a = 1) { return a; }(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C
new file mode 100644
index 000000000..35104c392
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C
@@ -0,0 +1,7 @@
+// PR c++/43886
+// { dg-do compile { target c++11 } }
+
+void f2() {
+ int i = 1;
+ void g5(int = ([]{ return sizeof i; })());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C
new file mode 100644
index 000000000..1c5939301
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C
@@ -0,0 +1,19 @@
+// PR c++/55223
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+// { dg-final { scan-assembler "_ZN8functionC1IZN1CIiE4testES_Ed_UliE_EET_" } }
+
+struct function
+{
+ template <class U> function(U u) { }
+};
+
+template<typename T> struct C
+{
+ static T test(function f = [](int i){return i;}) { }
+};
+
+int main()
+{
+ C<int>::test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C
new file mode 100644
index 000000000..221795459
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C
@@ -0,0 +1,8 @@
+// PR c++/54764
+// { dg-require-effective-target c++11 }
+
+template<class T = void>
+struct c
+{
+ int (*f)(int) = [](int i){return i + i;};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C
new file mode 100644
index 000000000..d85918dd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C
@@ -0,0 +1,30 @@
+// PR c++/58083
+// { dg-do compile { target c++11 } }
+
+namespace details {
+struct iterator_concept_checker
+{
+ typedef char yes_type;
+ typedef char (&no_type)[2];
+
+ template <typename T>
+ static no_type test(...);
+
+ template <typename T>
+ static yes_type test(
+ int*
+ , void (*)(T) = [](T it)
+ {
+ auto copy = T{it}; // copy constructible
+ copy = it; // copy assignable
+ copy.~T(); // destroyable
+ ++it; // incrementable
+ }
+ );
+};
+}
+
+int main()
+{
+ details::iterator_concept_checker::test<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C
new file mode 100644
index 000000000..dc1043b3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C
@@ -0,0 +1,8 @@
+// { dg-require-effective-target c++11 }
+
+int main()
+{
+ int x;
+ auto f = [x]{ };
+ f.__x.foo; // { dg-error "<lambda\\(\\)>::<x capture>" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C
new file mode 100644
index 000000000..7cc3f8f67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C
@@ -0,0 +1,14 @@
+// Test that capture by copy uses direct-initialization.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+ explicit A(const A&);
+};
+
+int main()
+{
+ A a;
+ [a]{};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C
new file mode 100644
index 000000000..7516fe0fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C
@@ -0,0 +1,35 @@
+// Test that we properly clean up if we get an exception in the middle of
+// constructing the closure object.
+
+// This test fails because of PR 41449; it isn't a lambda issue.
+// { dg-do run { xfail *-*-* } }
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ A() {}
+ A(const A&) { throw 1; }
+};
+
+int bs;
+struct B
+{
+ B() { ++bs; }
+ B(const B&) { ++bs; }
+ ~B() { --bs; }
+};
+
+int main()
+{
+ {
+ B b1, b2;
+ A a;
+
+ try
+ {
+ [b1, a, b2]{ };
+ }
+ catch(...) {}
+ }
+ return bs;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C
new file mode 100644
index 000000000..1ef510a48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C
@@ -0,0 +1,17 @@
+// PR c++/47263
+// PR c++/49260
+// { dg-options "-fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm" }
+// { dg-do run { target c++11 } }
+
+#include <exception>
+
+int main( void )
+{
+ std::set_unexpected( []{ throw 0; } );
+ try
+ {
+ []() throw( int ) { throw nullptr; }();
+ }
+ catch( int )
+ { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C
new file mode 100644
index 000000000..10dc6e36d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C
@@ -0,0 +1,14 @@
+// PR c++/56388
+// { dg-require-effective-target c++11 }
+
+int main()
+{
+ bool /*const*/ condition = false;
+
+ [&]{
+ try{}
+ catch(...){
+ if(condition){}
+ }
+ }();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C
new file mode 100644
index 000000000..932ff1bee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C
@@ -0,0 +1,8 @@
+// PR c++/51415
+// { dg-do compile { target c++11 } }
+
+void foo()
+{
+ int x[1];
+ [x]{} = 0; // { dg-error "lambda" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C
new file mode 100644
index 000000000..aaa80f470
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C
@@ -0,0 +1,12 @@
+// PR c++/53158
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ auto a = []() { return true; };
+ auto b = []() { return a(); }; // { dg-error "'a' is not captured" }
+ int c, d;
+ while (b() && c < d) // { dg-error "could not convert" }
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C
new file mode 100644
index 000000000..fec01acb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C
@@ -0,0 +1,10 @@
+// PR c++/51412
+// { dg-do compile { target c++11 } }
+
+void foo(int);
+
+template<int> void bar()
+{
+ foo([]{}...); // { dg-error "<lambda>" }
+ foo([]{}=0 ...); // { dg-error "<lambda>" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C
new file mode 100644
index 000000000..3dc7f8774
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C
@@ -0,0 +1,18 @@
+// Test that error messages about creating the closure object refer to
+// the lambda-introducer.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+ A(const A& a) = delete; // { dg-message "declared" }
+};
+
+int main()
+{
+ A ar[4][3];
+ [ar] { }; // { dg-error "3:" }
+
+ A a;
+ [a] { }; // { dg-error "3:" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C
new file mode 100644
index 000000000..4ddd38cc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C
@@ -0,0 +1,19 @@
+// PR c++/42399
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A();
+ A(const A&) = delete; // { dg-message "declared" }
+};
+
+template <class T>
+void f()
+{
+ T t;
+ [t] { return 0; }; // { dg-error "use" }
+}
+
+int main()
+{
+ f<A>(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C
new file mode 100644
index 000000000..1c5cfdbd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C
@@ -0,0 +1,21 @@
+// "For each entity captured by copy, an unnamed non-static data member is
+// declared in the closure type" -- test that there isn't a member of the
+// closure with the same name as the captured variable.
+
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A: public T
+{
+ A(T t): T(t) { }
+ int f() { return this->i; } // { dg-error "" "no member named i" }
+};
+
+int main()
+{
+ int i = 42;
+ auto lam = [i]{ };
+ lam.i = 24; // { dg-error "" "no member named i" }
+ A<decltype(lam)> a(lam);
+ return a.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C
new file mode 100644
index 000000000..0123034e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C
@@ -0,0 +1,13 @@
+// PR c++/50114
+// { dg-do compile { target c++11 } }
+// { dg-options "-w" }
+
+int open()
+{
+ int *x2feed_i = 0;
+ auto insert_feed = [&](unsigned char venue, int* newfeed)
+ {
+ for(int x2feed_i = 1; 0; ) ;
+ x2feed_i = newfeed;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C
new file mode 100644
index 000000000..e4a11eaf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C
@@ -0,0 +1,13 @@
+// PR c++/43790
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int f();
+};
+
+int main()
+{
+ A a;
+ auto l = [] () { return a.f(); }; // { dg-error "not captured|return" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C
new file mode 100644
index 000000000..1ea59c21c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C
@@ -0,0 +1,8 @@
+// PR c++/58568
+// { dg-do compile { target c++11 } }
+
+template<int> struct A
+{
+ static const int i;
+ template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C
new file mode 100644
index 000000000..58f0fa35a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C
@@ -0,0 +1,12 @@
+// PR c++/60252
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int i; // { dg-message "" }
+
+ void foo()
+ {
+ [&](){ [&](int[i]){}; }; // { dg-error "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C
new file mode 100644
index 000000000..d18aadfbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C
@@ -0,0 +1,15 @@
+// PR c++/54250
+// { dg-do compile { target c++11 } }
+
+struct T
+{
+ int a;
+ int foo()
+ {
+ return [&]()->int {
+ return [&](decltype(/*this->*/a) _)->int {
+ return 1;
+ }(a);
+ }();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C
new file mode 100644
index 000000000..6a31e0a36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C
@@ -0,0 +1,17 @@
+// PR c++/42083
+// { dg-do compile { target c++11 } }
+
+template<typename F>
+decltype(F()) run(F f) // { dg-message "note" }
+{
+ return f();
+}
+
+int main()
+{
+ auto l = []() { return 5; }; // { dg-message "lambda closure type" }
+
+ run(l); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 14 }
+ // { dg-error "use of deleted function" "candidate explanation" { target *-*-* } 5 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
new file mode 100644
index 000000000..03a7a4bb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
@@ -0,0 +1,23 @@
+// PR c++/47795
+// { dg-do compile { target c++11 } }
+
+class Klass
+{
+ unsigned int local;
+public:
+ bool dostuff();
+};
+
+bool Klass::dostuff()
+{
+ auto f = []() -> bool {
+ if (local & 1) { return true; } // { dg-error "not captured" }
+ return false;
+ };
+}
+
+int main()
+{
+ Klass c;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C
new file mode 100644
index 000000000..8c08e909a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C
@@ -0,0 +1,14 @@
+// PR c++/47242
+// { dg-do compile { target c++11 } }
+
+template < typename > void
+bar ()
+{
+ [i]{}; // { dg-error "declared|invalid" }
+}
+
+void
+foo ()
+{
+ bar<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C
new file mode 100644
index 000000000..914e0f71e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C
@@ -0,0 +1,12 @@
+// PR c++/51227
+// { dg-do compile { target c++11 } }
+
+template<int> int foo()
+{
+ [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" }
+}
+
+void bar()
+{
+ foo<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C
new file mode 100644
index 000000000..408af4203
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C
@@ -0,0 +1,4 @@
+// PR c++/51464
+// { dg-do compile { target c++11 } }
+
+template<int = sizeof([])> struct A {}; // { dg-error "lambda" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C
new file mode 100644
index 000000000..d0ee86611
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C
@@ -0,0 +1,9 @@
+// PR c++/52487
+// { dg-do compile { target c++11 } }
+
+struct A; // { dg-error "forward declaration" }
+
+void foo(A& a)
+{
+ [=](){a;}; // { dg-error "invalid use of incomplete type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C
new file mode 100644
index 000000000..00078d53b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C
@@ -0,0 +1,10 @@
+// PR c++/51422
+// { dg-do compile { target c++11 } }
+
+template<typename> struct A {};
+
+void foo()
+{
+ [i] { A<decltype(i)>(); }; // { dg-error "not declared|invalid" }
+ [i] { A<decltype(i)>(); }; // { dg-error "invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C
new file mode 100644
index 000000000..0a88bc875
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C
@@ -0,0 +1,18 @@
+// PR c++/53741
+// { dg-do compile { target c++11 } }
+
+struct X
+{
+ template <class T> static void bar() {}
+
+ template <class T> void foo(T p)
+ {
+ [&] { bar<T>(); };
+ }
+};
+
+int main()
+{
+ X x;
+ x.foo(3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C
new file mode 100644
index 000000000..92a165d95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C
@@ -0,0 +1,35 @@
+// { dg-do compile { target c++11 } }
+
+#include <cassert>
+
+class C {
+ private:
+ int m_i;
+
+ public:
+ C() : m_i(-1) {
+ [] { this; } (); // { dg-error "not captured" }
+ [this] () -> void { m_i = 0; } ();
+ assert(m_i == 0);
+ [this] () -> void { this->m_i = 1; } ();
+ assert(m_i == 1);
+ [&] () -> void { m_i = 2; } ();
+ assert(m_i == 2);
+ [&] () -> void { this->m_i = 3; } ();
+ assert(m_i == 3);
+ [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--?
+ assert(m_i == 4);
+ [=] () -> void { this->m_i = 5; } ();
+ assert(m_i == 5);
+ }
+
+};
+
+int main() {
+ C c;
+
+ [this] () -> void {} (); // { dg-error "use of 'this' in non-member function" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C
new file mode 100644
index 000000000..92981109f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C
@@ -0,0 +1,35 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+class C {
+ private:
+ int m_i;
+
+ public:
+ C() : m_i(-1) {
+ //[] { this; } ();
+ [this] () -> void { m_i = 0; } ();
+ assert(m_i == 0);
+ [this] () -> void { this->m_i = 1; } ();
+ assert(m_i == 1);
+ [&] () -> void { m_i = 2; } ();
+ assert(m_i == 2);
+ [&] () -> void { this->m_i = 3; } ();
+ assert(m_i == 3);
+ [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--?
+ assert(m_i == 4);
+ [=] () -> void { this->m_i = 5; } ();
+ assert(m_i == 5);
+ }
+
+};
+
+int main() {
+ C c;
+
+ //[this] () -> void {} (); // { dg-error: "cannot capture `this' outside of class method" }
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C
new file mode 100644
index 000000000..029576eab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C
@@ -0,0 +1,12 @@
+// PR c++/50863
+// { dg-do compile { target c++11 } }
+
+struct T {
+ template<typename F>
+ T(F) { }
+};
+
+int main()
+{
+ T t{ []{ } };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C
new file mode 100644
index 000000000..3c25f0eb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C
@@ -0,0 +1,27 @@
+// PR c++/54947
+// { dg-do compile { target c++11 } }
+
+struct X
+{
+ template<typename L>
+ X(L)
+ { }
+};
+
+template<typename A>
+ void
+ test()
+ {
+ int i = 0;
+
+ A a_ok_1( [=] { return i; } ); // OK
+ A a_ok_2( [i] { return i; } ); // OK
+
+ A a_err_1{ [i] { return i; } }; // error
+ A a_err_2{ [=] { return i; } }; // error
+ }
+
+int main()
+{
+ test<X>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C
new file mode 100644
index 000000000..f7b82efe9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C
@@ -0,0 +1,11 @@
+// PR c++/56567
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+int main()
+{
+ []{ return { 1, 2 }; }(); // { dg-error "initializer.list" }
+}
+
+// { dg-prune-output "return-statement with a value" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C
new file mode 100644
index 000000000..4c268c678
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C
@@ -0,0 +1,6 @@
+// PR c++/54420
+
+class __lambda
+{
+ virtual bool is_sub ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C
new file mode 100644
index 000000000..a952526a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C
@@ -0,0 +1,7 @@
+// Test that we don't crash on a failed lookup.
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ [i]{}; // { dg-error "not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C
new file mode 100644
index 000000000..220817a73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C
@@ -0,0 +1,104 @@
+// Test lambda mangling
+// { dg-require-weak "" }
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-inline" }
+
+template<typename F> int algo(F fn) { return fn(); }
+inline void g(int n) {
+ int bef(int i = []{ return 1; }());
+ // Default arguments of block-extern function declarations
+ // remain in the context of the encloding function body.
+ // The closure type is encoded as Z1giEUlvE_.
+ // The call operator of that type is _ZZ1giENKUlvE_clEv.
+
+// { dg-final { scan-assembler "_ZZ1giENKUlvE_clEv" } }
+// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1giENKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } }
+
+ algo([=]{return n+bef();});
+ // The captured entities do not participate in <lambda-sig>
+ // and so this closure type has the same <lambda-sig> as
+ // the previous one. It encoding is therefore Z1giEUlvE0_
+ // and the call operator is _ZZ1giENKUlvE0_clEv. The
+ // instance of "algo" being called is then
+ // _Z4algoIZ1giEUlvE0_EiT_.
+
+// { dg-final { scan-assembler "_Z4algoIZ1giEUlvE0_EiT_" } }
+// { dg-final { scan-assembler "_ZZ1giENKUlvE0_clEv" } }
+
+ int i = []{return 1;}();
+
+}
+
+struct S {
+ void f(int =
+ // Type: ZN1S1fEiiEd0_UlvE_
+ // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv
+// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE_clEv" } }
+// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZN1S1fEiiEd0_NKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } }
+ []{return 1;}()
+ // Type: ZN1S1fEiiEd0_UlvE0_
+ // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv
+// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE0_clEv" } }
+ + []{return 2;}(),
+ int =
+ // Type: ZN1S1fEiiEd_UlvE_
+ // Operator: _ZZN1S1fEiiEd_NKUlvE_clEv
+// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NKUlvE_clEv" } }
+ []{return 3;}());
+};
+
+template<typename T> struct R {
+ static int x;
+};
+template<typename T> int R<T>::x = []{return 1;}();
+template int R<int>::x;
+// Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E
+// Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv
+// { dg-final { scan-assembler "_ZNK1RIiE1xMUlvE_clEv" } }
+// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZNK1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } }
+
+void bar()
+{
+ // lambdas in non-vague linkage functions have internal linkage.
+ // { dg-final { scan-assembler-not "weak\[^\n\r\]*bar\[^\n\r\]*Ul" } }
+ []{}();
+}
+
+// lambdas used in non-template, non-class body initializers are internal.
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNKUlv" } }
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*variable" } }
+int variable = []{return 1;}();
+
+// And a template instantiated with such a lambda is also internal.
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*algoIUl" } }
+int var2 = algo([]{return 1;});
+
+// As are lambdas used in non-class-body default arguments.
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*function" } }
+void function (int i = []{return 1;}()+[]{return 1;}());
+
+struct Foo
+{
+ static int Int;
+ void Bar(int);
+};
+
+int Foo::Int = []{return 1;}();
+// Even default arguments for member functions that appear outside the
+// class body are internal.
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*Foo" } }
+void Foo::Bar(int i = []{return 1;}()) {}
+
+// Even default arguments for function templates.
+// { dg-final { scan-assembler-not "weak\[^\n\r\]*fn2\[^\n\r\]*Ulv" } }
+template <class T>
+void fn2 (T t = []{return 1;}()) {}
+
+int main()
+{
+ g(42);
+ S().f();
+ function();
+ Foo().Bar();
+ fn2<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C
new file mode 100644
index 000000000..54309a9dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C
@@ -0,0 +1,20 @@
+// PR c++/49276
+// { dg-do compile { target c++11 } }
+
+template <int N>
+struct F
+{
+ template <typename U> F (U);
+};
+
+struct S
+{
+ void foo (F <0> x = [] {}) {}
+};
+
+int
+main ()
+{
+ S s;
+ s.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C
new file mode 100644
index 000000000..5f17a21ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C
@@ -0,0 +1,15 @@
+// PR c++/51818
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_ZN1AC1IN3foo3barMUlvE_EEET_" } }
+
+struct A
+{
+ template <class T> A(T) { }
+};
+
+struct foo
+{
+ A bar = []{};
+};
+
+foo f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C
new file mode 100644
index 000000000..0d37637fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C
@@ -0,0 +1,13 @@
+// PR c++/54538
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } }
+ // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } }
+ void (*p)() = []{};
+};
+
+A<int> a1;
+A<char> a2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C
new file mode 100644
index 000000000..d3f434195
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C
@@ -0,0 +1,12 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+int main() {
+ int i = 1, j = 2;
+ [&i, j] () mutable -> void { i = 0; j = 0; } ();
+ assert(i == 0);
+ assert(j == 2);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C
new file mode 100644
index 000000000..2c6b0f206
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C
@@ -0,0 +1,15 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+int main() {
+ int i = 1;
+ const char* s1 = "hello";
+ const char* s2 = s1;
+ [i, s2] () mutable -> void { i = 2; s2 = "world"; } ();
+ //[i, s2] () -> void { i = 2; s2 = "world"; } (); // { dg-error: "assignment of data-member in read-only structure" }
+ assert(i == 1);
+ assert(s1 == s2);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C
new file mode 100644
index 000000000..c54ff5c84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C
@@ -0,0 +1,23 @@
+// PR c++/55532
+// { dg-do compile { target c++11 } }
+
+struct Foo {
+ void doit() {
+ }
+};
+
+template<typename T>
+void oops(Foo &foo, const T &) {
+ auto fun = [&] () mutable {
+ foo.doit();
+ };
+ auto fun2 = [=]() {
+ fun(); // { dg-error "" }
+ };
+ fun2();
+}
+
+int main() {
+ Foo foo;
+ oops(foo, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C
new file mode 100644
index 000000000..a09af89ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C
@@ -0,0 +1,10 @@
+// PR c++/56710
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+
+int main()
+{
+ int t = 0;
+ return [&]() -> int {int __t; __t = t; return __t; }();
+ return [&t]() -> int {int __t; __t = t; return __t; }();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C
new file mode 100644
index 000000000..c8ea46a98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C
@@ -0,0 +1,62 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+struct A {
+ int i;
+ A(): i(42) { }
+ int f() {
+ return [this]{
+ return [=]{ return i; }();
+ }();
+ }
+};
+
+int main() {
+ int i = 1;
+
+ [] (int& i) -> void {
+ [&] () -> void {
+ i = 2;
+ } ();
+ } (i);
+
+ assert(i == 2);
+
+ [&] () -> void {
+ [&i] () -> void {
+ i = 3;
+ } ();
+ } ();
+
+ assert(i == 3);
+
+ [&] () -> void {
+ [&] () -> void {
+ i = 4;
+ } ();
+ } ();
+
+ assert(i == 4);
+ i = 4;
+
+ [&] () -> void {
+ [=] () mutable -> void {
+ i = 5;
+ } ();
+ } ();
+
+ assert(i == 4);
+
+ [=] () mutable -> void {
+ [&] () -> void {
+ i = 6;
+ } ();
+ } ();
+
+ assert(i == 4);
+
+ assert (A().f() == 42);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C
new file mode 100644
index 000000000..9e509513a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C
@@ -0,0 +1,31 @@
+// Testcase from N2998
+// { dg-do compile { target c++11 } }
+
+void f1(int i) {
+ int const N = 20;
+ auto m1 = [=]{
+ int const M = 30;
+ auto m2 = [i]{
+ int x[N][M]; // OK: N and M are not "used"
+ x[0][0] = i; // OK: i is explicitly captured by m2
+ // and implicitly captured by m1
+ };
+ };
+ struct s1 {
+ int f;
+ int work(int n) {
+ int m = n*n;
+ int j = 40;
+ auto m3 = [this,m]{
+ /*auto m4=*/[&,j]{ // { dg-error "j. is not captured" }
+ int x = n; // { dg-error "n. is not captured" }
+ x += m; // OK: m implicitly captured by m4
+ // and explicitly captured by m3
+ x += i; // { dg-error "i. is not captured" }
+ x += f; // OK: this captured implicitly by m4
+ // and explicitly by m3
+ };
+ };
+ }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C
new file mode 100644
index 000000000..f7894fb40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C
@@ -0,0 +1,12 @@
+// PR c++/41896
+// { dg-do compile { target c++11 } }
+
+void nested_lambda()
+{
+ float val;
+
+ [val]()
+ {
+ [val](){};
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C
new file mode 100644
index 000000000..140ed30e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C
@@ -0,0 +1,9 @@
+// PR c++/47687
+// { dg-do compile { target c++11 } }
+
+template <class T> struct A { };
+
+auto inl = []{ return []{}; }();
+typedef decltype(inl) inlt;
+
+A<inlt> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C
new file mode 100644
index 000000000..b5a335eaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C
@@ -0,0 +1,18 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+template<typename F>
+void call(F f) { f(); }
+
+int main() {
+ call([] () -> void {});
+ call([] () mutable -> void {});
+
+ int i = -1;
+ call([i] () mutable -> void { i = 0; });
+ assert(i == -1);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C
new file mode 100644
index 000000000..4a04cfbfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C
@@ -0,0 +1,18 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+int main() {
+ int i = 1, j = 2;
+ [i, j] () -> void {} ();
+ assert(i == 1);
+ assert(j == 2);
+ [&i, &j] () -> void {} ();
+ assert(i == 1);
+ assert(j == 2);
+ [] (int x) -> void {} (1);
+ [] (int& x) -> void {} (i);
+ [] (int x, int y) -> void {} (i, j);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C
new file mode 100644
index 000000000..4729bb3b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C
@@ -0,0 +1,17 @@
+// { dg-do run { target c++11 } }
+
+auto f = [](int i) { return i+1; };
+
+int g(int i = [] { return 237; }())
+{
+ return i;
+}
+
+int main()
+{
+ if (f(41) != 42)
+ return 1;
+ if (g() != 237)
+ return 2;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C
new file mode 100644
index 000000000..94dc254fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C
@@ -0,0 +1,10 @@
+// PR c++/56464
+// { dg-do run { target c++11 } }
+
+struct bug { bug*a = [&]{ return [=]{return this;}(); }(); };
+int main()
+{
+ bug b;
+ if (b.a != &b)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C
new file mode 100644
index 000000000..73106d78b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C
@@ -0,0 +1,4 @@
+// PR c++/56565
+// { dg-do compile { target c++11 } }
+
+struct bug { int a; int *b = [&]{ return &a; }(); };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C
new file mode 100644
index 000000000..da7e0bfed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C
@@ -0,0 +1,9 @@
+// PR c++/55972
+// { dg-do compile { target c++11 } }
+
+class C
+{
+ void f();
+ int j = 10;
+ int i = [this]() { return this->j; }();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C
new file mode 100644
index 000000000..b592f1550
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C
@@ -0,0 +1,14 @@
+// PR c++/51927
+// { dg-do compile { target c++11 } }
+
+struct function
+{
+ template<typename Functor>
+ function(Functor);
+};
+
+struct testee
+{
+ function l1 = []() { };
+ function l2 = [=]() { l1; };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C
new file mode 100644
index 000000000..1d2778fb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C
@@ -0,0 +1,7 @@
+// PR c++/58596
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i = [] { return decltype(i)(); }();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C
new file mode 100644
index 000000000..1aadbb490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C
@@ -0,0 +1,47 @@
+// PR c++/54170
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+struct A;
+typedef A* ptr;
+typedef int (A::*pmf) (int);
+typedef int (A::*pdm);
+
+int total;
+
+void add(int n)
+{
+ total += n;
+}
+
+template <typename RType, typename Callable>
+RType Call(Callable native_func, int arg)
+{
+ return native_func(arg);
+}
+
+template <typename RType>
+RType do_test(int delta)
+{
+ return Call<RType>([=](int delta) { add(delta); return nullptr; }, delta);
+}
+
+template <typename RType>
+void test()
+{
+ total = 0;
+ assert (!do_test<RType>(5));
+ assert (total == 5);
+ assert (!do_test<RType>(20));
+ assert (total == 25);
+ assert (!do_test<RType>(-256));
+ assert (total == -231);
+}
+
+int main()
+{
+ test<ptr>();
+ test<pdm>();
+ test<pmf>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C
new file mode 100644
index 000000000..d904ebee1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C
@@ -0,0 +1,26 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+#include <algorithm>
+
+template <typename F, typename A1>
+void call(F f, const A1& arg1) {
+ f(arg1);
+}
+
+int main() {
+ int i = 1;
+ call(
+ [&i] (int j) -> void { i = j; },
+ 2
+ );
+ assert(i == 2);
+
+ int A[] = {1, 2, 3, 4};
+ int sum = 0;
+ std::for_each(A, A+4, [&sum] (int n) -> void { sum += n; });
+ assert(sum == 10);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C
new file mode 100644
index 000000000..40b539a6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C
@@ -0,0 +1,17 @@
+// PR c++/50089
+// { dg-do compile { target c++11 } }
+
+struct TestBase
+{
+ void foo() {}
+};
+
+struct Test : TestBase
+{
+ void foo()
+ {
+ [this]{
+ /*this->*/TestBase::foo(); // ICE without this->
+ }();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C
new file mode 100644
index 000000000..cbaeb1620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C
@@ -0,0 +1,20 @@
+// { dg-do run { target c++11 } }
+
+//#include <iostream>
+#include <functional>
+#include <cassert>
+
+int main() {
+
+ std::function<int(int)> fib = [&fib] (int n) -> int {
+ //std::cerr << "fib(" << n << ")\n";
+ if (n <= 2) return 1;
+ else return fib(n-1) + fib(n-2);
+ };
+
+ assert(fib(5) == 5);
+ assert(fib(10) == 55);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C
new file mode 100644
index 000000000..6b86369db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C
@@ -0,0 +1,14 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+int main() {
+ int i = 1;
+ float j = 2.0;
+ [&] () -> void { i = 3; j = 4.0; } ();
+ assert(i == 3);
+ assert(j == 4.0);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C
new file mode 100644
index 000000000..def13fdd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C
@@ -0,0 +1,14 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+int main() {
+ int i = 1;
+ float j = 2.0;
+ [&i, &j] () -> void { i = 3; j = 4.0; } ();
+ assert(i == 3);
+ assert(j == 4.0);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C
new file mode 100644
index 000000000..49705f502
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C
@@ -0,0 +1,12 @@
+// PR c++/49598
+// { dg-do run { target c++11 } }
+
+int
+main()
+{
+ int i = 10;
+ int& ir = i;
+
+ if ([=]{ return ir; }() != 10)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C
new file mode 100644
index 000000000..4b353b64c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C
@@ -0,0 +1,26 @@
+// PR c++/57437
+// { dg-require-effective-target c++11 }
+
+struct A {
+ int i;
+
+ A(): i(42) {}
+ A(const A&) = default;
+ A(A&& a): i(a.i) { a.i = 0; }
+};
+
+int main()
+{
+ A x;
+
+ auto y = [x] () mutable {
+ x.i++;
+ return x;
+ };
+
+ if (y().i != 43)
+ __builtin_abort ();
+
+ if (y().i != 44)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C
new file mode 100644
index 000000000..973f8a780
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C
@@ -0,0 +1,55 @@
+// PR c++/56039
+// { dg-do compile { target c++11 } }
+
+template <bool> struct BoolSink { typedef void type; };
+
+template <typename T, typename U>
+struct AddRvalueReferenceImpl { typedef T type; };
+
+template <typename T>
+struct AddRvalueReferenceImpl<T, typename BoolSink<false &&
+ [] {
+ extern T &&tref;
+ }>::type> { // { dg-error "lambda" }
+ typedef T &&type;
+};
+
+template <typename T>
+struct AddRvalueReference : AddRvalueReferenceImpl<T, void> { };
+
+namespace ImplHelpers {
+ template <typename T>
+ typename AddRvalueReference<T>::type create(void) { }
+}
+
+template <typename T, typename U, typename ...Args>
+struct IsConstructibleImpl { enum { value = 0 }; };
+
+template <typename T, typename ...Args>
+struct IsConstructibleImpl<T, typename BoolSink<false &&
+ [] {
+ T t( ::ImplHelpers::create<Args>() ...);
+ }>::type, Args ...> { // { dg-error "lambda" }
+ enum { value = 1 };
+};
+
+template <typename T, typename ...Args>
+struct IsConstructible : IsConstructibleImpl<T, void, Args ...> { };
+
+struct DestroyMe {
+ ~DestroyMe() = delete;
+};
+
+static_assert(+IsConstructible<int>::value, "error");
+static_assert(!IsConstructible<void>::value, "error");
+static_assert(+IsConstructible<int [1]>::value, "error");
+static_assert(!IsConstructible<DestroyMe>::value, "error");
+static_assert(!IsConstructible<int *, char *>::value, "error");
+
+static_assert(+IsConstructible<int &&, int>::value, "error");
+static_assert(!IsConstructible<int &&, int &>::value, "error");
+static_assert(+IsConstructible<int &&, int &&>::value, "error");
+
+// { dg-prune-output "expected" }
+// { dg-prune-output "does not name a class" }
+// { dg-prune-output "static assertion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C
new file mode 100644
index 000000000..fcfc39e3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C
@@ -0,0 +1,10 @@
+// PR c++/55357
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wshadow" }
+
+int main() {
+ int x = 1; // { dg-message "shadowed" }
+ auto const lambda = [](int x) { // { dg-warning "shadows" }
+ return x;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C
new file mode 100644
index 000000000..6c042ca67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wshadow" }
+
+struct A
+{
+ int i;
+ void f()
+ {
+ [=]{ int i; }; // { dg-warning "shadows" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C
new file mode 100644
index 000000000..a410384a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C
@@ -0,0 +1,21 @@
+// Test using std::function wrapper.
+// { dg-do run { target c++11 } }
+
+#include <functional>
+
+typedef std::function<int()> FN;
+
+template<typename T>
+FN f(T fn)
+{
+ return [fn]{return fn(2);};
+}
+
+int main()
+{
+ auto fn = f([](int i){return i*21;});
+
+ if (fn() != 42)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C
new file mode 100644
index 000000000..1cac211dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C
@@ -0,0 +1,26 @@
+// PR c++/49867
+// { dg-do compile { target c++11 } }
+
+int
+main ()
+{
+ void (*l)();
+ while (true)
+ {
+ switch (3)
+ {
+ struct A {
+ void f()
+ {
+ case 4: // { dg-error "case" }
+ break; // { dg-error "break" }
+ }
+ };
+ l = []()
+ {
+ case 3: // { dg-error "case" }
+ break; // { dg-error "break" }
+ };
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C
new file mode 100644
index 000000000..cb3ca94eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C
@@ -0,0 +1,5 @@
+// PR c++/46124
+// { dg-do compile { target c++11 } }
+
+void foo() { [] () -> void (); } // { dg-error "returning a function" "returning" }
+// { dg-error "expected .\{" "expected" { target *-*-* } 4 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C
new file mode 100644
index 000000000..66cc7a4e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C
@@ -0,0 +1,40 @@
+// { dg-do run { target c++11 } }
+
+extern "C" void abort();
+
+template <class T>
+auto apply (T t) -> decltype (t())
+{
+ return t();
+}
+
+template <class T>
+T f(T t)
+{
+ T t2 = t;
+ if (t != [=]()->T { return t; }())
+ abort ();
+ if (t != [=] { return t; }())
+ abort ();
+ if (t != [=] { return t2; }())
+ abort ();
+ if (t != [&] { return t; }())
+ abort ();
+ if (t != apply([=]{return t;}))
+ abort ();
+
+ int i;
+ [&] (int a) { return a+i+t; } (0);
+ [&] (int a) -> decltype(a) { return a+i+t; } (0);
+ [&] (int a) -> decltype(i) { return a+i+t; } (0);
+ [&] (int a) -> decltype(t) { return a+i+t; } (0);
+ [&] (int a) -> decltype(a+i) { return a+i+t; } (0);
+ [&] (int a) -> decltype(a+t) { return a+i+t; } (0);
+ [&] (int a) -> decltype(i+t) { return a+i+t; } (0);
+ [&] (int a) -> decltype(a+i+t) { return a+i+t; } (0);
+}
+
+int main()
+{
+ f(0xbeef);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C
new file mode 100644
index 000000000..4fcc96527
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C
@@ -0,0 +1,23 @@
+// PR c++/50276
+// { dg-options "-Wuninitialized" }
+// { dg-do run { target c++11 } }
+
+template<typename T>
+unsigned testfun(const T& func)
+{
+ return func();
+}
+
+template<int i>
+unsigned test()
+{
+ if (unsigned value = testfun( [] () { return 0; }))
+ return value;
+ return i;
+}
+
+int main()
+{
+ if (test<42>() != 42)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C
new file mode 100644
index 000000000..520b80488
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C
@@ -0,0 +1,25 @@
+// PR c++/56915
+// { dg-require-effective-target c++11 }
+
+template <typename T>
+class A
+{
+ typename T::type b(); // { dg-error "int" }
+};
+
+template <typename T, typename U>
+void waldo(T, U) {}
+
+template <typename T>
+void bar()
+{
+ waldo([](A<T> a){ return a; },
+ []{});
+}
+
+int main()
+{
+ bar<int>();
+}
+
+// { dg-prune-output "used but never defined" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C
new file mode 100644
index 000000000..635af97d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C
@@ -0,0 +1,19 @@
+// PR c++/57568
+// { dg-require-effective-target c++11 }
+
+template < class T >
+struct remove_reference
+{ typedef int type; };
+template < class T >
+class X
+{
+ enum Q { };
+ bool f ()
+ {
+ Q a;
+ [&a]{
+ typename remove_reference < decltype (a) >::type t;
+ };
+ }
+};
+template class X< int >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C
new file mode 100644
index 000000000..29f63afe0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C
@@ -0,0 +1,20 @@
+// PR c++/47049
+// { dg-do compile { target c++11 } }
+
+enum { E = 0, F = 1 };
+template <int N, int M = ((N == 1) ? F : E)> class S {};
+template <int N>
+struct T
+{
+ static void
+ foo (S<N> *p)
+ {
+ S<N> u;
+ [&u] ()->bool {} ();
+ }
+};
+
+int main()
+{
+ T<0>().foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C
new file mode 100644
index 000000000..dea9e0e4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C
@@ -0,0 +1,33 @@
+// PR c++/49554
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+ struct base
+ {
+ struct iterator { };
+
+ iterator begin();
+ };
+
+template<typename T>
+class flist : public base<T>
+{
+ typedef base<T> Base;
+
+ typedef typename Base::iterator Base_iterator;
+public:
+
+ void
+ resize()
+ {
+ Base_iterator b = Base::begin();
+
+ [b](int i) { return i; };
+ }
+};
+
+void test01()
+{
+ flist<int> fl;
+ fl.resize();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C
new file mode 100644
index 000000000..a65727a1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C
@@ -0,0 +1,42 @@
+// PR c++/51459
+// { dg-do run { target c++11 } }
+
+struct func {
+ virtual ~func() { }
+ virtual void operator()() const = 0;
+ virtual func* clone() const = 0;
+};
+
+template<typename T>
+struct funcimpl : func {
+ explicit funcimpl(T t) : t(t) { }
+ void operator()() const { t(); }
+ func* clone() const { return new funcimpl(*this); }
+ T t;
+};
+
+struct function
+{
+ func* p;
+
+ template<typename T>
+ function(T t) : p(new funcimpl<T>(t)) { }
+
+ ~function() { delete p; }
+
+ function(const function& f) : p(f.p->clone()) { }
+
+ function& operator=(const function& ) = delete;
+
+ void operator()() const { (*p)(); }
+};
+
+template <typename F>
+function animate(F f) { return [=]{ f(); }; }
+
+int main()
+{
+ function linear1 = []{};
+ function av(animate(linear1));
+ av();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C
new file mode 100644
index 000000000..b91b89ff3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C
@@ -0,0 +1,17 @@
+// PR c++/53137
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template <typename T> void f();
+
+ template <typename T> void g()
+ {
+ [this]{ f<T>(); }();
+ }
+
+ void h()
+ {
+ g<int>();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C
new file mode 100644
index 000000000..5e8561946
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C
@@ -0,0 +1,14 @@
+// PR c++/53821
+// { dg-final { scan-assembler-not "_ZZ1fIvEvvENKUlvE_cvPFvvEEv" } }
+// { dg-do compile { target c++11 } }
+
+template <class T> void f()
+{
+ auto g = []{};
+ g();
+}
+
+int main()
+{
+ f<void>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C
new file mode 100644
index 000000000..5b098d0df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C
@@ -0,0 +1,5 @@
+// PR c++/53783
+// { dg-do compile { target c++11 } }
+
+template <class T> void foo() { [] { [] {}; }; }
+int main() { foo<void>(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C
new file mode 100644
index 000000000..720941dbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C
@@ -0,0 +1,7 @@
+// PR c++/55680
+// { dg-do compile { target c++11 } }
+
+template <class T> struct X {
+ static void (* code ) ();
+};
+template <> void (* X<int>::code ) () = [](){};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C
new file mode 100644
index 000000000..c1d010ba1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C
@@ -0,0 +1,15 @@
+// PR c++/54276
+// { dg-do link { target c++11 } }
+
+template <typename T>
+void foo(T)
+{
+ static int x = 1;
+ auto f = [] { return x + 1; };
+ f();
+}
+
+int main()
+{
+ foo(4);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C
new file mode 100644
index 000000000..b32f8d7cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C
@@ -0,0 +1,13 @@
+// Test that implicit 'this' capture works, but that it's still an rvalue.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ void f()
+ {
+ [=] { i = 0; };
+ [&] { i = 0; };
+ [=] { this = 0; }; // { dg-error "lvalue" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C
new file mode 100644
index 000000000..b4b8e7201
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C
@@ -0,0 +1,4 @@
+// PR c++/54383
+// { dg-do compile { target c++11 } }
+
+auto foo = [&](int a) { return a > this->b; }; // { dg-error "this" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C
new file mode 100644
index 000000000..261829566
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C
@@ -0,0 +1,22 @@
+// PR c++/51494, c++/56222
+// Uses of static members and creating pointers to members aren't odr-uses
+// of 'this'.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ static void f() {}
+ static int i;
+ int j;
+ void f(int);
+
+ void foo()
+ {
+ [] () {
+ ++i;
+ f();
+ &A::j;
+ (void(*)())&A::f;
+ };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C
new file mode 100644
index 000000000..ef573b19e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C
@@ -0,0 +1,13 @@
+// Uses of 'this' in unevaluated context are not odr-uses.
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int f() {}
+ int i;
+
+ void foo()
+ {
+ [] () { sizeof(i); sizeof(f()); };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C
new file mode 100644
index 000000000..090d0a13e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C
@@ -0,0 +1,20 @@
+// PR c++/52374
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ int get() const { return 42; }
+};
+
+template<typename X>
+struct D
+ : public X
+{
+ int get() const { return [this]() -> int { return X::get(); }(); }
+};
+
+int main()
+{
+ D<B> d;
+ d.get();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C
new file mode 100644
index 000000000..9834bfdb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C
@@ -0,0 +1,49 @@
+// PR c++/52014
+// { dg-require-effective-target c++11 }
+
+template <class Iterator, class Func>
+void for_each(const Iterator first, const Iterator last, Func func)
+{
+ for (Iterator it = first; it != last; ++it) {
+ func(*it);
+ }
+}
+
+template <class T>
+struct helper
+{
+ typedef typename T::size_type type;
+};
+
+template <class T>
+struct helper<T&>
+{
+ typedef typename T::size_type type;
+};
+
+template <class T>
+struct helper<T*>
+{
+ typedef typename T::size_type type;
+};
+
+struct bar
+{
+ struct foo
+ {
+ typedef int size_type;
+ } foo_;
+
+ void test()
+ {
+ int arr[] = { 1, 2, 3 };
+ for_each(arr, arr + 3, [&](helper<foo>::type i) {
+ for_each(arr, arr + 3, [&](helper<decltype(foo_)>::type j) { });
+ });
+ }
+};
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C
new file mode 100644
index 000000000..d44bec949
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C
@@ -0,0 +1,12 @@
+// PR c++/56692
+// { dg-require-effective-target c++11 }
+
+struct Class {
+ void f () { }
+ static void f (int) { }
+};
+
+int main ()
+{
+ []{ Class::f(0); };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C
new file mode 100644
index 000000000..736d5f50e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C
@@ -0,0 +1,28 @@
+// PR c++/56699
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int a;
+};
+
+struct T
+{
+ int x;
+
+ T() : x([]{
+ sizeof(::A::a);
+ return 0;
+ }())
+ {}
+};
+
+struct B
+{
+ int a;
+};
+
+void f()
+{
+ []{sizeof(B::a);};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C
new file mode 100644
index 000000000..2386e6b1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C
@@ -0,0 +1,21 @@
+// PR c++/58481
+// { dg-require-effective-target c++11 }
+
+struct Test {
+ template<typename... Args> inline void triggerTest (Args&&... fargs) { }
+};
+
+struct TestPickled : Test {
+ template<typename... Args> void triggerTest (Args&&... fargs) {
+ [=](Args... as) {
+ Test::triggerTest (as...);
+ } ();
+ }
+};
+
+int main()
+{
+ TestPickled test;
+ test.triggerTest ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C
new file mode 100644
index 000000000..5029a4a76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C
@@ -0,0 +1,17 @@
+// PR c++/43856
+// Test for implicit 'this' capture via rewriting.
+// { dg-do compile { target c++11 } }
+
+struct S1 {
+ int operator()(int);
+ int i;
+ void g();
+ void f() {
+ [=]() {
+ i;
+ g();
+ S1::g();
+ operator()(42);
+ };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C
new file mode 100644
index 000000000..2defa9989
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C
@@ -0,0 +1,14 @@
+// PR c++/45520
+// { dg-do compile { target c++11 } }
+
+struct M {
+ int i;
+};
+
+struct S {
+ M m;
+
+ void f() {
+ auto lambda=[&](decltype(m.i) & i) { };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C
new file mode 100644
index 000000000..f14a2723d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C
@@ -0,0 +1,13 @@
+// PR c++/48523
+// { dg-do compile { target c++11 } }
+
+template<typename>
+struct X
+{
+ bool b;
+
+ void f()
+ {
+ [this]{ return b; };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C
new file mode 100644
index 000000000..897464164
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C
@@ -0,0 +1,22 @@
+// PR c++/53619
+// { dg-do run { target c++11 } }
+
+struct C {
+ int x;
+};
+struct B {
+ int q;
+};
+struct A : public B , C {
+ void foo();
+};
+
+void A::foo() {
+ auto k = [this]() {return (void *)(&x);};
+ if (k() != (void*)&x)
+ __builtin_abort();
+}
+
+int main(int l, char **) {
+ A a; a.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C
new file mode 100644
index 000000000..8c35126e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C
@@ -0,0 +1,32 @@
+// PR c++/53137
+// { dg-do compile { target c++11 } }
+
+template <typename STORE>
+void getParent(STORE& tStore)
+{
+}
+
+struct Store
+{
+ template <typename CheckParentFunc>
+ void updateChildCommon(CheckParentFunc c)
+ {
+ c();
+ }
+
+ template <typename T>
+ int& getStore();
+
+ template <typename T>
+ void updateChild(const T& obj)
+ {
+ updateChildCommon([this] () { getParent(getStore<T>()); });
+ }
+
+ void update(int obj);
+};
+
+void Store::update(int obj)
+{
+ updateChild(obj);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C
new file mode 100644
index 000000000..ee202032a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C
@@ -0,0 +1,11 @@
+// PR c++/54122
+// { dg-do compile { target c++11 } }
+
+enum E { F };
+
+template <typename A>
+struct C
+{
+ E e;
+ void f () { auto l = [&](void)->void { if (e == F) return; }; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C
new file mode 100644
index 000000000..d7c5d2c05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C
@@ -0,0 +1,37 @@
+// PR c++/56135
+// { dg-do run { target c++11 } }
+
+#include <functional>
+
+struct test {
+ template<typename T>
+ std::function<void()> broken(int x) {
+ return [=] { +x; print<T>(); };
+ }
+
+ std::function<void()> works0() {
+ return [=] { print<int>(); };
+ }
+
+ template<typename T>
+ std::function<void()> works1() {
+ return [=] { print<int>(); };
+ }
+
+ template<typename T>
+ std::function<void()> works2() {
+ return [=] { this->print<T>(); };
+ }
+
+ template<typename T>
+ void print() { if (this == 0) __builtin_abort (); }
+};
+
+int main(void) {
+ test().broken<int>(1)();
+ test().works0()();
+ test().works1<int>()();
+ test().works2<int>()();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C
new file mode 100644
index 000000000..07ddd0863
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C
@@ -0,0 +1,19 @@
+// PR c++/54277
+// { dg-do compile { target c++11 } }
+
+struct Used
+{
+ void foo() { }
+};
+
+template <typename>
+struct S
+{
+ Used x;
+
+ void bar()
+ {
+ auto f = [this] { x.foo(); };
+ f();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C
new file mode 100644
index 000000000..a0c17ad16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C
@@ -0,0 +1,74 @@
+// Every id-expression that is a use (_basic.def.odr_ 3.2) of an entity
+// captured by copy is transformed into an access to the corresponding
+// unnamed data member of the closure type.
+//...
+// Every occurrence of decltype((x)) where x is a possibly parenthesized
+// id-expression that names an entity of automatic storage duration is
+// treated as if x were transformed into an access to a corresponding data
+// member of the closure type that would have been declared if x were a use
+// of the denoted entity.
+
+// So, other appearances of 'x' within decltype do not refer to the closure
+// member, because they are not "use"s in the sense of 3.2.
+
+// { dg-do compile { target c++11 } }
+
+template<class T, class U>
+struct same_type;
+template <class T>
+struct same_type<T,T> { };
+
+int main()
+{
+ int i;
+ [=] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int const&>();
+ i+1;
+ same_type<decltype((i)),int const&>();
+ same_type<decltype(i),int>();
+ };
+ [=] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int const&>();
+ same_type<decltype(i),int>();
+ };
+ [=] () mutable {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ same_type<decltype(i),int>();
+ };
+ [&] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ same_type<decltype(i),int>();
+ };
+ [i] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int const&>();
+ };
+ [&,i] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int const&>();
+ };
+ [i] () mutable {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ };
+ [&,i] () mutable {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ };
+ [&i] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ };
+ [=,&i] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int &>();
+ };
+ [] {
+ same_type<decltype(i),int>();
+ same_type<decltype((i)),int const&>(); // { dg-error "" "not captured" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C
new file mode 100644
index 000000000..e1d1b5041
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C
@@ -0,0 +1,26 @@
+// PR c++/54975
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct identity
+{
+ typedef T type;
+};
+
+template<typename T>
+void f()
+{
+ typedef typename T::type A;
+ int i = 42;
+ int const &cri = i;
+ int volatile &vri = i;
+ [&]() {
+ A const &x = cri; // Problem here
+ A volatile &y = vri; // Likewise
+ };
+}
+
+int main()
+{
+ f<identity<int> >();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C
new file mode 100644
index 000000000..898f685aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C
@@ -0,0 +1,7 @@
+// 5.1.2/2: A lambda-expression shall not appear in an unevaluated operand.
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A { };
+A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C
new file mode 100644
index 000000000..73677c0e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+int main(int argc, char** argv)
+{
+ int i;
+ int &ir = i;
+ const int ci = 1;
+ const int &cir = ci;
+
+ [] { sizeof (argc); sizeof (i); sizeof (ir); sizeof (ci); sizeof (cir); };
+ [] { int ia[ci]; };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C
new file mode 100644
index 000000000..96af09c5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C
@@ -0,0 +1,12 @@
+// PR c++/50224
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-parameter" }
+
+struct T;
+
+void m(T& t) // ERROR here
+{
+ [&]{
+ t; // ``t`` is referenced here
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C
new file mode 100644
index 000000000..e85f2bcff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C
@@ -0,0 +1,15 @@
+// PR c++/49672
+// { dg-do compile { target c++11 } }
+
+template<typename ... Args>
+static void foo()
+{
+ [](Args..., int x) {
+ x;
+ };
+}
+
+int main()
+{
+ foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C
new file mode 100644
index 000000000..fab1f6ca6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C
@@ -0,0 +1,57 @@
+// { dg-do run { target c++11 } }
+
+int g() { return 0; }
+template <class T, class... U>
+int g(T t, U... u)
+{
+ return t + g(u...);
+}
+
+template <class... T>
+int f1(T... t)
+{
+ return [t...] {
+ return g(t...);
+ }();
+}
+
+template <class... T>
+int f2(T... t)
+{
+ return [&t...] {
+ return g(t...);
+ }();
+}
+
+template <class... T>
+int f3(T... t)
+{
+ return [=] {
+ return g(t...);
+ }();
+}
+
+template <class... T>
+int f4(T... t)
+{
+ return [&] {
+ return g(t...);
+ }();
+}
+
+#define assert(E) do { if (!(E)) __builtin_abort(); } while(0)
+int main()
+{
+ assert (f1() == 0);
+ assert (f2() == 0);
+ assert (f3() == 0);
+ assert (f4() == 0);
+ assert (f1(42) == 42);
+ assert (f2(42) == 42);
+ assert (f3(42) == 42);
+ assert (f4(42) == 42);
+ assert (f1(1,2,3) == 6);
+ assert (f2(1,2,3) == 6);
+ assert (f3(1,2,3) == 6);
+ assert (f4(1,2,3) == 6);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C
new file mode 100644
index 000000000..f86c4b6d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C
@@ -0,0 +1,9 @@
+// PR c++/41920
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall -Wextra" }
+
+int foo(int i)
+{
+ auto bar = [=](){ return i; };
+ return bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C
new file mode 100644
index 000000000..6542392ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C
@@ -0,0 +1,8 @@
+// PR c++/42370
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+
+void foo()
+{
+ []{ return 0; }();
+} // { dg-bogus "no return statement" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C
new file mode 100644
index 000000000..5c5b24c13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C
@@ -0,0 +1,13 @@
+// PR c++/49482
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-but-set-parameter" }
+
+template<class T>
+void f() {
+ []( bool b ){ return b; };
+}
+
+int main()
+{
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C
new file mode 100644
index 000000000..059c198ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C
@@ -0,0 +1,8 @@
+// PR c++/52845
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+
+void f()
+{
+ [](){};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C
new file mode 100644
index 000000000..52858687e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C
@@ -0,0 +1,33 @@
+// DR 743: A type without linkage shall not be used as the type of a
+// variable or function with linkage, unless
+// o the variable or function has extern "C" linkage (7.5 [dcl.link]), or
+// o the variable or function is not used (3.2 [basic.def.odr]) or is
+// defined in the same translation unit.
+
+// { dg-do compile { target c++11 } }
+
+template <typename T> struct B {
+ void g(T){}
+ void h(T); // { dg-error "never defined" }
+ friend void i(B, T){}
+ static T t1; // { dg-error "never defined" }
+ static T t2;
+};
+
+template <typename T> T B<T>::t2 = { };
+
+enum { E1 } e1; // OK, defined
+extern enum { E2 } e2; // { dg-error "never defined" }
+extern "C" enum { E3 } e3; // OK, extern "C"
+
+void f() {
+ struct A { int x; }; // no linkage
+ A a = {1};
+ B<A> ba; // declares B<A>::g(A) and B<A>::h(A)
+ ba.t1 = a; // error, B<T>::t never defined
+ ba.t2 = a; // OK
+ ba.g(a); // OK
+ ba.h(a); // error, B<T>::h never defined
+ i(ba, a); // OK
+ e1+e2+e3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C
new file mode 100644
index 000000000..588149a2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C
@@ -0,0 +1,31 @@
+// PR c++/51884
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_ZN1BIZN3fooIivE3barILb1EEEvvE1CEC1ERKS4_" } }
+
+template<typename TT>
+ struct test { static const int value = 0; };
+template<int I>
+ struct enable_if { typedef void type; };
+
+struct A { virtual void f() {} };
+template<typename U> struct B : A { B(); B(const B&); };
+template<typename U> B<U>::B() { }
+template<typename U> B<U>::B(const B&) { }
+
+template<class T> void g(T) { }
+
+template<typename T, typename = void> struct foo;
+template<typename T>
+struct foo<T,typename enable_if<test<T>::value>::type>
+{
+ template <bool P> void bar() {
+ struct C { } c;
+ B<C> b;
+ g(b);
+ }
+};
+
+int main() {
+ foo<int> f;
+ f.bar<true>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C
new file mode 100644
index 000000000..6a602c641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+void foo()
+{
+ long long x = 17;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C
new file mode 100644
index 000000000..5b9b17ebe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+#include <utility>
+
+class A { };
+
+static void g ( A && ) { }
+
+template < class T > class B {
+public:
+ void f ( ) {
+ A a;
+ g ( std :: move ( a ) );
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C
new file mode 100644
index 000000000..7bd209339
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C
@@ -0,0 +1,41 @@
+// { dg-do link { target c++11 } }
+
+template<typename _Tp>
+inline _Tp&&
+movel(_Tp& __t)
+{ return static_cast<_Tp&&>(__t); }
+
+struct S {};
+struct T
+{
+ T(S && s_) : s(movel(s_)) {}
+ S && get() { return movel(s); }
+ operator S&&() { return movel(s); }
+ S && s;
+ S s2;
+};
+
+void named(S const &) {}
+void named(S&&);
+
+void unnamed(S const &);
+void unnamed(S&&) {}
+
+void f(S && p)
+{
+ S && s(movel(p));
+ T t(movel(s));
+
+ named(s); // variable reference
+ named(p); // parameter reference
+ named(t.s); // class member access
+
+ unnamed(t.get()); // function return
+ unnamed(t); // implicit conversion
+ unnamed(static_cast<S&&>(s)); // cast to rvalue
+ unnamed(static_cast<T&&>(t).s2); // cast to rvalue
+}
+
+int main()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C
new file mode 100644
index 000000000..850179c42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C
@@ -0,0 +1,28 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test: Named rvalue references are treated as lvalues.
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+
+struct A {};
+
+one foo(const A&) {return one();}
+two foo(A&&) {return two();}
+
+int test1(A&& a)
+{
+ sa<sizeof(foo(a)) == 1 * sizeof(long)> t1;
+ return 0;
+}
+
+int main()
+{
+ return test1(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C
new file mode 100644
index 000000000..2f002db37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C
@@ -0,0 +1,8 @@
+// PR c++/52216
+// { dg-require-effective-target c++11 }
+
+#include <new>
+
+int n;
+
+static_assert(!noexcept(::new (std::nothrow) int[n]), "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C
new file mode 100644
index 000000000..9f425354b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C
@@ -0,0 +1,84 @@
+// Test for noexcept-expression
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2" }
+
+#include <typeinfo>
+
+#define SA(X) static_assert(X, #X)
+
+void f();
+void g() throw();
+SA(noexcept(g()));
+SA(!noexcept(f()));
+SA(!noexcept(throw 1));
+SA(noexcept(42));
+
+struct A
+{
+ virtual ~A();
+};
+
+struct B: public A
+{
+ virtual ~B();
+};
+
+A* ap;
+
+struct C { };
+C* cp;
+
+SA (noexcept (dynamic_cast<B*>(ap)));
+SA (!noexcept (dynamic_cast<B&>(*ap)));
+SA (!noexcept (typeid (*ap)));
+SA (noexcept (typeid (*cp)));
+
+SA (!noexcept (true ? 1 : throw 1));
+SA (!noexcept (true || true ? 1 : throw 1));
+
+SA (noexcept (C()));
+
+struct D
+{
+ D() throw();
+};
+
+SA (noexcept (D()));
+
+struct E
+{
+ E() throw();
+ ~E();
+};
+
+SA (noexcept (E()));
+
+struct F
+{
+ virtual void f();
+};
+
+SA (noexcept (F()));
+
+struct G
+{
+ G() = default;
+ ~G() = default;
+};
+
+SA (noexcept (G()));
+
+template <class T, bool b>
+void tf()
+{
+ SA (noexcept (T()) == b);
+}
+
+template void tf<int,true>();
+template void tf<E, true>();
+
+// Make sure that noexcept uses the declared exception-specification, not
+// any knowledge we might have about whether or not the function really
+// throws.
+void h() { }
+SA(!noexcept(h()));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C
new file mode 100644
index 000000000..5d5867af6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C
@@ -0,0 +1,54 @@
+// Test for noexcept-specification
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X, #X)
+
+void f();
+void f() noexcept(false);
+void f() noexcept(1 == 0);
+void f();
+
+SA(!noexcept(f()));
+
+void g() throw (int); // { dg-error "previous declaration" }
+void g() noexcept(false); // { dg-error "different exception" }
+void g();
+
+void h() throw();
+void h() noexcept;
+void h() throw();
+void h() noexcept;
+
+template <class T>
+void g (T) noexcept(noexcept(T())); // { dg-error "previous declaration" }
+template <class T>
+void g (T) noexcept(noexcept(T(0))); // { dg-error "different exception" }
+
+template <class T>
+void f (T) noexcept(noexcept(T()) && noexcept(T()));
+template <class T>
+void f (T) noexcept(noexcept(T()) && noexcept(T()));
+template <class T>
+void f2(T a) noexcept (noexcept (f (a)));
+
+struct A { A(); };
+SA(noexcept(f(1)));
+SA(!noexcept(f(A())));
+SA(noexcept(f2(1)));
+SA(!noexcept(f2(A())));
+
+template <class... Ts>
+void f3(Ts... ts) noexcept (noexcept (f(ts...)));
+
+SA(noexcept(f3(1)));
+SA(!noexcept(f3(A())));
+
+template <class T1, class T2>
+void f (T1, T2) noexcept(noexcept(T1(), T2()));
+
+struct B { };
+
+SA(noexcept(f3(1,B())));
+SA(!noexcept(f3(1,A())));
+SA(!noexcept(f3(A(),1)));
+SA(!noexcept(f3(A(),A())));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
new file mode 100644
index 000000000..2d378677b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
@@ -0,0 +1,52 @@
+// Runtime test for noexcept-specification.
+// { dg-options "-Wnoexcept" }
+// { dg-do run { target nonpic } }
+// { dg-require-effective-target c++11 }
+
+#include <exception>
+#include <cstdlib>
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void my_unexpected ()
+{
+ throw;
+}
+
+void g() { throw 1; }
+void (*p)() = g;
+void f () noexcept (false)
+{
+ p();
+}
+
+template <class T>
+void f(T) noexcept (noexcept (T())) // { dg-warning "false" }
+{
+ p();
+}
+
+template <class T>
+void f2(T a) noexcept (noexcept (f (a)))
+{
+ f(a);
+}
+
+struct A { A() { } }; // { dg-warning "does not throw" }
+
+int main()
+{
+ // noexcept(false) allows throw.
+ try { f(); } catch (int) { }
+ // noexcept(noexcept(A())) == noexcept(false).
+ try { f(A()); } catch (int) { }
+ try { f2(A()); } catch (int) { }
+
+ std::set_terminate (my_terminate);
+ // noexcept(noexcept(int())) == noexcept(true).
+ try { f2(1); } catch (...) { }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C
new file mode 100644
index 000000000..56ea1f48b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C
@@ -0,0 +1,30 @@
+// Make sure that we call terminate when a noexcept spec is violated.
+// The function pointers are there to make sure that
+// the compiler doesn't get clever about optimizing the calls based on
+// knowledge about the called functions.
+
+// { dg-do run { target c++11 } }
+
+#include <exception>
+#include <cstdlib>
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void g() { throw 1; }
+void (*p1)() = g;
+void f() noexcept { p1(); }
+void (*p2)() = f;
+void h() { p2(); }
+
+int main()
+{
+ std::set_terminate (my_terminate);
+
+ try { h(); }
+ catch (int) { }
+
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C
new file mode 100644
index 000000000..a6c425dc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C
@@ -0,0 +1,19 @@
+// Make sure that we force an LSDA for a noexcept spec so
+// that the personality routine will call terminate. Also check that we
+// optimize away the EH cleanup for var because the personality routine
+// will call terminate before unwinding: there should not be an EH region
+// (i.e. LEHB/LEHE labels) around the call to g().
+
+// { dg-final { scan-assembler-not "_ZSt9terminatev" } }
+// { dg-final { scan-assembler-not "EHB" } }
+// { dg-final { scan-assembler "LSDA" } }
+
+// { dg-do compile { target c++11 } }
+
+struct A { ~A(); };
+void g();
+void f() noexcept
+{
+ A var;
+ g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C
new file mode 100644
index 000000000..7e1db661e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C
@@ -0,0 +1,29 @@
+// Test that checking of a nothrow specification uses the one on the
+// definition.
+// { dg-do run { target c++11 } }
+
+#include <exception>
+#include <cstdlib>
+
+void my_unexpected ()
+{
+ std::abort ();
+}
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void f() throw();
+void f() noexcept
+{
+ throw 1;
+}
+
+int main()
+{
+ std::set_unexpected (my_unexpected);
+ std::set_terminate (my_terminate);
+ f();
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C
new file mode 100644
index 000000000..90c50a9c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C
@@ -0,0 +1,24 @@
+// Test that checking of a nothrow specification uses the one on the
+// definition.
+// { dg-do run { target c++11 } }
+
+#include <exception>
+#include <cstdlib>
+
+void my_unexpected ()
+{
+ std::exit (0);
+}
+
+void f() noexcept;
+void f() throw()
+{
+ throw 1;
+}
+
+int main()
+{
+ std::set_unexpected (my_unexpected);
+ f();
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C
new file mode 100644
index 000000000..96af0feb8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C
@@ -0,0 +1,56 @@
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "overriding" }
+
+struct A
+{
+ virtual void f();
+ virtual void g() throw();
+ virtual void h() noexcept;
+ virtual void i() noexcept(false);
+ virtual void j() throw(int);
+};
+
+struct B: A
+{
+ void f() noexcept;
+ void g() noexcept;
+ void h() noexcept;
+ void i() noexcept;
+ void j() noexcept;
+};
+
+struct C: A
+{
+ void f() throw();
+ void g() throw();
+ void h() throw();
+ void i() throw();
+ void j() throw();
+};
+
+struct D: A
+{
+ void f() noexcept(false);
+ void g() noexcept(false); // { dg-error "looser" }
+ void h() noexcept(false); // { dg-error "looser" }
+ void i() noexcept(false);
+ void j() noexcept(false); // { dg-error "looser" }
+};
+
+struct E: A
+{
+ void f() throw(int);
+ void g() throw(int); // { dg-error "looser" }
+ void h() throw(int); // { dg-error "looser" }
+ void i() throw(int);
+ void j() throw(int);
+};
+
+struct F: A
+{
+ void f();
+ void g(); // { dg-error "looser" }
+ void h(); // { dg-error "looser" }
+ void i();
+ void j(); // { dg-error "looser" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C
new file mode 100644
index 000000000..d26a3aeab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C
@@ -0,0 +1,15 @@
+// Test that -Wnoexcept works with templates
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wnoexcept" }
+
+template <class T>
+T f (T t) { return t; } // { dg-warning "does not throw" }
+
+#define SA(X) static_assert(X, #X)
+
+SA (!noexcept(f(1))); // { dg-warning "noexcept" }
+
+int main()
+{
+ f(1); // Use f(int) so it gets instantiated
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C
new file mode 100644
index 000000000..b80228278
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C
@@ -0,0 +1,27 @@
+// PR c++/49082
+// { dg-do compile { target c++11 } }
+
+namespace std { template <class T> T&& declval() noexcept; }
+
+struct Base
+{
+ Base(const Base&) noexcept(false);
+ Base(Base&&) noexcept(false);
+ ~Base() noexcept(false);
+};
+
+struct Derived
+: Base
+{
+ // Derived(const Derived&) = default;
+ // Derived(Derived&&) = default;
+};
+
+static_assert(!noexcept(Base(std::declval<const Base&>())), "Error");
+static_assert(!noexcept(Derived(std::declval<const Derived&>())), "Error"); // Error
+
+static_assert(!noexcept(Base(std::declval<Base&&>())), "Error");
+static_assert(!noexcept(Derived(std::declval<Derived&&>())), "Error"); // Error
+
+static_assert(!noexcept(std::declval<Base&>().~Base()), "Error"); // OK
+static_assert(!noexcept(std::declval<Derived&>().~Derived()), "Error"); // Error
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C
new file mode 100644
index 000000000..6597f4087
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C
@@ -0,0 +1,53 @@
+// PR c++/49107
+// { dg-do compile { target c++11 } }
+
+template<typename _Tp>
+_Tp declval() noexcept;
+
+template<typename _Tp , typename = decltype(_Tp(declval<_Tp&&>()))>
+struct trait
+{
+ static const bool value=true;
+};
+
+template<class _T2>
+struct pair
+{
+ _T2 second;
+ void swap(pair& __p)
+ noexcept(trait<_T2>::value);
+};
+
+template < class R_ >
+struct Main
+{
+ Main() {}
+ Main(const typename R_::Sub1T& r) ;
+ Main(const typename R_::Sub2T& l) ;
+};
+
+template < class R_ >
+class Sub1
+{
+ typedef pair<typename R_::MainT> Rep;
+ Rep base;
+};
+
+template < class R_ >
+struct Sub2
+{
+ typedef pair<typename R_::MainT> Rep;
+ Rep base;
+};
+
+struct Kernel
+{
+ typedef Main<Kernel> MainT;
+ typedef Sub1<Kernel> Sub1T;
+ typedef Sub2<Kernel> Sub2T;
+};
+
+Main<Kernel> f()
+{
+ return Main<Kernel> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C
new file mode 100644
index 000000000..185364b0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C
@@ -0,0 +1,11 @@
+// Test that we handle merging with deferred noexcept.
+// { dg-do compile { target c++11 } }
+
+template <class U>
+struct O
+{
+ template <class T>
+ void f() noexcept(noexcept(T()));
+};
+
+template<> template<> void O<int>::f<int>() noexcept { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C
new file mode 100644
index 000000000..e52e9a004
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C
@@ -0,0 +1,78 @@
+// PR c++/49107
+// { dg-do compile { target c++11 } }
+
+namespace std
+{
+ template<typename _Tp> _Tp&& declval() noexcept;
+
+ struct true_type { static const bool value = true; };
+ struct false_type { static const bool value = false; };
+
+ template<typename _Tp, typename _Arg>
+ struct __is_direct_constructible_impl
+ {
+ template<typename _Tp2, typename _Arg2, typename
+ = decltype(::new _Tp2(declval<_Arg2>()))>
+ static true_type __test(int);
+
+ template<typename, typename>
+ static false_type __test(...);
+
+ typedef decltype(__test<_Tp, _Arg>(0)) type;
+ };
+
+ template<typename _Tp, typename _Arg>
+ struct __is_direct_constructible_new_safe
+ : public __is_direct_constructible_impl<_Tp, _Arg>::type
+ { };
+
+ template<class _T1, class _T2>
+ struct pair
+ {
+ pair() = default;
+ constexpr pair(const pair&) = default;
+
+ pair(pair&& __p)
+ noexcept(__is_direct_constructible_new_safe<_T2,_T2&&>::value);
+ };
+}
+
+template <class R_>
+struct Vector3
+{
+ typedef typename R_::Ray_3 Ray_3;
+ Vector3() {}
+ explicit Vector3(const Ray_3& r);
+};
+
+template < class R_ > class LineC3
+{
+ typedef typename R_::Vector_3 Vector_3;
+ std::pair<int, Vector_3> x;
+};
+
+template < class R_ > class RayH3
+{
+ typedef typename R_::Vector_3 Vector_3;
+ std::pair<int, Vector_3> x;
+};
+
+template <typename Kernel >
+struct Homogeneous_base
+{
+ typedef LineC3<Kernel> Line_3;
+ typedef RayH3<Kernel> Ray_3;
+};
+
+template < typename RT_>
+struct Simple_homogeneous
+: public Homogeneous_base< Simple_homogeneous<RT_> >
+{
+ typedef Vector3<Simple_homogeneous<RT_> > Vector_3;
+};
+
+int main()
+{
+ typedef Simple_homogeneous<double> R;
+ R::Line_3 l3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C
new file mode 100644
index 000000000..913f2ef55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C
@@ -0,0 +1,4 @@
+// PR c++/50309
+// { dg-do compile { target c++11 } }
+
+void foo () noexcept () { } // { dg-error "expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C
new file mode 100644
index 000000000..909ee9748
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C
@@ -0,0 +1,34 @@
+// PR c++/50391
+// { dg-do compile { target c++11 } }
+
+#include <type_traits>
+
+template<class Tp>
+ struct single
+ {
+ Tp elem; // { dg-error "incomplete type" }
+
+ constexpr single(const Tp& e)
+ : elem(e) { }
+
+ single(single&& s)
+ noexcept(std::is_nothrow_move_constructible<Tp>::value)
+ : elem(s.elem) { }
+ };
+
+template<class Tp>
+ constexpr single<typename std::decay<Tp>::type>
+ make_single(Tp&& x)
+ {
+ return single<typename std::decay<Tp>::type>(x);
+ }
+
+class Blob; // { dg-error "forward declaration" }
+
+void
+foo(Blob *b)
+{
+ make_single(*b);
+}
+
+// { dg-prune-output "include" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C
new file mode 100644
index 000000000..10e0be958
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C
@@ -0,0 +1,130 @@
+// PR c++/50972
+// { dg-do compile { target c++11 } }
+// Ignore all errors, we're just testing that this doesn't ICE
+// { dg-prune-output "error" }
+
+namespace std
+typedef long unsigned int size_t;
+template<typename...>
+struct __and_;
+template<typename _Tp>
+struct is_nothrow_move_constructible
+{
+};
+template<typename _Tp>
+struct is_nothrow_move_assignable
+struct __add_rvalue_reference_helper<_Tp, true>
+{ typedef _Tp&& type; };
+template<typename _Tp>
+struct add_rvalue_reference
+ : public __add_rvalue_reference_helper<_Tp>
+{
+};
+template<typename _Tp>
+inline typename add_rvalue_reference<_Tp>::type
+declval() noexcept
+{
+}
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+template<typename _Tp>
+class new_allocator
+{
+};
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+class allocator: public __gnu_cxx::new_allocator<_Tp>
+{
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+};
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+template<typename _Alloc, typename _Tp>
+struct __alloctr_rebind<_Alloc, _Tp, true>
+{
+ typedef typename _Alloc::template rebind<_Tp>::other __type;
+};
+template<typename _Alloc>
+struct allocator_traits
+{
+ template<typename _Tp>
+ struct __rebind_alloc
+ {
+ typedef typename __alloctr_rebind<_Alloc, _Tp>::__type __type;
+ };
+}
+ }
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+template<typename _Alloc>
+struct __alloc_traits
+{
+ typedef std::allocator_traits<_Alloc> _Base_type;
+ static constexpr bool _S_nothrow_swap()
+ {
+ return !_S_propagate_on_swap()
+ || noexcept(swap(std::declval<_Alloc&>(), std::declval<_Alloc&>()));
+ }
+ template<typename _Tp>
+ struct rebind
+ { typedef typename _Base_type::template __rebind_alloc<_Tp>::__type other; };
+};
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+template<typename _Tp, typename _Alloc>
+struct _Vector_base
+{
+ typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
+ rebind<_Tp>::other _Tp_alloc_type;
+};
+template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
+class vector : protected _Vector_base<_Tp, _Alloc>
+{
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
+ swap(vector& __x)
+ noexcept(_Alloc_traits::_S_nothrow_swap());
+};
+}
+namespace lexertl
+namespace detail
+}
+namespace detail
+template<typename id_type>
+struct basic_internals
+{
+ typedef std::vector<id_type> id_type_vector;
+};
+};
+template<typename char_type, typename id_type = std::size_t>
+class basic_state_machine
+{
+ typedef detail::basic_internals<id_type> internals;
+ void minimise ()
+ {
+ minimise_dfa (dfa_alphabet_, *dfa_, size_);
+ }
+ typedef typename internals::id_type_vector id_type_vector;
+ void minimise_dfa (const id_type dfa_alphabet_,
+ id_type_vector &dfa_, std::size_t size_)
+ {
+ id_type_vector new_dfa_ (front_, front_ + dfa_alphabet_);
+ dfa_.swap (new_dfa_);
+ }
+}
+ }
+namespace std __attribute__ ((__visibility__ ("default")))
+template<typename _Tp>
+void
+swap(_Tp&, _Tp&)
+ noexcept(__and_<is_nothrow_move_constructible<_Tp>,
+ is_nothrow_move_assignable<_Tp>>::value)
+ ;
+typedef lexertl::basic_state_machine<char32_t> lexstate;
+lexstate m_state_machine;
+GenerateLexer()
+{
+ m_state_machine.minimise();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C
new file mode 100644
index 000000000..b27acefcd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C
@@ -0,0 +1,54 @@
+// PR c++/50043
+// { dg-do compile { target c++11 } }
+
+struct True1 {};
+struct True2 { ~True2(); };
+struct True3 { ~True3(){ throw 0; } };
+struct False { ~False() noexcept(false); };
+
+template <typename Base>
+struct A : Base
+{
+};
+
+template <typename Member>
+struct B
+{
+ Member mem;
+};
+
+template <typename Base, typename Member>
+struct C : Base
+{
+ Member mem;
+};
+
+#define SA(X) static_assert(X, #X)
+
+SA( noexcept(True1()));
+SA( noexcept(True2()));
+SA( noexcept(True3()));
+SA(!noexcept(False()));
+
+SA( noexcept(A<True1>()));
+SA( noexcept(A<True2>()));
+SA( noexcept(A<True3>()));
+SA(!noexcept(A<False>()));
+
+SA( noexcept(B<True1>()));
+SA( noexcept(B<True2>()));
+SA( noexcept(B<True3>()));
+SA(!noexcept(B<False>()));
+
+SA( noexcept(C<True1, True2>()));
+SA( noexcept(C<True1, True3>()));
+SA( noexcept(C<True2, True3>()));
+SA( noexcept(C<True2, True1>()));
+SA( noexcept(C<True3, True1>()));
+SA( noexcept(C<True3, True2>()));
+SA(!noexcept(C<False, True1>()));
+SA(!noexcept(C<False, True2>()));
+SA(!noexcept(C<False, True3>()));
+SA(!noexcept(C<True1, False>()));
+SA(!noexcept(C<True2, False>()));
+SA(!noexcept(C<True3, False>()));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C
new file mode 100644
index 000000000..e851b8600
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C
@@ -0,0 +1,10 @@
+// PR c++/54207
+// { dg-do compile { target c++11 } }
+
+typedef bool B;
+constexpr B foo () { return true; }
+
+void
+bar () noexcept (foo ())
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C
new file mode 100644
index 000000000..d303a8c60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C
@@ -0,0 +1,28 @@
+// PR c++/55652
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct A
+{
+ static const bool a = false;
+};
+
+template <typename X, typename Y = A <X>>
+struct B
+{
+ B () noexcept (A <Y>::a) {}
+};
+
+template <typename X, typename Y>
+struct C
+{
+ X x;
+ Y y;
+};
+
+struct D
+{
+ D () throw (int);
+};
+
+C <D, B <D>> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C
new file mode 100644
index 000000000..ec4f3a153
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C
@@ -0,0 +1,22 @@
+// PR c++/56071
+// { dg-do compile { target c++11 } }
+
+class B
+{
+ template <typename T> friend struct A;
+ B() {}
+};
+
+template <typename T>
+struct A
+{
+ A() noexcept(noexcept(B())) { }
+};
+
+struct C
+{
+ C()
+ {
+ static_assert( !noexcept(A<int>()), "" );
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C
new file mode 100644
index 000000000..ec88e1d3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C
@@ -0,0 +1,87 @@
+// PR c++/57645
+// { dg-do compile { target c++11 } }
+
+struct Thrower
+{
+ ~Thrower() noexcept(false) { throw 1; }
+};
+
+struct ExplicitA
+{
+ ~ExplicitA() {}
+
+ Thrower t;
+};
+
+struct ExplicitB
+{
+ ~ExplicitB();
+
+ Thrower t;
+};
+
+ExplicitB::~ExplicitB() {}
+
+struct ExplicitC
+{
+ ~ExplicitC() = default;
+
+ Thrower t;
+};
+
+struct ExplicitD
+{
+ ~ExplicitD();
+
+ Thrower t;
+};
+
+ExplicitD::~ExplicitD() = default;
+
+struct NoThrower
+{
+ ~NoThrower() noexcept(true) {}
+};
+
+struct ExplicitE
+{
+ ~ExplicitE() {}
+
+ NoThrower t;
+};
+
+struct ExplicitF
+{
+ ~ExplicitF();
+
+ NoThrower t;
+};
+
+ExplicitF::~ExplicitF() {}
+
+struct ExplicitG
+{
+ ~ExplicitG() = default;
+
+ NoThrower t;
+};
+
+struct ExplicitH
+{
+ ~ExplicitH();
+
+ NoThrower t;
+};
+
+ExplicitH::~ExplicitH() = default;
+
+#define SA(X) static_assert(X, #X)
+
+SA( !noexcept(ExplicitA()) );
+SA( !noexcept(ExplicitB()) );
+SA( !noexcept(ExplicitC()) );
+SA( !noexcept(ExplicitD()) );
+SA( noexcept(ExplicitE()) );
+SA( noexcept(ExplicitF()) );
+SA( noexcept(ExplicitG()) );
+SA( noexcept(ExplicitH()) );
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C
new file mode 100644
index 000000000..7aab0f43c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C
@@ -0,0 +1,21 @@
+// PR c++/60046
+// { dg-require-effective-target c++11 }
+
+constexpr bool foo () { return noexcept (true); }
+template <typename T>
+struct V
+{
+ void bar (V &) noexcept (foo ()) {}
+};
+template <typename T>
+struct W : public V <int>
+{
+ void bar (W &x) { V <int>::bar (x); }
+};
+
+int
+main ()
+{
+ W <int> a, b;
+ a.bar (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C
new file mode 100644
index 000000000..d38028c4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C
@@ -0,0 +1,21 @@
+// DR 757 allows using types without linkage in declarations with linkage.
+// Test that this doesn't lead to link-time collisions.
+
+// { dg-additional-sources "nolinkage1a.cc" }
+// { dg-do link { target c++11 } }
+
+#include "nolinkage1.h"
+
+typedef struct { int i; } *AP;
+
+void f(AP) { }
+
+A<AP> a;
+
+static void g()
+{
+ struct B { };
+ A<B> a;
+}
+
+int main() { g(); f(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h
new file mode 100644
index 000000000..3cb5f63b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h
@@ -0,0 +1,8 @@
+template <class T>
+struct A
+{
+ A();
+};
+
+template <class T>
+A<T>::A() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc
new file mode 100644
index 000000000..f8528f3e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc
@@ -0,0 +1,15 @@
+#include "nolinkage1.h"
+
+typedef struct { double d; } *BP;
+
+void f(BP) { }
+
+A<BP> b;
+
+static void g()
+{
+ struct B { };
+ A<B> a;
+}
+
+int dummy() { g(); f(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C
new file mode 100644
index 000000000..22054ea05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C
@@ -0,0 +1,52 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test that move constructor and move assignement are special.
+// That is, their presence should cause compiler declared
+// copy ctor or assignment to be deleted.
+
+// { dg-do compile { target c++11 } }
+
+#include <assert.h>
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+
+int copy = 0;
+int assign = 0;
+
+struct base
+{
+ base() {}
+ base(const base&) {++copy;}
+ base& operator=(const base&) {++assign; return *this;}
+};
+
+struct derived // { dg-message "declares a move" }
+ : base
+{
+ derived() {}
+ derived(derived&&) {}
+ derived& operator=(derived&&) {return *this;}
+};
+
+int test1()
+{
+ derived d;
+ derived d2(static_cast<derived&&>(d)); // should not call base::(const base&)
+ assert(copy == 0);
+ derived d3(d); // { dg-error "deleted" }
+ assert(copy == 1);
+ d2 = static_cast<derived&&>(d); // should not call base::operator=
+ assert(assign == 0);
+ d3 = d; // { dg-error "deleted" }
+ assert(assign == 1);
+ return 0;
+}
+
+int main()
+{
+ return test1();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C
new file mode 100644
index 000000000..b5b8dabbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C
@@ -0,0 +1,10 @@
+// PR c++/50707
+// { dg-do compile { target c++11 } }
+
+int g;
+
+struct S {
+ int const v=g;
+};
+
+S s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C
new file mode 100644
index 000000000..e1b9d6929
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert(X,#X)
+
+struct A
+{
+ int i = f();
+ int j { f() };
+ static constexpr int f() { return 42; }
+};
+
+constexpr A a;
+SA(a.i == 42);
+SA(a.j == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C
new file mode 100644
index 000000000..96ed2c8ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i = f();
+ static int f(int i = 42) { return i; }
+};
+
+A a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C
new file mode 100644
index 000000000..90f910285
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C
@@ -0,0 +1,19 @@
+// Do NSDMI get deferred instantiation?
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ T t = T(42);
+ constexpr A() { }
+ A(T t): t(t) { }
+};
+
+struct B { };
+
+#define SA(X) static_assert(X,#X)
+
+constexpr A<int> a1;
+SA(a1.t == 42);
+
+A<B> a2 {B()};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C
new file mode 100644
index 000000000..60ca88d45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C
@@ -0,0 +1,17 @@
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i = 42;
+ int j = f();
+ int k = this->f();
+ int f() { return i++; }
+};
+
+A a;
+
+int main()
+{
+ if (a.j != 42 || a.k != 43 || a.i != 44)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C
new file mode 100644
index 000000000..a83d40b29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C
@@ -0,0 +1,20 @@
+// PR c++/51666 (DR 325)
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct tuple
+{
+ tuple(T, U) { }
+};
+
+struct Y
+{
+ tuple<int, int> tt = tuple<int, int>{1, 2};
+};
+
+struct A
+{
+ int i = 0;
+ int j = i < 42, k; // OK, declares j and k
+ int l = i < 42, 24; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C
new file mode 100644
index 000000000..033c14264
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+struct A // { dg-error "non-static data member" }
+{
+ int i = (A(), 42); // { dg-message "required here" }
+};
+
+A a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C
new file mode 100644
index 000000000..edcf5887d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C
@@ -0,0 +1,18 @@
+// Core issue 1351
+// { dg-do run { xfail *-*-* } }
+// { dg-require-effective-target c++11 }
+
+bool fail;
+struct A
+{
+ int i = fail ? throw "noooooooo" : 42;
+};
+
+int main()
+{
+ A a1;
+ if (a1.i != 42) return 1;
+ fail = true;
+ try { A a2; }
+ catch (...) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C
new file mode 100644
index 000000000..e54be050b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C
@@ -0,0 +1,14 @@
+// PR c++/50563
+// { dg-do compile { target c++11 } }
+
+struct S1 {
+ int a{10}, b{20}; // OK
+};
+
+struct S2 {
+ int a, b = 20; // OK
+};
+
+struct S3 {
+ int a = 10, b = 20;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C
new file mode 100644
index 000000000..d3669865c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C
@@ -0,0 +1,32 @@
+// PR c++/50930
+// { dg-do compile { target c++11 } }
+
+struct nmc {
+ nmc() = default;
+ nmc(nmc&&) = delete; // line 3
+};
+
+struct A { // line 6
+ nmc n{};
+ nmc n2 = {};
+} a; // line 8
+
+// ------
+
+struct lock_t {
+ int lock[4];
+};
+
+struct pthread_mutex_t {
+ volatile lock_t __spinlock;
+};
+
+struct mutex {
+ pthread_mutex_t m = { };
+ mutex() = default;
+};
+
+int main()
+{
+ mutex mx;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C
new file mode 100644
index 000000000..a554f935b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C
@@ -0,0 +1,21 @@
+// PR c++/54998
+// { dg-do compile { target c++11 } }
+
+class Foo {
+public:
+private:
+ static const int kRows = 4;
+ static const int kCols = 4;
+
+ union {
+ float m_n[kRows][kCols];
+ float m_m[kRows * kCols] = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+ };
+};
+
+Foo myFoo;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C
new file mode 100644
index 000000000..2330365f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C
@@ -0,0 +1,8 @@
+// PR c++/55240
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ int q = 1; // { dg-message "declared here" }
+ struct test { int x = q; } instance; // { dg-error "local variable" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C
new file mode 100644
index 000000000..fac979b66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C
@@ -0,0 +1,7 @@
+// PR c++/57673
+// { dg-do compile { target c++11 } }
+
+template< int ... p >
+struct d {
+ int n = sizeof ... ( p );
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C
new file mode 100644
index 000000000..7316dc652
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C
@@ -0,0 +1,20 @@
+// { dg-do run { target c++11 } }
+
+struct base
+{
+ int calc_avg() { return 42; }
+};
+
+template <class T> struct nsdmi : T
+{
+ nsdmi() {}
+ int avg() { return avg_; }
+ int avg_ = this->calc_avg();
+};
+
+int main()
+{
+ nsdmi<base> x;
+ if (x.avg() != 42)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C
new file mode 100644
index 000000000..fcb405c15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C
@@ -0,0 +1,15 @@
+// PR c++/50614
+// { dg-do compile { target c++11 } }
+// { dg-options "-fcompare-debug" }
+
+struct A
+{
+ int f ();
+};
+
+template <int> struct B : A
+{
+ int i = this->f ();
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C
new file mode 100644
index 000000000..8a6f913d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C
@@ -0,0 +1,16 @@
+// PR c++/58760
+// { dg-do compile { target c++11 } }
+
+enum en
+{
+ a,b,c
+};
+
+struct B
+{
+ template<en N>
+ struct A
+ {
+ const int X = N;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C
new file mode 100644
index 000000000..ff8dc7e93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C
@@ -0,0 +1,24 @@
+// PR c++/57887
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ template<int N>
+ struct A
+ {
+ int X = N;
+ };
+};
+
+template<int M>
+struct C
+{
+ int Y = M;
+
+ template<int N>
+ struct A
+ {
+ int X = N;
+ int Y = M;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C
new file mode 100644
index 000000000..fdaf4611e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C
@@ -0,0 +1,38 @@
+// PR c++/58599
+// { dg-do compile { target c++11 } }
+
+template<int> struct A1;
+
+template<> struct A1<0>
+{
+ template<typename, typename...> struct B1
+ {
+ template<typename> int foo1() {}
+
+ int i1 = foo1<int>();
+ };
+};
+
+template<int> struct A2;
+
+template<> struct A2<0>
+{
+ template<typename, typename> struct B2
+ {
+ template<typename> int foo2() {}
+
+ int i2 = foo2<int>();
+ };
+};
+
+template<int> struct A3;
+
+template<> struct A3<0>
+{
+ template<typename> struct B3
+ {
+ template<typename> int foo3() {}
+
+ int i3 = foo3<int>();
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C
new file mode 100644
index 000000000..33ed82d08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C
@@ -0,0 +1,13 @@
+// PR c++/58829
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int f() {return 0;}
+} a;
+
+struct B {
+ template<int=0> struct C {
+ int i = a.f();
+ };
+};
+B::C<> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C
new file mode 100644
index 000000000..cec7b7bea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C
@@ -0,0 +1,15 @@
+// PR c++/58725
+// { dg-do compile { target c++11 } }
+
+struct A {
+ template<int=0>
+ struct B {
+ struct C {
+ int x = 0;
+ double y = x;
+ } c;
+ };
+};
+int main() {
+ A::B<>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C
new file mode 100644
index 000000000..ef0dddd73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C
@@ -0,0 +1,27 @@
+// PR c++/58188
+// { dg-do compile { target c++11 } }
+
+struct B {};
+struct A
+{
+ A( B );
+};
+
+struct Bar
+{
+ template< unsigned v >
+ struct Foo
+ {
+ A z = B();
+ unsigned value;
+ Foo(): value( v ) {}
+ };
+
+ struct Baz
+ {
+ Foo< 8 > foo1;
+ Foo< 1 > foo3;
+ };
+};
+
+Bar::Baz baz;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C
new file mode 100644
index 000000000..11bdd88ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C
@@ -0,0 +1,25 @@
+// PR c++/52377
+// { dg-do run { target c++11 } }
+
+union Test
+{
+ int a{4};
+};
+
+union B
+{
+ int i = 42;
+ double d;
+ B() = default;
+ B(double d): d(d) { }
+};
+
+int main()
+{
+ Test t;
+ B b;
+ B b2(4.2);
+
+ if (t.a != 4 || b.i != 42 || b2.d != 4.2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C
new file mode 100644
index 000000000..069232755
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C
@@ -0,0 +1,18 @@
+// PR c++/52377
+// { dg-require-effective-target c++11 }
+
+union A // { dg-error "multiple" }
+{
+ int i = 4;
+ int j = 2;
+};
+
+A a;
+
+union B
+{
+ int i,j;
+ B(): i(1), j(2) {} // { dg-error "multiple" }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C
new file mode 100644
index 000000000..35f6509df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C
@@ -0,0 +1,10 @@
+// PR c++/58965
+// { dg-require-effective-target c++11 }
+
+void foo()
+{
+ static union
+ {
+ int i = i;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C
new file mode 100644
index 000000000..c21fdcaed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C
@@ -0,0 +1,12 @@
+// PR c++/59269
+// { dg-require-effective-target c++11 }
+
+union U
+{
+ int& i = 0; // { dg-error "reference" }
+};
+
+void foo()
+{
+ U();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C
new file mode 100644
index 000000000..57dfd5986
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C
@@ -0,0 +1,11 @@
+// PR c++/58701
+// { dg-require-effective-target c++11 }
+// { dg-final { scan-assembler "7" } }
+
+static union
+{
+ union
+ {
+ int i = 7;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C
new file mode 100644
index 000000000..aeafe1cc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C
@@ -0,0 +1,25 @@
+// PR c++/51611
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ A(): i(42) { }
+ int i;
+ int f() { return i; }
+};
+
+struct B : virtual A
+{
+ int j = i + f();
+ int k = A::i + A::f();
+};
+
+struct C: B { int pad; };
+
+int main()
+{
+ C c;
+ if (c.j != 84 || c.k != 84)
+ __builtin_abort();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C
new file mode 100644
index 000000000..157854c5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C
@@ -0,0 +1,8 @@
+// PR c++/51474
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ virtual int foo() = 0;
+ int i = foo(); // { dg-warning "pure virtual" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C
new file mode 100644
index 000000000..976b8f480
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C
@@ -0,0 +1,52 @@
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i = 42;
+};
+
+struct B
+{
+ int i = 42;
+ B() { }
+ B(int i): i(i) { }
+};
+
+template <class T, T t>
+struct C
+{
+ T m = t;
+};
+
+template <class T, T t>
+struct D
+{
+ T m = t;
+ D() { }
+ D(T m):m(m) { }
+};
+
+int main()
+{
+ A a1;
+ if (a1.i != 42) return 1;
+ A a2{};
+ if (a2.i != 42) return 2;
+ A a3[1];
+ if (a3[0].i != 42) return 3;
+
+ B b1;
+ if (b1.i != 42) return 3;
+ B b2 (24);
+ if (b2.i != 24) return 4;
+
+ C<int,3> c1;
+ if (c1.m != 3) return 5;
+ C<int,5> c2 {};
+ if (c2.m != 5) return 6;
+
+ D<int,3> d1;
+ if (d1.m != 3) return 7;
+ D<int,3> d2 (5) ;
+ if (d2.m != 5) return 8;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C
new file mode 100644
index 000000000..31a638f2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ constexpr A(int i): i(i) {}
+};
+
+struct B
+{
+ A a1 = 1;
+ A a2 { 2 };
+ A a3 = { 3 };
+};
+
+#define SA(X) static_assert(X,#X)
+
+constexpr B b;
+SA(b.a1.i == 1);
+SA(b.a2.i == 2);
+SA(b.a3.i == 3);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C
new file mode 100644
index 000000000..a8e8cdf2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i;
+ explicit constexpr A(int i): i(i) {}
+};
+
+struct B
+{
+ A a1 = 1; // { dg-error "" }
+ A a2 { 2 };
+ A a3 = { 3 }; // { dg-error "" }
+};
+
+constexpr B b; // { dg-error "B::B" }
+
+// { dg-message "a1. is invalid" "" { target *-*-* } 11 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C
new file mode 100644
index 000000000..6f97b0671
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C
@@ -0,0 +1,23 @@
+// { dg-do run { target c++11 } }
+
+int c;
+
+struct A
+{
+ A() { }
+ A(const A&) { }
+};
+
+A f() { ++c; return A(); }
+
+struct B
+{
+ A a = f();
+};
+
+int main()
+{
+ B b1, b2;
+ if (c != 2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C
new file mode 100644
index 000000000..bade28f3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+struct X
+{
+ int x = 5;
+ int f() { return x; }
+};
+struct Y : X
+{
+ int y = this->x;
+};
+template <class T> struct Z : T
+{
+ int y = this->f();
+};
+int main()
+{
+ Y foo;
+ Z<X> bar;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C
new file mode 100644
index 000000000..e78f50019
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C
@@ -0,0 +1,8 @@
+// Origin PR c++/51477
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ typedef int int T; // { dg-error "two or more data types in declaration" }
+ struct T x[1] = { 0 }; // { dg-error "invalid|forward" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C
new file mode 100644
index 000000000..4b08474aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C
@@ -0,0 +1,17 @@
+// PR c++/53594
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wuninitialized" }
+
+struct A
+{
+ const int a = 6; // { dg-bogus "non-static const member" }
+ static int b;
+ int &c = b; // { dg-bogus "non-static reference" }
+};
+
+struct B
+{
+ const int d; // { dg-warning "non-static const member" }
+ int &e; // { dg-warning "non-static reference" }
+ int f = 7;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C
new file mode 100644
index 000000000..f89bec6d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C
@@ -0,0 +1,8 @@
+// PR c++/55670
+// { dg-do compile { target c++11 } }
+
+template <class T> using F = T;
+struct X {
+ F<void ()>* fp = nullptr;
+};
+int main () { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C
new file mode 100644
index 000000000..febe0ecac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C
@@ -0,0 +1,13 @@
+// PR c++/58162
+// { dg-require-effective-target c++11 }
+
+struct A {
+ A();
+ A(A&&);
+};
+
+struct B {
+ A const a = A();
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C
new file mode 100644
index 000000000..90917d74f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+// Test assignment to pointer
+
+char* const cp1 = nullptr;
+char* const cp2 = __null;
+char* const cp3 = 0;
+decltype(nullptr) mynull = 0;
+char* const cp4 = mynull;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C
new file mode 100644
index 000000000..50b3d0741
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+// Test assignment to nullptr_t
+
+typedef decltype(nullptr) nullptr_t;
+
+const nullptr_t np1 = nullptr;
+const nullptr_t np2 = __null;
+const nullptr_t np3 = 0;
+const nullptr_t np4 = np1;
+const nullptr_t np5 = np2;
+const nullptr_t np6 = np3;
+const nullptr_t np7 = np4;
+const nullptr_t np8 = np5;
+const nullptr_t np9 = np6;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C
new file mode 100644
index 000000000..cc3c031a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+// Test assignment to int
+
+const int n1 = nullptr; // { dg-error "cannot convert " }
+decltype(nullptr) mynull = 0;
+const int n2 = mynull; // { dg-error "cannot convert " }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C
new file mode 100644
index 000000000..372ac51cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+// Test cast to int
+
+__extension__ typedef __INTPTR_TYPE__ intptr_t;
+
+const int n4 = static_cast<const int>(nullptr); // { dg-error "invalid static_cast " }
+const short int n5 = reinterpret_cast<short int>(nullptr); // { dg-error "loses precision" }
+const intptr_t n6 = reinterpret_cast<intptr_t>(nullptr);
+const intptr_t n7 = (intptr_t)nullptr;
+
+decltype(nullptr) mynull = 0;
+const int n8 = static_cast<const int>(mynull); // { dg-error "invalid static_cast " }
+const short int n9 = reinterpret_cast<short int>(mynull); // { dg-error "loses precision" }
+const intptr_t n10 = reinterpret_cast<intptr_t>(mynull);
+const intptr_t n11 = (intptr_t)mynull;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C
new file mode 100644
index 000000000..65121b659
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+// Test assignment to method pointer
+
+class F { };
+
+typedef void (F::*pmf)();
+
+const pmf pmf1 = nullptr;
+const pmf pmf2 = __null;
+const pmf pmf3 = 0;
+decltype(nullptr) mynull = 0;
+const pmf pmf4 = mynull;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C
new file mode 100644
index 000000000..e933c3528
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+// Test compare to pointer
+
+#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0)
+
+char* const cp1 = nullptr;
+
+void fun()
+{
+ assert_true(cp1 == nullptr);
+ decltype(nullptr) mynull = 0;
+ assert_true(cp1 == mynull);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C
new file mode 100644
index 000000000..b2ef51519
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+// Test compare to int
+
+void fun()
+{
+ int n = 0;
+ if( n == nullptr ); // { dg-error "invalid operands of types " }
+ const int m = 1;
+ if( m == nullptr ); // { dg-error "invalid operands of types " }
+ decltype(nullptr) mynull = 0;
+ if( n == mynull ); // { dg-error "invalid operands of types " }
+ if( m == mynull ); // { dg-error "invalid operands of types " }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C
new file mode 100644
index 000000000..dbf163233
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+// Test conversion to bool
+
+#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0)
+
+void fun()
+{
+ assert_true(nullptr ? false : true);
+ decltype(nullptr) mynull = 0;
+ assert_true(mynull ? false : true);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C
new file mode 100644
index 000000000..1422a35cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+// Test compare to literal 0
+
+void fun()
+{
+ if( nullptr == 0 );
+ decltype(nullptr) mynull = 0;
+ if( mynull == 0 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C
new file mode 100644
index 000000000..e27d65861
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+// Test arithmetic operations
+
+void fun()
+{
+ nullptr = 0; // { dg-error "lvalue required as left operand" }
+ nullptr + 2; // { dg-error "invalid operands of types " }
+ decltype(nullptr) mynull = 0;
+ mynull = 1; // { dg-error "cannot convert" }
+ mynull = 0;
+ mynull + 2; // { dg-error "invalid operands of types " }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C
new file mode 100644
index 000000000..f81f0c3c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C
@@ -0,0 +1,39 @@
+// { dg-do compile { target c++11 } }
+
+// Test relational operators
+
+#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0)
+#define assert_false(b) do { char c[1 - 2 * bool(b)]; } while(0)
+
+void fun()
+{
+ assert_true(nullptr == nullptr);
+ assert_false(nullptr != nullptr);
+ assert_false(nullptr < nullptr);
+ assert_false(nullptr > nullptr);
+ assert_true(nullptr <= nullptr);
+ assert_true(nullptr >= nullptr);
+
+ decltype(nullptr) mynull = 0;
+
+ assert_true(mynull == nullptr);
+ assert_false(mynull != nullptr);
+ assert_false(mynull < nullptr);
+ assert_false(mynull > nullptr);
+ assert_true(mynull <= nullptr);
+ assert_true(mynull >= nullptr);
+
+ assert_true(nullptr == mynull);
+ assert_false(nullptr != mynull);
+ assert_false(nullptr < mynull);
+ assert_false(nullptr > mynull);
+ assert_true(nullptr <= mynull);
+ assert_true(nullptr >= mynull);
+
+ assert_true(mynull == mynull);
+ assert_false(mynull != mynull);
+ assert_false(mynull < mynull);
+ assert_false(mynull > mynull);
+ assert_true(mynull <= mynull);
+ assert_true(mynull >= mynull);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C
new file mode 100644
index 000000000..439708205
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+// Test sizeof
+
+static_assert(sizeof(nullptr) == sizeof(void*), "sizeof(nullptr) is wrong");
+const decltype(nullptr) mynull = 0;
+static_assert(sizeof(mynull) == sizeof(void*), "sizeof(nullptr) is wrong");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C
new file mode 100644
index 000000000..e788c16b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C
@@ -0,0 +1,12 @@
+// { dg-do run { target c++11 } }
+
+// Test typeid
+
+#include <typeinfo>
+
+int main()
+{
+ const decltype(nullptr) mynull = 0;
+ if (typeid(nullptr) != typeid(mynull))
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C
new file mode 100644
index 000000000..6a79c4967
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+
+// Test overload preference char*/int
+
+template <typename T, typename U> struct tType_equal;
+template <typename T> struct tType_equal<T, T> { typedef void type; };
+
+template <typename T, typename U>
+inline typename tType_equal<T, U>::type
+type_equal(U) { }
+
+char* f( char* );
+int f( int );
+long int f( long int );
+
+void test_f()
+{
+ // Overloading cases
+ //
+ type_equal<char*>(f(nullptr));
+ type_equal<int>(f(0));
+ decltype(nullptr) mynull = 0;
+ type_equal<char*>(f(mynull));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C
new file mode 100644
index 000000000..939d44959
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+
+
+// Test template deduction
+
+template <typename T, typename U> struct tType_equal;
+template <typename T> struct tType_equal<T, T> { typedef void type; };
+
+template <typename T, typename U>
+inline typename tType_equal<T, U>::type
+type_equal(U) { }
+
+template<typename T> T* g( T* t ); // { dg-message "note" }
+
+void test_g()
+{
+ // Deduction to nullptr_t, no deduction to pointer type
+ //
+ g(nullptr); // { dg-error "no matching function for call to " }
+ // { dg-message "(candidate|mismatched types)" "candidate note" { target *-*-* } 19 }
+ type_equal<float*>(g((float*)nullptr));
+ decltype(nullptr) mynull = 0;
+ g(mynull); // { dg-error "no matching function for call to " }
+ // { dg-message "(candidate|mismatched types)" "candidate note" { target *-*-* } 23 }
+ type_equal<float*>(g((float*)mynull));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C
new file mode 100644
index 000000000..62029b3a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+
+// Test template deduction
+
+typedef decltype(nullptr) nullptr_t;
+
+template <typename T, typename U> struct tType_equal;
+template <typename T> struct tType_equal<T, T> { typedef void type; };
+
+template <typename T, typename U>
+inline typename tType_equal<T, U>::type
+type_equal(U) { }
+
+template<typename T> T h( T t );
+
+void test_h()
+{
+ type_equal<int>(h(0));
+ type_equal<nullptr_t>(h(nullptr));
+ type_equal<float*>(h((float*)nullptr));
+ nullptr_t mynull = 0;
+ type_equal<nullptr_t>(h(mynull));
+ type_equal<float*>(h((float*)mynull));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C
new file mode 100644
index 000000000..96fea44b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+// Test that bool is a better overload match than int
+
+template <typename T, typename U> struct tType_equal;
+template <typename T> struct tType_equal<T, T> { typedef void type; };
+
+template <typename T, typename U>
+inline typename tType_equal<T, U>::type
+type_equal(U) { }
+
+int i( int );
+long int i( long int );
+bool i( bool );
+
+void test_i()
+{
+ // Overload to bool, not int
+ type_equal<bool>(i(nullptr));
+ decltype(nullptr) mynull = 0;
+ type_equal<bool>(i(mynull));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C
new file mode 100644
index 000000000..17dd62c84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+// Test overload of pointer versus bool when applied on a nullptr_t
+
+template <typename T, typename U> struct tType_equal;
+template <typename T> struct tType_equal<T, T> { typedef void type; };
+
+template <typename T, typename U>
+inline typename tType_equal<T, U>::type
+type_equal(U) { }
+
+char* j( char* );
+bool j( bool );
+
+void test_j()
+{
+ type_equal<char*>(j(nullptr));
+ decltype(nullptr) mynull = 0;
+ type_equal<char*>(j(mynull));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C
new file mode 100644
index 000000000..8b6a0b428
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+
+// Test overload of pointer versus nullptr_t when applied on a literal 0/__null
+
+typedef decltype(nullptr) nullptr_t;
+
+char* k( char* ); /* { dg-message "note" } */
+nullptr_t k( nullptr_t ); /* { dg-message "note" } */
+
+void test_k()
+{
+ k(0); /* { dg-error "is ambiguous" } */
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+ k(__null); /* { dg-error "is ambiguous" } */
+ // { dg-message "candidate" "candidate note" { target *-*-* } 15 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C
new file mode 100644
index 000000000..bbd0c7e24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C
@@ -0,0 +1,19 @@
+// { dg-do run { target c++11 } }
+
+// Test passing to ellipisis
+
+#include <cstdio>
+#include <cstring>
+
+int main()
+{
+ char buf1[64];
+ char buf2[64];
+ char buf3[64];
+
+ std::sprintf(buf1, "%p", (void*)0);
+ std::sprintf(buf2, "%p", nullptr);
+ decltype(nullptr) mynull = 0;
+ std::sprintf(buf3, "%p", nullptr);
+ return std::strcmp(buf1, buf2) != 0 || std::strcmp(buf1, buf3) != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C
new file mode 100644
index 000000000..89884b90f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C
@@ -0,0 +1,54 @@
+// { dg-do run { target c++11 } }
+
+// Test throw and catch
+
+extern "C" void abort (void);
+
+typedef decltype(nullptr) nullptr_t;
+
+int result[2];
+
+void __attribute__((noinline))
+foo (int i, int j)
+{
+ result[i] = j;
+}
+
+int main()
+{
+ try {
+ throw nullptr;
+ } catch (void*) {
+ foo (0, 1);
+ } catch (bool) {
+ foo (0, 2);
+ } catch (int) {
+ foo (0, 3);
+ } catch (long int) {
+ foo (0, 4);
+ } catch (nullptr_t) {
+ foo (0, 5);
+ } catch (...) {
+ foo (0, 6);
+ }
+
+ nullptr_t mynull = 0;
+ try {
+ throw mynull;
+ } catch (void*) {
+ foo (1, 1);
+ } catch (bool) {
+ foo (1, 2);
+ } catch (int) {
+ foo (1, 3);
+ } catch (long int) {
+ foo (1, 4);
+ } catch (nullptr_t) {
+ foo (1, 5);
+ } catch (...) {
+ foo (1, 6);
+ }
+
+ if (result[0] != 5 || result[1] != 5)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C
new file mode 100644
index 000000000..5fbd124b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall -Wformat=2 -Wstrict-null-sentinel" }
+
+// Test various warnings
+
+void f1(const char*, ...) __attribute__((format(printf, 1, 2)));
+void f2(const char*) __attribute__((nonnull));
+void f3(const char*, ...) __attribute__((sentinel));
+
+void f()
+{
+ f1("%p", nullptr);
+ f2(nullptr); // { dg-warning "null argument where non-null required " }
+ f3("x", "y", __null); // { dg-warning "missing sentinel in function call" }
+ f3("x", "y", nullptr);
+ decltype(nullptr) mynull = 0;
+ f1("%p", mynull);
+ f2(mynull); // { dg-warning "null argument where non-null required " }
+ f3("x", "y", mynull);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C
new file mode 100644
index 000000000..2fab690b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C
@@ -0,0 +1,24 @@
+// PR c++/50361
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct Foo
+{
+ Foo(std::initializer_list<Foo>) { };
+
+ template<class T> Foo(T t) { T u(t); }
+
+private:
+ union Data
+ {
+ Data() : null(nullptr) {}
+
+ std::nullptr_t null;
+ } u_;
+};
+
+int main()
+{
+ Foo f = { {} };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C
new file mode 100644
index 000000000..de0c84279
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C
@@ -0,0 +1,5 @@
+// PR c++/50371
+// { dg-do compile { target c++11 } }
+
+template<decltype(nullptr)>
+struct nt;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C
new file mode 100644
index 000000000..a87a923a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+template<decltype(nullptr)>
+struct nt{};
+
+nt<nullptr> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C
new file mode 100644
index 000000000..f60fae02a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C
@@ -0,0 +1,13 @@
+// PR c++/51530
+// { dg-do compile { target c++11 } }
+
+template <class T, class U>
+void f(T, U);
+
+template <class T>
+void f(T, decltype(nullptr));
+
+int main()
+{
+ f(1, nullptr);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C
new file mode 100644
index 000000000..2510dc806
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C
@@ -0,0 +1,9 @@
+// PR c++/52706
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } }
+
+template<class T, decltype(nullptr) = nullptr>
+int f(T);
+
+int i2 = f(nullptr); // 17
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C
new file mode 100644
index 000000000..05fbe57b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C
@@ -0,0 +1,16 @@
+// { dg-do run { target c++11 } }
+
+typedef decltype(nullptr) nullptr_t;
+
+int i;
+nullptr_t n;
+const nullptr_t& f() { ++i; return n; }
+
+nullptr_t g() { return f(); }
+
+int main()
+{
+ g();
+ if (i != 1)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C
new file mode 100644
index 000000000..d2325bb83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C
@@ -0,0 +1,5 @@
+// PR c++/53882
+// { dg-options "-O" }
+// { dg-do compile { target c++11 } }
+
+void f(decltype(nullptr) &__restrict np) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C
new file mode 100644
index 000000000..3673999d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C
@@ -0,0 +1,40 @@
+// PR c++/58176
+// { dg-do compile { target c++11 } }
+
+// Nil
+struct nil_ { constexpr nil_ () {} };
+constexpr nil_ nil;
+
+// Cons
+template <class H, class T = nil_>
+struct cons_ {
+ using head_ = H;
+ using tail_ = T;
+
+ H head;
+ T tail;
+
+ constexpr cons_() {}
+ constexpr cons_(H const &h, T const &t) : head(h), tail(t) {}
+};
+template <class H, class T = nil_>
+constexpr cons_<H, T> cons (H const &h, T const &t = nil) { return
+cons_<H,T>(h,t); }
+
+// List
+template <class... T> struct list_s;
+template <class H, class... T>
+struct list_s<H, T...> {
+ using type = cons_<H, typename list_s<T...>::type>;
+};
+template <>
+struct list_s<> {
+ using type = nil_;
+};
+template <class... T>
+using list_ = typename list_s<T...>::type;
+constexpr nil_ list () { return nil; }
+template <class H, class... T>
+constexpr list_<H, T...> list (H h, T... t) { return cons(h, list(t...)); }
+
+constexpr auto l1 = list("monkey", 123.4, cons(1, 2), nullptr);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C
new file mode 100644
index 000000000..b8591b4af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C
@@ -0,0 +1,25 @@
+// { dg-prune-output "-Woverflow" }
+
+template <long long i>
+struct Fib
+{
+ static const long long value // { dg-error "overflow" }
+ = Fib<i-1>::value + Fib<i-2>::value;
+};
+
+template <>
+struct Fib<0>
+{
+ static const long long value = 0;
+};
+
+template <>
+struct Fib<1>
+{
+ static const long long value = 1;
+};
+
+int main()
+{
+ return Fib<95>::value;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C
new file mode 100644
index 000000000..5817ad560
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C
@@ -0,0 +1,28 @@
+// { dg-do link { target c++11 } }
+
+struct S {};
+
+struct T
+{
+ operator S() { return S(); }
+};
+
+struct U
+{
+ operator S&() { return *static_cast<S*>(0); }
+};
+
+void f(const S&);
+void f(S&&) {}
+
+void g(const S&) {}
+void g(S&&);
+
+int main()
+{
+ T t;
+ f(t);
+
+ U u;
+ g(u);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C
new file mode 100644
index 000000000..b95994d7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C
@@ -0,0 +1,16 @@
+// { dg-do link { target c++11 } }
+
+struct T {};
+struct S
+{
+ S(T const &) {}
+};
+
+void f(const S&);
+void f(S&&) {}
+
+int main()
+{
+ T t;
+ f(t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C
new file mode 100644
index 000000000..a52e7c018
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C
@@ -0,0 +1,707 @@
+// { dg-do link { target c++11 } }
+// Generated by overload.py
+
+template<typename _Tp>
+inline _Tp&&
+movel(_Tp& __t)
+{ return static_cast<_Tp&&>(__t); }
+
+struct S{};
+
+S l; // lvalue (l)
+S const cl = l; // const lvalue (cl)
+S r() { return l; } // rvalue (r)
+S const cr() { return l; } // const rvalue (cr)
+S & nl = l; // named lvalue reference (nl)
+S const & ncl = l; // named const lvalue reference (ncl)
+S && nr = movel(l); // named rvalue reference (nr)
+S const && ncr = movel(l); // named const rvalue reference (ncr)
+S & ul() { return l; } // unnamed lvalue reference (ul)
+S const & ucl() { return l; } // unnamed const lvalue reference (ucl)
+S && ur() { return movel(l); } // unnamed rvalue reference (ur)
+S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr)
+
+void l0001(const S&&) {}
+
+void l0010(S&&) {}
+
+void l0011(S&&) {}
+void l0011(const S&&);
+
+void l0100(const S&) {}
+
+void l0101(const S&) {}
+void l0101(const S&&);
+
+void l0110(const S&) {}
+void l0110(S&&);
+
+void l0111(const S&) {}
+void l0111(S&&);
+void l0111(const S&&);
+
+void l1000(S&) {}
+
+void l1001(S&) {}
+void l1001(const S&&);
+
+void l1010(S&) {}
+void l1010(S&&);
+
+void l1011(S&) {}
+void l1011(S&&);
+void l1011(const S&&);
+
+void l1100(S&) {}
+void l1100(const S&);
+
+void l1101(S&) {}
+void l1101(const S&);
+void l1101(const S&&);
+
+void l1110(S&) {}
+void l1110(const S&);
+void l1110(S&&);
+
+void l1111(S&) {}
+void l1111(const S&);
+void l1111(S&&);
+void l1111(const S&&);
+
+void cl0001(const S&&) {}
+
+void cl0011(S&&);
+void cl0011(const S&&) {}
+
+void cl0100(const S&) {}
+
+void cl0101(const S&) {}
+void cl0101(const S&&);
+
+void cl0110(const S&) {}
+void cl0110(S&&);
+
+void cl0111(const S&) {}
+void cl0111(S&&);
+void cl0111(const S&&);
+
+void cl1001(S&);
+void cl1001(const S&&) {}
+
+void cl1011(S&);
+void cl1011(S&&);
+void cl1011(const S&&) {}
+
+void cl1100(S&);
+void cl1100(const S&) {}
+
+void cl1101(S&);
+void cl1101(const S&) {}
+void cl1101(const S&&);
+
+void cl1110(S&);
+void cl1110(const S&) {}
+void cl1110(S&&);
+
+void cl1111(S&);
+void cl1111(const S&) {}
+void cl1111(S&&);
+void cl1111(const S&&);
+
+void r0001(const S&&) {}
+
+void r0010(S&&) {}
+
+void r0011(S&&) {}
+void r0011(const S&&);
+
+void r0100(const S&) {}
+
+void r0101(const S&);
+void r0101(const S&&) {}
+
+void r0110(const S&);
+void r0110(S&&) {}
+
+void r0111(const S&);
+void r0111(S&&) {}
+void r0111(const S&&);
+
+void r1001(S&);
+void r1001(const S&&) {}
+
+void r1010(S&);
+void r1010(S&&) {}
+
+void r1011(S&);
+void r1011(S&&) {}
+void r1011(const S&&);
+
+void r1100(S&);
+void r1100(const S&) {}
+
+void r1101(S&);
+void r1101(const S&);
+void r1101(const S&&) {}
+
+void r1110(S&);
+void r1110(const S&);
+void r1110(S&&) {}
+
+void r1111(S&);
+void r1111(const S&);
+void r1111(S&&) {}
+void r1111(const S&&);
+
+void cr0001(const S&&) {}
+
+void cr0011(S&&);
+void cr0011(const S&&) {}
+
+void cr0100(const S&) {}
+
+void cr0101(const S&);
+void cr0101(const S&&) {}
+
+void cr0110(const S&) {}
+void cr0110(S&&);
+
+void cr0111(const S&);
+void cr0111(S&&);
+void cr0111(const S&&) {}
+
+void cr1001(S&);
+void cr1001(const S&&) {}
+
+void cr1011(S&);
+void cr1011(S&&);
+void cr1011(const S&&) {}
+
+void cr1100(S&);
+void cr1100(const S&) {}
+
+void cr1101(S&);
+void cr1101(const S&);
+void cr1101(const S&&) {}
+
+void cr1110(S&);
+void cr1110(const S&) {}
+void cr1110(S&&);
+
+void cr1111(S&);
+void cr1111(const S&);
+void cr1111(S&&);
+void cr1111(const S&&) {}
+
+void nl0001(const S&&) {}
+
+void nl0010(S&&) {}
+
+void nl0011(S&&) {}
+void nl0011(const S&&);
+
+void nl0100(const S&) {}
+
+void nl0101(const S&) {}
+void nl0101(const S&&);
+
+void nl0110(const S&) {}
+void nl0110(S&&);
+
+void nl0111(const S&) {}
+void nl0111(S&&);
+void nl0111(const S&&);
+
+void nl1000(S&) {}
+
+void nl1001(S&) {}
+void nl1001(const S&&);
+
+void nl1010(S&) {}
+void nl1010(S&&);
+
+void nl1011(S&) {}
+void nl1011(S&&);
+void nl1011(const S&&);
+
+void nl1100(S&) {}
+void nl1100(const S&);
+
+void nl1101(S&) {}
+void nl1101(const S&);
+void nl1101(const S&&);
+
+void nl1110(S&) {}
+void nl1110(const S&);
+void nl1110(S&&);
+
+void nl1111(S&) {}
+void nl1111(const S&);
+void nl1111(S&&);
+void nl1111(const S&&);
+
+void ncl0001(const S&&) {}
+
+void ncl0011(S&&);
+void ncl0011(const S&&) {}
+
+void ncl0100(const S&) {}
+
+void ncl0101(const S&) {}
+void ncl0101(const S&&);
+
+void ncl0110(const S&) {}
+void ncl0110(S&&);
+
+void ncl0111(const S&) {}
+void ncl0111(S&&);
+void ncl0111(const S&&);
+
+void ncl1001(S&);
+void ncl1001(const S&&) {}
+
+void ncl1011(S&);
+void ncl1011(S&&);
+void ncl1011(const S&&) {}
+
+void ncl1100(S&);
+void ncl1100(const S&) {}
+
+void ncl1101(S&);
+void ncl1101(const S&) {}
+void ncl1101(const S&&);
+
+void ncl1110(S&);
+void ncl1110(const S&) {}
+void ncl1110(S&&);
+
+void ncl1111(S&);
+void ncl1111(const S&) {}
+void ncl1111(S&&);
+void ncl1111(const S&&);
+
+void nr0001(const S&&) {}
+
+void nr0010(S&&) {}
+
+void nr0011(S&&) {}
+void nr0011(const S&&);
+
+void nr0100(const S&) {}
+
+void nr0101(const S&) {}
+void nr0101(const S&&);
+
+void nr0110(const S&) {}
+void nr0110(S&&);
+
+void nr0111(const S&) {}
+void nr0111(S&&);
+void nr0111(const S&&);
+
+void nr1000(S&) {}
+
+void nr1001(S&) {}
+void nr1001(const S&&);
+
+void nr1010(S&) {}
+void nr1010(S&&);
+
+void nr1011(S&) {}
+void nr1011(S&&);
+void nr1011(const S&&);
+
+void nr1100(S&) {}
+void nr1100(const S&);
+
+void nr1101(S&) {}
+void nr1101(const S&);
+void nr1101(const S&&);
+
+void nr1110(S&) {}
+void nr1110(const S&);
+void nr1110(S&&);
+
+void nr1111(S&) {}
+void nr1111(const S&);
+void nr1111(S&&);
+void nr1111(const S&&);
+
+void ncr0001(const S&&) {}
+
+void ncr0011(S&&);
+void ncr0011(const S&&) {}
+
+void ncr0100(const S&) {}
+
+void ncr0101(const S&) {}
+void ncr0101(const S&&);
+
+void ncr0110(const S&) {}
+void ncr0110(S&&);
+
+void ncr0111(const S&) {}
+void ncr0111(S&&);
+void ncr0111(const S&&);
+
+void ncr1001(S&);
+void ncr1001(const S&&) {}
+
+void ncr1011(S&);
+void ncr1011(S&&);
+void ncr1011(const S&&) {}
+
+void ncr1100(S&);
+void ncr1100(const S&) {}
+
+void ncr1101(S&);
+void ncr1101(const S&) {}
+void ncr1101(const S&&);
+
+void ncr1110(S&);
+void ncr1110(const S&) {}
+void ncr1110(S&&);
+
+void ncr1111(S&);
+void ncr1111(const S&) {}
+void ncr1111(S&&);
+void ncr1111(const S&&);
+
+void ul0001(const S&&) {}
+
+void ul0010(S&&) {}
+
+void ul0011(S&&) {}
+void ul0011(const S&&);
+
+void ul0100(const S&) {}
+
+void ul0101(const S&) {}
+void ul0101(const S&&);
+
+void ul0110(const S&) {}
+void ul0110(S&&);
+
+void ul0111(const S&) {}
+void ul0111(S&&);
+void ul0111(const S&&);
+
+void ul1000(S&) {}
+
+void ul1001(S&) {}
+void ul1001(const S&&);
+
+void ul1010(S&) {}
+void ul1010(S&&);
+
+void ul1011(S&) {}
+void ul1011(S&&);
+void ul1011(const S&&);
+
+void ul1100(S&) {}
+void ul1100(const S&);
+
+void ul1101(S&) {}
+void ul1101(const S&);
+void ul1101(const S&&);
+
+void ul1110(S&) {}
+void ul1110(const S&);
+void ul1110(S&&);
+
+void ul1111(S&) {}
+void ul1111(const S&);
+void ul1111(S&&);
+void ul1111(const S&&);
+
+void ucl0001(const S&&) {}
+
+void ucl0011(S&&);
+void ucl0011(const S&&) {}
+
+void ucl0100(const S&) {}
+
+void ucl0101(const S&) {}
+void ucl0101(const S&&);
+
+void ucl0110(const S&) {}
+void ucl0110(S&&);
+
+void ucl0111(const S&) {}
+void ucl0111(S&&);
+void ucl0111(const S&&);
+
+void ucl1001(S&);
+void ucl1001(const S&&) {}
+
+void ucl1011(S&);
+void ucl1011(S&&);
+void ucl1011(const S&&) {}
+
+void ucl1100(S&);
+void ucl1100(const S&) {}
+
+void ucl1101(S&);
+void ucl1101(const S&) {}
+void ucl1101(const S&&);
+
+void ucl1110(S&);
+void ucl1110(const S&) {}
+void ucl1110(S&&);
+
+void ucl1111(S&);
+void ucl1111(const S&) {}
+void ucl1111(S&&);
+void ucl1111(const S&&);
+
+void ur0001(const S&&) {}
+
+void ur0010(S&&) {}
+
+void ur0011(S&&) {}
+void ur0011(const S&&);
+
+void ur0100(const S&) {}
+
+void ur0101(const S&);
+void ur0101(const S&&) {}
+
+void ur0110(const S&);
+void ur0110(S&&) {}
+
+void ur0111(const S&);
+void ur0111(S&&) {}
+void ur0111(const S&&);
+
+void ur1001(S&);
+void ur1001(const S&&) {}
+
+void ur1010(S&);
+void ur1010(S&&) {}
+
+void ur1011(S&);
+void ur1011(S&&) {}
+void ur1011(const S&&);
+
+void ur1100(S&);
+void ur1100(const S&) {}
+
+void ur1101(S&);
+void ur1101(const S&);
+void ur1101(const S&&) {}
+
+void ur1110(S&);
+void ur1110(const S&);
+void ur1110(S&&) {}
+
+void ur1111(S&);
+void ur1111(const S&);
+void ur1111(S&&) {}
+void ur1111(const S&&);
+
+void ucr0001(const S&&) {}
+
+void ucr0011(S&&);
+void ucr0011(const S&&) {}
+
+void ucr0100(const S&) {}
+
+void ucr0101(const S&);
+void ucr0101(const S&&) {}
+
+void ucr0110(const S&) {}
+void ucr0110(S&&);
+
+void ucr0111(const S&);
+void ucr0111(S&&);
+void ucr0111(const S&&) {}
+
+void ucr1001(S&);
+void ucr1001(const S&&) {}
+
+void ucr1011(S&);
+void ucr1011(S&&);
+void ucr1011(const S&&) {}
+
+void ucr1100(S&);
+void ucr1100(const S&) {}
+
+void ucr1101(S&);
+void ucr1101(const S&);
+void ucr1101(const S&&) {}
+
+void ucr1110(S&);
+void ucr1110(const S&) {}
+void ucr1110(S&&);
+
+void ucr1111(S&);
+void ucr1111(const S&);
+void ucr1111(S&&);
+void ucr1111(const S&&) {}
+
+
+int main()
+{
+ //l0001(l);
+ //l0010(l);
+ //l0011(l);
+ l0100(l);
+ l0101(l);
+ l0110(l);
+ l0111(l);
+ l1000(l);
+ l1001(l);
+ l1010(l);
+ l1011(l);
+ l1100(l);
+ l1101(l);
+ l1110(l);
+ l1111(l);
+ //cl0001(cl);
+ //cl0011(cl);
+ cl0100(cl);
+ cl0101(cl);
+ cl0110(cl);
+ cl0111(cl);
+ //cl1001(cl);
+ //cl1011(cl);
+ cl1100(cl);
+ cl1101(cl);
+ cl1110(cl);
+ cl1111(cl);
+ r0001(r());
+ r0010(r());
+ r0011(r());
+ r0100(r());
+ r0101(r());
+ r0110(r());
+ r0111(r());
+ r1001(r());
+ r1010(r());
+ r1011(r());
+ r1100(r());
+ r1101(r());
+ r1110(r());
+ r1111(r());
+ cr0001(cr());
+ cr0011(cr());
+ cr0100(cr());
+ cr0101(cr());
+ cr0110(cr());
+ cr0111(cr());
+ cr1001(cr());
+ cr1011(cr());
+ cr1100(cr());
+ cr1101(cr());
+ cr1110(cr());
+ cr1111(cr());
+ //nl0001(nl);
+ //nl0010(nl);
+ //nl0011(nl);
+ nl0100(nl);
+ nl0101(nl);
+ nl0110(nl);
+ nl0111(nl);
+ nl1000(nl);
+ nl1001(nl);
+ nl1010(nl);
+ nl1011(nl);
+ nl1100(nl);
+ nl1101(nl);
+ nl1110(nl);
+ nl1111(nl);
+ //ncl0001(ncl);
+ //ncl0011(ncl);
+ ncl0100(ncl);
+ ncl0101(ncl);
+ ncl0110(ncl);
+ ncl0111(ncl);
+ //ncl1001(ncl);
+ //ncl1011(ncl);
+ ncl1100(ncl);
+ ncl1101(ncl);
+ ncl1110(ncl);
+ ncl1111(ncl);
+ //nr0001(nr);
+ //nr0010(nr);
+ //nr0011(nr);
+ nr0100(nr);
+ nr0101(nr);
+ nr0110(nr);
+ nr0111(nr);
+ nr1000(nr);
+ nr1001(nr);
+ nr1010(nr);
+ nr1011(nr);
+ nr1100(nr);
+ nr1101(nr);
+ nr1110(nr);
+ nr1111(nr);
+ //ncr0001(ncr);
+ //ncr0011(ncr);
+ ncr0100(ncr);
+ ncr0101(ncr);
+ ncr0110(ncr);
+ ncr0111(ncr);
+ //ncr1001(ncr);
+ //ncr1011(ncr);
+ ncr1100(ncr);
+ ncr1101(ncr);
+ ncr1110(ncr);
+ ncr1111(ncr);
+ //ul0001(ul());
+ //ul0010(ul());
+ //ul0011(ul());
+ ul0100(ul());
+ ul0101(ul());
+ ul0110(ul());
+ ul0111(ul());
+ ul1000(ul());
+ ul1001(ul());
+ ul1010(ul());
+ ul1011(ul());
+ ul1100(ul());
+ ul1101(ul());
+ ul1110(ul());
+ ul1111(ul());
+ //ucl0001(ucl());
+ //ucl0011(ucl());
+ ucl0100(ucl());
+ ucl0101(ucl());
+ ucl0110(ucl());
+ ucl0111(ucl());
+ //ucl1001(ucl());
+ //ucl1011(ucl());
+ ucl1100(ucl());
+ ucl1101(ucl());
+ ucl1110(ucl());
+ ucl1111(ucl());
+ ur0001(ur());
+ ur0010(ur());
+ ur0011(ur());
+ ur0100(ur());
+ ur0101(ur());
+ ur0110(ur());
+ ur0111(ur());
+ ur1001(ur());
+ ur1010(ur());
+ ur1011(ur());
+ ur1100(ur());
+ ur1101(ur());
+ ur1110(ur());
+ ur1111(ur());
+ ucr0001(ucr());
+ ucr0011(ucr());
+ ucr0100(ucr());
+ ucr0101(ucr());
+ ucr0110(ucr());
+ ucr0111(ucr());
+ ucr1001(ucr());
+ ucr1011(ucr());
+ ucr1100(ucr());
+ ucr1101(ucr());
+ ucr1110(ucr());
+ ucr1111(ucr());
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C
new file mode 100644
index 000000000..2779f6d9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C
@@ -0,0 +1,24 @@
+// Core 1321
+// { dg-do compile { target c++11 } }
+// Two dependent names are equivalent even if the overload sets found by
+// phase 1 lookup are different. Merging them keeps the earlier set.
+
+int g1(int);
+template <class T> decltype(g1(T())) f1();
+int g1();
+template <class T> decltype(g1(T())) f1()
+{ return g1(T()); }
+int i1 = f1<int>(); // OK, g1(int) was declared before the first f1
+
+template <class T> decltype(g2(T())) f2(); // { dg-error "g2. was not declared" }
+int g2(int);
+template <class T> decltype(g2(T())) f2()
+{ return g2(T()); }
+int i2 = f2<int>(); // { dg-error "no match" }
+
+int g3();
+template <class T> decltype(g3(T())) f3(); // { dg-error "too many arguments" }
+int g3(int);
+template <class T> decltype(g3(T())) f3()
+{ return g3(T()); }
+int i3 = f3<int>(); // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C
new file mode 100644
index 000000000..2d957830c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C
@@ -0,0 +1,17 @@
+// PR c++/59823
+// { dg-do compile { target c++11 } }
+
+struct X { };
+
+void f(X&&);
+
+struct wrap
+{
+ operator const X&() const;
+};
+
+int main()
+{
+ wrap w;
+ f(w); // { dg-error "lvalue" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C
new file mode 100644
index 000000000..16c39a9ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C
@@ -0,0 +1,708 @@
+// { dg-do link { target c++11 } }
+// { dg-options "" }
+// Generated by overload.py
+
+template<typename _Tp>
+inline _Tp&&
+movel(_Tp& __t)
+{ return static_cast<_Tp&&>(__t); }
+
+struct S{};
+
+S l; // lvalue (l)
+S const cl = l; // const lvalue (cl)
+S r() { return l; } // rvalue (r)
+S const cr() { return l; } // const rvalue (cr)
+S & nl = l; // named lvalue reference (nl)
+S const & ncl = l; // named const lvalue reference (ncl)
+S && nr = movel(l); // named rvalue reference (nr)
+S const && ncr = movel(l); // named const rvalue reference (ncr)
+S & ul() { return l; } // unnamed lvalue reference (ul)
+S const & ucl() { return l; } // unnamed const lvalue reference (ucl)
+S && ur() { return movel(l); } // unnamed rvalue reference (ur)
+S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr)
+
+void l0001(const S&&) {} // { dg-message "" }
+
+void l0010(S&&) {} // { dg-message "" }
+
+void l0011(S&&) {} // { dg-message "" }
+void l0011(const S&&);
+
+void l0100(const S&) {}
+
+void l0101(const S&) {}
+void l0101(const S&&);
+
+void l0110(const S&) {}
+void l0110(S&&);
+
+void l0111(const S&) {}
+void l0111(S&&);
+void l0111(const S&&);
+
+void l1000(S&) {}
+
+void l1001(S&) {}
+void l1001(const S&&);
+
+void l1010(S&) {}
+void l1010(S&&);
+
+void l1011(S&) {}
+void l1011(S&&);
+void l1011(const S&&);
+
+void l1100(S&) {}
+void l1100(const S&);
+
+void l1101(S&) {}
+void l1101(const S&);
+void l1101(const S&&);
+
+void l1110(S&) {}
+void l1110(const S&);
+void l1110(S&&);
+
+void l1111(S&) {}
+void l1111(const S&);
+void l1111(S&&);
+void l1111(const S&&);
+
+void cl0001(const S&&) {} // { dg-message "" }
+
+void cl0011(S&&);
+void cl0011(const S&&) {} // { dg-message "" }
+
+void cl0100(const S&) {}
+
+void cl0101(const S&) {}
+void cl0101(const S&&);
+
+void cl0110(const S&) {}
+void cl0110(S&&);
+
+void cl0111(const S&) {}
+void cl0111(S&&);
+void cl0111(const S&&);
+
+void cl1001(S&);
+void cl1001(const S&&) {} // { dg-message "" }
+
+void cl1011(S&);
+void cl1011(S&&);
+void cl1011(const S&&) {} // { dg-message "" }
+
+void cl1100(S&);
+void cl1100(const S&) {}
+
+void cl1101(S&);
+void cl1101(const S&) {}
+void cl1101(const S&&);
+
+void cl1110(S&);
+void cl1110(const S&) {}
+void cl1110(S&&);
+
+void cl1111(S&);
+void cl1111(const S&) {}
+void cl1111(S&&);
+void cl1111(const S&&);
+
+void r0001(const S&&) {}
+
+void r0010(S&&) {}
+
+void r0011(S&&) {}
+void r0011(const S&&);
+
+void r0100(const S&) {}
+
+void r0101(const S&);
+void r0101(const S&&) {}
+
+void r0110(const S&);
+void r0110(S&&) {}
+
+void r0111(const S&);
+void r0111(S&&) {}
+void r0111(const S&&);
+
+void r1001(S&);
+void r1001(const S&&) {}
+
+void r1010(S&);
+void r1010(S&&) {}
+
+void r1011(S&);
+void r1011(S&&) {}
+void r1011(const S&&);
+
+void r1100(S&);
+void r1100(const S&) {}
+
+void r1101(S&);
+void r1101(const S&);
+void r1101(const S&&) {}
+
+void r1110(S&);
+void r1110(const S&);
+void r1110(S&&) {}
+
+void r1111(S&);
+void r1111(const S&);
+void r1111(S&&) {}
+void r1111(const S&&);
+
+void cr0001(const S&&) {}
+
+void cr0011(S&&);
+void cr0011(const S&&) {}
+
+void cr0100(const S&) {}
+
+void cr0101(const S&);
+void cr0101(const S&&) {}
+
+void cr0110(const S&) {}
+void cr0110(S&&);
+
+void cr0111(const S&);
+void cr0111(S&&);
+void cr0111(const S&&) {}
+
+void cr1001(S&);
+void cr1001(const S&&) {}
+
+void cr1011(S&);
+void cr1011(S&&);
+void cr1011(const S&&) {}
+
+void cr1100(S&);
+void cr1100(const S&) {}
+
+void cr1101(S&);
+void cr1101(const S&);
+void cr1101(const S&&) {}
+
+void cr1110(S&);
+void cr1110(const S&) {}
+void cr1110(S&&);
+
+void cr1111(S&);
+void cr1111(const S&);
+void cr1111(S&&);
+void cr1111(const S&&) {}
+
+void nl0001(const S&&) {} // { dg-message "" }
+
+void nl0010(S&&) {} // { dg-message "" }
+
+void nl0011(S&&) {} // { dg-message "" }
+void nl0011(const S&&);
+
+void nl0100(const S&) {}
+
+void nl0101(const S&) {}
+void nl0101(const S&&);
+
+void nl0110(const S&) {}
+void nl0110(S&&);
+
+void nl0111(const S&) {}
+void nl0111(S&&);
+void nl0111(const S&&);
+
+void nl1000(S&) {}
+
+void nl1001(S&) {}
+void nl1001(const S&&);
+
+void nl1010(S&) {}
+void nl1010(S&&);
+
+void nl1011(S&) {}
+void nl1011(S&&);
+void nl1011(const S&&);
+
+void nl1100(S&) {}
+void nl1100(const S&);
+
+void nl1101(S&) {}
+void nl1101(const S&);
+void nl1101(const S&&);
+
+void nl1110(S&) {}
+void nl1110(const S&);
+void nl1110(S&&);
+
+void nl1111(S&) {}
+void nl1111(const S&);
+void nl1111(S&&);
+void nl1111(const S&&);
+
+void ncl0001(const S&&) {} // { dg-message "" }
+
+void ncl0011(S&&);
+void ncl0011(const S&&) {} // { dg-message "" }
+
+void ncl0100(const S&) {}
+
+void ncl0101(const S&) {}
+void ncl0101(const S&&);
+
+void ncl0110(const S&) {}
+void ncl0110(S&&);
+
+void ncl0111(const S&) {}
+void ncl0111(S&&);
+void ncl0111(const S&&);
+
+void ncl1001(S&);
+void ncl1001(const S&&) {} // { dg-message "" }
+
+void ncl1011(S&);
+void ncl1011(S&&);
+void ncl1011(const S&&) {} // { dg-message "" }
+
+void ncl1100(S&);
+void ncl1100(const S&) {}
+
+void ncl1101(S&);
+void ncl1101(const S&) {}
+void ncl1101(const S&&);
+
+void ncl1110(S&);
+void ncl1110(const S&) {}
+void ncl1110(S&&);
+
+void ncl1111(S&);
+void ncl1111(const S&) {}
+void ncl1111(S&&);
+void ncl1111(const S&&);
+
+void nr0001(const S&&) {} // { dg-message "" }
+
+void nr0010(S&&) {} // { dg-message "" }
+
+void nr0011(S&&) {} // { dg-message "" }
+void nr0011(const S&&);
+
+void nr0100(const S&) {}
+
+void nr0101(const S&) {}
+void nr0101(const S&&);
+
+void nr0110(const S&) {}
+void nr0110(S&&);
+
+void nr0111(const S&) {}
+void nr0111(S&&);
+void nr0111(const S&&);
+
+void nr1000(S&) {}
+
+void nr1001(S&) {}
+void nr1001(const S&&);
+
+void nr1010(S&) {}
+void nr1010(S&&);
+
+void nr1011(S&) {}
+void nr1011(S&&);
+void nr1011(const S&&);
+
+void nr1100(S&) {}
+void nr1100(const S&);
+
+void nr1101(S&) {}
+void nr1101(const S&);
+void nr1101(const S&&);
+
+void nr1110(S&) {}
+void nr1110(const S&);
+void nr1110(S&&);
+
+void nr1111(S&) {}
+void nr1111(const S&);
+void nr1111(S&&);
+void nr1111(const S&&);
+
+void ncr0001(const S&&) {} // { dg-message "" }
+
+void ncr0011(S&&);
+void ncr0011(const S&&) {} // { dg-message "" }
+
+void ncr0100(const S&) {}
+
+void ncr0101(const S&) {}
+void ncr0101(const S&&);
+
+void ncr0110(const S&) {}
+void ncr0110(S&&);
+
+void ncr0111(const S&) {}
+void ncr0111(S&&);
+void ncr0111(const S&&);
+
+void ncr1001(S&);
+void ncr1001(const S&&) {} // { dg-message "" }
+
+void ncr1011(S&);
+void ncr1011(S&&);
+void ncr1011(const S&&) {} // { dg-message "" }
+
+void ncr1100(S&);
+void ncr1100(const S&) {}
+
+void ncr1101(S&);
+void ncr1101(const S&) {}
+void ncr1101(const S&&);
+
+void ncr1110(S&);
+void ncr1110(const S&) {}
+void ncr1110(S&&);
+
+void ncr1111(S&);
+void ncr1111(const S&) {}
+void ncr1111(S&&);
+void ncr1111(const S&&);
+
+void ul0001(const S&&) {} // { dg-message "" }
+
+void ul0010(S&&) {} // { dg-message "" }
+
+void ul0011(S&&) {} // { dg-message "" }
+void ul0011(const S&&);
+
+void ul0100(const S&) {}
+
+void ul0101(const S&) {}
+void ul0101(const S&&);
+
+void ul0110(const S&) {}
+void ul0110(S&&);
+
+void ul0111(const S&) {}
+void ul0111(S&&);
+void ul0111(const S&&);
+
+void ul1000(S&) {}
+
+void ul1001(S&) {}
+void ul1001(const S&&);
+
+void ul1010(S&) {}
+void ul1010(S&&);
+
+void ul1011(S&) {}
+void ul1011(S&&);
+void ul1011(const S&&);
+
+void ul1100(S&) {}
+void ul1100(const S&);
+
+void ul1101(S&) {}
+void ul1101(const S&);
+void ul1101(const S&&);
+
+void ul1110(S&) {}
+void ul1110(const S&);
+void ul1110(S&&);
+
+void ul1111(S&) {}
+void ul1111(const S&);
+void ul1111(S&&);
+void ul1111(const S&&);
+
+void ucl0001(const S&&) {} // { dg-message "" }
+
+void ucl0011(S&&);
+void ucl0011(const S&&) {} // { dg-message "" }
+
+void ucl0100(const S&) {}
+
+void ucl0101(const S&) {}
+void ucl0101(const S&&);
+
+void ucl0110(const S&) {}
+void ucl0110(S&&);
+
+void ucl0111(const S&) {}
+void ucl0111(S&&);
+void ucl0111(const S&&);
+
+void ucl1001(S&);
+void ucl1001(const S&&) {} // { dg-message "" }
+
+void ucl1011(S&);
+void ucl1011(S&&);
+void ucl1011(const S&&) {} // { dg-message "" }
+
+void ucl1100(S&);
+void ucl1100(const S&) {}
+
+void ucl1101(S&);
+void ucl1101(const S&) {}
+void ucl1101(const S&&);
+
+void ucl1110(S&);
+void ucl1110(const S&) {}
+void ucl1110(S&&);
+
+void ucl1111(S&);
+void ucl1111(const S&) {}
+void ucl1111(S&&);
+void ucl1111(const S&&);
+
+void ur0001(const S&&) {}
+
+void ur0010(S&&) {}
+
+void ur0011(S&&) {}
+void ur0011(const S&&);
+
+void ur0100(const S&) {}
+
+void ur0101(const S&);
+void ur0101(const S&&) {}
+
+void ur0110(const S&);
+void ur0110(S&&) {}
+
+void ur0111(const S&);
+void ur0111(S&&) {}
+void ur0111(const S&&);
+
+void ur1001(S&);
+void ur1001(const S&&) {}
+
+void ur1010(S&);
+void ur1010(S&&) {}
+
+void ur1011(S&);
+void ur1011(S&&) {}
+void ur1011(const S&&);
+
+void ur1100(S&);
+void ur1100(const S&) {}
+
+void ur1101(S&);
+void ur1101(const S&);
+void ur1101(const S&&) {}
+
+void ur1110(S&);
+void ur1110(const S&);
+void ur1110(S&&) {}
+
+void ur1111(S&);
+void ur1111(const S&);
+void ur1111(S&&) {}
+void ur1111(const S&&);
+
+void ucr0001(const S&&) {}
+
+void ucr0011(S&&);
+void ucr0011(const S&&) {}
+
+void ucr0100(const S&) {}
+
+void ucr0101(const S&);
+void ucr0101(const S&&) {}
+
+void ucr0110(const S&) {}
+void ucr0110(S&&);
+
+void ucr0111(const S&);
+void ucr0111(S&&);
+void ucr0111(const S&&) {}
+
+void ucr1001(S&);
+void ucr1001(const S&&) {}
+
+void ucr1011(S&);
+void ucr1011(S&&);
+void ucr1011(const S&&) {}
+
+void ucr1100(S&);
+void ucr1100(const S&) {}
+
+void ucr1101(S&);
+void ucr1101(const S&);
+void ucr1101(const S&&) {}
+
+void ucr1110(S&);
+void ucr1110(const S&) {}
+void ucr1110(S&&);
+
+void ucr1111(S&);
+void ucr1111(const S&);
+void ucr1111(S&&);
+void ucr1111(const S&&) {}
+
+
+int main()
+{
+ l0001(l); // { dg-error "lvalue" }
+ l0010(l); // { dg-error "lvalue" }
+ l0011(l); // { dg-error "lvalue" }
+ l0100(l);
+ l0101(l);
+ l0110(l);
+ l0111(l);
+ l1000(l);
+ l1001(l);
+ l1010(l);
+ l1011(l);
+ l1100(l);
+ l1101(l);
+ l1110(l);
+ l1111(l);
+ cl0001(cl); // { dg-error "lvalue" }
+ cl0011(cl); // { dg-error "lvalue" }
+ cl0100(cl);
+ cl0101(cl);
+ cl0110(cl);
+ cl0111(cl);
+ cl1001(cl); // { dg-error "lvalue" }
+ cl1011(cl); // { dg-error "lvalue" }
+ cl1100(cl);
+ cl1101(cl);
+ cl1110(cl);
+ cl1111(cl);
+ r0001(r());
+ r0010(r());
+ r0011(r());
+ r0100(r());
+ r0101(r());
+ r0110(r());
+ r0111(r());
+ r1001(r());
+ r1010(r());
+ r1011(r());
+ r1100(r());
+ r1101(r());
+ r1110(r());
+ r1111(r());
+ cr0001(cr());
+ cr0011(cr());
+ cr0100(cr());
+ cr0101(cr());
+ cr0110(cr());
+ cr0111(cr());
+ cr1001(cr());
+ cr1011(cr());
+ cr1100(cr());
+ cr1101(cr());
+ cr1110(cr());
+ cr1111(cr());
+ nl0001(nl); // { dg-error "lvalue" }
+ nl0010(nl); // { dg-error "lvalue" }
+ nl0011(nl); // { dg-error "lvalue" }
+ nl0100(nl);
+ nl0101(nl);
+ nl0110(nl);
+ nl0111(nl);
+ nl1000(nl);
+ nl1001(nl);
+ nl1010(nl);
+ nl1011(nl);
+ nl1100(nl);
+ nl1101(nl);
+ nl1110(nl);
+ nl1111(nl);
+ ncl0001(ncl); // { dg-error "lvalue" }
+ ncl0011(ncl); // { dg-error "lvalue" }
+ ncl0100(ncl);
+ ncl0101(ncl);
+ ncl0110(ncl);
+ ncl0111(ncl);
+ ncl1001(ncl); // { dg-error "lvalue" }
+ ncl1011(ncl); // { dg-error "lvalue" }
+ ncl1100(ncl);
+ ncl1101(ncl);
+ ncl1110(ncl);
+ ncl1111(ncl);
+ nr0001(nr); // { dg-error "lvalue" }
+ nr0010(nr); // { dg-error "lvalue" }
+ nr0011(nr); // { dg-error "lvalue" }
+ nr0100(nr);
+ nr0101(nr);
+ nr0110(nr);
+ nr0111(nr);
+ nr1000(nr);
+ nr1001(nr);
+ nr1010(nr);
+ nr1011(nr);
+ nr1100(nr);
+ nr1101(nr);
+ nr1110(nr);
+ nr1111(nr);
+ ncr0001(ncr); // { dg-error "lvalue" }
+ ncr0011(ncr); // { dg-error "lvalue" }
+ ncr0100(ncr);
+ ncr0101(ncr);
+ ncr0110(ncr);
+ ncr0111(ncr);
+ ncr1001(ncr); // { dg-error "lvalue" }
+ ncr1011(ncr); // { dg-error "lvalue" }
+ ncr1100(ncr);
+ ncr1101(ncr);
+ ncr1110(ncr);
+ ncr1111(ncr);
+ ul0001(ul()); // { dg-error "lvalue" }
+ ul0010(ul()); // { dg-error "lvalue" }
+ ul0011(ul()); // { dg-error "lvalue" }
+ ul0100(ul());
+ ul0101(ul());
+ ul0110(ul());
+ ul0111(ul());
+ ul1000(ul());
+ ul1001(ul());
+ ul1010(ul());
+ ul1011(ul());
+ ul1100(ul());
+ ul1101(ul());
+ ul1110(ul());
+ ul1111(ul());
+ ucl0001(ucl()); // { dg-error "lvalue" }
+ ucl0011(ucl()); // { dg-error "lvalue" }
+ ucl0100(ucl());
+ ucl0101(ucl());
+ ucl0110(ucl());
+ ucl0111(ucl());
+ ucl1001(ucl()); // { dg-error "lvalue" }
+ ucl1011(ucl()); // { dg-error "lvalue" }
+ ucl1100(ucl());
+ ucl1101(ucl());
+ ucl1110(ucl());
+ ucl1111(ucl());
+ ur0001(ur());
+ ur0010(ur());
+ ur0011(ur());
+ ur0100(ur());
+ ur0101(ur());
+ ur0110(ur());
+ ur0111(ur());
+ ur1001(ur());
+ ur1010(ur());
+ ur1011(ur());
+ ur1100(ur());
+ ur1101(ur());
+ ur1110(ur());
+ ur1111(ur());
+ ucr0001(ucr());
+ ucr0011(ucr());
+ ucr0100(ucr());
+ ucr0101(ucr());
+ ucr0110(ucr());
+ ucr0111(ucr());
+ ucr1001(ucr());
+ ucr1011(ucr());
+ ucr1100(ucr());
+ ucr1101(ucr());
+ ucr1110(ucr());
+ ucr1111(ucr());
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C
new file mode 100644
index 000000000..e05693fc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C
@@ -0,0 +1,60 @@
+// { dg-do compile { target c++11 } }
+struct B
+{
+ virtual void f() final {}
+ virtual void g() {}
+ virtual void x() const {}
+};
+
+struct B2
+{
+ virtual void h() {}
+};
+
+struct D : B
+{
+ virtual void g() override final {} // { dg-error "overriding" }
+};
+
+template <class T> struct D2 : T
+{
+ void h() override {} // { dg-error "marked override, but does not override" }
+};
+
+template <class T> struct D3 : T
+{
+ void h() override {}
+};
+
+struct D4 : D
+{
+ void g() {} // { dg-error "virtual function" }
+};
+
+struct B3
+{
+ virtual void f() final final {} // { dg-error "duplicate virt-specifier" }
+};
+
+struct B4
+{
+ void f() final {} // { dg-error "marked final, but is not virtual" }
+};
+
+struct D5 : B
+{
+ void ff() override {} // { dg-error "marked override, but does not override" }
+ virtual void fff() override {} // { dg-error "marked override, but does not override" }
+ virtual void x() override {} // { dg-error "marked override, but does not override" }
+ void g() override;
+};
+
+void D5::g() override {} // { dg-error "not allowed outside a class definition" }
+void g() override {} // { dg-error "not allowed outside a class definition" }
+
+int main()
+{
+ D2<B> d;
+ D2<B2> d2;
+ D3<B2> d3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C
new file mode 100644
index 000000000..c0b89de2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C
@@ -0,0 +1,53 @@
+// { dg-do compile { target c++11 } }
+struct B1 {};
+
+struct B2 final {};
+
+struct D1 : B1 {};
+
+struct D2 : B2 {}; // { dg-error "cannot derive from 'final' base" }
+
+template<class T> struct D3 : T {};
+
+template<class T> struct D4 : T {}; // { dg-error "cannot derive from 'final' base" }
+
+template <class T> struct B3 {};
+
+template <class T> struct B4 final {};
+
+template <class T> struct B5 final {};
+
+struct undeclared<int> final { }; // { dg-error "not a class template" }
+
+struct D5 : B3<D5> {};
+
+struct D6 : B4<D6> {}; // { dg-error "cannot derive from 'final' base" }
+
+struct B6 final final {}; // { dg-error "duplicate virt-specifier" }
+
+struct B7 override {}; // { dg-error "cannot specify 'override' for a class" }
+
+namespace N
+{
+ struct C;
+}
+
+struct N::C final{};
+
+int main()
+{
+ D3<B1> d;
+ D4<B2> d2;
+ struct B2 final{}; // { dg-error "previous definition" }
+ B2 final; // { dg-error "has a previous declaration|previously declared here" }
+ B2 final2 = final;
+ struct B2 {}; // { dg-error "redefinition" }
+ struct B2 final; // { dg-error "redeclaration" }
+ struct B2 override; // { dg-message "previously declared here" }
+ struct B2 final {}; // { dg-error "redefinition" }
+ struct B2 override {}; // { dg-error "cannot specify 'override' for a class" }
+ B2 override{}; // { dg-error "redeclaration" }
+ struct foo final {}; // { dg-error "previous definition" }
+ struct foo final {}; // { dg-error "redefinition" }
+ foo final; // { dg-error "conflicting declaration" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C
new file mode 100644
index 000000000..2d22cbf2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "--std=c++98" }
+
+struct B final {}; // { dg-warning "override controls" }
+
+struct D : B {}; // { dg-error "cannot derive from 'final' base" }
+
+struct E __final {};
+
+struct F : E {}; // { dg-error "cannot derive from 'final' base" }
+
+struct G
+{
+ virtual void f();
+};
+
+struct H : G
+{
+ void f() override; // { dg-warning "override controls" }
+};
+
+int main()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C
new file mode 100644
index 000000000..7120984b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C
@@ -0,0 +1,45 @@
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "expected ';'" }
+// { dg-prune-output "expected unqualified-id" }
+// { dg-prune-output "declaration does not declare anything" }
+
+struct B
+{
+ virtual auto f() -> void final;
+ virtual auto g() -> void;
+};
+
+struct B2
+{
+ virtual auto f() -> void final {}
+};
+
+struct B3
+{
+ virtual auto f() -> final void; // { dg-error "type" }
+};
+
+struct B4
+{
+ virtual auto f() -> final void {} // { dg-error "type" }
+};
+
+struct D : B
+{
+ virtual auto g() -> void override;
+};
+
+struct D2 : B
+{
+ virtual auto g() -> void override {}
+};
+
+struct D3 : B
+{
+ virtual auto g() -> override void; // { dg-error "type" }
+};
+
+struct D4 : B
+{
+ virtual auto g() -> override void {} // { dg-error "type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C
new file mode 100644
index 000000000..5a11b7337
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C
@@ -0,0 +1,5 @@
+// PR c++/43509
+// { dg-do compile { target c++11 } }
+
+typedef int B; // { dg-message "" }
+B::B() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C
new file mode 100644
index 000000000..77ea14a92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C
@@ -0,0 +1,15 @@
+// PR c++/54526
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct X { };
+
+struct A { };
+
+int main()
+{
+ X<::A> x;
+}
+
+int a;
+bool b = 0<::a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C
new file mode 100644
index 000000000..6d8f565e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename, typename..., typename> void foo(); // { dg-message "note" }
+
+void bar()
+{
+ foo<int>(); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C
new file mode 100644
index 000000000..428673d18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename..., typename> void foo(); // { dg-message "note" }
+
+void bar()
+{
+ foo<int>(); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C
new file mode 100644
index 000000000..1f2ea5097
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename..., typename> struct A // { dg-error "parameter pack" }
+{
+ static int i;
+};
+
+A<int, int> a; // { dg-error "mismatch|expected|invalid type" }
+A<char,int> b; // { dg-error "mismatch|expected|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C
new file mode 100644
index 000000000..e70bdd17e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> int foo(const T&) // { dg-error "not expanded with|T" }
+{
+ union { T t; }; // { dg-error "not expanded with|T" }
+ return t;
+}
+
+void bar()
+{
+ foo(0); // { dg-error "no matching" }
+ // { dg-message "(candidate|cannot convert)" "candidate note" { target *-*-* } 10 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C
new file mode 100644
index 000000000..5f7010fe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template <typename... T> struct A // { dg-message "candidates|A" }
+{
+ A(T* p) { // { dg-error "parameter packs|T" }
+ (A<T...>*)(p);
+ }
+};
+
+A<int> a(0); // { dg-error "no matching" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C
new file mode 100644
index 000000000..272f4022d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template<typename> struct A;
+template<typename T, typename... U> struct A<T(U)> // { dg-error "parameter packs|U" }
+{
+ template<typename X> A(X);
+};
+
+A<void(int)> a(0); // { dg-error "incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C
new file mode 100644
index 000000000..f75373555
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous|declaration" }
+
+template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" }
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C
new file mode 100644
index 000000000..7fd20e7ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<typename... T, T = 0> struct A {}; // { dg-error "parameter packs|T|the end|parameter packs|anonymous" }
+
+struct B
+{
+ template <template <typename...> class C> B(C<int>);
+};
+
+B b = A<int>(); // { dg-error "mismatch|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C
new file mode 100644
index 000000000..3169312fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+template<int, typename... T> struct A
+{
+ template<int N> void foo(A<N,T>); // { dg-error "parameter packs|T" }
+};
+
+void bar()
+{
+ A<0,int>().foo(A<0,int>()); // { dg-error "no member named" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C
new file mode 100644
index 000000000..955562d20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> struct A
+{
+ template<int> void foo(A<T>); // { dg-error "not expanded|T" }
+};
+
+void bar()
+{
+ A<int>().foo<0>(A<int>()); // { dg-error "no member named" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C
new file mode 100644
index 000000000..89aae9a85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template <typename... T> struct A
+{
+ void foo(T...);
+ A(T... t) { foo(t); } // { dg-error "parameter packs|t" }
+};
+
+A<int> a(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C
new file mode 100644
index 000000000..9c3411cf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template<typename...> struct A;
+
+template<template<int> class... T> struct A<T<0>...>
+{
+ template<int> struct B {};
+ B<0> b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C
new file mode 100644
index 000000000..0ae684ce9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename ...T> struct A
+{
+ typedef typename T::X Y; // { dg-error "not expanded|T" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C
new file mode 100644
index 000000000..5722aa336
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+template<typename ...T, int = 0> struct A {}; // { dg-error "end of" }
+
+A<int> a; // { dg-error "mismatch|expected|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C
new file mode 100644
index 000000000..01844bd49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<typename...T> struct A<T*> // { dg-error "not expanded|T" }
+{
+ A();
+ A(T);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C
new file mode 100644
index 000000000..dac1da563
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<typename...T> struct A<T> // { dg-error "not expanded|T|" }
+{
+ static int i;
+};
+
+A<char> a; // { dg-error "incomplete" }
+A<int> b; // { dg-error "incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C
new file mode 100644
index 000000000..586469d88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename...T> struct A
+{
+ static T i; // { dg-error "parameter packs|T" }
+};
+
+int j = A<int>::i; // { dg-error "not a member" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C
new file mode 100644
index 000000000..147001e2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<typename...T, typename...U>
+ struct A<T..., U...> {}; // { dg-error "must be at the end" }
+
+A<int> a; // { dg-error "incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C
new file mode 100644
index 000000000..715ad27db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+int x[5];
+
+template<int M, int N, int (&... p)[N]> struct A;
+
+template<int M> struct A<M,5,x> {};
+
+A<0,5,x> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C
new file mode 100644
index 000000000..2094b2d98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<void (*... fp)()> struct A
+{
+ A() { fp(); } // { dg-error "not expanded|fp" }
+};
+
+void foo();
+
+A<foo> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C
new file mode 100644
index 000000000..fd07432bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+template<int...> struct A;
+
+template<template<int> class... T> struct A<T...> {}; // { dg-error "mismatch|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C
new file mode 100644
index 000000000..50bcfe81c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<int> struct A;
+
+void foo()
+{
+ __decltype A<0>; // { dg-error "invalid declarator|expected" }
+ __decltype (A<0>); // { dg-error "must be an expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C
new file mode 100644
index 000000000..8d9312c01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+typedef const int* type;
+
+float& foo( const type& ggg );
+int& foo( type&& ggg );
+
+void bar( int* someptr )
+{
+ int& x = foo( someptr );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C
new file mode 100644
index 000000000..7d3f6b664
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C
@@ -0,0 +1,39 @@
+// { dg-do compile { target c++11 } }
+template<typename T>
+struct uncvref
+{
+ typedef T type;
+};
+
+template<typename... Args>
+struct args
+{
+ static const int size = sizeof...(Args);
+};
+
+template<typename G, typename E, typename S, typename V, long GN = G::size, long EN = E::size>
+struct apply_args;
+
+template<typename... G, typename... E, typename S, typename V, long N>
+struct apply_args<args<G...>, args<E...>, S, V, N, N>
+{
+ typedef args<
+ typename G::template apply<typename uncvref<E>::type, S, V>::type...
+ > type;
+};
+
+struct or_
+{
+ template<typename E, typename S, typename V>
+ struct apply {
+ typedef typename E::type type;
+ };
+};
+
+template<typename T>
+struct identity
+{
+ typedef T type;
+};
+
+apply_args<args<or_>, args<identity<int>>, float, double> a1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C
new file mode 100644
index 000000000..3fca7f24f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C
@@ -0,0 +1,52 @@
+// { dg-do compile { target c++11 } }
+
+#define BUG
+struct type
+{
+ type() { }
+ type(const type&) { }
+
+private:
+ type(type&&);
+};
+
+template<typename _Tp>
+ struct identity
+ {
+ typedef _Tp type;
+ };
+
+template<typename _Tp>
+ inline _Tp&&
+ forward(typename identity<_Tp>::type&& __t)
+ { return __t; }
+
+struct vec
+{
+ template<typename _Args>
+ void
+ bar(_Args&& __args)
+#ifdef BUG
+ ;
+#else
+ {
+ type(forward<_Args>(__args));
+ }
+#endif
+};
+
+#ifdef BUG
+template<typename _Args>
+ void
+ vec::bar(_Args&& __args)
+ {
+ type(forward<_Args>(__args));
+ }
+#endif
+
+int main()
+{
+ vec v;
+ type c;
+ v.bar(c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C
new file mode 100644
index 000000000..8043f9660
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C
@@ -0,0 +1,4 @@
+// PR c++/34054
+// { dg-do compile { target c++11 } }
+
+template<typename... T> T foo() {} // { dg-error "not expanded|T" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C
new file mode 100644
index 000000000..9c5261da8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C
@@ -0,0 +1,9 @@
+// PR c++/34056
+// { dg-do compile { target c++11 } }
+
+template<typename... T> struct A
+{
+ void foo (T *) { ++p; } // { dg-error "not expanded|T" }
+ void bar (T **) { } // { dg-error "not expanded|T" }
+ T *p; // { dg-error "not expanded|T" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C
new file mode 100644
index 000000000..d74018e6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C
@@ -0,0 +1,7 @@
+// PR c++/34057
+// { dg-do compile { target c++11 } }
+
+template <typename... T> struct A
+{
+ typedef T X __attribute__ ((vector_size (8))); // { dg-error "not expanded|T" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C
new file mode 100644
index 000000000..dc9e8364f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C
@@ -0,0 +1,9 @@
+// PR c++/34058
+// { dg-do compile { target c++11 } }
+
+template <typename...T> struct A
+{
+ typedef T X; // { dg-error "not expanded|T" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C
new file mode 100644
index 000000000..f485346e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C
@@ -0,0 +1,10 @@
+// PR c++/34060
+// { dg-do compile { target c++11 } }
+
+template <int> struct A
+{
+ template <typename... > struct B {};
+ template <typename... T> struct B <int, T *> {}; // { dg-error "not expanded|T" }
+};
+
+A<0>::B<int>b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C
new file mode 100644
index 000000000..64f0ded10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C
@@ -0,0 +1,4 @@
+// PR c++/34061
+// { dg-do compile { target c++11 } }
+
+template<template<int> class ...T> struct A : T<0> {}; // { dg-error "not expanded|T" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C
new file mode 100644
index 000000000..7dd53ae26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C
@@ -0,0 +1,11 @@
+/* PR c++/38646 */
+/* { dg-do compile { target c++11 } } */
+
+template<int...> struct A;
+
+template<int... N> struct A<N..., N...> /* { dg-error "must be at the end" } */
+{
+ template<typename> struct B;
+
+ template<typename T> struct B<T*> {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C
new file mode 100644
index 000000000..89ce0d368
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C
@@ -0,0 +1,12 @@
+// PR c++/38795
+// { dg-do compile { target c++11 } }
+
+template<typename... T> int foo(int i)
+{
+ return *reinterpret_cast<T*>(i); // { dg-error "not expanded with|T" }
+}
+
+void bar(int i)
+{
+ foo<int>(i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C
new file mode 100644
index 000000000..5618e80eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/39639
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "template argument 1 is invalid" }
+
+template <class... Types>
+struct S
+ : S<...Types>, // { dg-error "expected parameter pack before '...'" }
+ S<...Types...>, // { dg-error "expected parameter pack before '...'" }
+ S<...> // { dg-error "expected parameter pack before '...'" }
+{
+ static int f () { return 1;}
+};
+
+int
+main ()
+{
+ return S<void>::f ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C
new file mode 100644
index 000000000..ff2396605
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C
@@ -0,0 +1,41 @@
+// PR c++/42844
+// { dg-do compile { target c++11 } }
+
+struct A // { dg-message "user-provided default constructor" }
+{
+ int i;
+ A() = default; // { dg-message "not user-provided" }
+};
+
+struct Base
+{
+ Base() {}
+};
+
+struct Derived : Base // { dg-message "user-provided default constructor" }
+{
+ int i;
+ Derived() = default; // { dg-message "not user-provided" }
+};
+
+struct Derived2 : Base // { dg-message "user-provided default constructor" }
+{
+ int i;
+ Derived2() = default; // { dg-message "not user-provided" }
+ Derived2( Derived2 const& ) = default;
+};
+
+struct Derived3 : Base // { dg-message "user-provided default constructor" }
+{
+ int i;
+ Derived3( Derived3 const& ) = default;
+ Derived3() = default; // { dg-message "not user-provided" }
+};
+
+void f()
+{
+ const A a; // { dg-error "uninitialized const" }
+ const Derived d; // { dg-error "uninitialized const" }
+ const Derived2 d2; // { dg-error "uninitialized const" }
+ const Derived3 d3; // { dg-error "uninitialized const" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C
new file mode 100644
index 000000000..dad8dfde9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C
@@ -0,0 +1,17 @@
+// PR c++/45908
+// Testcase by Jonathan Wakely <redi@gcc.gnu.org>
+
+// { dg-do compile { target c++11 } }
+
+struct vector {
+ struct iterator { };
+ struct const_iterator { };
+ iterator begin();
+ const_iterator begin() const;
+};
+
+class block {
+ vector v;
+ auto end() const -> decltype(v.begin())
+ { return v.begin(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C
new file mode 100644
index 000000000..e4eb317e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C
@@ -0,0 +1,224 @@
+// PR c++/47416
+// { dg-do compile { target c++11 } }
+
+namespace std
+{
+ template < typename _Tp, _Tp __v > struct integral_constant
+ {
+ static const _Tp value = __v;
+ };
+ typedef integral_constant < bool, false > false_type;
+ template < typename > struct is_array:false_type
+ {
+ };
+ template < typename > struct is_function:false_type
+ {
+ };
+ template < typename _Tp > struct remove_const
+ {
+ typedef _Tp type;
+ };
+ template < typename _Tp > struct remove_volatile
+ {
+ typedef _Tp type;
+ };
+ template < typename _Tp > struct remove_cv
+ {
+ typedef typename remove_const < typename remove_volatile <
+ _Tp >::type >::type type;
+ };
+ template < typename > struct remove_reference
+ {
+ };
+ template < typename _Tp > struct remove_reference <_Tp & >
+ {
+ typedef _Tp type;
+ };
+ template < typename _Up, bool = is_array < _Up >::value, bool =
+ is_function < _Up >::value > struct __decay_selector;
+ template < typename _Up > struct __decay_selector <_Up, false, false >
+ {
+ typedef typename remove_cv < _Up >::type __type;
+ };
+ template < typename _Tp > class decay
+ {
+ typedef typename remove_reference < _Tp >::type __remove_type;
+ public:typedef typename __decay_selector <
+ __remove_type >::__type type;
+ };
+ template < typename _Tp > struct __strip_reference_wrapper
+ {
+ typedef _Tp __type;
+ };
+ template < typename _Tp > struct __decay_and_strip
+ {
+ typedef typename __strip_reference_wrapper < typename decay <
+ _Tp >::type >::__type __type;
+ };
+ template < typename _Tp > _Tp forward (typename remove_reference <
+ _Tp >::type &)
+ {
+ }
+ template < class _T1, class _T2 > struct pair
+ {
+ _T1 first;
+ _T2 second;
+ constexpr pair (_T1, _T2 &):first (), second (__b) // { dg-error "was not declared in this scope" }
+ {
+ }
+ };
+ template < class _T1,
+ class _T2 > pair < typename __decay_and_strip < _T1 >::__type,
+ typename __decay_and_strip < _T2 >::__type > make_pair (_T1 && __x, _T2
+ && __y)
+ {
+ typedef typename __decay_and_strip < _T1 >::__type __ds_type1;
+ typedef typename __decay_and_strip < _T2 >::__type __ds_type2;
+ typedef pair < __ds_type1, __ds_type2 > __pair_type;
+ __pair_type (forward < _T1 > (__x), std::forward < _T2 > (__y));
+ }
+}
+
+typedef long size_t;
+namespace std
+{
+ template < typename > class allocator;
+ template < class > struct char_traits;
+ template < typename _CharT, typename = char_traits < _CharT >, typename =
+ allocator < _CharT > >class basic_string;
+ typedef basic_string < char >string;
+}
+namespace __gnu_cxx
+{
+ template < bool > class __pool;
+ template < template < bool > class, bool > struct __common_pool
+ {
+ };
+ template < template < bool > class, bool > struct __common_pool_base;
+ template < template < bool > class _PoolTp >
+ struct __common_pool_base <_PoolTp, true >:__common_pool < _PoolTp, true >
+ {
+ };
+ template < template < bool > class _PoolTp,
+ bool _Thread > struct __common_pool_policy:__common_pool_base < _PoolTp,
+ _Thread >
+ {
+ template < typename, template < bool > class _PoolTp1 =
+ _PoolTp, bool _Thread1 = _Thread > struct _M_rebind
+ {
+ typedef __common_pool_policy < _PoolTp1, _Thread1 > other;
+ };
+ };
+ template < typename _Tp > class __mt_alloc_base
+ {
+ };
+template < typename _Tp, typename _Poolp = __common_pool_policy < __pool, true > >class __mt_alloc:public __mt_alloc_base <
+ _Tp
+ >
+ {
+ public:size_t size_type;
+ typedef _Tp value_type;
+ template < typename _Tp1, typename _Poolp1 = _Poolp > struct rebind
+ {
+ typedef typename _Poolp1::template _M_rebind < _Tp1 >::other pol_type;
+ typedef __mt_alloc < _Tp1, pol_type > other;
+ };
+ };
+}
+
+namespace std
+{
+ template < typename _Tp > class allocator:public __gnu_cxx::__mt_alloc <
+ _Tp >
+ {
+ };
+ template < typename, typename > struct unary_function
+ {
+ };
+ template < typename, typename, typename > struct binary_function
+ {
+ };
+ template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool >
+ {
+ };
+}
+
+namespace boost
+{
+ template < class > struct hash;
+ template < class K, class T, class = hash < K >, class =
+ std::equal_to < K >, class =
+ std::allocator < std::pair < const K, T > >>class unordered_map;
+ template < >struct hash <std::string >:std::unary_function < std::string,
+ size_t >
+ {
+ };
+ namespace unordered_detail
+ {
+ template < class Alloc, class T > struct rebind_wrap
+ {
+ typedef typename Alloc::template rebind < T >::other type;
+ };
+ }
+ namespace unordered_detail
+ {
+ size_t default_bucket_count;
+ template < class, class > struct map_extractor;
+ struct ungrouped
+ {
+ };
+ template < class T > class hash_table:T::buckets, T::buffered_functions
+ {
+ };
+ template < class, class, class H, class P, class A, class, class G > struct types
+ {
+ typedef H hasher;
+ typedef P key_equal;
+ typedef A value_allocator;
+ };
+ template < class T > class hash_unique_table:T
+ {
+ public:typedef typename T::hasher hasher;
+ typedef typename T::key_equal key_equal;
+ typedef typename T::value_allocator value_allocator;
+ typedef typename T::table table;
+ hash_unique_table (size_t n, hasher, key_equal,
+ value_allocator & a):table (n, a) // { dg-error "is not a direct base" }
+ {
+ }
+ };
+ template < class K, class H, class P, class A > struct map:types < K,
+ typename A::value_type, H, P, A, map_extractor < K,
+ typename A::value_type >, ungrouped >
+ {
+ typedef hash_unique_table < map < K, H, P, A > >impl;
+ typedef hash_table < map < K, H, P, A > >table;
+ };
+ }
+ template < class K, class T, class H, class P, class A > class unordered_map
+ {
+ typedef std::pair < const K, T > value_type;
+ typedef H hasher;
+ typedef P key_equal;
+ typedef A allocator_type;
+ typedef typename unordered_detail::rebind_wrap < allocator_type,
+ value_type >::type value_allocator;
+ typedef boost::unordered_detail::map < K, H, P, value_allocator > types;
+ typedef typename types::impl table;
+ typedef size_t size_type;
+ private:table table_;
+ public: unordered_map (size_type n = boost::unordered_detail::default_bucket_count,
+ hasher hf = hasher (), key_equal eql = key_equal (),
+ allocator_type a = allocator_type ()):table_ (n, hf, eql, a) // { dg-message "required" }
+ {
+ }
+ };
+}
+
+void
+foo (const int &a)
+{
+ typedef boost::unordered_map < std::string, int >Name2Port;
+ Name2Port b; // { dg-message "required" }
+ std::make_pair (a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C
new file mode 100644
index 000000000..bf9a06527
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C
@@ -0,0 +1,9 @@
+// PR c++/47476
+// { dg-do compile { target c++11 } }
+
+int
+foo (int a, int b)
+{
+ const bool c ((a != 0) == (b != 26));
+ return c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C
new file mode 100644
index 000000000..560e70b6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct Handle
+{
+ Handle(T& t);
+};
+
+template<class T>
+struct Class {
+ struct Struct {} data;
+ void f();
+ void g();
+};
+
+template<class T>
+void Class<T>::f() {
+ Handle< decltype((data)) > handle(data);
+}
+
+template<class T>
+void Class<T>::g() {
+ Handle< decltype((data)) > handle(data);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C
new file mode 100644
index 000000000..1f7d8d566
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C
@@ -0,0 +1,40 @@
+// { dg-do compile { target c++11 } }
+
+#include <utility>
+
+class A
+{
+public:
+
+ A(int a, int& b, int&& c)
+ : m_a{a},
+ m_b{b},
+ m_c{std::move(c)}
+ {}
+
+private:
+
+ int m_a;
+ int& m_b;
+ int&& m_c;
+};
+
+
+struct X {};
+
+class B
+{
+public:
+
+ B(X& q, X&& r, const X& s)
+ : m_q{q},
+ m_r{std::move(r)},
+ m_s{s}
+ {}
+
+private:
+
+ X& m_q;
+ X&& m_r;
+ const X& m_s;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C
new file mode 100644
index 000000000..d203a33ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+struct GrandParent {
+ void *get();
+};
+
+template<class OBJ>
+struct Parent : public GrandParent{
+};
+
+template<typename T>
+struct Child : public Parent<T> {
+ using GrandParent::get;
+ void Foo() {
+ void* ex = get();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C
new file mode 100644
index 000000000..de82435a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template<class T> int foo(int a)
+{
+ const unsigned b = a < 0 ? -a : a;
+ return 0;
+}
+
+int i = foo<float>(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C
new file mode 100644
index 000000000..af1d1cf2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C
@@ -0,0 +1,20 @@
+// PR c++/51150
+// { dg-do compile { target c++11 } }
+
+struct Clock {
+ double Now();
+};
+template <class T> void Foo(Clock* clock) {
+ const int now = clock->Now();
+}
+
+template void Foo<float>(Clock*);
+
+template <class T> void Boo(int val) {
+ const int now1 = (double)(val);
+ const int now2 = const_cast<double>(val); // { dg-error "invalid" }
+ const int now3 = static_cast<double>(val);
+ const int now4 = reinterpret_cast<double>(val); // { dg-error "invalid" }
+}
+
+template void Boo<float>(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C
new file mode 100644
index 000000000..356b628e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C
@@ -0,0 +1,11 @@
+// PR c++/51216
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+void foo()
+{
+ int i = ({ if (1) ; }); // { dg-error "ignored" }
+ int j = ({ for (;;) ; }); // { dg-error "ignored" }
+ int k = ({ while (1) ; }); // { dg-error "ignored" }
+ int l = ({ do { } while (1); }); // { dg-error "ignored" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C
new file mode 100644
index 000000000..f80bd0e77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C
@@ -0,0 +1,14 @@
+// PR c++/51225
+// { dg-do compile { target c++11 } }
+
+template<int> struct A {};
+
+template<typename> void foo()
+{
+ A<int(x)> a; // { dg-error "not declared|invalid type" }
+}
+
+template<typename> struct bar
+{
+ static constexpr A<1> b = A<1>(x); // { dg-error "not declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C
new file mode 100644
index 000000000..1e048ef2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C
@@ -0,0 +1,9 @@
+// PR c++/51226
+// { dg-do compile { target c++11 } }
+
+template<int> struct A // { dg-error "provided" }
+{
+ enum E : int;
+};
+
+template<> enum A<>::E : int {} // { dg-error "wrong number|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C
new file mode 100644
index 000000000..eb304ba44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C
@@ -0,0 +1,18 @@
+// PR c++/51313
+// { dg-do compile { target c++11 } }
+
+class ostream;
+
+extern "C" {
+ extern int isdigit (int);
+}
+
+ostream&
+operator<<(ostream&, const unsigned char*);
+
+extern ostream cout;
+
+int main()
+{
+ cout << isdigit(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C
new file mode 100644
index 000000000..7aa80e536
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+void
+foo()
+{
+ float x = operator"" _F(); // { dg-error "was not declared in this scope" }
+ float y = 0_F; // { dg-error "unable to find numeric literal operator" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C
new file mode 100644
index 000000000..6a57e4782
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C
@@ -0,0 +1,7 @@
+// PR c++/51463
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ static virtual int i = 0; // { dg-error "both virtual and static|declared as" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C
new file mode 100644
index 000000000..578a799e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C
@@ -0,0 +1,50 @@
+// PR c++/51547
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct vector
+{
+ T*
+ begin()
+ { return &member; }
+
+ const T*
+ begin() const
+ { return &member; }
+
+ T member;
+};
+
+struct Bar {
+ int x;
+};
+
+struct Foo {
+ const vector<Bar>& bar() const {
+ return bar_;
+ }
+
+ vector<Bar> bar_;
+};
+
+template <class X>
+struct Y {
+ void foo() {
+ Foo a;
+ auto b = a.bar().begin();
+ auto&& c = b->x;
+ }
+};
+
+template <class X>
+void foo() {
+ Foo a;
+ auto b = a.bar().begin();
+ auto&& c = b->x;
+}
+
+int main() {
+ Y<int> p;
+ p.foo();
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C
new file mode 100644
index 000000000..9a7318804
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C
@@ -0,0 +1,6 @@
+// PR c++/51619
+// { dg-do compile { target c++11 } }
+
+struct A { virtual ~A(); };
+struct B { A a[1][1]; } b;
+struct C { A a[3][3]; } c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C
new file mode 100644
index 000000000..69b744158
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C
@@ -0,0 +1,8 @@
+// PR c++/51786
+// { dg-do compile { target c++11 } }
+
+enum E {};
+struct A {};
+
+void foo() { decltype(E{}); } // { dg-error "does not declare anything" }
+void bar() { decltype(A{}); } // { dg-error "does not declare anything" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C
new file mode 100644
index 000000000..0210f53b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C
@@ -0,0 +1,27 @@
+// PR c++/52440
+// { dg-do compile { target c++11 } }
+
+template<bool>
+struct V
+{
+ typedef void type;
+};
+
+template<typename T>
+struct X
+{
+ template<typename>
+ static constexpr bool always_true()
+ {
+ return true;
+ }
+
+ template<typename U,
+ typename = typename V<always_true<U>()>::type>
+ X(U &&) {}
+};
+
+int main()
+{
+ X<int> x(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C
new file mode 100644
index 000000000..1a01fb295
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C
@@ -0,0 +1,83 @@
+// PR c++/52744
+// { dg-do compile { target c++11 } }
+
+struct T
+{
+ int a;
+ void b(){}
+ int c(int)
+ {
+ return 1;
+ }
+};
+
+template<typename CT, CT> struct member_helper;
+
+template<typename FT, FT(T::*mem)>
+struct member_helper<FT(T::*), mem>
+{
+ static const char* worker()
+ {
+ return "for members";
+ }
+};
+
+template<typename Return, typename... Args, Return(T::*fun)(Args...)>
+struct member_helper<Return(T::*)(Args...), fun>
+{
+ static const char* worker()
+ {
+ return "for member functions returning non void";
+ }
+};
+
+template<typename... Args, void(T::*fun)(Args...)>
+struct member_helper<void(T::*)(Args...), fun>
+{
+ static const char* worker()
+ {
+ return "for member functions returning void";
+ }
+};
+
+void member_test()
+{
+ member_helper<decltype(&T::a), &T::a>::worker();
+ member_helper<decltype(&T::b), &T::b>::worker();
+ member_helper<decltype(&T::c), &T::c>::worker();
+}
+
+typedef void lua_State;
+
+template<typename T, T> class function_helper
+{
+ static_assert(sizeof(T) != sizeof(T),
+ "Error: function_helper works with functions (duh)");
+};
+
+template<typename Return, typename... Args, Return(*func)(Args...)>
+struct function_helper<Return(*)(Args...), func>
+{
+ static int wrapper(lua_State* l)
+ {
+ return 1;
+ }
+};
+
+template<typename... Args, void(*func)(Args...)>
+struct function_helper<void(*)(Args...), func>
+{
+ static int wrapper(lua_State* l)
+ {
+ return 0;
+ }
+};
+
+int ciao(int){ return 0; }
+void ciao2(int){}
+
+void function_test()
+{
+ function_helper<decltype(&ciao), &ciao>::wrapper(0);
+ function_helper<decltype(&ciao2), &ciao2>::wrapper(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C
new file mode 100644
index 000000000..f6467f8f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+struct Solvable;
+namespace sat
+{
+ class Solvable
+ {
+ public:
+ typedef bool bool_type;
+ };
+}
+
+class Resolvable : public sat::Solvable
+{
+public:
+ using sat::Solvable::bool_type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C
new file mode 100644
index 000000000..4dac31b88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C
@@ -0,0 +1,24 @@
+// PR c++/54318
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct wrapped
+{
+ typedef T type;
+};
+
+template <typename T>
+typename T::type unwrap1(T);
+
+int unwrap(int);
+
+template <typename T>
+auto unwrap(T t) -> decltype(unwrap(unwrap1(t)))
+{
+ return unwrap(unwrap1(t));
+}
+
+int main()
+{
+ unwrap(wrapped<wrapped<int>>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C
new file mode 100644
index 000000000..71b6c7192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C
@@ -0,0 +1,37 @@
+// PR c++/54323
+// { dg-do compile { target c++11 } }
+
+template<bool, typename T = void>
+struct enable_if { };
+
+template<typename T>
+struct enable_if<true, T>
+{ typedef T type; };
+
+template<template<typename> class CRTP, typename T>
+class Base
+{
+public:
+ template<template<typename> class CRTP0, typename T0, class>
+ friend int func(const Base<CRTP0, T0>& rhs);
+
+protected:
+ int n;
+};
+
+template<template<typename> class CRTP0, typename T0,
+ class = typename enable_if<true>::type>
+int func(const Base<CRTP0, T0>& rhs)
+{
+ return rhs.n;
+}
+
+template<typename T>
+class Derived : public Base<Derived, T> {};
+
+int main()
+{
+ Derived<int> x;
+ func(x);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C
new file mode 100644
index 000000000..94b576f4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C
@@ -0,0 +1,221 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fcompare-debug" }
+
+typedef long unsigned size_t;
+namespace
+{
+ template < typename _Tp, _Tp __v > struct integral_constant
+ {
+ static const _Tp value = __v;
+ };
+ typedef integral_constant < bool, false > false_type;
+ template < typename > struct remove_cv;
+ template < typename > struct __is_void_helper:false_type
+ {
+ };
+ template
+ <
+ typename
+ _Tp
+ >
+ struct
+ is_void:integral_constant
+ < bool, (__is_void_helper < typename remove_cv < _Tp >::type >::value) >
+ {
+ };
+ template < typename > struct is_function:false_type
+ {
+ };
+ template < typename _Tp > struct remove_const
+ {
+ typedef _Tp type;
+ };
+ template < typename _Tp > struct remove_volatile
+ {
+ typedef _Tp type;
+ };
+ template < typename _Tp > struct remove_cv
+ {
+ typedef
+ typename
+ remove_const < typename remove_volatile < _Tp >::type >::type type;
+ };
+ template < typename > struct is_lvalue_reference:false_type
+ {
+ };
+ template < typename _Tp, bool = is_void < _Tp >::value > struct __add_rvalue_reference_helper
+ {
+ typedef _Tp type;
+ };
+ template
+ <
+ typename
+ _Tp > struct add_rvalue_reference:__add_rvalue_reference_helper < _Tp >
+ {
+ };
+ template
+ < typename _Tp > typename add_rvalue_reference < _Tp >::type declval ();
+ template
+ <
+ typename,
+ typename
+ _To, bool = (is_function < _To >::value) > struct __is_convertible_helper;
+ template
+ <
+ typename
+ _From, typename _To > struct __is_convertible_helper <_From, _To, false >
+ {
+ static const bool __value = sizeof ((declval < _From > ()));
+ };
+ template
+ <
+ typename
+ _From,
+ typename
+ _To
+ >
+ struct
+ is_convertible:integral_constant
+ < bool, __is_convertible_helper < _From, _To >::__value >
+ {
+ };
+ template < bool, typename _Tp = void >struct enable_if
+ {
+ typedef _Tp type;
+ };
+ template < typename _Tp > struct identity
+ {
+ typedef _Tp type;
+ };
+ template
+ <
+ typename
+ _Tp
+ >
+ typename
+ enable_if
+ <
+ is_lvalue_reference
+ < _Tp >::value, _Tp >::type forward (typename identity < _Tp >::type)
+ {
+ return 0;
+
+ }
+ template < class _T1, class > struct pair
+ {
+ _T1 first;
+ template < class _U1, class = typename enable_if < is_convertible < _U1, _T1 >::value >::type > pair (_U1 __x):
+ first
+ (forward < _U1 > (__x))
+ {
+ }
+ };
+}
+
+namespace __gnu_cxx
+{
+ template < typename > class new_allocator
+ {
+ };
+}
+
+namespace std
+{
+ template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp >
+ {
+ public:
+ template < typename > struct rebind
+ {
+ typedef allocator other;
+ };
+ };
+ template < typename, typename > struct unary_function;
+ template < typename, typename, typename > struct binary_function
+ {
+ };
+ template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool >
+ {
+ };
+ template
+ <
+ typename
+ _Pair
+ > struct _Select1st:unary_function < _Pair, typename _Pair::first_type >
+ {
+ };
+ template < typename > struct _Rb_tree_node;
+ template
+ <
+ typename,
+ typename
+ _Val,
+ typename,
+ typename _Compare, typename _Alloc = allocator < _Val > >class _Rb_tree
+ {
+ typedef
+ typename
+ _Alloc::template
+ rebind < _Rb_tree_node < _Val > >::other _Node_allocator;
+ public:
+ typedef _Alloc allocator_type;
+ template < typename _Key_compare > struct _Rb_tree_impl
+ {
+ _Rb_tree_impl (_Key_compare, _Node_allocator);
+ };
+ _Rb_tree_impl < _Compare > _M_impl;
+ _Rb_tree (_Compare __comp, allocator_type __a):
+ _M_impl (__comp, __a)
+ {
+ }
+ };
+ template < class _E > class initializer_list
+ {
+ typedef size_t size_type;
+ typedef _E *iterator;
+ iterator _M_array;
+ size_type _M_len;
+ };
+ template
+ <
+ typename
+ _Key,
+ typename
+ _Tp,
+ typename
+ _Compare
+ =
+ less
+ <
+ _Key >, typename _Alloc = allocator < pair < _Key, _Tp > > >class multimap
+ {
+ typedef _Key key_type;
+ typedef pair < _Key, _Tp > value_type;
+ typedef _Compare key_compare;
+ typedef _Alloc allocator_type;
+ typedef
+ _Rb_tree
+ <
+ key_type,
+ value_type, _Select1st < value_type >, key_compare > _Rep_type;
+ _Rep_type _M_t;
+ public:
+ multimap (initializer_list < value_type >, _Compare __comp = _Compare (), allocator_type __a = allocator_type ()):
+ _M_t
+ (__comp, __a)
+ {
+ }
+ };
+}
+
+using namespace std;
+void
+test01 ()
+{
+ typedef multimap < int, double >Container;
+ Container (
+ {
+ {
+ 1}
+ }
+ );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C
new file mode 100644
index 000000000..210883813
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C
@@ -0,0 +1,7 @@
+// PR c++/57172
+// { dg-do compile { target c++11 } }
+
+template <typename T> int f (T&) { return 0; }
+template <typename T> int f (T&&) = delete;
+int i;
+int j = f (i);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C
new file mode 100644
index 000000000..104f1a7ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C
@@ -0,0 +1,45 @@
+// PR c++/57416
+// { dg-do compile { target c++11 } }
+
+struct Nothing
+{
+};
+
+template <class PARENTDATA>
+void func3 (PARENTDATA & p_parent_data)
+{
+ struct Data
+ {
+ PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" }
+ } data;
+}
+
+template <class PARENTDATA>
+void func2 (PARENTDATA & p_parent_data)
+{
+ struct Data
+ {
+ PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" }
+ } data;
+
+ data.parent_data.x = 5;
+ func3(data);
+}
+
+template <class PARENTDATA>
+void func1 (PARENTDATA & p_parent_data)
+{
+ struct Data
+ {
+ PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" }
+ int x = 1;
+ } data;
+
+ func2(data);
+}
+
+int main()
+{
+ Nothing nothing;
+ func1(nothing);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C
new file mode 100644
index 000000000..33f46371e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall -Wextra" }
+
+template<class T>
+void f(T t, void* = 0) // { dg-warning "unused parameter" }
+{
+}
+
+template<class T>
+auto g(T t) -> decltype(f(t))
+{
+ f(t);
+}
+
+int main()
+{
+ g(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C
new file mode 100644
index 000000000..6d48a555b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+// PR c++/58072
+
+extern 'c'void*blah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern L'c'void*Lblah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern u'c'void*ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern U'c'void*Ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+
+extern "c"void*strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern L"c"void*Lstrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern u"c"void*ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern U"c"void*Ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern u8"c"void*u8strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+
+extern 123void*ULLblah(void*); // { dg-error "expected unqualified-id before numeric constant" }
+extern 123.456void*Ldblblah(void*); // { dg-error "expected unqualified-id before numeric constant" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C
new file mode 100644
index 000000000..82f200df0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C
@@ -0,0 +1,14 @@
+// PR c++/58080
+// { dg-do compile { target c++11 } }
+
+template<class A, class B>
+struct Eval
+{
+ void foo(A a, B b) { bar(a,b, 0); }
+ auto bar(A a, B b, decltype(a+b)* _) -> decltype(a+b) { return a+b; } // { dg-error "pointer" }
+};
+
+int main()
+{
+ Eval<int,void*> eiv; eiv.foo(0,0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C
new file mode 100644
index 000000000..71f252098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C
@@ -0,0 +1,11 @@
+// PR c++/58510
+// { dg-do compile { target c++11 } }
+
+void foo()
+{
+ union
+ { // { dg-error "multiple" }
+ int i = 0;
+ char c = 0;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C
new file mode 100644
index 000000000..c9e3e308a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C
@@ -0,0 +1,8 @@
+// PR c++/58563
+// { dg-do compile { target c++11 } }
+
+template<int> void foo()
+{
+ enum E {};
+ E().E::~T(); // { dg-error "not a class" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C
new file mode 100644
index 000000000..fe97c6de9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C
@@ -0,0 +1,18 @@
+// PR c++/58674
+// { dg-do compile { target c++11 } }
+
+template<int> struct A {};
+
+template<int N> using B = A<N>;
+
+template<typename T> struct C
+{
+ B<T::i> b; // { dg-error "not usable" }
+};
+
+struct X
+{
+ static const int i;
+};
+
+C<X> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C
new file mode 100644
index 000000000..12f2e3097
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C
@@ -0,0 +1,6 @@
+// PR c++/58707
+// { dg-do compile { target c++11 } }
+
+template<int i> class TC { };
+constexpr int foo[] = { 42 };
+TC<foo[0 > 1]> bar;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C
new file mode 100644
index 000000000..5920f5c3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C
@@ -0,0 +1,12 @@
+// PR c++/59111
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct A : virtual T // { dg-error "base type" }
+{
+ A();
+ A(const A&);
+};
+
+template<typename T> A<T>::A(const A<T>&) = default;
+
+A<int> a = A<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C
new file mode 100644
index 000000000..4e4885441
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C
@@ -0,0 +1,5 @@
+// PR c++/59111
+// { dg-do compile { target c++11 } }
+
+auto& foo(); // { dg-error "type specifier without trailing return type" "" { target { ! c++1y } } }
+int i = foo(); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C
new file mode 100644
index 000000000..36af96a89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+typedef int T __attribute__((vector_size(2*sizeof(int))));
+
+void foo(T& r, const T& a, const T& b)
+{
+ constexpr T c = a < b; // { dg-error "constant" }
+ r = c ? a : b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C
new file mode 100644
index 000000000..ab73e752e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C
@@ -0,0 +1,14 @@
+// PR c++/60047
+// { dg-do compile { target c++11 } }
+
+struct B { };
+
+template<typename T> struct A : virtual B
+{
+ A();
+ A(const A&);
+};
+
+template<typename T> A<T>::A(const A<T>&) = default;
+
+A<int> a = A<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C
new file mode 100644
index 000000000..297001741
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C
@@ -0,0 +1,8 @@
+// PR c++/60215
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ void foo();
+ int i : foo; // { dg-error "width" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
new file mode 100644
index 000000000..ed12655af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
@@ -0,0 +1,9 @@
+// Origin PR c++/51476
+// { dg-do compile { target c++11 } }
+
+template<int> struct A {};
+struct B
+{
+ int i;
+ A<&B::i> a; // { dg-error "could not convert template argument" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C
new file mode 100644
index 000000000..4fecdc715
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C
@@ -0,0 +1,16 @@
+// Test for range-based for loop
+// Test the loop with an array
+
+// { dg-do run { target c++11 } }
+
+extern "C" void abort();
+
+int main()
+{
+ int a[] = {1,2,3,4};
+ int sum = 0;
+ for (int x : a)
+ sum += x;
+ if (sum != 10)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C
new file mode 100644
index 000000000..139783090
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C
@@ -0,0 +1,18 @@
+// PR c++/47388
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-for-scope" }
+
+template <int>
+void
+foo ()
+{
+ int a[] = { 1, 2, 3, 4 };
+ for (int i : a)
+ ;
+}
+
+void
+bar ()
+{
+ foo <0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C
new file mode 100644
index 000000000..d7dde91bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C
@@ -0,0 +1,39 @@
+// Test for range-based for loop
+// Test the loop with a custom iterator
+// with begin/end as member functions
+
+// { dg-do compile { target c++11 } }
+
+struct iterator
+{
+ int x;
+ explicit iterator(int v) :x(v) {}
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+};
+
+namespace foo
+{
+ struct container
+ {
+ int min, max;
+ container(int a, int b) :min(a), max(b) {}
+
+ iterator begin()
+ {
+ return iterator(min);
+ }
+ iterator end()
+ {
+ return iterator(max + 1);
+ }
+ };
+}
+
+int main()
+{
+ foo::container c(1,4);
+ for (int it : c)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C
new file mode 100644
index 000000000..5a2a7d190
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C
@@ -0,0 +1,115 @@
+// Test for range-based for loop with templates
+// and begin/end as member functions
+
+// { dg-do run { target c++11 } }
+
+/* Preliminary declarations */
+namespace pre
+{
+ struct iterator
+ {
+ int x;
+ explicit iterator (int v) :x(v) {}
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+ };
+
+ struct container
+ {
+ int min, max;
+ container(int a, int b) :min(a), max(b) {}
+ iterator begin() const
+ {
+ return iterator(min);
+ }
+ iterator end() const
+ {
+ return iterator(max);
+ }
+
+ };
+
+} //namespace pre
+
+using pre::container;
+extern "C" void abort(void);
+
+container run_me_just_once()
+{
+ static bool run = false;
+ if (run)
+ abort();
+ run = true;
+ return container(1,2);
+}
+
+/* Template with dependent expression. */
+template<typename T> int test1(const T &r)
+{
+ int t = 0;
+ for (int i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression and dependent declaration. */
+template<typename T> int test2(const container &r)
+{
+ int t = 0;
+ for (T i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression (array) and dependent declaration. */
+template<typename T> int test2(const int (&r)[4])
+{
+ int t = 0;
+ for (T i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression and auto declaration. */
+template<typename T> int test3(const container &r)
+{
+ int t = 0;
+ for (auto i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression (array) and auto declaration. */
+template<typename T> int test3(const int (&r)[4])
+{
+ int t = 0;
+ for (auto i : r)
+ t += i;
+ return t;
+}
+
+int main ()
+{
+ container c(1,5);
+ int a[4] = {5,6,7,8};
+
+ for (auto x : run_me_just_once())
+ ;
+
+ if (test1 (c) != 10)
+ abort();
+ if (test1 (a) != 26)
+ abort();
+
+ if (test2<int> (c) != 10)
+ abort();
+ if (test2<int> (a) != 26)
+ abort();
+
+ if (test3<int> (c) != 10)
+ abort();
+ if (test3<int> (a) != 26)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C
new file mode 100644
index 000000000..ab7bdde47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C
@@ -0,0 +1,102 @@
+// Test for errors in range-based for loops
+// with member begin/end
+
+// { dg-do compile { target c++11 } }
+
+//These should not be used
+template<typename T> int *begin(T &t)
+{
+ T::fail;
+}
+template<typename T> int *end(T &t)
+{
+ T::fail;
+}
+
+struct container1
+{
+ int *begin();
+ //no end
+};
+
+struct container2
+{
+ int *end();
+ //no begin
+};
+
+struct container3
+{
+private:
+ int *begin(); // { dg-error "is private" }
+ int *end(); // { dg-error "is private" }
+};
+
+struct container4
+{
+ int *begin;
+ int *end;
+};
+
+struct container5
+{
+ typedef int *begin;
+ typedef int *end;
+};
+
+struct callable
+{
+ int *operator()();
+};
+
+struct container6
+{
+ callable begin;
+ callable end;
+};
+
+struct container7
+{
+ static callable begin;
+ static callable end;
+};
+
+struct container8
+{
+ static int *begin();
+ int *end();
+};
+
+struct private_callable
+{
+private:
+ int *operator()(); // { dg-error "is private" }
+};
+
+struct container9
+{
+ private_callable begin;
+ private_callable end;
+};
+
+struct container10
+{
+ typedef int *(*function)();
+
+ function begin;
+ static function end;
+};
+
+void test1()
+{
+ for (int x : container1()); // { dg-error "member but not" }
+ for (int x : container2()); // { dg-error "member but not" }
+ for (int x : container3()); // { dg-error "within this context" }
+ for (int x : container4()); // { dg-error "cannot be used as a function" }
+ for (int x : container5()); // { dg-error "invalid use of" }
+ for (int x : container6());
+ for (int x : container7());
+ for (int x : container8());
+ for (int x : container9()); // { dg-error "within this context" }
+ for (int x : container10());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C
new file mode 100644
index 000000000..f43e1abcd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C
@@ -0,0 +1,94 @@
+// Test for other range-based for loops with
+// begin/end member functions
+
+// { dg-do compile { target c++11 } }
+
+//These should not be used
+template<typename T> int *begin(T &t)
+{
+ T::fail;
+}
+template<typename T> int *end(T &t)
+{
+ T::fail;
+}
+
+//Test for defaults
+
+struct default1
+{
+ int *begin(int x); // { dg-message "note" }
+ int *end();
+};
+
+struct default2
+{
+ int *begin(int x=0);
+ int *end();
+};
+
+struct default3
+{
+ template <typename T> T *begin(); // { dg-message "note" }
+ int *end();
+};
+
+struct default4
+{
+ template <typename T=int> T *begin();
+ int *end();
+};
+
+struct default5
+{
+ template <typename T=int> T *begin(int x=0);
+ int *end();
+};
+
+void test1()
+{
+ for (int x : default1()); // { dg-error "no matching function|note" }
+ for (int x : default2());
+ for (int x : default3()); // { dg-error "no matching function|note" }
+ for (int x : default4());
+ for (int x : default5());
+}
+
+//Inheritance tests
+
+struct base_begin
+{
+ int *begin(); // { dg-message "" }
+};
+
+struct base_end
+{
+ int *end();
+};
+
+struct derived1 : base_begin, base_end
+{
+};
+
+struct base_begin2 : base_begin
+{
+};
+
+struct derived2 : base_begin, base_end, base_begin2 // { dg-warning "" }
+{
+};
+
+struct base_begin3 : virtual base_begin
+{
+};
+
+struct derived3 : virtual base_begin, base_end, base_begin3
+{
+};
+
+void test2()
+{
+ for (int x : derived1());
+ for (int x : derived2()); // { dg-error "is ambiguous" }
+ for (int x : derived3());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C
new file mode 100644
index 000000000..5dd442dd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C
@@ -0,0 +1,58 @@
+// Test for range-based for loop with templates
+// and begin/end as member (non-)virtual functions
+
+// { dg-do run { target c++11 } }
+
+unsigned int g;
+
+struct A
+{
+ virtual int *begin()
+ {
+ g |= 1;
+ return 0;
+ }
+ int *end()
+ {
+ g |= 2;
+ return 0;
+ }
+};
+
+struct B : A
+{
+ virtual int *begin()
+ {
+ g |= 4;
+ return 0;
+ }
+ int *end()
+ {
+ g |= 8;
+ return 0;
+ }
+};
+
+extern "C" void abort(void);
+
+int main ()
+{
+ A a;
+ B b;
+ A &aa = b;
+
+ g = 0;
+ for (int x : a);
+ if (g != (1 | 2))
+ abort();
+
+ g = 0;
+ for (int x : b);
+ if (g != (4 | 8))
+ abort();
+
+ g = 0;
+ for (int x : aa);
+ if (g != (4 | 2))
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C
new file mode 100644
index 000000000..bcc09cb1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C
@@ -0,0 +1,20 @@
+// Test for range-based for loop with arrays of
+// incomplete type or unknown size
+
+// { dg-do compile { target c++11 } }
+
+extern int a[10];
+extern int b[];
+
+struct S;
+extern S c[10];
+extern S d[];
+
+void test()
+{
+ for (int n : a);
+ for (int n : b); // { dg-error "incomplete type" }
+ for (S &n : c); // { dg-error "incomplete type" }
+ for (S &n : d); // { dg-error "incomplete type" }
+ for (int n : *c); // { dg-error "incomplete type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C
new file mode 100644
index 000000000..6cc3f9be1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+
+extern "C" int printf (const char *, ...);
+
+enum E { e1, e2, e3, X };
+E operator*(E e) { return e; }
+E begin(E e) { return e; }
+E end(E e) { return X; }
+E operator++(E& e) { return e = E(e+1); }
+
+int main()
+{
+ for (auto e: e1)
+ {
+ printf ("%d ", e);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C
new file mode 100644
index 000000000..be436380e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C
@@ -0,0 +1,16 @@
+// PR c++/48994
+
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct myvec
+{
+ T* begin() const;
+ T* end() const;
+};
+
+void f(const myvec<int>& v)
+{
+ for (int i : v)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C
new file mode 100644
index 000000000..e3f446f37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C
@@ -0,0 +1,10 @@
+// PR c++/49838
+
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ auto a; // { dg-error "no initializer" }
+ for(auto i: a) // { dg-error "deduce" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C
new file mode 100644
index 000000000..ea845ee42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C
@@ -0,0 +1,40 @@
+// Test for range-based for loop
+// Test the loop with a custom iterator
+// with begin/end in an associated namespace
+
+// { dg-do compile { target c++11 } }
+
+struct iterator
+{
+ int x;
+ explicit iterator(int v) :x(v) {}
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+};
+
+namespace foo
+{
+ struct container
+ {
+ int min, max;
+ container(int a, int b) :min(a), max(b) {}
+ };
+
+ iterator begin(container &c)
+ {
+ return iterator(c.min);
+ }
+
+ iterator end(container &c)
+ {
+ return iterator(c.max + 1);
+ }
+}
+
+int main()
+{
+ foo::container c(1,4);
+ for (int it : c)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C
new file mode 100644
index 000000000..eb3cfe736
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C
@@ -0,0 +1,36 @@
+// PR c++/49834
+// PR c++/50020
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template <typename T> T get_value() const;
+};
+
+struct B {
+ A first, second;
+};
+
+struct C
+{
+ B* begin() const;
+ B* end() const;
+};
+
+template <typename Ret>
+struct D
+{
+ Ret f(const C &p)
+ {
+ for (const B &i: p) // OK
+ i.second.get_value<int>();
+ for (const auto &i: p) // ERROR
+ i.second.get_value<int>();
+ return Ret(0);
+ }
+};
+
+void g()
+{
+ D<int>().f(C());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C
new file mode 100644
index 000000000..4990b480b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C
@@ -0,0 +1,8 @@
+// PR c++/49983
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f(T t)
+{
+ for (auto v : t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C
new file mode 100644
index 000000000..d4bb3601f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+template<int I> void f() {
+ for (auto i: {I} );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C
new file mode 100644
index 000000000..849682c02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C
@@ -0,0 +1,8 @@
+// PR c++/56722
+// { dg-do compile { target c++11 } }
+
+int main()
+{
+ for (const auto& i, 21) // { dg-error "has no initializer|expected" }
+ i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C
new file mode 100644
index 000000000..b4a5b185b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C
@@ -0,0 +1,15 @@
+// PR c++/56794
+// { dg-require-effective-target c++11 }
+
+template<int... values>
+static void Colors()
+{
+ static const int colors[] = { values... };
+
+ for(auto c: colors) { }
+}
+
+int main()
+{
+ Colors<0,1,2> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C
new file mode 100644
index 000000000..8ba9f652d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C
@@ -0,0 +1,30 @@
+// PR c++/57243
+// { dg-require-effective-target c++11 }
+
+struct snarf
+{
+ template <class T>
+ void get() {}
+};
+
+template <class T>
+struct container
+{
+ snarf * begin() { return nullptr; }
+ snarf * end() { return nullptr; }
+};
+
+template <class T>
+void foo()
+{
+ container<int> arr;
+
+ for( auto i : arr )
+ i.get<int>();
+}
+
+int main()
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C
new file mode 100644
index 000000000..71359cde6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C
@@ -0,0 +1,7 @@
+// PR c++/58503
+// { dg-require-effective-target c++11 }
+
+template<int> void foo()
+{
+ for (auto i : 0) {} // { dg-error "there are no arguments" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C
new file mode 100644
index 000000000..a9cfb8ebc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C
@@ -0,0 +1,15 @@
+// PR c++/58503
+// { dg-require-effective-target c++11 }
+// { dg-options "-fpermissive -w" }
+
+struct c { };
+
+template<int> void foo()
+{
+ for (auto i : c()) { }
+}
+
+c* begin(const c&);
+c* end(const c&);
+
+template void foo<1>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C
new file mode 100644
index 000000000..500734994
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C
@@ -0,0 +1,11 @@
+// PR c++/59165
+// { dg-require-effective-target c++11 }
+
+namespace std {
+int* begin(int i) { return (int*)0; }
+int* end(int i) { return (int*)0; }
+}
+
+int main() {
+ for (int a : 10) { } // { dg-error "was not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C
new file mode 100644
index 000000000..cc6deaf3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C
@@ -0,0 +1,41 @@
+// Test for range-based for loop
+// Test the loop with a custom iterator
+// with begin/end in std
+
+// { dg-do compile { target c++11 } }
+
+struct iterator
+{
+ int x;
+ explicit iterator(int v) :x(v) {}
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+};
+
+struct container
+{
+ int min, max;
+ container(int a, int b) :min(a), max(b) {}
+};
+
+namespace std
+{
+ iterator begin(container &c)
+ {
+ return iterator(c.min);
+ }
+
+ iterator end(container &c)
+ {
+ return iterator(c.max + 1);
+ }
+}
+
+int main()
+{
+ container c(1,4);
+ for (int it : c) // { dg-error "was not declared" }
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C
new file mode 100644
index 000000000..8a3117b62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C
@@ -0,0 +1,115 @@
+// Test for range-based for loop with templates
+
+// { dg-do run { target c++11 } }
+
+/* Preliminary declarations */
+namespace pre
+{
+ struct iterator
+ {
+ int x;
+ iterator (int v) :x(v) {}
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+ };
+
+ struct container
+ {
+ int min, max;
+ container(int a, int b) :min(a), max(b) {}
+ };
+
+ iterator begin(const container &c)
+ {
+ return iterator(c.min);
+ }
+
+ iterator end(const container &c)
+ {
+ return iterator(c.max);
+ }
+
+} //namespace pre
+
+using pre::container;
+extern "C" void abort(void);
+
+container run_me_just_once()
+{
+ static bool run = false;
+ if (run)
+ abort();
+ run = true;
+ return container(1,2);
+}
+
+/* Template with dependent expression. */
+template<typename T> int test1(const T &r)
+{
+ int t = 0;
+ for (int i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression and dependent declaration. */
+template<typename T> int test2(const container &r)
+{
+ int t = 0;
+ for (T i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression (array) and dependent declaration. */
+template<typename T> int test2(const int (&r)[4])
+{
+ int t = 0;
+ for (T i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression and auto declaration. */
+template<typename T> int test3(const container &r)
+{
+ int t = 0;
+ for (auto i : r)
+ t += i;
+ return t;
+}
+
+/* Template with non-dependent expression (array) and auto declaration. */
+template<typename T> int test3(const int (&r)[4])
+{
+ int t = 0;
+ for (auto i : r)
+ t += i;
+ return t;
+}
+
+int main ()
+{
+ container c(1,5);
+ int a[4] = {5,6,7,8};
+
+ for (auto x : run_me_just_once())
+ ;
+
+ if (test1 (c) != 10)
+ abort();
+ if (test1 (a) != 26)
+ abort();
+
+ if (test2<int> (c) != 10)
+ abort();
+ if (test2<int> (a) != 26)
+ abort();
+
+ if (test3<int> (c) != 10)
+ abort();
+ if (test3<int> (a) != 26)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C
new file mode 100644
index 000000000..bf044068b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C
@@ -0,0 +1,53 @@
+// Test for errors in range-based for loops
+
+// { dg-do compile { target c++11 } }
+
+struct container
+{
+};
+
+int *begin(const container &c)
+{
+ return 0;
+}
+
+int end(const container &c) //Ops! wrong type
+{
+ return 0;
+}
+
+
+struct Implicit
+{
+ Implicit(int x)
+ {}
+};
+struct Explicit
+{
+ explicit Explicit(int x)
+ {}
+};
+
+void test1()
+{
+ container c;
+ for (int x : c) // { dg-error "inconsistent|conversion" }
+ ;
+
+ int a[2] = {1,2};
+ for (Implicit x : a)
+ ;
+ for (Explicit x : a) // { dg-error "conversion" }
+ ;
+ for (const Implicit &x : a)
+ ;
+ for (Implicit &&x : a)
+ ;
+
+ //Check the correct scopes
+ int i;
+ for (int i : a) // { dg-message "previously declared" }
+ {
+ int i; // { dg-error "redeclaration" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C
new file mode 100644
index 000000000..366499a34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C
@@ -0,0 +1,28 @@
+// Test for range-based for loop
+// Test the loop with an initializer_list
+
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+extern "C" void abort();
+
+template<typename T> T foo()
+{
+ T sum = 0;
+ for (T x : {T(1),T(2),T(3),T(4)})
+ sum += x;
+ if (sum != T(10))
+ abort();
+}
+
+int main()
+{
+ int sum = 0;
+ for (int x : {1,2,3,4})
+ sum += x;
+ if (sum != 10)
+ abort();
+
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C
new file mode 100644
index 000000000..3e88362e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C
@@ -0,0 +1,116 @@
+// PR c++/46056
+// Check that range-based for loop calls destructors
+// when required
+// { dg-do run { target c++11 } }
+extern "C" void abort();
+
+int value_counter = 0, it_counter = 0, seq_counter = 0;
+
+struct Int
+{
+ int x;
+ Int(int v)
+ :x(v)
+ {
+ ++value_counter;
+ }
+ Int(const Int &o)
+ :x(o.x)
+ {
+ ++value_counter;
+ }
+ ~Int()
+ {
+ --value_counter;
+ }
+};
+
+struct iterator
+{
+ int x;
+ iterator(int v)
+ :x(v)
+ {
+ ++it_counter;
+ }
+ iterator(const iterator &o)
+ :x(o.x)
+ {
+ ++it_counter;
+ }
+ ~iterator()
+ {
+ --it_counter;
+ }
+ iterator &operator ++() { ++x; return *this; }
+ int operator *() { return x; }
+ bool operator != (const iterator &o) { return x != o.x; }
+};
+
+struct container
+{
+ int min, max;
+ container(int a, int b) :min(a), max(b)
+ {
+ ++seq_counter;
+ }
+ container(const container &) = delete;
+ ~container()
+ {
+ --seq_counter;
+ }
+};
+
+iterator begin(container &c)
+{
+ return iterator(c.min);
+}
+
+iterator end(container &c)
+{
+ return iterator(c.max + 1);
+}
+
+int main()
+{
+ for (Int x : container(0, 10))
+ {
+ if (value_counter != 1) abort();
+ if (it_counter != 2) abort();
+ if (seq_counter != 1) abort();
+ }
+ if (value_counter != 0) abort();
+ if (it_counter != 0) abort();
+ if (seq_counter != 0) abort();
+
+ try
+ {
+ for (Int x : container(0, 10))
+ {
+ if (value_counter != 1) abort();
+ if (it_counter != 2) abort();
+ if (seq_counter != 1) abort();
+ }
+ if (value_counter != 0) abort();
+ if (it_counter != 0) abort();
+ if (seq_counter != 0) abort();
+
+ for (Int x : container(0, 10))
+ {
+ if (value_counter != 1) abort();
+ if (it_counter != 2) abort();
+ if (seq_counter != 1) abort();
+
+ if (x.x == 5)
+ throw 0;
+ }
+ }
+ catch (int)
+ {
+ if (value_counter != 0) abort();
+ if (it_counter != 0) abort();
+ if (seq_counter != 0) abort();
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C
new file mode 100644
index 000000000..a389f66f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C
@@ -0,0 +1,15 @@
+// Test for range-based for loop when the declarator declares
+// a new type
+
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+void test()
+{
+ for (struct S { } *x : { (S*)0, (S*)0 } )
+ ;
+
+ for (struct S { } x : { S(), S() } )
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C
new file mode 100644
index 000000000..c51cbf994
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C
@@ -0,0 +1,11 @@
+// Test for range-based for loop error in C++98 mode
+
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+void test()
+{
+ int a[] = {0,1,2};
+ for (int x : a) // { dg-error "range-based 'for'" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C
new file mode 100644
index 000000000..c6ef0792b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C
@@ -0,0 +1,37 @@
+// PR c++/56821
+// { dg-require-effective-target c++11 }
+
+struct A {
+ // { dg-final { scan-assembler "_ZNR1A1fEv" } }
+ void f() & {}
+ // { dg-final { scan-assembler "_ZNO1A1gEv" } }
+ void g() && {}
+ // { dg-final { scan-assembler "_ZNKR1A1hEv" } }
+ void h() const & {}
+};
+
+// { dg-final { scan-assembler "_Z1jM1AFvvRE" } }
+void j(void (A::*)() &) { }
+// { dg-final { scan-assembler "_Z1kM1AFvvOE" } }
+void k(void (A::*)() &&) { }
+// { dg-final { scan-assembler "_Z1lM1AKFvvRE" } }
+void l(void (A::*)() const &) { }
+
+// { dg-final { scan-assembler "_Z1mIFvvOEEvM1AT_" } }
+// { dg-final { scan-assembler "_Z1mIFvvREEvM1AT_" } }
+// { dg-final { scan-assembler "_Z1mIKFvvREEvM1AT_" } }
+template <typename T>
+void m(T A::*) {}
+
+// { dg-final { scan-assembler "_Z1nIM1AFvvOEEvT_" } }
+// { dg-final { scan-assembler "_Z1nIM1AFvvREEvT_" } }
+// { dg-final { scan-assembler "_Z1nIM1AKFvvREEvT_" } }
+template <typename T>
+void n(T) {}
+
+int main()
+{
+ j(&A::f); k(&A::g); l(&A::h);
+ m(&A::f); m(&A::g); m(&A::h);
+ n(&A::f); n(&A::g); n(&A::h);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C
new file mode 100644
index 000000000..5be89423f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C
@@ -0,0 +1,7 @@
+// { dg-require-effective-target c++11 }
+
+class Foo
+{
+public:
+ void bar() const && & { } // { dg-error "multiple ref-qualifiers" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C
new file mode 100644
index 000000000..7fa826c3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C
@@ -0,0 +1,30 @@
+// { dg-require-effective-target c++11 }
+
+template <class,class> struct ST;
+template <class T> struct ST<T,T> {};
+
+struct A
+{
+ int f() &;
+ char f() &&;
+};
+
+template <class T> struct B
+{
+ int f() &;
+ char f() &&;
+};
+
+int main()
+{
+ A a;
+ a.f();
+ A().f();
+ ST<decltype(a.f()), int>();
+ ST<decltype(A().f()), char>();
+ B<int> b;
+ b.f();
+ B<int>().f();
+ ST<decltype(b.f()), int>();
+ ST<decltype(B<int>().f()), char>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C
new file mode 100644
index 000000000..1b6c54fd4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C
@@ -0,0 +1,13 @@
+// PR c++/57252
+// { dg-require-effective-target c++11 }
+
+struct foo {
+ void bar() & {}
+ void bar() && {}
+};
+
+int main()
+{
+ auto p = &foo::bar; // { dg-error "" }
+ (foo{}.*p)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C
new file mode 100644
index 000000000..15dd049f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C
@@ -0,0 +1,10 @@
+// PR c++/57253
+// { dg-require-effective-target c++11 }
+
+template<typename T> struct foo;
+
+template<> struct foo<void()&> {};
+template<> struct foo<void()> {};
+
+int main()
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C
new file mode 100644
index 000000000..b0a16fe94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C
@@ -0,0 +1,22 @@
+// PR c++/57254
+// { dg-require-effective-target c++11 }
+
+struct foo {
+ template<typename T>
+ void bar(T) &;
+
+ template<typename T>
+ void bar(T) &&;
+};
+
+template<typename T>
+void foo::bar(T) & {}
+
+template<typename T>
+void foo::bar(T) && {}
+
+int main()
+{
+ foo f;
+ f.bar(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C
new file mode 100644
index 000000000..84d3b0f2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C
@@ -0,0 +1,29 @@
+// PR c++/57388
+// { dg-require-effective-target c++11 }
+
+template<class> struct A
+{
+ static constexpr bool value = false;
+};
+
+template<class Res, class... Args>
+struct A<Res(Args...)>
+{
+ static constexpr bool value = true;
+};
+
+template<class Res, class... Args>
+struct A<Res(Args...) const &>
+{
+ static constexpr bool value = true;
+};
+
+template<class Res, class... Args>
+struct A<Res(Args...) const &&>
+{
+ static constexpr bool value = true;
+};
+
+static_assert(A<void()>::value, "Ouch");
+static_assert(A<void() const &>::value, ""); // #1
+static_assert(A<void() const &&>::value, ""); // #2
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C
new file mode 100644
index 000000000..8e55551ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C
@@ -0,0 +1,18 @@
+// PR c++/57825
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct target_class
+{};
+
+template<typename Class, typename Ret, typename... Args>
+struct target_class<Ret (Class::*)(Args...)>
+{};
+
+template<typename Class, typename Ret, typename... Args>
+struct target_class<Ret (Class::*)(Args...) &>
+{};
+
+template<typename Class, typename Ret, typename... Args>
+struct target_class<Ret (Class::*)(Args...) &&>
+{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C
new file mode 100644
index 000000000..fa09ab48a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C
@@ -0,0 +1,75 @@
+// In a .* expression whose object expression is an rvalue, the program is
+// ill-formed if the second operand is a pointer to member function with
+// ref-qualifier &. In a .* expression whose object expression is an
+// lvalue, the program is ill-formed if the second operand is a pointer to
+// member function with ref-qualifier &&.
+
+// { dg-require-effective-target c++11 }
+
+struct A {
+ void f() &;
+ void g() &&;
+ void h();
+};
+
+void one()
+{
+ A a;
+
+ void (A::*p)() & = &A::f;
+ (a.*p)();
+ (A().*p)(); // { dg-error "" }
+
+ p = &A::g; // { dg-error "" }
+ p = &A::h; // { dg-error "" }
+
+ void (A::*p2)() && = &A::g;
+ (A().*p2)();
+ (a.*p2)(); // { dg-error "" }
+ p2 = &A::f; // { dg-error "" }
+ p2 = &A::h; // { dg-error "" }
+
+ void (A::*p3)() = &A::h;
+ (a.*p3)();
+ (A().*p3)();
+ p3 = &A::f; // { dg-error "" }
+ p3 = &A::g; // { dg-error "" }
+}
+
+template <class T>
+struct B {
+ void f() &;
+ void g() &&;
+ void h();
+};
+
+template <class T>
+void two()
+{
+ B<T> a;
+
+ void (B<T>::*p)() & = &B<T>::f;
+ (a.*p)();
+ (B<T>().*p)(); // { dg-error "" }
+
+ p = &B<T>::g; // { dg-error "" }
+ p = &B<T>::h; // { dg-error "" }
+
+ void (B<T>::*p2)() && = &B<T>::g;
+ (B<T>().*p2)();
+ (a.*p2)(); // { dg-error "" }
+ p2 = &B<T>::f; // { dg-error "" }
+ p2 = &B<T>::h; // { dg-error "" }
+
+ void (B<T>::*p3)() = &B<T>::h;
+ (a.*p3)();
+ (B<T>().*p3)();
+ p3 = &B<T>::f; // { dg-error "" }
+ p3 = &B<T>::g; // { dg-error "" }
+}
+
+int main()
+{
+ one();
+ two<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C
new file mode 100644
index 000000000..1b2119632
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C
@@ -0,0 +1,29 @@
+// An explicitly defaulted function can have a ref-qualifier.
+
+// { dg-require-effective-target c++11 }
+
+struct A {
+ A& operator=(const A&) & = default;
+};
+
+template<class T>
+struct B {
+ B& operator=(const B&) & = default;
+};
+
+template<class T>
+void f()
+{
+ B<T> b;
+ b = B<T>();
+ B<T>() = b; // { dg-error "" }
+}
+
+int main()
+{
+ A a;
+ a = A();
+ A() = a; // { dg-error "" }
+
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C
new file mode 100644
index 000000000..5a0ee162f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C
@@ -0,0 +1,14 @@
+// 12.1: A constructor shall not be declared with a ref-qualifier.
+// 12.4: A destructor shall not be declared with a ref-qualifier.
+
+// { dg-require-effective-target c++11 }
+
+struct A {
+ A() & = default; // { dg-error "constructor" }
+ ~A() & = default; // { dg-error "destructor" }
+};
+
+int main()
+{
+ A a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C
new file mode 100644
index 000000000..e3d26e5a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C
@@ -0,0 +1,13 @@
+// 13.1: ...cannot be overloaded if any of them, but not all, have a
+// ref-qualifier.
+
+// { dg-require-effective-target c++11 }
+
+class Y {
+ void h() &;
+ void h() const &; // OK
+ void h() &&; // OK, all declarations have a ref-qualifier
+ void i() &; // { dg-message "" }
+ void i() const; // { dg-error "" } prior declaration of i
+ // has a ref-qualifier
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C
new file mode 100644
index 000000000..02e3f6e68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C
@@ -0,0 +1,15 @@
+// Binding an rvalue to && beats binding it to const& (13.3.3.2).
+
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int operator+(int) &&;
+};
+
+void operator+ (const A&, int);
+
+int main()
+{
+ return A() + 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C
new file mode 100644
index 000000000..2430665db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C
@@ -0,0 +1,19 @@
+// typedef test
+// { dg-require-effective-target c++11 }
+
+typedef void F() &;
+
+F f; // { dg-error "" }
+F* p; // { dg-error "" }
+extern F& r; // { dg-error "" }
+
+struct A {
+ F f;
+};
+
+int main()
+{
+ A a;
+ a.f();
+ A().f(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C
new file mode 100644
index 000000000..b4c972b3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C
@@ -0,0 +1,13 @@
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ virtual void f() & = 0;
+};
+
+struct B: A
+{
+ void f(); // doesn't override
+};
+
+B b; // { dg-error "abstract" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C
new file mode 100644
index 000000000..cdb8d6856
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C
@@ -0,0 +1,14 @@
+// PR c++/57064
+// { dg-require-effective-target c++11 }
+
+template <class T> T&& move(T& t);
+
+struct A {
+ void p() &;
+ int p() &&;
+};
+
+void g(A &&a)
+{
+ int i = move(a).p();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C
new file mode 100644
index 000000000..3de8f9616
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C
@@ -0,0 +1,174 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test the reference collapsing rules. Note that there are recent differences
+// for how cv-qualifications are applied to reference types. 7.1.3, 14.3.1
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+template <class T, T v>
+struct integral_constant
+{
+ static const T value = v;
+ typedef T value_type;
+ typedef integral_constant<T, v> type;
+};
+
+typedef integral_constant<bool, true> true_type;
+typedef integral_constant<bool, false> false_type;
+
+template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {};
+template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {};
+
+template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {};
+template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {};
+
+template <class T> struct remove_reference {typedef T type;};
+template <class T> struct remove_reference<T&> {typedef T type;};
+template <class T> struct remove_reference<T&&> {typedef T type;};
+
+template <class T> struct is_const : public integral_constant<bool, false> {};
+template <class T> struct is_const<T const> : public integral_constant<bool, true> {};
+
+template <class T> struct is_volatile : public integral_constant<bool, false> {};
+template <class T> struct is_volatile<T volatile> : public integral_constant<bool, true> {};
+
+struct A {};
+
+typedef A& Alref;
+typedef const A& cAlref;
+typedef volatile A& vAlref;
+typedef const volatile A& cvAlref;
+
+typedef A&& Arref;
+typedef const A&& cArref;
+typedef volatile A&& vArref;
+typedef const volatile A&& cvArref;
+
+template <class T, bool is_lvalue_ref, bool is_rvalue_ref, bool s_const, bool s_volatile>
+void test()
+{
+ sa<is_lvalue_reference<T>::value == is_lvalue_ref> t1;
+ sa<is_rvalue_reference<T>::value == is_rvalue_ref> t2;
+ sa<is_const <typename remove_reference<T>::type>::value == s_const> t3;
+ sa<is_volatile<typename remove_reference<T>::type>::value == s_volatile> t4;
+ sa<is_const <typename remove_reference<const T>::type>::value == s_const > t5;
+ sa<is_volatile<typename remove_reference< volatile T>::type>::value == s_volatile> t6;
+}
+
+int main()
+{
+ // sanity check
+ test< A&, true, false, false, false>();
+ test<const A&, true, false, true, false>();
+ test< volatile A&, true, false, false, true>();
+ test<const volatile A&, true, false, true, true>();
+ test< A&&, false, true, false, false>();
+ test<const A&&, false, true, true, false>();
+ test< volatile A&&, false, true, false, true>();
+ test<const volatile A&&, false, true, true, true>();
+
+// lvalue reference test
+
+ // Alref
+ test< Alref&, true, false, false, false>();
+ test<const Alref&, true, false, false, false>();
+ test< volatile Alref&, true, false, false, false>();
+ test<const volatile Alref&, true, false, false, false>();
+
+ // cAlref
+ test< cAlref&, true, false, true, false>();
+ test<const cAlref&, true, false, true, false>();
+ test< volatile cAlref&, true, false, true, false>();
+ test<const volatile cAlref&, true, false, true, false>();
+
+ // vAlref
+ test< vAlref&, true, false, false, true>();
+ test<const vAlref&, true, false, false, true>();
+ test< volatile vAlref&, true, false, false, true>();
+ test<const volatile vAlref&, true, false, false, true>();
+
+ // cvAlref
+ test< cvAlref&, true, false, true, true>();
+ test<const cvAlref&, true, false, true, true>();
+ test< volatile cvAlref&, true, false, true, true>();
+ test<const volatile cvAlref&, true, false, true, true>();
+
+ // Arref
+ test< Arref&, true, false, false, false>();
+ test<const Arref&, true, false, false, false>();
+ test< volatile Arref&, true, false, false, false>();
+ test<const volatile Arref&, true, false, false, false>();
+
+ // cArref
+ test< cArref&, true, false, true, false>();
+ test<const cArref&, true, false, true, false>();
+ test< volatile cArref&, true, false, true, false>();
+ test<const volatile cArref&, true, false, true, false>();
+
+ // vArref
+ test< vArref&, true, false, false, true>();
+ test<const vArref&, true, false, false, true>();
+ test< volatile vArref&, true, false, false, true>();
+ test<const volatile vArref&, true, false, false, true>();
+
+ // vArref
+ test< cvArref&, true, false, true, true>();
+ test<const cvArref&, true, false, true, true>();
+ test< volatile cvArref&, true, false, true, true>();
+ test<const volatile cvArref&, true, false, true, true>();
+
+// rvalue reference test
+
+ // Alref
+ test< Alref&&, true, false, false, false>();
+ test<const Alref&&, true, false, false, false>();
+ test< volatile Alref&&, true, false, false, false>();
+ test<const volatile Alref&&, true, false, false, false>();
+
+ // cAlref
+ test< cAlref&&, true, false, true, false>();
+ test<const cAlref&&, true, false, true, false>();
+ test< volatile cAlref&&, true, false, true, false>();
+ test<const volatile cAlref&&, true, false, true, false>();
+
+ // vAlref
+ test< vAlref&&, true, false, false, true>();
+ test<const vAlref&&, true, false, false, true>();
+ test< volatile vAlref&&, true, false, false, true>();
+ test<const volatile vAlref&&, true, false, false, true>();
+
+ // cvAlref
+ test< cvAlref&&, true, false, true, true>();
+ test<const cvAlref&&, true, false, true, true>();
+ test< volatile cvAlref&&, true, false, true, true>();
+ test<const volatile cvAlref&&, true, false, true, true>();
+
+ // Arref
+ test< Arref&&, false, true, false, false>();
+ test<const Arref&&, false, true, false, false>();
+ test< volatile Arref&&, false, true, false, false>();
+ test<const volatile Arref&&, false, true, false, false>();
+
+ // cArref
+ test< cArref&&, false, true, true, false>();
+ test<const cArref&&, false, true, true, false>();
+ test< volatile cArref&&, false, true, true, false>();
+ test<const volatile cArref&&, false, true, true, false>();
+
+ // vArref
+ test< vArref&&, false, true, false, true>();
+ test<const vArref&&, false, true, false, true>();
+ test< volatile vArref&&, false, true, false, true>();
+ test<const volatile vArref&&, false, true, false, true>();
+
+ // cvArref
+ test< cvArref&&, false, true, true, true>();
+ test<const cvArref&&, false, true, true, true>();
+ test< volatile cvArref&&, false, true, true, true>();
+ test<const volatile cvArref&&, false, true, true, true>();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C
new file mode 100644
index 000000000..7c0463eac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C
@@ -0,0 +1,6 @@
+// PR c++/57869
+// { dg-do compile { target c++11 } }
+
+void* po = 0;
+void (*pf)() = reinterpret_cast<decltype(pf)>(po);
+static_assert(sizeof(po) >= sizeof(pf), "Conversion not supported");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C
new file mode 100644
index 000000000..ce93a1614
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i : 1;
+};
+
+int main()
+{
+ A a;
+ static_cast<int&&>(a.i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C
new file mode 100644
index 000000000..9ca17f23b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C
@@ -0,0 +1,17 @@
+// PR c++/51868
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A() {}
+ A(const A&) {}
+ A(A&&) {}
+};
+
+struct B {
+ A a;
+ int f : 1;
+};
+
+B func() {
+ return B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C
new file mode 100644
index 000000000..4b46c5490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+void f(int i)
+{
+ int&& r = static_cast<int&&>(i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C
new file mode 100644
index 000000000..6dc5abcdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C
@@ -0,0 +1,21 @@
+// Test for const_cast to reference (5.2.11/4).
+// { dg-do compile { target c++11 } }
+
+template <class T> T&& xval();
+template <class T> T& lval();
+template <class T> T prval();
+
+struct A { };
+
+int main()
+{
+ const_cast<int&>(lval<int>());
+ const_cast<int&>(xval<int>()); // { dg-error "" }
+ const_cast<int&>(prval<int>()); // { dg-error "" }
+ const_cast<int&&>(lval<int>());
+ const_cast<int&&>(xval<int>());
+ const_cast<int&&>(prval<int>()); // { dg-error "" }
+ const_cast<A&&>(lval<A>());
+ const_cast<A&&>(xval<A>());
+ const_cast<A&&>(prval<A>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C
new file mode 100644
index 000000000..6c70324aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C
@@ -0,0 +1,17 @@
+// PR c++/51406
+// { dg-do run { target c++11 } }
+
+extern "C" int printf(const char *,...);
+extern "C" void abort();
+
+struct A { int a; A() : a(1) {} };
+struct B { int b; B() : b(2) {} };
+struct X : A, B {};
+
+int main() {
+ X x;
+ int a=static_cast<A&&>(x).a;
+ int b=static_cast<B&&>(x).b;
+ // printf ("%d %d\n", a, b);
+ if (a!=1 || b!=2) abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C
new file mode 100644
index 000000000..13f369d61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C
@@ -0,0 +1,13 @@
+// PR c++/51161
+// { dg-do compile { target c++11 } }
+
+struct A{};
+struct B : A{};
+struct C : A{};
+struct D : B, C{};
+
+int main()
+{
+ D d;
+ static_cast<A &&>(d); // { dg-error "ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C
new file mode 100644
index 000000000..348276612
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C
@@ -0,0 +1,9 @@
+// PR c++/49267
+// { dg-do compile { target c++11 } }
+
+struct X {
+ operator int&();
+ operator int&&();
+};
+
+int&&x = X();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C
new file mode 100644
index 000000000..70d3d7192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C
@@ -0,0 +1,10 @@
+// PR c++/55017
+// { dg-do compile { target c++11 } }
+
+struct S { // { dg-error "rvalue ref" }
+ int&& rr;
+ S(int&& rr) : rr(static_cast<int&&>(rr)) {}
+};
+
+S s1(13);
+S s2 = s1; // { dg-error "deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C
new file mode 100644
index 000000000..ce06d1319
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C
@@ -0,0 +1,8 @@
+// PR c++/36816, core issue 873
+// { dg-do compile { target c++11 } }
+
+template <class T> void h (T&&) { }
+
+void (*pf)(int&) = &h;
+template <> void h(char&);
+template void h(double&);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C
new file mode 100644
index 000000000..ecaaf388c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C
@@ -0,0 +1,18 @@
+// PR c++/48313
+// { dg-do compile { target c++11 } }
+
+template<typename F>
+void f(F&&) { }
+
+void g() { }
+
+template<typename T> void h() { }
+
+int main()
+{
+ f( g ); // OK
+ void (&p)() = h<int>;
+ f( p ); // OK
+ f( h<int> ); // ???
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C
new file mode 100644
index 000000000..7834be557
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C
@@ -0,0 +1,13 @@
+// PR c++/49389
+// { dg-do compile { target c++11 } }
+
+template<class T> T&& val();
+
+struct A {};
+
+typedef decltype(val<A>().*val<int A::*>()) type;
+
+template<class> struct assert_type;
+template<> struct assert_type<int&&> {};
+
+assert_type<type> test;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C
new file mode 100644
index 000000000..e97fe3dd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C
@@ -0,0 +1,22 @@
+// PR c++/48457, Core 1238
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template<class T, class Arg>
+void test() {
+ T t(create<Arg>());
+ (void) t;
+}
+
+void f (void (&)());
+void f (void (&&)());
+
+int main() {
+ test<void(&)(), void()>();
+ test<void(&&)(), void()>();
+ // This call should choose the lvalue reference overload.
+ // { dg-final { scan-assembler-not "_Z1fOFvvE" } }
+ f(create<void()>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C
new file mode 100644
index 000000000..cfa0b2149
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C
@@ -0,0 +1,10 @@
+// PR c++/49458
+// { dg-do compile { target c++11 } }
+
+typedef void ftype();
+
+struct A {
+ operator ftype&(void);
+};
+
+ftype &&frvref = A();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C
new file mode 100644
index 000000000..673830350
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C
@@ -0,0 +1,10 @@
+// DR 1328
+// { dg-do compile { target c++11 } }
+
+template <class T> struct A {
+ operator T&(); // #1
+ operator T&&(); // #2
+};
+typedef int Fn();
+A<Fn> a;
+Fn&& f = a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C
new file mode 100644
index 000000000..1ca3c4154
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> T&& declval();
+
+int main()
+{
+ &declval<int>(); // { dg-error "xvalue" }
+ declval<int>() = declval<int>(); // { dg-error "xvalue" }
+ declval<int>()++; // { dg-error "xvalue" }
+ --declval<int>(); // { dg-error "xvalue" }
+ declval<int>() += 1; // { dg-error "xvalue" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C
new file mode 100644
index 000000000..b55b67a9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C
@@ -0,0 +1,10 @@
+// { dg-do run { target c++11 } }
+
+void f(int &);
+void f(int &&ir) { ir = 42; }
+int main()
+{
+ int x;
+ f(reinterpret_cast<int&&>(x));
+ return (x != 42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C
new file mode 100644
index 000000000..11bf4dec0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C
@@ -0,0 +1,6 @@
+// PR c++/45401
+// { dg-do compile { target c++11 } }
+
+typedef int &__restrict restrictLvref;
+typedef restrictLvref &&rvrefToRestrictLvref;
+typedef restrictLvref rvrefToRestrictLvref;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C
new file mode 100644
index 000000000..12a15aa30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C
@@ -0,0 +1,18 @@
+// PR c++/41815
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U> struct same_type;
+template<typename T> struct same_type<T, T> {};
+
+int const f() { return 0; }
+
+int &&r = f(); // binding "int&&" to "int" should succeed
+same_type<decltype(f()), int> s1;
+same_type<decltype(0,f()), int> s2;
+
+template <class T>
+T const g() { return 0; }
+
+int &&r2 = g<int>();
+same_type<decltype(g<int>()), int> s3;
+same_type<decltype(0,g<int>()), int> s4;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C
new file mode 100644
index 000000000..dcc4e5efb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C
@@ -0,0 +1,11 @@
+// PR c++/44870
+// { dg-do compile { target c++11 } }
+
+void foo(int&& data);
+
+template <typename T>
+void bar(T t)
+{ foo(int()); }
+
+void baz()
+{ bar(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C
new file mode 100644
index 000000000..8064a51d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C
@@ -0,0 +1,7 @@
+// PR c++/56701
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ void f(){ A*&& a = this; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C
new file mode 100644
index 000000000..b729dc83d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target c++11 } }
+// PR c++/33235
+#include <cassert>
+
+int move_construct = 0;
+int move_assign = 0;
+
+struct base2 // { dg-message "declares a move" }
+{
+ base2() {}
+ base2(base2&&) {++move_construct;}
+ base2& operator=(base2&&) {++move_assign; return *this;}
+};
+
+int test2()
+{
+ base2 b;
+ base2 b2(b); // { dg-error "deleted" }
+ assert(move_construct == 0);
+ base2 b3(static_cast<base2&&>(b));
+ base2 b4 = static_cast<base2&&>(b);
+ assert(move_construct == 2);
+ b = b2; // { dg-error "deleted" }
+ assert(move_assign == 0);
+ b = static_cast<base2&&>(b2);
+ assert(move_assign == 1);
+}
+
+int main()
+{
+ test2();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C
new file mode 100644
index 000000000..bba72d201
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A() = default;
+ A(const A&) = delete;
+};
+
+A&& f();
+void h(A&&);
+void g()
+{
+ A&& arr = f();
+ h(f());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C
new file mode 100644
index 000000000..9aa534a65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C
@@ -0,0 +1,168 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 1 at a time
+
+one sink_1_1( A&); // { dg-message "" }
+
+int test1_1()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_1(ca); // { dg-error "invalid initialization" }
+ sink_1_1(va); // { dg-error "invalid initialization" }
+ sink_1_1(cva); // { dg-error "invalid initialization" }
+ sink_1_1(source()); // { dg-error "invalid initialization" }
+ sink_1_1(c_source()); // { dg-error "invalid initialization" }
+ sink_1_1(v_source()); // { dg-error "invalid initialization" }
+ sink_1_1(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+two sink_1_2(const A&); // { dg-message "" }
+
+int test1_2()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_2(va); // { dg-error "invalid initialization" }
+ sink_1_2(cva); // { dg-error "invalid initialization" }
+ sink_1_2(v_source()); // { dg-error "invalid initialization" }
+ sink_1_2(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+three sink_1_3(volatile A&); // { dg-message "" }
+
+int test1_3()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_3(ca); // { dg-error "invalid initialization" }
+ sink_1_3(cva); // { dg-error "invalid initialization" }
+ sink_1_3(source()); // { dg-error "invalid initialization" }
+ sink_1_3(c_source()); // { dg-error "invalid initialization" }
+ sink_1_3(v_source()); // { dg-error "invalid initialization" }
+ sink_1_3(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+four sink_1_4(const volatile A&); // { dg-message "" }
+
+int test1_4()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_4(source()); // { dg-error "invalid initialization" }
+ sink_1_4(c_source()); // { dg-error "invalid initialization" }
+ sink_1_4(v_source()); // { dg-error "invalid initialization" }
+ sink_1_4(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+five sink_1_5( A&&); // { dg-message "" }
+
+int test1_5()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_5(a); // { dg-error "lvalue" }
+ sink_1_5(ca); // { dg-error "invalid initialization" }
+ sink_1_5(va); // { dg-error "invalid initialization" }
+ sink_1_5(cva); // { dg-error "invalid initialization" }
+ sink_1_5(c_source()); // { dg-error "invalid initialization" }
+ sink_1_5(v_source()); // { dg-error "invalid initialization" }
+ sink_1_5(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+six sink_1_6(const A&&); // { dg-message "" }
+
+int test1_6()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_6(a); // { dg-error "lvalue" }
+ sink_1_6(ca); // { dg-error "lvalue" }
+ sink_1_6(va); // { dg-error "invalid initialization" }
+ sink_1_6(cva); // { dg-error "invalid initialization" }
+ sink_1_6(v_source()); // { dg-error "invalid initialization" }
+ sink_1_6(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+seven sink_1_7(volatile A&&); // { dg-message "" }
+
+int test1_7()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_7(a); // { dg-error "lvalue" }
+ sink_1_7(ca); // { dg-error "invalid initialization" }
+ sink_1_7(va); // { dg-error "lvalue" }
+ sink_1_7(cva); // { dg-error "invalid initialization" }
+ sink_1_7(c_source()); // { dg-error "invalid initialization" }
+ sink_1_7(cv_source()); // { dg-error "invalid initialization" }
+ return 0;
+}
+
+eight sink_1_8(const volatile A&&); // { dg-message "" }
+
+int test1_8()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_1_8(a); // { dg-error "lvalue" }
+ sink_1_8(ca); // { dg-error "lvalue" }
+ sink_1_8(va); // { dg-error "lvalue" }
+ sink_1_8(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+int main()
+{
+ return test1_1() + test1_2() + test1_3() + test1_5() +
+ test1_6() + test1_7();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C
new file mode 100644
index 000000000..e4c0ab16d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C
@@ -0,0 +1,145 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 1 at a time
+
+one sink_1_1( A&);
+
+int test1_1()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_1(a)) == 1 * sizeof(long)> t1;
+ return 0;
+}
+
+two sink_1_2(const A&);
+
+int test1_2()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_2(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_1_2(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_1_2(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_1_2(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+three sink_1_3(volatile A&);
+
+int test1_3()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_3(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_1_3(va)) == 3 * sizeof(long)> t3;
+ return 0;
+}
+
+four sink_1_4(const volatile A&);
+
+int test1_4()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_4(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_1_4(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_1_4(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_1_4(cva)) == 4 * sizeof(long)> t4;
+ return 0;
+}
+
+five sink_1_5( A&&);
+
+int test1_5()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_5(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+six sink_1_6(const A&&);
+
+int test1_6()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_6(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_1_6(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+seven sink_1_7(volatile A&&);
+
+int test1_7()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_7(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_1_7(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+eight sink_1_8(const volatile A&&);
+
+int test1_8()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_1_8(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_1_8(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_1_8(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_1_8(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test1_1() + test1_2() + test1_3() + test1_4() +
+ test1_5() + test1_6() + test1_7() + test1_8();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C
new file mode 100644
index 000000000..289cffb18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C
@@ -0,0 +1,544 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 2 at a time
+
+one sink_2_12( A&); // { dg-message "note|argument" }
+two sink_2_12(const A&); // { dg-message "note|argument" }
+
+int test2_12()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_12(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 42 }
+ sink_2_12(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 44 }
+ sink_2_12(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 46 }
+ sink_2_12(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 48 }
+ return 0;
+}
+
+one sink_2_13( A&); // { dg-message "note|argument" }
+three sink_2_13(volatile A&); // { dg-message "note|argument" }
+
+int test2_13()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_13(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 62 }
+ sink_2_13(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 64 }
+ sink_2_13(source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 66 }
+ sink_2_13(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 68 }
+ sink_2_13(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 70 }
+ sink_2_13(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 72 }
+ return 0;
+}
+
+one sink_2_14( A&); // { dg-message "note|argument" }
+four sink_2_14(const volatile A&); // { dg-message "note|argument" }
+
+int test2_14()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_14(source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 86 }
+ sink_2_14(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 88 }
+ sink_2_14(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 90 }
+ sink_2_14(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 92 }
+ return 0;
+}
+
+one sink_2_15( A&); // { dg-message "note|argument" }
+five sink_2_15( A&&); // { dg-message "note|argument" }
+
+int test2_15()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_15(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 106 }
+ sink_2_15(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 108 }
+ sink_2_15(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 110 }
+ sink_2_15(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 112 }
+ sink_2_15(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 114 }
+ sink_2_15(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 116 }
+ return 0;
+}
+
+one sink_2_16( A&); // { dg-message "note|argument" }
+six sink_2_16(const A&&); // { dg-message "note|argument" }
+
+int test2_16()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_16(ca); // { dg-error "lvalue" }
+ sink_2_16(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 131 }
+ sink_2_16(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 133 }
+ sink_2_16(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 135 }
+ sink_2_16(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 137 }
+ return 0;
+}
+
+one sink_2_17( A&); // { dg-message "note|argument" }
+seven sink_2_17(volatile A&&); // { dg-message "note|argument" }
+
+int test2_17()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_17(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 151 }
+ sink_2_17(va); // { dg-error "lvalue" }
+ sink_2_17(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 154 }
+ sink_2_17(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 156 }
+ sink_2_17(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 158 }
+ return 0;
+}
+
+one sink_2_18( A&);
+eight sink_2_18(const volatile A&&); // { dg-message "argument" }
+
+int test2_18()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_18(ca); // { dg-error "lvalue" }
+ sink_2_18(va); // { dg-error "lvalue" }
+ sink_2_18(cva); // { dg-error "lvalue" }
+}
+
+two sink_2_23(const A&); // { dg-message "note|argument" }
+three sink_2_23(volatile A&); // { dg-message "note|argument" }
+
+int test2_23()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_23(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 186 }
+ sink_2_23(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 188 }
+ sink_2_23(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 190 }
+ sink_2_23(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 192 }
+ return 0;
+}
+
+two sink_2_24(const A&); // { dg-message "note|argument" }
+four sink_2_24(const volatile A&); // { dg-message "note|argument" }
+
+int test2_24()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_24(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 206 }
+ sink_2_24(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 208 }
+ return 0;
+}
+
+three sink_2_34(volatile A&); // { dg-message "three sink_2_34|no known conversion" }
+four sink_2_34(const volatile A&); // { dg-message "note|argument" }
+
+int test2_34()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_34(source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 222 }
+ sink_2_34(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 224 }
+ sink_2_34(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 226 }
+ sink_2_34(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 228 }
+ return 0;
+}
+
+two sink_2_25(const A&); // { dg-message "two sink_2_25|no known conversion" }
+five sink_2_25( A&&); // { dg-message "note|argument" }
+
+int test2_25()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_25(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 242 }
+ sink_2_25(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 244 }
+ sink_2_25(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 246 }
+ sink_2_25(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 248 }
+ return 0;
+}
+
+two sink_2_26(const A&); // { dg-message "two sink_2_26|no known conversion" }
+six sink_2_26(const A&&); // { dg-message "note|argument" }
+
+int test2_26()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_26(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 262 }
+ sink_2_26(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 264 }
+ sink_2_26(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 266 }
+ sink_2_26(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 268 }
+ return 0;
+}
+
+two sink_2_27(const A&); // { dg-message "two sink_2_27|no known conversion" }
+seven sink_2_27(volatile A&&); // { dg-message "note|argument" }
+
+int test2_27()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_27(va); // { dg-error "lvalue" }
+ sink_2_27(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 283 }
+ sink_2_27(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 285 }
+ return 0;
+}
+
+two sink_2_28(const A&);
+eight sink_2_28(const volatile A&&); // { dg-message "argument" }
+
+int test2_28()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_28(va); // { dg-error "lvalue" }
+ sink_2_28(cva); // { dg-error "lvalue" }
+}
+
+three sink_2_35(volatile A&); // { dg-message "three sink_2_35|no known conversion" }
+five sink_2_35( A&&); // { dg-message "note|argument" }
+
+int test2_35()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_35(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 312 }
+ sink_2_35(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 314 }
+ sink_2_35(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 316 }
+ sink_2_35(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 318 }
+ sink_2_35(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 320 }
+ return 0;
+}
+
+three sink_2_36(volatile A&); // { dg-message "three sink_2_36|no known conversion" }
+six sink_2_36(const A&&); // { dg-message "note|argument" }
+
+int test2_36()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_36(ca); // { dg-error "lvalue" }
+ sink_2_36(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 335 }
+ sink_2_36(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 337 }
+ sink_2_36(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 339 }
+ return 0;
+}
+
+three sink_2_37(volatile A&); // { dg-message "three sink_2_37|no known conversion" }
+seven sink_2_37(volatile A&&); // { dg-message "note|argument" }
+
+int test2_37()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_37(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 353 }
+ sink_2_37(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 355 }
+ sink_2_37(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 357 }
+ sink_2_37(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 359 }
+ return 0;
+}
+
+three sink_2_38(volatile A&);
+eight sink_2_38(const volatile A&&); // { dg-message "argument" }
+
+int test2_38()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_38(ca); // { dg-error "lvalue" }
+ sink_2_38(cva); // { dg-error "lvalue" }
+}
+
+four sink_2_45(const volatile A&); // { dg-message "note" }
+five sink_2_45( A&&); // { dg-message "note|argument" }
+
+int test2_45()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_45(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 386 }
+ sink_2_45(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 388 }
+ sink_2_45(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 390 }
+ return 0;
+}
+
+four sink_2_46(const volatile A&); // { dg-message "note" }
+six sink_2_46(const A&&); // { dg-message "note|argument" }
+
+int test2_46()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_46(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 404 }
+ sink_2_46(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 406 }
+ return 0;
+}
+
+four sink_2_47(const volatile A&); // { dg-message "note" }
+seven sink_2_47(volatile A&&); // { dg-message "note|argument" }
+
+int test2_47()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_47(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 420 }
+ sink_2_47(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 422 }
+ return 0;
+}
+
+five sink_2_56( A&&); // { dg-message "note|argument" }
+six sink_2_56(const A&&); // { dg-message "note|argument" }
+
+int test2_56()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_56(a); // { dg-error "lvalue" }
+ sink_2_56(ca); // { dg-error "lvalue" }
+ sink_2_56(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 438 }
+ sink_2_56(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 440 }
+ sink_2_56(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 442 }
+ sink_2_56(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 444 }
+ return 0;
+}
+
+five sink_2_57( A&&); // { dg-message "note|argument" }
+seven sink_2_57(volatile A&&); // { dg-message "note|argument" }
+
+int test2_57()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_57(a); // { dg-error "lvalue" }
+ sink_2_57(va); // { dg-error "lvalue" }
+ sink_2_57(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 460 }
+ sink_2_57(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 462 }
+ sink_2_57(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 464 }
+ sink_2_57(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 466 }
+ return 0;
+}
+
+five sink_2_58( A&&); // { dg-message "argument" }
+eight sink_2_58(const volatile A&&); // { dg-message "argument" }
+
+int test2_58()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_58(a); // { dg-error "lvalue" }
+ sink_2_58(ca); // { dg-error "lvalue" }
+ sink_2_58(va); // { dg-error "lvalue" }
+ sink_2_58(cva); // { dg-error "lvalue" }
+}
+
+six sink_2_67(const A&&); // { dg-message "note|argument" }
+seven sink_2_67(volatile A&&); // { dg-message "note|argument" }
+
+int test2_67()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_67(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 495 }
+ sink_2_67(ca); // { dg-error "lvalue" }
+ sink_2_67(va); // { dg-error "lvalue" }
+ sink_2_67(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 499 }
+ sink_2_67(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 501 }
+ sink_2_67(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 503 }
+ return 0;
+}
+
+six sink_2_68(const A&&); // { dg-message "argument" }
+eight sink_2_68(const volatile A&&); // { dg-message "argument" }
+
+int test2_68()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_68(a); // { dg-error "lvalue" }
+ sink_2_68(ca); // { dg-error "lvalue" }
+ sink_2_68(va); // { dg-error "lvalue" }
+ sink_2_68(cva); // { dg-error "lvalue" }
+}
+
+seven sink_2_78(volatile A&&); // { dg-message "argument" }
+eight sink_2_78(const volatile A&&); // { dg-message "argument" }
+
+int test2_78()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_2_78(a); // { dg-error "lvalue" }
+ sink_2_78(ca); // { dg-error "lvalue" }
+ sink_2_78(va); // { dg-error "lvalue" }
+ sink_2_78(cva); // { dg-error "lvalue" }
+}
+
+int main()
+{
+ return test2_12() + test2_13() + test2_15() + test2_16() +
+ test2_17() + test2_23() + test2_25() + test2_26() +
+ test2_27() + test2_35() + test2_36() + test2_37() +
+ test2_56() + test2_57() + test2_67();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C
new file mode 100644
index 000000000..fb3019f2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C
@@ -0,0 +1,507 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 2 at a time
+
+one sink_2_12( A&);
+two sink_2_12(const A&);
+
+int test2_12()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_12(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_12(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_12(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_2_12(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_2_13( A&);
+three sink_2_13(volatile A&);
+
+int test2_13()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_13(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_13(va)) == 3 * sizeof(long)> t3;
+ return 0;
+}
+
+one sink_2_14( A&);
+four sink_2_14(const volatile A&);
+
+int test2_14()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_14(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_14(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_14(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_14(cva)) == 4 * sizeof(long)> t4;
+ return 0;
+}
+
+one sink_2_15( A&);
+five sink_2_15( A&&);
+
+int test2_15()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_15(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_15(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+one sink_2_16( A&);
+six sink_2_16(const A&&);
+
+int test2_16()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_16(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_16(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_2_16(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_2_17( A&);
+seven sink_2_17(volatile A&&);
+
+int test2_17()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_17(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_17(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_2_17(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_2_18( A&);
+eight sink_2_18(const volatile A&&);
+
+int test2_18()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_18(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_2_18(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_2_18(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_18(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_18(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_2_23(const A&);
+three sink_2_23(volatile A&);
+
+int test2_23()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_23(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_23(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_23(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_2_23(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_2_24(const A&);
+four sink_2_24(const volatile A&);
+
+int test2_24()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_24(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_2_24(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_24(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_24(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_2_24(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_2_24(c_source())) == 2 * sizeof(long)> t6;
+// sa<sizeof(sink_2_24(v_source())) == 4 * sizeof(long)> t7;
+// sa<sizeof(sink_2_24(cv_source())) == 4 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_2_25(const A&);
+five sink_2_25( A&&);
+
+int test2_25()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_25(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_2_25(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_25(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_2_25(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_2_26(const A&);
+six sink_2_26(const A&&);
+
+int test2_26()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_26(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_2_26(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_26(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_2_26(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_2_27(const A&);
+seven sink_2_27(volatile A&&);
+
+int test2_27()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_27(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_2_27(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_27(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_2_27(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_2_27(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_2_28(const A&);
+eight sink_2_28(const volatile A&&);
+
+int test2_28()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_28(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_2_28(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_2_28(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_2_28(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_28(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_28(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_2_34(volatile A&);
+four sink_2_34(const volatile A&);
+
+int test2_34()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_34(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_2_34(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_34(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_34(cva)) == 4 * sizeof(long)> t4;
+// sa<sizeof(sink_2_34(source())) == 4 * sizeof(long)> t5;
+// sa<sizeof(sink_2_34(c_source())) == 4 * sizeof(long)> t6;
+// sa<sizeof(sink_2_34(v_source())) == 4 * sizeof(long)> t7;
+// sa<sizeof(sink_2_34(cv_source())) == 4 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_2_35(volatile A&);
+five sink_2_35( A&&);
+
+int test2_35()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_35(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_2_35(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_35(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+three sink_2_36(volatile A&);
+six sink_2_36(const A&&);
+
+int test2_36()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_36(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_2_36(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_36(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_2_36(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+three sink_2_37(volatile A&);
+seven sink_2_37(volatile A&&);
+
+int test2_37()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_37(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_2_37(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_37(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_2_37(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_2_38(volatile A&);
+eight sink_2_38(const volatile A&&);
+
+int test2_38()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_38(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_2_38(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_2_38(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_2_38(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_38(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_38(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_2_45(const volatile A&);
+five sink_2_45( A&&);
+
+int test2_45()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_45(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_2_45(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_45(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_45(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_2_45(source())) == 5 * sizeof(long)> t5;
+// sa<sizeof(sink_2_45(c_source())) == 4 * sizeof(long)> t6;
+// sa<sizeof(sink_2_45(v_source())) == 4 * sizeof(long)> t7;
+// sa<sizeof(sink_2_45(cv_source())) == 4 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_2_46(const volatile A&);
+six sink_2_46(const A&&);
+
+int test2_46()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_46(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_2_46(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_46(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_46(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_2_46(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_2_46(c_source())) == 6 * sizeof(long)> t6;
+// sa<sizeof(sink_2_46(v_source())) == 4 * sizeof(long)> t7;
+// sa<sizeof(sink_2_46(cv_source())) == 4 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_2_47(const volatile A&);
+seven sink_2_47(volatile A&&);
+
+int test2_47()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_47(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_2_47(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_47(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_47(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_2_47(source())) == 7 * sizeof(long)> t5;
+// sa<sizeof(sink_2_47(c_source())) == 4 * sizeof(long)> t6;
+ sa<sizeof(sink_2_47(v_source())) == 7 * sizeof(long)> t7;
+// sa<sizeof(sink_2_47(cv_source())) == 4 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_2_48(const volatile A&);
+eight sink_2_48(const volatile A&&);
+
+int test2_48()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_48(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_2_48(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_2_48(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_2_48(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_2_48(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_2_48(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_48(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_48(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+five sink_2_56( A&&);
+six sink_2_56(const A&&);
+
+int test2_56()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_56(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_2_56(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+five sink_2_57( A&&);
+seven sink_2_57(volatile A&&);
+
+int test2_57()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_57(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_2_57(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+five sink_2_58( A&&);
+eight sink_2_58(const volatile A&&);
+
+int test2_58()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_58(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_2_58(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_58(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_58(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+six sink_2_67(const A&&);
+seven sink_2_67(volatile A&&);
+
+int test2_67()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_67(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_2_67(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+six sink_2_68(const A&&);
+eight sink_2_68(const volatile A&&);
+
+int test2_68()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_68(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_2_68(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_2_68(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_2_68(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+seven sink_2_78(volatile A&&);
+eight sink_2_78(const volatile A&&);
+
+int test2_78()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_2_78(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_2_78(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_2_78(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_2_78(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test2_12() + test2_13() + test2_14() + test2_15() +
+ test2_16() + test2_17() + test2_18() + test2_23() +
+ test2_24() + test2_25() + test2_26() + test2_27() +
+ test2_28() + test2_34() + test2_35() + test2_36() +
+ test2_37() + test2_38() + test2_45() + test2_46() +
+ test2_47() + test2_48() + test2_56() + test2_57() +
+ test2_58() + test2_67() + test2_68() + test2_78();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C
new file mode 100644
index 000000000..765dfbc7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C
@@ -0,0 +1,951 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 3 at a time
+
+one sink_3_123( A&); // { dg-message "one sink_3_123|no known conversion" }
+two sink_3_123(const A&); // { dg-message "two sink_3_123|no known conversion" }
+three sink_3_123(volatile A&); // { dg-message "three sink_3_123|no known conversion" }
+
+int test3_123()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_123(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 43 }
+ sink_3_123(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 45 }
+ sink_3_123(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 47 }
+ return 0;
+}
+
+one sink_3_125( A&); // { dg-message "one sink_3_125|no known conversion" }
+two sink_3_125(const A&); // { dg-message "two sink_3_125|no known conversion" }
+five sink_3_125( A&&); // { dg-message "five sink_3_125|no known conversion" }
+
+one sink_3_124( A&); // { dg-message "one sink_3_124|no known conversion" }
+two sink_3_124(const A&); // { dg-message "two sink_3_124|no known conversion" }
+four sink_3_124(const volatile A&); // { dg-message "four sink_3_124|no known conversion" }
+
+int test3_124()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_124(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 66 }
+ sink_3_124(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 68 }
+ return 0;
+}
+
+int test3_125()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_125(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 79 }
+ sink_3_125(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 81 }
+ sink_3_125(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 83 }
+ sink_3_125(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 85 }
+ return 0;
+}
+
+one sink_3_126( A&); // { dg-message "one sink_3_126|no known conversion" }
+two sink_3_126(const A&); // { dg-message "two sink_3_126|no known conversion" }
+six sink_3_126(const A&&); // { dg-message "six sink_3_126|no known conversion" }
+
+int test3_126()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_126(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 100 }
+ sink_3_126(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 102 }
+ sink_3_126(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 104 }
+ sink_3_126(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 106 }
+ return 0;
+}
+
+one sink_3_127( A&); // { dg-message "one sink_3_127|no known conversion" }
+two sink_3_127(const A&); // { dg-message "two sink_3_127|no known conversion" }
+seven sink_3_127(volatile A&&); // { dg-message "seven sink_3_127|no known conversion" }
+
+int test3_127()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_127(va); // { dg-error "lvalue" }
+ sink_3_127(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 122 }
+ sink_3_127(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 124 }
+ return 0;
+}
+
+one sink_3_128( A&);
+two sink_3_128(const A&);
+eight sink_3_128(const volatile A&&); // { dg-message "" }
+
+int test3_128()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+
+ sink_3_128(va); // { dg-error "lvalue" }
+ sink_3_128(cva); // { dg-error "lvalue" }
+}
+
+one sink_3_134( A&); // { dg-message "one sink_3_134|no known conversion" }
+three sink_3_134(volatile A&); // { dg-message "three sink_3_134|no known conversion" }
+four sink_3_134(const volatile A&); // { dg-message "four sink_3_134|no known conversion" }
+
+int test3_134()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_134(source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 154 }
+ sink_3_134(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 156 }
+ sink_3_134(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 158 }
+ sink_3_134(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 160 }
+ return 0;
+}
+
+one sink_3_135( A&); // { dg-message "one sink_3_135|no known conversion" }
+three sink_3_135(volatile A&); // { dg-message "three sink_3_135|no known conversion" }
+five sink_3_135( A&&); // { dg-message "five sink_3_135|no known conversion" }
+
+int test3_135()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_135(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 175 }
+ sink_3_135(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 177 }
+ sink_3_135(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 179 }
+ sink_3_135(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 181 }
+ sink_3_135(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 183 }
+ return 0;
+}
+
+one sink_3_136( A&); // { dg-message "one sink_3_136|no known conversion" }
+three sink_3_136(volatile A&); // { dg-message "note" }
+six sink_3_136(const A&&); // { dg-message "" }
+
+int test3_136()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_136(ca); // { dg-error "lvalue" }
+ sink_3_136(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 199 }
+ sink_3_136(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 201 }
+ sink_3_136(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 203 }
+ return 0;
+}
+
+one sink_3_137( A&); // { dg-message "one sink_3_137|no known conversion" }
+three sink_3_137(volatile A&); // { dg-message "note" }
+seven sink_3_137(volatile A&&); // { dg-message "note" }
+
+int test3_137()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_137(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 218 }
+ sink_3_137(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 220 }
+ sink_3_137(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 222 }
+ sink_3_137(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 224 }
+ return 0;
+}
+
+one sink_3_138( A&);
+three sink_3_138(volatile A&);
+eight sink_3_138(const volatile A&&); // { dg-message "" }
+
+int test3_138()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_138(ca); // { dg-error "lvalue" }
+ sink_3_138(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_3_145( A&); // { dg-message "one sink_3_145|no known conversion" }
+four sink_3_145(const volatile A&); // { dg-message "note" }
+five sink_3_145( A&&); // { dg-message "note" }
+
+int test3_145()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_145(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 254 }
+ sink_3_145(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 256 }
+ sink_3_145(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 258 }
+ return 0;
+}
+
+one sink_3_146( A&); // { dg-message "one sink_3_146|no known conversion" }
+four sink_3_146(const volatile A&); // { dg-message "note" }
+six sink_3_146(const A&&); // { dg-message "note" }
+
+int test3_146()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_146(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 273 }
+ sink_3_146(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 275 }
+ return 0;
+}
+
+one sink_3_147( A&); // { dg-message "one sink_3_147|no known conversion" }
+four sink_3_147(const volatile A&); // { dg-message "note" }
+seven sink_3_147(volatile A&&); // { dg-message "note" }
+
+int test3_147()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_147(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 290 }
+ sink_3_147(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 292 }
+ return 0;
+}
+
+one sink_3_156( A&); // { dg-message "one sink_3_156|no known conversion" }
+five sink_3_156( A&&); // { dg-message "note" }
+six sink_3_156(const A&&); // { dg-message "" }
+
+int test3_156()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_156(ca); // { dg-error "lvalue" }
+ sink_3_156(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 308 }
+ sink_3_156(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 310 }
+ sink_3_156(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 312 }
+ sink_3_156(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 314 }
+ return 0;
+}
+
+one sink_3_157( A&); // { dg-message "one sink_3_157|no known conversion" }
+five sink_3_157( A&&); // { dg-message "note" }
+seven sink_3_157(volatile A&&); // { dg-message "" }
+
+int test3_157()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_157(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 329 }
+ sink_3_157(va); // { dg-error "lvalue" }
+ sink_3_157(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 332 }
+ sink_3_157(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 334 }
+ sink_3_157(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 336 }
+ return 0;
+}
+
+one sink_3_158( A&);
+five sink_3_158( A&&);
+eight sink_3_158(const volatile A&&); // { dg-message "" }
+
+int test3_158()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_158(ca); // { dg-error "lvalue" }
+ sink_3_158(va); // { dg-error "lvalue" }
+ sink_3_158(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_3_167( A&); // { dg-message "one sink_3_167|no known conversion" }
+six sink_3_167(const A&&); // { dg-message "" }
+seven sink_3_167(volatile A&&); // { dg-message "" }
+
+int test3_167()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_167(ca); // { dg-error "lvalue" }
+ sink_3_167(va); // { dg-error "lvalue" }
+ sink_3_167(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 369 }
+ sink_3_167(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 371 }
+ sink_3_167(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 373 }
+ return 0;
+}
+
+one sink_3_168( A&);
+six sink_3_168(const A&&); // { dg-message "" }
+eight sink_3_168(const volatile A&&); // { dg-message "" }
+
+int test3_168()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_168(ca); // { dg-error "lvalue" }
+ sink_3_168(va); // { dg-error "lvalue" }
+ sink_3_168(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_3_178( A&);
+seven sink_3_178(volatile A&&); // { dg-message "" }
+eight sink_3_178(const volatile A&&); // { dg-message "" }
+
+int test3_178()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_178(ca); // { dg-error "lvalue" }
+ sink_3_178(va); // { dg-error "lvalue" }
+ sink_3_178(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_3_234(const A&); // { dg-message "two sink_3_234|no known conversion" }
+three sink_3_234(volatile A&); // { dg-message "note" }
+four sink_3_234(const volatile A&); // { dg-message "note" }
+
+int test3_234()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_234(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 420 }
+ sink_3_234(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 422 }
+ sink_3_234(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 424 }
+ return 0;
+}
+
+two sink_3_235(const A&); // { dg-message "two sink_3_235|no known conversion" }
+three sink_3_235(volatile A&); // { dg-message "note" }
+five sink_3_235( A&&); // { dg-message "note" }
+
+int test3_235()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_235(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 439 }
+ sink_3_235(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 441 }
+ sink_3_235(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 443 }
+ sink_3_235(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 445 }
+ return 0;
+}
+
+two sink_3_236(const A&); // { dg-message "two sink_3_236|no known conversion" }
+three sink_3_236(volatile A&); // { dg-message "note" }
+six sink_3_236(const A&&); // { dg-message "note" }
+
+int test3_236()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_236(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 460 }
+ sink_3_236(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 462 }
+ sink_3_236(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 464 }
+ sink_3_236(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 466 }
+ return 0;
+}
+
+two sink_3_237(const A&); // { dg-message "two sink_3_237|no known conversion" }
+three sink_3_237(volatile A&); // { dg-message "note" }
+seven sink_3_237(volatile A&&); // { dg-message "note" }
+
+int test3_237()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_237(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 481 }
+ sink_3_237(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 483 }
+ sink_3_237(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 485 }
+ return 0;
+}
+
+two sink_3_238(const A&); // { dg-message "two sink_3_238|no known conversion" }
+three sink_3_238(volatile A&); // { dg-message "three sink_3_238|no known conversion" }
+eight sink_3_238(const volatile A&&); // { dg-message "eight sink_3_238|no known conversion" }
+
+int test3_238()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_238(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 500 }
+ sink_3_238(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_3_245(const A&); // { dg-message "two sink_3_245|no known conversion" }
+four sink_3_245(const volatile A&); // { dg-message "four sink_3_245|no known conversion" }
+five sink_3_245( A&&); // { dg-message "five sink_3_245|no known conversion" }
+
+int test3_245()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_245(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 516 }
+ sink_3_245(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 518 }
+ return 0;
+}
+
+two sink_3_246(const A&); // { dg-message "two sink_3_246|no known conversion" }
+four sink_3_246(const volatile A&); // { dg-message "four sink_3_246|no known conversion" }
+six sink_3_246(const A&&); // { dg-message "six sink_3_246|no known conversion" }
+
+int test3_246()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_246(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 533 }
+ sink_3_246(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 535 }
+ return 0;
+}
+
+two sink_3_247(const A&); // { dg-message "two sink_3_247|no known conversion" }
+four sink_3_247(const volatile A&); // { dg-message "four sink_3_247|no known conversion" }
+seven sink_3_247(volatile A&&); // { dg-message "seven sink_3_247|no known conversion" }
+
+int test3_247()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_247(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 550 }
+ return 0;
+}
+
+two sink_3_256(const A&); // { dg-message "two sink_3_256|no known conversion" }
+five sink_3_256( A&&); // { dg-message "five sink_3_256|no known conversion" }
+six sink_3_256(const A&&); // { dg-message "six sink_3_256|no known conversion" }
+
+int test3_256()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_256(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 565 }
+ sink_3_256(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 567 }
+ sink_3_256(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 569 }
+ sink_3_256(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 571 }
+ return 0;
+}
+
+two sink_3_257(const A&); // { dg-message "two sink_3_257|no known conversion" }
+five sink_3_257( A&&); // { dg-message "five sink_3_257|no known conversion" }
+seven sink_3_257(volatile A&&); // { dg-message "seven sink_3_257|no known conversion" }
+
+int test3_257()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_257(va); // { dg-error "lvalue" }
+ sink_3_257(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 587 }
+ sink_3_257(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 589 }
+ return 0;
+}
+
+two sink_3_258(const A&);
+five sink_3_258( A&&);
+eight sink_3_258(const volatile A&&); // { dg-message "" }
+
+int test3_258()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_258(va); // { dg-error "lvalue" }
+ sink_3_258(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_3_267(const A&); // { dg-message "two sink_3_267|no known conversion" }
+six sink_3_267(const A&&); // { dg-message "six sink_3_267|no known conversion" }
+seven sink_3_267(volatile A&&); // { dg-message "seven sink_3_267|no known conversion" }
+
+int test3_267()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_267(va); // { dg-error "lvalue" }
+ sink_3_267(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 620 }
+ sink_3_267(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 622 }
+ sink_3_267(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 624 }
+ return 0;
+}
+
+two sink_3_268(const A&);
+six sink_3_268(const A&&);
+eight sink_3_268(const volatile A&&); // { dg-message "" }
+
+int test3_268()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_268(va); // { dg-error "lvalue" }
+ sink_3_268(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_3_278(const A&);
+seven sink_3_278(volatile A&&); // { dg-message "" }
+eight sink_3_278(const volatile A&&); // { dg-message "" }
+
+int test3_278()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_278(va); // { dg-error "lvalue" }
+ sink_3_278(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_3_345(volatile A&); // { dg-message "three sink_3_345|no known conversion" }
+four sink_3_345(const volatile A&); // { dg-message "four sink_3_345|no known conversion" }
+five sink_3_345( A&&); // { dg-message "five sink_3_345|no known conversion" }
+
+int test3_345()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_345(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 669 }
+ sink_3_345(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 671 }
+ sink_3_345(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 673 }
+ return 0;
+}
+
+three sink_3_346(volatile A&); // { dg-message "three sink_3_346|no known conversion" }
+four sink_3_346(const volatile A&); // { dg-message "four sink_3_346|no known conversion" }
+six sink_3_346(const A&&); // { dg-message "six sink_3_346|no known conversion" }
+
+int test3_346()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_346(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 688 }
+ sink_3_346(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 690 }
+ return 0;
+}
+
+three sink_3_347(volatile A&); // { dg-message "three sink_3_347|no known conversion" }
+four sink_3_347(const volatile A&); // { dg-message "four sink_3_347|no known conversion" }
+seven sink_3_347(volatile A&&); // { dg-message "seven sink_3_347|no known conversion" }
+
+int test3_347()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_347(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 705 }
+ sink_3_347(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 707 }
+ return 0;
+}
+
+three sink_3_356(volatile A&); // { dg-message "three sink_3_356|no known conversion" }
+five sink_3_356( A&&); // { dg-message "five sink_3_356|no known conversion" }
+six sink_3_356(const A&&); // { dg-message "six sink_3_356|no known conversion" }
+
+int test3_356()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_356(ca); // { dg-error "lvalue" }
+ sink_3_356(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 723 }
+ sink_3_356(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 725 }
+ sink_3_356(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 727 }
+ return 0;
+}
+
+three sink_3_357(volatile A&); // { dg-message "three sink_3_357|no known conversion" }
+five sink_3_357( A&&); // { dg-message "five sink_3_357|no known conversion" }
+seven sink_3_357(volatile A&&); // { dg-message "seven sink_3_357|no known conversion" }
+
+int test3_357()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_357(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 742 }
+ sink_3_357(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 744 }
+ sink_3_357(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 746 }
+ sink_3_357(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 748 }
+ return 0;
+}
+
+three sink_3_358(volatile A&);
+five sink_3_358( A&&);
+eight sink_3_358(const volatile A&&); // { dg-message "" }
+
+int test3_358()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_358(ca); // { dg-error "lvalue" }
+ sink_3_358(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_3_367(volatile A&); // { dg-message "three sink_3_367|no known conversion" }
+six sink_3_367(const A&&); // { dg-message "six sink_3_367|no known conversion" }
+seven sink_3_367(volatile A&&); // { dg-message "seven sink_3_367|no known conversion" }
+
+int test3_367()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_367(ca); // { dg-error "lvalue" }
+ sink_3_367(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 779 }
+ sink_3_367(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 781 }
+ sink_3_367(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 783 }
+ return 0;
+}
+
+three sink_3_368(volatile A&);
+six sink_3_368(const A&&); // { dg-message "" }
+eight sink_3_368(const volatile A&&); // { dg-message "" }
+
+int test3_368()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_368(ca); // { dg-error "lvalue" }
+ sink_3_368(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_3_378(volatile A&);
+seven sink_3_378(volatile A&&);
+eight sink_3_378(const volatile A&&); // { dg-message "" }
+
+int test3_378()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_378(ca); // { dg-error "lvalue" }
+ sink_3_378(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+four sink_3_456(const volatile A&); // { dg-message "note" }
+five sink_3_456( A&&); // { dg-message "note" }
+six sink_3_456(const A&&); // { dg-message "note" }
+
+int test3_456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 828 }
+ sink_3_456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 830 }
+ return 0;
+}
+
+four sink_3_457(const volatile A&); // { dg-message "note" }
+five sink_3_457( A&&); // { dg-message "note" }
+seven sink_3_457(volatile A&&); // { dg-message "note" }
+
+int test3_457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_457(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 845 }
+ sink_3_457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 847 }
+ return 0;
+}
+
+four sink_3_467(const volatile A&); // { dg-message "note" }
+six sink_3_467(const A&&); // { dg-message "note" }
+seven sink_3_467(volatile A&&); // { dg-message "note" }
+
+int test3_467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 862 }
+ sink_3_467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 864 }
+ return 0;
+}
+
+five sink_3_567( A&&); // { dg-message "five sink_3_567|no known conversion" }
+six sink_3_567(const A&&); // { dg-message "six sink_3_567|no known conversion" }
+seven sink_3_567(volatile A&&); // { dg-message "seven sink_3_567|no known conversion" }
+
+int test3_567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_567(a); // { dg-error "lvalue" }
+ sink_3_567(ca); // { dg-error "lvalue" }
+ sink_3_567(va); // { dg-error "lvalue" }
+ sink_3_567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 882 }
+ sink_3_567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 884 }
+ return 0;
+}
+
+five sink_3_568( A&&); // { dg-message "" }
+six sink_3_568(const A&&); // { dg-message "" }
+eight sink_3_568(const volatile A&&); // { dg-message "" }
+
+int test3_568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_568(a); // { dg-error "lvalue" }
+ sink_3_568(ca); // { dg-error "lvalue" }
+ sink_3_568(va); // { dg-error "lvalue" }
+ sink_3_568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+five sink_3_578( A&&); // { dg-message "" }
+seven sink_3_578(volatile A&&); // { dg-message "" }
+eight sink_3_578(const volatile A&&); // { dg-message "" }
+
+int test3_578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_578(a); // { dg-error "lvalue" }
+ sink_3_578(ca); // { dg-error "lvalue" }
+ sink_3_578(va); // { dg-error "lvalue" }
+ sink_3_578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+six sink_3_678(const A&&); // { dg-message "six sink_3_678|no known conversion" }
+seven sink_3_678(volatile A&&); // { dg-message "seven sink_3_678|no known conversion" }
+eight sink_3_678(const volatile A&&); // { dg-message "eight sink_3_678|no known conversion" }
+
+int test3_678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_3_678(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 933 }
+ sink_3_678(ca); // { dg-error "lvalue" }
+ sink_3_678(va); // { dg-error "lvalue" }
+ sink_3_678(cva); // { dg-error "lvalue" }
+ sink_3_678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 938 }
+ return 0;
+}
+
+int main()
+{
+ return test3_123() + test3_125() + test3_126() + test3_127() +
+ test3_135() + test3_136() + test3_137() + test3_156() +
+ test3_157() + test3_167() + test3_234() + test3_235() +
+ test3_236() + test3_237() + test3_238() + test3_256() +
+ test3_257() + test3_267() + test3_356() + test3_357() +
+ test3_367() + test3_467() + test3_567() + test3_678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C
new file mode 100644
index 000000000..6d4625ad4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C
@@ -0,0 +1,1070 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 3 at a time
+
+one sink_3_123( A&);
+two sink_3_123(const A&);
+three sink_3_123(volatile A&);
+
+int test3_123()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_123(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_123(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_123(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_123(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_3_123(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_124( A&);
+two sink_3_124(const A&);
+four sink_3_124(const volatile A&);
+
+int test3_124()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_124(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_124(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_124(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_124(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_124(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_3_124(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_125( A&);
+two sink_3_125(const A&);
+five sink_3_125( A&&);
+
+int test3_125()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_125(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_125(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_125(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_125(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_126( A&);
+two sink_3_126(const A&);
+six sink_3_126(const A&&);
+
+int test3_126()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_126(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_126(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_126(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_126(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_127( A&);
+two sink_3_127(const A&);
+seven sink_3_127(volatile A&&);
+
+int test3_127()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_127(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_127(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_127(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_127(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_3_127(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_3_128( A&);
+two sink_3_128(const A&);
+eight sink_3_128(const volatile A&&);
+
+int test3_128()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_128(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_128(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_128(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_128(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_128(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_128(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_3_134( A&);
+three sink_3_134(volatile A&);
+four sink_3_134(const volatile A&);
+
+int test3_134()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_134(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_134(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_134(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_134(cva)) == 4 * sizeof(long)> t4;
+ return 0;
+}
+
+one sink_3_135( A&);
+three sink_3_135(volatile A&);
+five sink_3_135( A&&);
+
+int test3_135()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_135(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_135(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_135(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+one sink_3_136( A&);
+three sink_3_136(volatile A&);
+six sink_3_136(const A&&);
+
+int test3_136()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_136(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_136(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_136(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_136(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_137( A&);
+three sink_3_137(volatile A&);
+seven sink_3_137(volatile A&&);
+
+int test3_137()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_137(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_137(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_137(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_137(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_3_138( A&);
+three sink_3_138(volatile A&);
+eight sink_3_138(const volatile A&&);
+
+int test3_138()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_138(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_138(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_138(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_138(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_138(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_138(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_3_145( A&);
+four sink_3_145(const volatile A&);
+five sink_3_145( A&&);
+
+int test3_145()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_145(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_145(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_145(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_145(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_145(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+one sink_3_146( A&);
+four sink_3_146(const volatile A&);
+six sink_3_146(const A&&);
+
+int test3_146()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_146(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_146(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_146(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_146(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_146(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_146(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_147( A&);
+four sink_3_147(const volatile A&);
+seven sink_3_147(volatile A&&);
+
+int test3_147()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_147(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_147(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_147(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_147(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_147(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_147(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_3_148( A&);
+four sink_3_148(const volatile A&);
+eight sink_3_148(const volatile A&&);
+
+int test3_148()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_148(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_148(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_148(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_148(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_148(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_148(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_148(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_148(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_3_156( A&);
+five sink_3_156( A&&);
+six sink_3_156(const A&&);
+
+int test3_156()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_156(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_156(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_156(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_3_157( A&);
+five sink_3_157( A&&);
+seven sink_3_157(volatile A&&);
+
+int test3_157()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_157(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_157(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_157(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_3_158( A&);
+five sink_3_158( A&&);
+eight sink_3_158(const volatile A&&);
+
+int test3_158()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_158(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_158(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_158(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_158(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_158(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_3_167( A&);
+six sink_3_167(const A&&);
+seven sink_3_167(volatile A&&);
+
+int test3_167()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_167(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_167(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_167(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_3_168( A&);
+six sink_3_168(const A&&);
+eight sink_3_168(const volatile A&&);
+
+int test3_168()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_168(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_168(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_168(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_168(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_168(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_3_178( A&);
+seven sink_3_178(volatile A&&);
+eight sink_3_178(const volatile A&&);
+
+int test3_178()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_178(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_3_178(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_178(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_178(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_178(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_3_234(const A&);
+three sink_3_234(volatile A&);
+four sink_3_234(const volatile A&);
+
+int test3_234()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_234(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_234(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_234(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_234(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_3_234(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_235(const A&);
+three sink_3_235(volatile A&);
+five sink_3_235( A&&);
+
+int test3_235()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_235(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_235(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_235(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_235(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_236(const A&);
+three sink_3_236(volatile A&);
+six sink_3_236(const A&&);
+
+int test3_236()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_236(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_236(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_236(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_236(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_237(const A&);
+three sink_3_237(volatile A&);
+seven sink_3_237(volatile A&&);
+
+int test3_237()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_237(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_237(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_237(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_237(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_3_237(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_3_238(const A&);
+three sink_3_238(volatile A&);
+eight sink_3_238(const volatile A&&);
+
+int test3_238()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_238(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_238(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_238(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_238(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_238(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_238(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_3_245(const A&);
+four sink_3_245(const volatile A&);
+five sink_3_245( A&&);
+
+int test3_245()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_245(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_245(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_245(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_245(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_245(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_245(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_246(const A&);
+four sink_3_246(const volatile A&);
+six sink_3_246(const A&&);
+
+int test3_246()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_246(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_246(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_246(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_246(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_246(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_246(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_247(const A&);
+four sink_3_247(const volatile A&);
+seven sink_3_247(volatile A&&);
+
+int test3_247()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_247(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_247(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_247(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_247(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_247(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_247(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_3_247(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_3_248(const A&);
+four sink_3_248(const volatile A&);
+eight sink_3_248(const volatile A&&);
+
+int test3_248()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_248(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_248(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_248(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_248(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_248(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_248(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_248(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_248(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_3_256(const A&);
+five sink_3_256( A&&);
+six sink_3_256(const A&&);
+
+int test3_256()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_256(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_256(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_256(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_256(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_3_257(const A&);
+five sink_3_257( A&&);
+seven sink_3_257(volatile A&&);
+
+int test3_257()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_257(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_257(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_257(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_257(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_3_257(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_3_258(const A&);
+five sink_3_258( A&&);
+eight sink_3_258(const volatile A&&);
+
+int test3_258()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_258(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_258(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_258(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_258(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_258(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_258(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_3_267(const A&);
+six sink_3_267(const A&&);
+seven sink_3_267(volatile A&&);
+
+int test3_267()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_267(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_267(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_267(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_267(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_3_268(const A&);
+six sink_3_268(const A&&);
+eight sink_3_268(const volatile A&&);
+
+int test3_268()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_268(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_268(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_268(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_268(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_268(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_268(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_3_278(const A&);
+seven sink_3_278(volatile A&&);
+eight sink_3_278(const volatile A&&);
+
+int test3_278()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_278(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_3_278(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_3_278(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_278(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_278(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_278(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_3_345(volatile A&);
+four sink_3_345(const volatile A&);
+five sink_3_345( A&&);
+
+int test3_345()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_345(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_345(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_345(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_345(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_345(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+three sink_3_346(volatile A&);
+four sink_3_346(const volatile A&);
+six sink_3_346(const A&&);
+
+int test3_346()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_346(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_346(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_346(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_346(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_346(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_346(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+three sink_3_347(volatile A&);
+four sink_3_347(const volatile A&);
+seven sink_3_347(volatile A&&);
+
+int test3_347()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_347(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_347(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_347(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_347(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_347(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_347(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_3_348(volatile A&);
+four sink_3_348(const volatile A&);
+eight sink_3_348(const volatile A&&);
+
+int test3_348()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_348(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_348(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_348(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_348(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_348(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_3_348(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_348(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_348(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_3_356(volatile A&);
+five sink_3_356( A&&);
+six sink_3_356(const A&&);
+
+int test3_356()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_356(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_356(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_356(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_356(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+three sink_3_357(volatile A&);
+five sink_3_357( A&&);
+seven sink_3_357(volatile A&&);
+
+int test3_357()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_357(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_357(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_357(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_357(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_3_358(volatile A&);
+five sink_3_358( A&&);
+eight sink_3_358(const volatile A&&);
+
+int test3_358()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_358(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_358(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_358(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_358(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_358(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_358(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_3_367(volatile A&);
+six sink_3_367(const A&&);
+seven sink_3_367(volatile A&&);
+
+int test3_367()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_367(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_367(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_367(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_367(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_3_368(volatile A&);
+six sink_3_368(const A&&);
+eight sink_3_368(const volatile A&&);
+
+int test3_368()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_368(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_368(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_368(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_368(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_368(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_368(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_3_378(volatile A&);
+seven sink_3_378(volatile A&&);
+eight sink_3_378(const volatile A&&);
+
+int test3_378()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_378(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_3_378(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_3_378(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_378(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_378(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_378(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_3_456(const volatile A&);
+five sink_3_456( A&&);
+six sink_3_456(const A&&);
+
+int test3_456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_456(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_456(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_456(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_456(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_456(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_456(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+four sink_3_457(const volatile A&);
+five sink_3_457( A&&);
+seven sink_3_457(volatile A&&);
+
+int test3_457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_457(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_457(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_457(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_457(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_457(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_457(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+four sink_3_458(const volatile A&);
+five sink_3_458( A&&);
+eight sink_3_458(const volatile A&&);
+
+int test3_458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_458(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_458(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_458(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_458(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_458(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_458(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_458(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_458(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_3_467(const volatile A&);
+six sink_3_467(const A&&);
+seven sink_3_467(volatile A&&);
+
+int test3_467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_467(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_467(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_467(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_467(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_467(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_467(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+four sink_3_468(const volatile A&);
+six sink_3_468(const A&&);
+eight sink_3_468(const volatile A&&);
+
+int test3_468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_468(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_468(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_468(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_468(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_468(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_3_468(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_468(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_468(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_3_478(const volatile A&);
+seven sink_3_478(volatile A&&);
+eight sink_3_478(const volatile A&&);
+
+int test3_478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_478(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_3_478(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_3_478(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_3_478(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_3_478(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_3_478(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_478(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_478(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+five sink_3_567( A&&);
+six sink_3_567(const A&&);
+seven sink_3_567(volatile A&&);
+
+int test3_567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+five sink_3_568( A&&);
+six sink_3_568(const A&&);
+eight sink_3_568(const volatile A&&);
+
+int test3_568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_3_568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+five sink_3_578( A&&);
+seven sink_3_578(volatile A&&);
+eight sink_3_578(const volatile A&&);
+
+int test3_578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_3_578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_3_578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+six sink_3_678(const A&&);
+seven sink_3_678(volatile A&&);
+eight sink_3_678(const volatile A&&);
+
+int test3_678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_3_678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_3_678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_3_678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test3_123() + test3_124() + test3_125() + test3_126() +
+ test3_127() + test3_128() + test3_134() + test3_135() +
+ test3_136() + test3_137() + test3_138() + test3_145() +
+ test3_146() + test3_147() + test3_148() + test3_156() +
+ test3_157() + test3_158() + test3_167() + test3_168() +
+ test3_178() + test3_234() + test3_235() + test3_236() +
+ test3_237() + test3_238() + test3_245() + test3_246() +
+ test3_247() + test3_248() + test3_256() + test3_257() +
+ test3_258() + test3_267() + test3_268() + test3_278() +
+ test3_345() + test3_346() + test3_347() + test3_348() +
+ test3_356() + test3_357() + test3_358() + test3_367() +
+ test3_368() + test3_378() + test3_456() + test3_457() +
+ test3_458() + test3_467() + test3_468() + test3_478() +
+ test3_567() + test3_568() + test3_578() + test3_678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C
new file mode 100644
index 000000000..dc56afeba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C
@@ -0,0 +1,1072 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 4 at a time
+
+one sink_4_1234( A&); // { dg-message "one sink_4_1234|no known conversion" }
+two sink_4_1234(const A&); // { dg-message "note" }
+three sink_4_1234(volatile A&); // { dg-message "note" }
+four sink_4_1234(const volatile A&); // { dg-message "note" }
+
+int test4_1234()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1234(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 44 }
+ sink_4_1234(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 46 }
+ return 0;
+}
+
+one sink_4_1235( A&); // { dg-message "one sink_4_1235|no known conversion" }
+two sink_4_1235(const A&); // { dg-message "note" }
+three sink_4_1235(volatile A&); // { dg-message "note" }
+five sink_4_1235( A&&); // { dg-message "note" }
+
+int test4_1235()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1235(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 62 }
+ sink_4_1235(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 64 }
+ sink_4_1235(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 66 }
+ return 0;
+}
+
+one sink_4_1236( A&); // { dg-message "one sink_4_1236|no known conversion" }
+two sink_4_1236(const A&); // { dg-message "note" }
+three sink_4_1236(volatile A&); // { dg-message "note" }
+six sink_4_1236(const A&&); // { dg-message "note" }
+
+int test4_1236()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1236(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 82 }
+ sink_4_1236(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 84 }
+ sink_4_1236(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 86 }
+ return 0;
+}
+
+one sink_4_1237( A&); // { dg-message "one sink_4_1237|no known conversion" }
+two sink_4_1237(const A&); // { dg-message "note" }
+three sink_4_1237(volatile A&); // { dg-message "note" }
+seven sink_4_1237(volatile A&&); // { dg-message "note" }
+
+int test4_1237()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1237(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 102 }
+ sink_4_1237(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 104 }
+ return 0;
+}
+
+one sink_4_1238( A&);
+two sink_4_1238(const A&);
+three sink_4_1238(volatile A&);
+eight sink_4_1238(const volatile A&&); // { dg-message "" }
+
+int test4_1238()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1238(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1245( A&); // { dg-message "one sink_4_1245|no known conversion" }
+two sink_4_1245(const A&); // { dg-message "note" }
+four sink_4_1245(const volatile A&); // { dg-message "note" }
+five sink_4_1245( A&&); // { dg-message "note" }
+
+int test4_1245()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1245(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 135 }
+ sink_4_1245(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 137 }
+ return 0;
+}
+
+one sink_4_1246( A&); // { dg-message "one sink_4_1246|no known conversion" }
+two sink_4_1246(const A&); // { dg-message "note" }
+four sink_4_1246(const volatile A&); // { dg-message "note" }
+six sink_4_1246(const A&&); // { dg-message "note" }
+
+int test4_1246()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1246(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 153 }
+ sink_4_1246(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 155 }
+ return 0;
+}
+
+one sink_4_1247( A&); // { dg-message "one sink_4_1247|no known conversion" }
+two sink_4_1247(const A&); // { dg-message "note" }
+four sink_4_1247(const volatile A&); // { dg-message "note" }
+seven sink_4_1247(volatile A&&); // { dg-message "note" }
+
+int test4_1247()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1247(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 171 }
+ return 0;
+}
+
+one sink_4_1256( A&); // { dg-message "one sink_4_1256|no known conversion" }
+two sink_4_1256(const A&); // { dg-message "note" }
+five sink_4_1256( A&&); // { dg-message "note" }
+six sink_4_1256(const A&&); // { dg-message "note" }
+
+int test4_1256()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1256(va); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 187 }
+ sink_4_1256(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 189 }
+ sink_4_1256(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 191 }
+ sink_4_1256(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 193 }
+ return 0;
+}
+
+one sink_4_1257( A&); // { dg-message "one sink_4_1257|no known conversion" }
+two sink_4_1257(const A&); // { dg-message "note" }
+five sink_4_1257( A&&); // { dg-message "note" }
+seven sink_4_1257(volatile A&&); // { dg-message "" }
+
+int test4_1257()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1257(va); // { dg-error "lvalue" }
+ sink_4_1257(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 210 }
+ sink_4_1257(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 212 }
+ return 0;
+}
+
+one sink_4_1258( A&);
+two sink_4_1258(const A&);
+five sink_4_1258( A&&);
+eight sink_4_1258(const volatile A&&); // { dg-message "" }
+
+int test4_1258()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1258(va); // { dg-error "lvalue" }
+ sink_4_1258(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1267( A&); // { dg-message "one sink_4_1267|no known conversion" }
+two sink_4_1267(const A&); // { dg-message "note" }
+six sink_4_1267(const A&&); // { dg-message "note" }
+seven sink_4_1267(volatile A&&); // { dg-message "" }
+
+int test4_1267()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1267(va); // { dg-error "lvalue" }
+ sink_4_1267(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 245 }
+ sink_4_1267(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 247 }
+ sink_4_1267(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 249 }
+ return 0;
+}
+
+one sink_4_1268( A&);
+two sink_4_1268(const A&);
+six sink_4_1268(const A&&);
+eight sink_4_1268(const volatile A&&); // { dg-message "" }
+
+int test4_1268()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1268(va); // { dg-error "lvalue" }
+ sink_4_1268(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1278( A&);
+two sink_4_1278(const A&);
+seven sink_4_1278(volatile A&&); // { dg-message "" }
+eight sink_4_1278(const volatile A&&); // { dg-message "" }
+
+int test4_1278()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1278(va); // { dg-error "lvalue" }
+ sink_4_1278(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1345( A&); // { dg-message "one sink_4_1345|no known conversion" }
+three sink_4_1345(volatile A&); // { dg-message "note" }
+four sink_4_1345(const volatile A&); // { dg-message "note" }
+five sink_4_1345( A&&); // { dg-message "note" }
+
+int test4_1345()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1345(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 297 }
+ sink_4_1345(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 299 }
+ sink_4_1345(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 301 }
+ return 0;
+}
+
+one sink_4_1346( A&); // { dg-message "one sink_4_1346|no known conversion" }
+three sink_4_1346(volatile A&); // { dg-message "note" }
+four sink_4_1346(const volatile A&); // { dg-message "note" }
+six sink_4_1346(const A&&); // { dg-message "note" }
+
+int test4_1346()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1346(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 317 }
+ sink_4_1346(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 319 }
+ return 0;
+}
+
+one sink_4_1347( A&); // { dg-message "one sink_4_1347|no known conversion" }
+three sink_4_1347(volatile A&); // { dg-message "note" }
+four sink_4_1347(const volatile A&); // { dg-message "note" }
+seven sink_4_1347(volatile A&&); // { dg-message "note" }
+
+int test4_1347()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1347(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 335 }
+ sink_4_1347(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 337 }
+ return 0;
+}
+
+one sink_4_1356( A&); // { dg-message "one sink_4_1356|no known conversion" }
+three sink_4_1356(volatile A&); // { dg-message "note" }
+five sink_4_1356( A&&); // { dg-message "note" }
+six sink_4_1356(const A&&); // { dg-message "" }
+
+int test4_1356()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1356(ca); // { dg-error "lvalue" }
+ sink_4_1356(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 354 }
+ sink_4_1356(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 356 }
+ sink_4_1356(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 358 }
+ return 0;
+}
+
+one sink_4_1357( A&); // { dg-message "one sink_4_1357|no known conversion" }
+three sink_4_1357(volatile A&); // { dg-message "note" }
+five sink_4_1357( A&&); // { dg-message "note" }
+seven sink_4_1357(volatile A&&); // { dg-message "note" }
+
+int test4_1357()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1357(ca); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 374 }
+ sink_4_1357(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 376 }
+ sink_4_1357(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 378 }
+ sink_4_1357(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 380 }
+ return 0;
+}
+
+one sink_4_1358( A&);
+three sink_4_1358(volatile A&);
+five sink_4_1358( A&&);
+eight sink_4_1358(const volatile A&&); // { dg-message "" }
+
+int test4_1358()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1358(ca); // { dg-error "lvalue" }
+ sink_4_1358(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1367( A&); // { dg-message "one sink_4_1367|no known conversion" }
+three sink_4_1367(volatile A&); // { dg-message "note" }
+six sink_4_1367(const A&&); // { dg-message "" }
+seven sink_4_1367(volatile A&&); // { dg-message "note" }
+
+int test4_1367()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1367(ca); // { dg-error "lvalue" }
+ sink_4_1367(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 413 }
+ sink_4_1367(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 415 }
+ sink_4_1367(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 417 }
+ return 0;
+}
+
+one sink_4_1368( A&);
+three sink_4_1368(volatile A&);
+six sink_4_1368(const A&&); // { dg-message "" }
+eight sink_4_1368(const volatile A&&); // { dg-message "" }
+
+int test4_1368()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1368(ca); // { dg-error "lvalue" }
+ sink_4_1368(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1378( A&);
+three sink_4_1378(volatile A&);
+seven sink_4_1378(volatile A&&);
+eight sink_4_1378(const volatile A&&); // { dg-message "" }
+
+int test4_1378()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1378(ca); // { dg-error "lvalue" }
+ sink_4_1378(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1456( A&); // { dg-message "one sink_4_1456|no known conversion" }
+four sink_4_1456(const volatile A&); // { dg-message "note" }
+five sink_4_1456( A&&); // { dg-message "note" }
+six sink_4_1456(const A&&); // { dg-message "note" }
+
+int test4_1456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 465 }
+ sink_4_1456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 467 }
+ return 0;
+}
+
+one sink_4_1457( A&); // { dg-message "one sink_4_1457|no known conversion" }
+four sink_4_1457(const volatile A&); // { dg-message "note" }
+five sink_4_1457( A&&); // { dg-message "note" }
+seven sink_4_1457(volatile A&&); // { dg-message "note" }
+
+int test4_1457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1457(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 483 }
+ sink_4_1457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 485 }
+ return 0;
+}
+
+one sink_4_1467( A&); // { dg-message "one sink_4_1467|no known conversion" }
+four sink_4_1467(const volatile A&); // { dg-message "note" }
+six sink_4_1467(const A&&); // { dg-message "note" }
+seven sink_4_1467(volatile A&&); // { dg-message "note" }
+
+int test4_1467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 501 }
+ sink_4_1467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 503 }
+ return 0;
+}
+
+one sink_4_1567( A&); // { dg-message "one sink_4_1567|no known conversion" }
+five sink_4_1567( A&&); // { dg-message "note" }
+six sink_4_1567(const A&&); // { dg-message "" }
+seven sink_4_1567(volatile A&&); // { dg-message "" }
+
+int test4_1567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1567(ca); // { dg-error "lvalue" }
+ sink_4_1567(va); // { dg-error "lvalue" }
+ sink_4_1567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 521 }
+ sink_4_1567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 523 }
+ return 0;
+}
+
+one sink_4_1568( A&);
+five sink_4_1568( A&&);
+six sink_4_1568(const A&&); // { dg-message "" }
+eight sink_4_1568(const volatile A&&); // { dg-message "" }
+
+int test4_1568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1568(ca); // { dg-error "lvalue" }
+ sink_4_1568(va); // { dg-error "lvalue" }
+ sink_4_1568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1578( A&);
+five sink_4_1578( A&&);
+seven sink_4_1578(volatile A&&); // { dg-message "" }
+eight sink_4_1578(const volatile A&&); // { dg-message "" }
+
+int test4_1578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1578(ca); // { dg-error "lvalue" }
+ sink_4_1578(va); // { dg-error "lvalue" }
+ sink_4_1578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_4_1678( A&);
+six sink_4_1678(const A&&); // { dg-message "" }
+seven sink_4_1678(volatile A&&); // { dg-message "" }
+eight sink_4_1678(const volatile A&&); // { dg-message "" }
+
+int test4_1678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_1678(ca); // { dg-error "lvalue" }
+ sink_4_1678(va); // { dg-error "lvalue" }
+ sink_4_1678(cva); // { dg-error "lvalue" }
+ sink_4_1678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 576 }
+ return 0;
+}
+
+two sink_4_2345(const A&); // { dg-message "two sink_4_2345|no known conversion" }
+three sink_4_2345(volatile A&); // { dg-message "note" }
+four sink_4_2345(const volatile A&); // { dg-message "note" }
+five sink_4_2345( A&&); // { dg-message "note" }
+
+int test4_2345()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2345(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 592 }
+ sink_4_2345(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 594 }
+ sink_4_2345(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 596 }
+ return 0;
+}
+
+two sink_4_2346(const A&); // { dg-message "two sink_4_2346|no known conversion" }
+three sink_4_2346(volatile A&); // { dg-message "note" }
+four sink_4_2346(const volatile A&); // { dg-message "note" }
+six sink_4_2346(const A&&); // { dg-message "note" }
+
+int test4_2346()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2346(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 612 }
+ sink_4_2346(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 614 }
+ sink_4_2346(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 616 }
+ return 0;
+}
+
+two sink_4_2347(const A&); // { dg-message "two sink_4_2347|no known conversion" }
+three sink_4_2347(volatile A&); // { dg-message "note" }
+four sink_4_2347(const volatile A&); // { dg-message "note" }
+seven sink_4_2347(volatile A&&); // { dg-message "note" }
+
+int test4_2347()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2347(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 632 }
+ sink_4_2347(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 634 }
+ return 0;
+}
+
+two sink_4_2348(const A&); // { dg-message "note" }
+three sink_4_2348(volatile A&); // { dg-message "note" }
+four sink_4_2348(const volatile A&); // { dg-message "note" }
+eight sink_4_2348(const volatile A&&); // { dg-message "note" }
+
+int test4_2348()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2348(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 650 }
+ return 0;
+}
+
+two sink_4_2356(const A&); // { dg-message "two sink_4_2356|no known conversion" }
+three sink_4_2356(volatile A&); // { dg-message "note" }
+five sink_4_2356( A&&); // { dg-message "note" }
+six sink_4_2356(const A&&); // { dg-message "note" }
+
+int test4_2356()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2356(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 666 }
+ sink_4_2356(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 668 }
+ sink_4_2356(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 670 }
+ sink_4_2356(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 672 }
+ return 0;
+}
+
+two sink_4_2357(const A&); // { dg-message "two sink_4_2357|no known conversion" }
+three sink_4_2357(volatile A&); // { dg-message "note" }
+five sink_4_2357( A&&); // { dg-message "note" }
+seven sink_4_2357(volatile A&&); // { dg-message "note" }
+
+int test4_2357()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2357(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 688 }
+ sink_4_2357(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 690 }
+ sink_4_2357(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 692 }
+ return 0;
+}
+
+two sink_4_2358(const A&); // { dg-message "note" }
+three sink_4_2358(volatile A&); // { dg-message "note" }
+five sink_4_2358( A&&); // { dg-message "note" }
+eight sink_4_2358(const volatile A&&); // { dg-message "" }
+
+int test4_2358()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2358(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 708 }
+ sink_4_2358(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_4_2367(const A&); // { dg-message "two sink_4_2367|no known conversion" }
+three sink_4_2367(volatile A&); // { dg-message "note" }
+six sink_4_2367(const A&&); // { dg-message "note" }
+seven sink_4_2367(volatile A&&); // { dg-message "note" }
+
+int test4_2367()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2367(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 725 }
+ sink_4_2367(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 727 }
+ sink_4_2367(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 729 }
+ sink_4_2367(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 731 }
+ return 0;
+}
+
+two sink_4_2368(const A&); // { dg-message "note" }
+three sink_4_2368(volatile A&); // { dg-message "note" }
+six sink_4_2368(const A&&); // { dg-message "note" }
+eight sink_4_2368(const volatile A&&); // { dg-message "" }
+
+int test4_2368()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2368(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 747 }
+ sink_4_2368(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_4_2378(const A&); // { dg-message "note" }
+three sink_4_2378(volatile A&); // { dg-message "note" }
+seven sink_4_2378(volatile A&&); // { dg-message "note" }
+eight sink_4_2378(const volatile A&&); // { dg-message "" }
+
+int test4_2378()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2378(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 764 }
+ sink_4_2378(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_4_2456(const A&); // { dg-message "two sink_4_2456|no known conversion" }
+four sink_4_2456(const volatile A&); // { dg-message "note" }
+five sink_4_2456( A&&); // { dg-message "note" }
+six sink_4_2456(const A&&); // { dg-message "note" }
+
+int test4_2456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 781 }
+ sink_4_2456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 783 }
+ return 0;
+}
+
+two sink_4_2457(const A&); // { dg-message "two sink_4_2457|no known conversion" }
+four sink_4_2457(const volatile A&); // { dg-message "note" }
+five sink_4_2457( A&&); // { dg-message "note" }
+seven sink_4_2457(volatile A&&); // { dg-message "note" }
+
+int test4_2457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 799 }
+ return 0;
+}
+
+two sink_4_2467(const A&); // { dg-message "two sink_4_2467|no known conversion" }
+four sink_4_2467(const volatile A&); // { dg-message "note" }
+six sink_4_2467(const A&&); // { dg-message "note" }
+seven sink_4_2467(volatile A&&); // { dg-message "note" }
+
+int test4_2467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 815 }
+ sink_4_2467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 817 }
+ return 0;
+}
+
+two sink_4_2567(const A&); // { dg-message "two sink_4_2567|no known conversion" }
+five sink_4_2567( A&&); // { dg-message "note" }
+six sink_4_2567(const A&&); // { dg-message "note" }
+seven sink_4_2567(volatile A&&); // { dg-message "" }
+
+int test4_2567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2567(va); // { dg-error "lvalue" }
+ sink_4_2567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 834 }
+ sink_4_2567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 836 }
+ return 0;
+}
+
+two sink_4_2568(const A&);
+five sink_4_2568( A&&);
+six sink_4_2568(const A&&);
+eight sink_4_2568(const volatile A&&); // { dg-message "" }
+
+int test4_2568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2568(va); // { dg-error "lvalue" }
+ sink_4_2568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_4_2578(const A&);
+five sink_4_2578( A&&);
+seven sink_4_2578(volatile A&&); // { dg-message "" }
+eight sink_4_2578(const volatile A&&); // { dg-message "" }
+
+int test4_2578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2578(va); // { dg-error "lvalue" }
+ sink_4_2578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_4_2678(const A&); // { dg-message "note" }
+six sink_4_2678(const A&&); // { dg-message "note" }
+seven sink_4_2678(volatile A&&); // { dg-message "" }
+eight sink_4_2678(const volatile A&&); // { dg-message "" }
+
+int test4_2678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_2678(va); // { dg-error "lvalue" }
+ sink_4_2678(cva); // { dg-error "lvalue" }
+ sink_4_2678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 886 }
+ return 0;
+}
+
+three sink_4_3456(volatile A&); // { dg-message "three sink_4_3456|no known conversion" }
+four sink_4_3456(const volatile A&); // { dg-message "note" }
+five sink_4_3456( A&&); // { dg-message "note" }
+six sink_4_3456(const A&&); // { dg-message "note" }
+
+int test4_3456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 902 }
+ sink_4_3456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 904 }
+ return 0;
+}
+
+three sink_4_3457(volatile A&); // { dg-message "three sink_4_3457|no known conversion" }
+four sink_4_3457(const volatile A&); // { dg-message "note" }
+five sink_4_3457( A&&); // { dg-message "note" }
+seven sink_4_3457(volatile A&&); // { dg-message "note" }
+
+int test4_3457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3457(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 920 }
+ sink_4_3457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 922 }
+ return 0;
+}
+
+three sink_4_3467(volatile A&); // { dg-message "three sink_4_3467|no known conversion" }
+four sink_4_3467(const volatile A&); // { dg-message "note" }
+six sink_4_3467(const A&&); // { dg-message "note" }
+seven sink_4_3467(volatile A&&); // { dg-message "note" }
+
+int test4_3467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 938 }
+ sink_4_3467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 940 }
+ return 0;
+}
+
+three sink_4_3567(volatile A&); // { dg-message "three sink_4_3567|no known conversion" }
+five sink_4_3567( A&&); // { dg-message "note" }
+six sink_4_3567(const A&&); // { dg-message "" }
+seven sink_4_3567(volatile A&&); // { dg-message "note" }
+
+int test4_3567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3567(ca); // { dg-error "lvalue" }
+ sink_4_3567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 957 }
+ sink_4_3567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 959 }
+ return 0;
+}
+
+three sink_4_3568(volatile A&);
+five sink_4_3568( A&&);
+six sink_4_3568(const A&&); // { dg-message "" }
+eight sink_4_3568(const volatile A&&); // { dg-message "" }
+
+int test4_3568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3568(ca); // { dg-error "lvalue" }
+ sink_4_3568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_4_3578(volatile A&);
+five sink_4_3578( A&&);
+seven sink_4_3578(volatile A&&);
+eight sink_4_3578(const volatile A&&); // { dg-message "" }
+
+int test4_3578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3578(ca); // { dg-error "lvalue" }
+ sink_4_3578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_4_3678(volatile A&);
+six sink_4_3678(const A&&); // { dg-message "" }
+seven sink_4_3678(volatile A&&); // { dg-message "note" }
+eight sink_4_3678(const volatile A&&); // { dg-message "" }
+
+int test4_3678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_3678(ca); // { dg-error "lvalue" }
+ sink_4_3678(cva); // { dg-error "lvalue" }
+ sink_4_3678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 1009 }
+ return 0;
+}
+
+four sink_4_4567(const volatile A&); // { dg-message "note" }
+five sink_4_4567( A&&); // { dg-message "note" }
+six sink_4_4567(const A&&); // { dg-message "note" }
+seven sink_4_4567(volatile A&&); // { dg-message "note" }
+
+int test4_4567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_4567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 1025 }
+ return 0;
+}
+
+four sink_4_4678(const volatile A&);
+six sink_4_4678(const A&&); // { dg-message "note" }
+seven sink_4_4678(volatile A&&); // { dg-message "note" }
+eight sink_4_4678(const volatile A&&); // { dg-message "note" }
+
+int test4_4678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_4678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 1041 }
+ return 0;
+}
+
+five sink_4_5678( A&&); // { dg-message "" }
+six sink_4_5678(const A&&); // { dg-message "" }
+seven sink_4_5678(volatile A&&); // { dg-message "" }
+eight sink_4_5678(const volatile A&&); // { dg-message "" }
+
+int test4_5678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_4_5678(a); // { dg-error "lvalue" }
+ sink_4_5678(ca); // { dg-error "lvalue" }
+ sink_4_5678(va); // { dg-error "lvalue" }
+ sink_4_5678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+int main()
+{
+ return test4_1235() + test4_1236() + test4_1237() + test4_1256() + test4_1257() +
+ test4_1267() + test4_1356() + test4_1357() + test4_1467() + test4_1567() +
+ test4_1678() + test4_2345() + test4_2346() + test4_2347() + test4_2348() +
+ test4_2356() + test4_2357() + test4_2358() + test4_2367() + test4_2368() +
+ test4_2378() + test4_2467() + test4_2567() + test4_2678() + test4_3467() +
+ test4_3567() + test4_3678() + test4_4678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C
new file mode 100644
index 000000000..8d720c7a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C
@@ -0,0 +1,1448 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 4 at a time
+
+one sink_4_1234( A&);
+two sink_4_1234(const A&);
+three sink_4_1234(volatile A&);
+four sink_4_1234(const volatile A&);
+
+int test4_1234()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1234(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1234(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1234(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1234(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1234(source())) == 2 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1234(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1235( A&);
+two sink_4_1235(const A&);
+three sink_4_1235(volatile A&);
+five sink_4_1235( A&&);
+
+int test4_1235()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1235(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1235(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1235(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1235(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1235(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1236( A&);
+two sink_4_1236(const A&);
+three sink_4_1236(volatile A&);
+six sink_4_1236(const A&&);
+
+int test4_1236()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1236(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1236(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1236(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1236(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1236(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1237( A&);
+two sink_4_1237(const A&);
+three sink_4_1237(volatile A&);
+seven sink_4_1237(volatile A&&);
+
+int test4_1237()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1237(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1237(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1237(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1237(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1237(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1237(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1238( A&);
+two sink_4_1238(const A&);
+three sink_4_1238(volatile A&);
+eight sink_4_1238(const volatile A&&);
+
+int test4_1238()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1238(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1238(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1238(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1238(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1238(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1238(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1238(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1245( A&);
+two sink_4_1245(const A&);
+four sink_4_1245(const volatile A&);
+five sink_4_1245( A&&);
+
+int test4_1245()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1245(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1245(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1245(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1245(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1245(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1245(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1246( A&);
+two sink_4_1246(const A&);
+four sink_4_1246(const volatile A&);
+six sink_4_1246(const A&&);
+
+int test4_1246()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1246(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1246(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1246(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1246(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1246(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1246(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1247( A&);
+two sink_4_1247(const A&);
+four sink_4_1247(const volatile A&);
+seven sink_4_1247(volatile A&&);
+
+int test4_1247()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1247(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1247(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1247(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1247(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1247(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1247(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1247(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1248( A&);
+two sink_4_1248(const A&);
+four sink_4_1248(const volatile A&);
+eight sink_4_1248(const volatile A&&);
+
+int test4_1248()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1248(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1248(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1248(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1248(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1248(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1248(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1248(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1248(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1256( A&);
+two sink_4_1256(const A&);
+five sink_4_1256( A&&);
+six sink_4_1256(const A&&);
+
+int test4_1256()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1256(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1256(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1256(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1256(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1257( A&);
+two sink_4_1257(const A&);
+five sink_4_1257( A&&);
+seven sink_4_1257(volatile A&&);
+
+int test4_1257()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1257(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1257(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1257(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1257(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1257(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1258( A&);
+two sink_4_1258(const A&);
+five sink_4_1258( A&&);
+eight sink_4_1258(const volatile A&&);
+
+int test4_1258()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1258(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1258(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1258(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1258(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1258(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1258(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1267( A&);
+two sink_4_1267(const A&);
+six sink_4_1267(const A&&);
+seven sink_4_1267(volatile A&&);
+
+int test4_1267()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1267(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1267(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1267(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1267(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1268( A&);
+two sink_4_1268(const A&);
+six sink_4_1268(const A&&);
+eight sink_4_1268(const volatile A&&);
+
+int test4_1268()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1268(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1268(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1268(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1268(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1268(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1268(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1278( A&);
+two sink_4_1278(const A&);
+seven sink_4_1278(volatile A&&);
+eight sink_4_1278(const volatile A&&);
+
+int test4_1278()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1278(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1278(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1278(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1278(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1278(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1278(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1345( A&);
+three sink_4_1345(volatile A&);
+four sink_4_1345(const volatile A&);
+five sink_4_1345( A&&);
+
+int test4_1345()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1345(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1345(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1345(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1345(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1345(source())) == 5 * sizeof(long)> t5;
+ return 0;
+}
+
+one sink_4_1346( A&);
+three sink_4_1346(volatile A&);
+four sink_4_1346(const volatile A&);
+six sink_4_1346(const A&&);
+
+int test4_1346()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1346(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1346(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1346(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1346(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1346(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1346(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1347( A&);
+three sink_4_1347(volatile A&);
+four sink_4_1347(const volatile A&);
+seven sink_4_1347(volatile A&&);
+
+int test4_1347()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1347(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1347(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1347(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1347(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1347(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1347(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1348( A&);
+three sink_4_1348(volatile A&);
+four sink_4_1348(const volatile A&);
+eight sink_4_1348(const volatile A&&);
+
+int test4_1348()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1348(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1348(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1348(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1348(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1348(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1348(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1348(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1348(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1356( A&);
+three sink_4_1356(volatile A&);
+five sink_4_1356( A&&);
+six sink_4_1356(const A&&);
+
+int test4_1356()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1356(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1356(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1356(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1356(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1357( A&);
+three sink_4_1357(volatile A&);
+five sink_4_1357( A&&);
+seven sink_4_1357(volatile A&&);
+
+int test4_1357()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1357(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1357(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1357(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1357(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1358( A&);
+three sink_4_1358(volatile A&);
+five sink_4_1358( A&&);
+eight sink_4_1358(const volatile A&&);
+
+int test4_1358()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1358(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1358(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1358(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1358(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1358(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1358(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1367( A&);
+three sink_4_1367(volatile A&);
+six sink_4_1367(const A&&);
+seven sink_4_1367(volatile A&&);
+
+int test4_1367()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1367(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1367(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1367(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1367(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1368( A&);
+three sink_4_1368(volatile A&);
+six sink_4_1368(const A&&);
+eight sink_4_1368(const volatile A&&);
+
+int test4_1368()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1368(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1368(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1368(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1368(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1368(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1368(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1378( A&);
+three sink_4_1378(volatile A&);
+seven sink_4_1378(volatile A&&);
+eight sink_4_1378(const volatile A&&);
+
+int test4_1378()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1378(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1378(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1378(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1378(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1378(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1378(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1456( A&);
+four sink_4_1456(const volatile A&);
+five sink_4_1456( A&&);
+six sink_4_1456(const A&&);
+
+int test4_1456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1456(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1456(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1456(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1456(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1456(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1456(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_4_1457( A&);
+four sink_4_1457(const volatile A&);
+five sink_4_1457( A&&);
+seven sink_4_1457(volatile A&&);
+
+int test4_1457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1457(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1457(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1457(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1457(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1457(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1457(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1458( A&);
+four sink_4_1458(const volatile A&);
+five sink_4_1458( A&&);
+eight sink_4_1458(const volatile A&&);
+
+int test4_1458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1458(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1458(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1458(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1458(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1458(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1458(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1458(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1458(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1467( A&);
+four sink_4_1467(const volatile A&);
+six sink_4_1467(const A&&);
+seven sink_4_1467(volatile A&&);
+
+int test4_1467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1467(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1467(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1467(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1467(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1467(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1467(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1468( A&);
+four sink_4_1468(const volatile A&);
+six sink_4_1468(const A&&);
+eight sink_4_1468(const volatile A&&);
+
+int test4_1468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1468(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1468(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1468(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1468(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1468(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1468(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1468(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1468(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1478( A&);
+four sink_4_1478(const volatile A&);
+seven sink_4_1478(volatile A&&);
+eight sink_4_1478(const volatile A&&);
+
+int test4_1478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1478(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1478(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_1478(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_1478(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_1478(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1478(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1478(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1478(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1567( A&);
+five sink_4_1567( A&&);
+six sink_4_1567(const A&&);
+seven sink_4_1567(volatile A&&);
+
+int test4_1567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1567(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_4_1568( A&);
+five sink_4_1568( A&&);
+six sink_4_1568(const A&&);
+eight sink_4_1568(const volatile A&&);
+
+int test4_1568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1568(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1578( A&);
+five sink_4_1578( A&&);
+seven sink_4_1578(volatile A&&);
+eight sink_4_1578(const volatile A&&);
+
+int test4_1578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1578(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_1578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_4_1678( A&);
+six sink_4_1678(const A&&);
+seven sink_4_1678(volatile A&&);
+eight sink_4_1678(const volatile A&&);
+
+int test4_1678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_1678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_4_1678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_1678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_1678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2345(const A&);
+three sink_4_2345(volatile A&);
+four sink_4_2345(const volatile A&);
+five sink_4_2345( A&&);
+
+int test4_2345()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2345(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2345(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2345(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2345(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2345(c_source())) == 2 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_4_2346(const A&);
+three sink_4_2346(volatile A&);
+four sink_4_2346(const volatile A&);
+six sink_4_2346(const A&&);
+
+int test4_2346()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2346(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2346(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2346(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2346(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2346(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_4_2347(const A&);
+three sink_4_2347(volatile A&);
+four sink_4_2347(const volatile A&);
+seven sink_4_2347(volatile A&&);
+
+int test4_2347()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2347(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2347(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2347(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2347(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2347(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2347(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2348(const A&);
+three sink_4_2348(volatile A&);
+four sink_4_2348(const volatile A&);
+eight sink_4_2348(const volatile A&&);
+
+int test4_2348()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2348(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2348(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2348(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2348(source())) == 8 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2348(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2348(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2348(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2356(const A&);
+three sink_4_2356(volatile A&);
+five sink_4_2356( A&&);
+six sink_4_2356(const A&&);
+
+int test4_2356()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2356(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2356(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2356(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2356(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_4_2357(const A&);
+three sink_4_2357(volatile A&);
+five sink_4_2357( A&&);
+seven sink_4_2357(volatile A&&);
+
+int test4_2357()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2357(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2357(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2357(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2357(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2357(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2358(const A&);
+three sink_4_2358(volatile A&);
+five sink_4_2358( A&&);
+eight sink_4_2358(const volatile A&&);
+
+int test4_2358()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2358(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2358(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2358(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2358(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2358(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2358(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2367(const A&);
+three sink_4_2367(volatile A&);
+six sink_4_2367(const A&&);
+seven sink_4_2367(volatile A&&);
+
+int test4_2367()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2367(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2367(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2367(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2367(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2368(const A&);
+three sink_4_2368(volatile A&);
+six sink_4_2368(const A&&);
+eight sink_4_2368(const volatile A&&);
+
+int test4_2368()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2368(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2368(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2368(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2368(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2368(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2368(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2378(const A&);
+three sink_4_2378(volatile A&);
+seven sink_4_2378(volatile A&&);
+eight sink_4_2378(const volatile A&&);
+
+int test4_2378()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2378(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2378(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2378(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2378(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2378(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2378(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2456(const A&);
+four sink_4_2456(const volatile A&);
+five sink_4_2456( A&&);
+six sink_4_2456(const A&&);
+
+int test4_2456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2456(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2456(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2456(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2456(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2456(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2456(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+two sink_4_2457(const A&);
+four sink_4_2457(const volatile A&);
+five sink_4_2457( A&&);
+seven sink_4_2457(volatile A&&);
+
+int test4_2457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2457(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2457(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2457(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2457(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2457(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2457(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2457(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2458(const A&);
+four sink_4_2458(const volatile A&);
+five sink_4_2458( A&&);
+eight sink_4_2458(const volatile A&&);
+
+int test4_2458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2458(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2458(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2458(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2458(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2458(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2458(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2458(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2458(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2467(const A&);
+four sink_4_2467(const volatile A&);
+six sink_4_2467(const A&&);
+seven sink_4_2467(volatile A&&);
+
+int test4_2467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2467(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2467(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2467(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2467(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2467(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2467(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2468(const A&);
+four sink_4_2468(const volatile A&);
+six sink_4_2468(const A&&);
+eight sink_4_2468(const volatile A&&);
+
+int test4_2468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2468(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2468(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2468(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2468(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2468(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2468(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2468(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2468(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2478(const A&);
+four sink_4_2478(const volatile A&);
+seven sink_4_2478(volatile A&&);
+eight sink_4_2478(const volatile A&&);
+
+int test4_2478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2478(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2478(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2478(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_2478(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_2478(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2478(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2478(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2478(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2567(const A&);
+five sink_4_2567( A&&);
+six sink_4_2567(const A&&);
+seven sink_4_2567(volatile A&&);
+
+int test4_2567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2567(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2567(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_4_2568(const A&);
+five sink_4_2568( A&&);
+six sink_4_2568(const A&&);
+eight sink_4_2568(const volatile A&&);
+
+int test4_2568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2568(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2568(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2578(const A&);
+five sink_4_2578( A&&);
+seven sink_4_2578(volatile A&&);
+eight sink_4_2578(const volatile A&&);
+
+int test4_2578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2578(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2578(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_2578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_4_2678(const A&);
+six sink_4_2678(const A&&);
+seven sink_4_2678(volatile A&&);
+eight sink_4_2678(const volatile A&&);
+
+int test4_2678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_2678(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_4_2678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_4_2678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_2678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_2678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3456(volatile A&);
+four sink_4_3456(const volatile A&);
+five sink_4_3456( A&&);
+six sink_4_3456(const A&&);
+
+int test4_3456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3456(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3456(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3456(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3456(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3456(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3456(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+three sink_4_3457(volatile A&);
+four sink_4_3457(const volatile A&);
+five sink_4_3457( A&&);
+seven sink_4_3457(volatile A&&);
+
+int test4_3457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3457(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3457(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3457(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3457(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3457(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3457(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_4_3458(volatile A&);
+four sink_4_3458(const volatile A&);
+five sink_4_3458( A&&);
+eight sink_4_3458(const volatile A&&);
+
+int test4_3458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3458(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3458(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3458(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3458(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3458(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3458(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3458(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3458(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3467(volatile A&);
+four sink_4_3467(const volatile A&);
+six sink_4_3467(const A&&);
+seven sink_4_3467(volatile A&&);
+
+int test4_3467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3467(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3467(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3467(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3467(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3467(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3467(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_4_3468(volatile A&);
+four sink_4_3468(const volatile A&);
+six sink_4_3468(const A&&);
+eight sink_4_3468(const volatile A&&);
+
+int test4_3468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3468(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3468(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3468(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3468(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3468(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3468(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3468(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3468(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3478(volatile A&);
+four sink_4_3478(const volatile A&);
+seven sink_4_3478(volatile A&&);
+eight sink_4_3478(const volatile A&&);
+
+int test4_3478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3478(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3478(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_3478(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3478(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_3478(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3478(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3478(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3478(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3567(volatile A&);
+five sink_4_3567( A&&);
+six sink_4_3567(const A&&);
+seven sink_4_3567(volatile A&&);
+
+int test4_3567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3567(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3567(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+three sink_4_3568(volatile A&);
+five sink_4_3568( A&&);
+six sink_4_3568(const A&&);
+eight sink_4_3568(const volatile A&&);
+
+int test4_3568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3568(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3568(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3578(volatile A&);
+five sink_4_3578( A&&);
+seven sink_4_3578(volatile A&&);
+eight sink_4_3578(const volatile A&&);
+
+int test4_3578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3578(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3578(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_3578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_4_3678(volatile A&);
+six sink_4_3678(const A&&);
+seven sink_4_3678(volatile A&&);
+eight sink_4_3678(const volatile A&&);
+
+int test4_3678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_3678(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_4_3678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_4_3678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_3678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_3678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_4_4567(const volatile A&);
+five sink_4_4567( A&&);
+six sink_4_4567(const A&&);
+seven sink_4_4567(volatile A&&);
+
+int test4_4567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_4567(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_4_4567(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_4567(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_4567(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_4567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_4567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_4567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+four sink_4_4568(const volatile A&);
+five sink_4_4568( A&&);
+six sink_4_4568(const A&&);
+eight sink_4_4568(const volatile A&&);
+
+int test4_4568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_4568(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_4_4568(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_4568(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_4568(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_4568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_4568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_4568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_4_4568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_4_4578(const volatile A&);
+five sink_4_4578( A&&);
+seven sink_4_4578(volatile A&&);
+eight sink_4_4578(const volatile A&&);
+
+int test4_4578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_4578(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_4_4578(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_4578(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_4578(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_4578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_4578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_4_4578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_4578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_4_4678(const volatile A&);
+six sink_4_4678(const A&&);
+seven sink_4_4678(volatile A&&);
+eight sink_4_4678(const volatile A&&);
+
+int test4_4678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_4678(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_4_4678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_4_4678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_4_4678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_4_4678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_4678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_4678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+five sink_4_5678( A&&);
+six sink_4_5678(const A&&);
+seven sink_4_5678(volatile A&&);
+eight sink_4_5678(const volatile A&&);
+
+int test4_5678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_4_5678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_4_5678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_4_5678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_4_5678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test4_1234() + test4_1235() + test4_1236() + test4_1237() + test4_1238() +
+ test4_1245() + test4_1246() + test4_1247() + test4_1248() + test4_1256() +
+ test4_1257() + test4_1258() + test4_1267() + test4_1268() + test4_1278() +
+ test4_1345() + test4_1346() + test4_1347() + test4_1348() + test4_1356() +
+ test4_1357() + test4_1358() + test4_1367() + test4_1368() + test4_1378() +
+ test4_1456() + test4_1457() + test4_1458() + test4_1467() + test4_1468() +
+ test4_1478() + test4_1567() + test4_1568() + test4_1578() + test4_1678() +
+ test4_2345() + test4_2346() + test4_2347() + test4_2348() + test4_2356() +
+ test4_2357() + test4_2358() + test4_2367() + test4_2368() + test4_2378() +
+ test4_2456() + test4_2457() + test4_2458() + test4_2467() + test4_2468() +
+ test4_2478() + test4_2567() + test4_2568() + test4_2578() + test4_2678() +
+ test4_3456() + test4_3457() + test4_3458() + test4_3467() + test4_3468() +
+ test4_3478() + test4_3567() + test4_3568() + test4_3578() + test4_3678() +
+ test4_4567() + test4_4568() + test4_4578() + test4_4678() + test4_5678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C
new file mode 100644
index 000000000..ca179cd82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C
@@ -0,0 +1,806 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 5 at a time
+
+one sink_5_12345( A&); // { dg-message "one sink_5_12345|no known conversion" }
+two sink_5_12345(const A&); // { dg-message "note" }
+three sink_5_12345(volatile A&); // { dg-message "note" }
+four sink_5_12345(const volatile A&); // { dg-message "note" }
+five sink_5_12345( A&&); // { dg-message "note" }
+
+int test5_12345()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12345(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 45 }
+ sink_5_12345(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 47 }
+ return 0;
+}
+
+one sink_5_12346( A&); // { dg-message "one sink_5_12346|no known conversion" }
+two sink_5_12346(const A&); // { dg-message "note" }
+three sink_5_12346(volatile A&); // { dg-message "note" }
+four sink_5_12346(const volatile A&); // { dg-message "note" }
+six sink_5_12346(const A&&); // { dg-message "note" }
+
+int test5_12346()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12346(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 64 }
+ sink_5_12346(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 66 }
+ return 0;
+}
+
+one sink_5_12347( A&); // { dg-message "one sink_5_12347|no known conversion" }
+two sink_5_12347(const A&); // { dg-message "note" }
+three sink_5_12347(volatile A&); // { dg-message "note" }
+four sink_5_12347(const volatile A&); // { dg-message "note" }
+seven sink_5_12347(volatile A&&); // { dg-message "note" }
+
+int test5_12347()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12347(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 83 }
+ return 0;
+}
+
+one sink_5_12356( A&); // { dg-message "one sink_5_12356|no known conversion" }
+two sink_5_12356(const A&); // { dg-message "note" }
+three sink_5_12356(volatile A&); // { dg-message "note" }
+five sink_5_12356( A&&); // { dg-message "note" }
+six sink_5_12356(const A&&); // { dg-message "note" }
+
+int test5_12356()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12356(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 100 }
+ sink_5_12356(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 102 }
+ sink_5_12356(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 104 }
+ return 0;
+}
+
+one sink_5_12357( A&); // { dg-message "one sink_5_12357|no known conversion" }
+two sink_5_12357(const A&); // { dg-message "note" }
+three sink_5_12357(volatile A&); // { dg-message "note" }
+five sink_5_12357( A&&); // { dg-message "note" }
+seven sink_5_12357(volatile A&&); // { dg-message "note" }
+
+int test5_12357()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12357(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 121 }
+ sink_5_12357(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 123 }
+ return 0;
+}
+
+one sink_5_12358( A&);
+two sink_5_12358(const A&);
+three sink_5_12358(volatile A&);
+five sink_5_12358( A&&);
+eight sink_5_12358(const volatile A&&); // { dg-message "" }
+
+int test5_12358()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12358(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_12367( A&); // { dg-message "one sink_5_12367|no known conversion" }
+two sink_5_12367(const A&); // { dg-message "note" }
+three sink_5_12367(volatile A&); // { dg-message "note" }
+six sink_5_12367(const A&&); // { dg-message "note" }
+seven sink_5_12367(volatile A&&); // { dg-message "note" }
+
+int test5_12367()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12367(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 156 }
+ sink_5_12367(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 158 }
+ sink_5_12367(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 160 }
+ return 0;
+}
+
+one sink_5_12368( A&);
+two sink_5_12368(const A&);
+three sink_5_12368(volatile A&);
+six sink_5_12368(const A&&);
+eight sink_5_12368(const volatile A&&); // { dg-message "" }
+
+int test5_12368()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12368(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_12378( A&);
+two sink_5_12378(const A&);
+three sink_5_12378(volatile A&);
+seven sink_5_12378(volatile A&&);
+eight sink_5_12378(const volatile A&&); // { dg-message "" }
+
+int test5_12378()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12378(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_12456( A&); // { dg-message "one sink_5_12456|no known conversion" }
+two sink_5_12456(const A&); // { dg-message "note" }
+four sink_5_12456(const volatile A&); // { dg-message "note" }
+five sink_5_12456( A&&); // { dg-message "note" }
+six sink_5_12456(const A&&); // { dg-message "note" }
+
+int test5_12456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 209 }
+ sink_5_12456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 211 }
+ return 0;
+}
+
+one sink_5_12457( A&); // { dg-message "one sink_5_12457|no known conversion" }
+two sink_5_12457(const A&); // { dg-message "note" }
+four sink_5_12457(const volatile A&); // { dg-message "note" }
+five sink_5_12457( A&&); // { dg-message "note" }
+seven sink_5_12457(volatile A&&); // { dg-message "note" }
+
+int test5_12457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 228 }
+ return 0;
+}
+
+one sink_5_12467( A&); // { dg-message "one sink_5_12467|no known conversion" }
+two sink_5_12467(const A&); // { dg-message "note" }
+four sink_5_12467(const volatile A&); // { dg-message "note" }
+six sink_5_12467(const A&&); // { dg-message "note" }
+seven sink_5_12467(volatile A&&); // { dg-message "note" }
+
+int test5_12467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 245 }
+ sink_5_12467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 247 }
+ return 0;
+}
+
+one sink_5_12567( A&); // { dg-message "one sink_5_12567|no known conversion" }
+two sink_5_12567(const A&); // { dg-message "note" }
+five sink_5_12567( A&&); // { dg-message "note" }
+six sink_5_12567(const A&&); // { dg-message "note" }
+seven sink_5_12567(volatile A&&); // { dg-message "" }
+
+int test5_12567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12567(va); // { dg-error "lvalue" }
+ sink_5_12567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 265 }
+ sink_5_12567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 267 }
+ return 0;
+}
+
+one sink_5_12568( A&);
+two sink_5_12568(const A&);
+five sink_5_12568( A&&);
+six sink_5_12568(const A&&);
+eight sink_5_12568(const volatile A&&); // { dg-message "" }
+
+int test5_12568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12568(va); // { dg-error "lvalue" }
+ sink_5_12568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_12578( A&);
+two sink_5_12578(const A&);
+five sink_5_12578( A&&);
+seven sink_5_12578(volatile A&&); // { dg-message "" }
+eight sink_5_12578(const volatile A&&); // { dg-message "" }
+
+int test5_12578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12578(va); // { dg-error "lvalue" }
+ sink_5_12578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_12678( A&);
+two sink_5_12678(const A&); // { dg-message "note" }
+six sink_5_12678(const A&&); // { dg-message "note" }
+seven sink_5_12678(volatile A&&); // { dg-message "" }
+eight sink_5_12678(const volatile A&&); // { dg-message "" }
+
+int test5_12678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_12678(va); // { dg-error "lvalue" }
+ sink_5_12678(cva); // { dg-error "lvalue" }
+ sink_5_12678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 320 }
+ return 0;
+}
+
+one sink_5_13456( A&); // { dg-message "one sink_5_13456|no known conversion" }
+three sink_5_13456(volatile A&); // { dg-message "note" }
+four sink_5_13456(const volatile A&); // { dg-message "note" }
+five sink_5_13456( A&&); // { dg-message "note" }
+six sink_5_13456(const A&&); // { dg-message "note" }
+
+int test5_13456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 337 }
+ sink_5_13456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 339 }
+ return 0;
+}
+
+one sink_5_13457( A&); // { dg-message "one sink_5_13457|no known conversion" }
+three sink_5_13457(volatile A&); // { dg-message "note" }
+four sink_5_13457(const volatile A&); // { dg-message "note" }
+five sink_5_13457( A&&); // { dg-message "note" }
+seven sink_5_13457(volatile A&&); // { dg-message "note" }
+
+int test5_13457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13457(c_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 356 }
+ sink_5_13457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 358 }
+ return 0;
+}
+
+one sink_5_13467( A&); // { dg-message "one sink_5_13467|no known conversion" }
+three sink_5_13467(volatile A&); // { dg-message "note" }
+four sink_5_13467(const volatile A&); // { dg-message "note" }
+six sink_5_13467(const A&&); // { dg-message "note" }
+seven sink_5_13467(volatile A&&); // { dg-message "note" }
+
+int test5_13467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 375 }
+ sink_5_13467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 377 }
+ return 0;
+}
+
+one sink_5_13567( A&); // { dg-message "one sink_5_13567|no known conversion" }
+three sink_5_13567(volatile A&); // { dg-message "note" }
+five sink_5_13567( A&&); // { dg-message "note" }
+six sink_5_13567(const A&&); // { dg-message "" }
+seven sink_5_13567(volatile A&&); // { dg-message "note" }
+
+int test5_13567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13567(ca); // { dg-error "lvalue" }
+ sink_5_13567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 395 }
+ sink_5_13567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 397 }
+ return 0;
+}
+
+one sink_5_13568( A&);
+three sink_5_13568(volatile A&);
+five sink_5_13568( A&&);
+six sink_5_13568(const A&&); // { dg-message "" }
+eight sink_5_13568(const volatile A&&); // { dg-message "" }
+
+int test5_13568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13568(ca); // { dg-error "lvalue" }
+ sink_5_13568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_13578( A&);
+three sink_5_13578(volatile A&);
+five sink_5_13578( A&&);
+seven sink_5_13578(volatile A&&);
+eight sink_5_13578(const volatile A&&); // { dg-message "" }
+
+int test5_13578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13578(ca); // { dg-error "lvalue" }
+ sink_5_13578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_5_13678( A&);
+three sink_5_13678(volatile A&);
+six sink_5_13678(const A&&); // { dg-message "" }
+seven sink_5_13678(volatile A&&); // { dg-message "note" }
+eight sink_5_13678(const volatile A&&); // { dg-message "" }
+
+int test5_13678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_13678(ca); // { dg-error "lvalue" }
+ sink_5_13678(cva); // { dg-error "lvalue" }
+ sink_5_13678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 450 }
+ return 0;
+}
+
+one sink_5_14567( A&); // { dg-message "one sink_5_14567|no known conversion" }
+four sink_5_14567(const volatile A&); // { dg-message "note" }
+five sink_5_14567( A&&); // { dg-message "note" }
+six sink_5_14567(const A&&); // { dg-message "note" }
+seven sink_5_14567(volatile A&&); // { dg-message "note" }
+
+int test5_14567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_14567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 467 }
+ return 0;
+}
+
+one sink_5_14678( A&);
+four sink_5_14678(const volatile A&);
+six sink_5_14678(const A&&); // { dg-message "note" }
+seven sink_5_14678(volatile A&&); // { dg-message "note" }
+eight sink_5_14678(const volatile A&&); // { dg-message "note" }
+
+int test5_14678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_14678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 484 }
+ return 0;
+}
+
+one sink_5_15678( A&);
+five sink_5_15678( A&&);
+six sink_5_15678(const A&&); // { dg-message "" }
+seven sink_5_15678(volatile A&&); // { dg-message "" }
+eight sink_5_15678(const volatile A&&); // { dg-message "" }
+
+int test5_15678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_15678(ca); // { dg-error "lvalue" }
+ sink_5_15678(va); // { dg-error "lvalue" }
+ sink_5_15678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_5_23456(const A&); // { dg-message "two sink_5_23456|no known conversion" }
+three sink_5_23456(volatile A&); // { dg-message "note" }
+four sink_5_23456(const volatile A&); // { dg-message "note" }
+five sink_5_23456( A&&); // { dg-message "note" }
+six sink_5_23456(const A&&); // { dg-message "note" }
+
+int test5_23456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23456(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 519 }
+ sink_5_23456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 521 }
+ sink_5_23456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 523 }
+ return 0;
+}
+
+two sink_5_23457(const A&); // { dg-message "two sink_5_23457|no known conversion" }
+three sink_5_23457(volatile A&); // { dg-message "note" }
+four sink_5_23457(const volatile A&); // { dg-message "note" }
+five sink_5_23457( A&&); // { dg-message "note" }
+seven sink_5_23457(volatile A&&); // { dg-message "note" }
+
+int test5_23457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23457(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 540 }
+ sink_5_23457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 542 }
+ return 0;
+}
+
+two sink_5_23458(const A&); // { dg-message "note" }
+three sink_5_23458(volatile A&); // { dg-message "note" }
+four sink_5_23458(const volatile A&); // { dg-message "note" }
+five sink_5_23458( A&&); // { dg-message "note" }
+eight sink_5_23458(const volatile A&&); // { dg-message "note" }
+
+int test5_23458()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23458(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 559 }
+ return 0;
+}
+
+two sink_5_23467(const A&); // { dg-message "two sink_5_23467|no known conversion" }
+three sink_5_23467(volatile A&); // { dg-message "note" }
+four sink_5_23467(const volatile A&); // { dg-message "note" }
+six sink_5_23467(const A&&); // { dg-message "note" }
+seven sink_5_23467(volatile A&&); // { dg-message "note" }
+
+int test5_23467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23467(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 576 }
+ sink_5_23467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 578 }
+ sink_5_23467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 580 }
+ return 0;
+}
+
+two sink_5_23468(const A&); // { dg-message "note" }
+three sink_5_23468(volatile A&); // { dg-message "note" }
+four sink_5_23468(const volatile A&); // { dg-message "note" }
+six sink_5_23468(const A&&); // { dg-message "note" }
+eight sink_5_23468(const volatile A&&); // { dg-message "note" }
+
+int test5_23468()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23468(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 597 }
+ return 0;
+}
+
+two sink_5_23478(const A&); // { dg-message "note" }
+three sink_5_23478(volatile A&); // { dg-message "note" }
+four sink_5_23478(const volatile A&); // { dg-message "note" }
+seven sink_5_23478(volatile A&&); // { dg-message "note" }
+eight sink_5_23478(const volatile A&&); // { dg-message "note" }
+
+int test5_23478()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23478(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 614 }
+ return 0;
+}
+
+two sink_5_23567(const A&); // { dg-message "two sink_5_23567|no known conversion" }
+three sink_5_23567(volatile A&); // { dg-message "note" }
+five sink_5_23567( A&&); // { dg-message "note" }
+six sink_5_23567(const A&&); // { dg-message "note" }
+seven sink_5_23567(volatile A&&); // { dg-message "note" }
+
+int test5_23567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23567(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 631 }
+ sink_5_23567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 633 }
+ sink_5_23567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 635 }
+ return 0;
+}
+
+two sink_5_23568(const A&); // { dg-message "note" }
+three sink_5_23568(volatile A&); // { dg-message "note" }
+five sink_5_23568( A&&); // { dg-message "note" }
+six sink_5_23568(const A&&); // { dg-message "note" }
+eight sink_5_23568(const volatile A&&); // { dg-message "" }
+
+int test5_23568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23568(cva); // { dg-error "lvalue" }
+ sink_5_23568(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 653 }
+ return 0;
+}
+
+two sink_5_23578(const A&); // { dg-message "note" }
+three sink_5_23578(volatile A&); // { dg-message "note" }
+five sink_5_23578( A&&); // { dg-message "note" }
+seven sink_5_23578(volatile A&&); // { dg-message "note" }
+eight sink_5_23578(const volatile A&&); // { dg-message "" }
+
+int test5_23578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23578(cva); // { dg-error "lvalue" }
+ sink_5_23578(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 671 }
+ return 0;
+}
+
+two sink_5_23678(const A&); // { dg-message "note" }
+three sink_5_23678(volatile A&); // { dg-message "note" }
+six sink_5_23678(const A&&); // { dg-message "note" }
+seven sink_5_23678(volatile A&&); // { dg-message "note" }
+eight sink_5_23678(const volatile A&&); // { dg-message "" }
+
+int test5_23678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_23678(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 688 }
+ sink_5_23678(cva); // { dg-error "lvalue" }
+ sink_5_23678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 691 }
+ return 0;
+}
+
+two sink_5_24567(const A&); // { dg-message "two sink_5_24567|no known conversion" }
+four sink_5_24567(const volatile A&); // { dg-message "note" }
+five sink_5_24567( A&&); // { dg-message "note" }
+six sink_5_24567(const A&&); // { dg-message "note" }
+seven sink_5_24567(volatile A&&); // { dg-message "note" }
+
+int test5_24567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_24567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 708 }
+ return 0;
+}
+
+two sink_5_24678(const A&); // { dg-message "note" }
+four sink_5_24678(const volatile A&);
+six sink_5_24678(const A&&); // { dg-message "note" }
+seven sink_5_24678(volatile A&&); // { dg-message "note" }
+eight sink_5_24678(const volatile A&&); // { dg-message "note" }
+
+int test5_24678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_24678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 725 }
+ return 0;
+}
+
+two sink_5_25678(const A&);
+five sink_5_25678( A&&);
+six sink_5_25678(const A&&);
+seven sink_5_25678(volatile A&&); // { dg-message "" }
+eight sink_5_25678(const volatile A&&); // { dg-message "" }
+
+int test5_25678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_25678(va); // { dg-error "lvalue" }
+ sink_5_25678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+three sink_5_34567(volatile A&); // { dg-message "three sink_5_34567|no known conversion" }
+four sink_5_34567(const volatile A&); // { dg-message "note" }
+five sink_5_34567( A&&); // { dg-message "note" }
+six sink_5_34567(const A&&); // { dg-message "note" }
+seven sink_5_34567(volatile A&&); // { dg-message "note" }
+
+int test5_34567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_34567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 759 }
+ return 0;
+}
+
+three sink_5_34678(volatile A&);
+four sink_5_34678(const volatile A&);
+six sink_5_34678(const A&&); // { dg-message "note" }
+seven sink_5_34678(volatile A&&); // { dg-message "note" }
+eight sink_5_34678(const volatile A&&); // { dg-message "note" }
+
+int test5_34678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_34678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 776 }
+ return 0;
+}
+
+three sink_5_35678(volatile A&);
+five sink_5_35678( A&&);
+six sink_5_35678(const A&&); // { dg-message "" }
+seven sink_5_35678(volatile A&&);
+eight sink_5_35678(const volatile A&&); // { dg-message "" }
+
+int test5_35678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_5_35678(ca); // { dg-error "lvalue" }
+ sink_5_35678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+int main()
+{
+ return test5_12356() + test5_12357() + test5_12367() + test5_12467() +
+ test5_12567() + test5_12678() + test5_13467() + test5_13567() +
+ test5_13678() + test5_13678() + test5_23456() + test5_23457() +
+ test5_23458() + test5_23467() + test5_23468() + test5_23478() +
+ test5_23567() + test5_23568() + test5_23578() + test5_23678() +
+ test5_24678() + test5_34678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C
new file mode 100644
index 000000000..703027754
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C
@@ -0,0 +1,1256 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 5 at a time
+
+one sink_5_12345( A&);
+two sink_5_12345(const A&);
+three sink_5_12345(volatile A&);
+four sink_5_12345(const volatile A&);
+five sink_5_12345( A&&);
+
+int test5_12345()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12345(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12345(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12345(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12345(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12345(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12345(c_source())) == 2* sizeof(long)> t6;
+ return 0;
+}
+
+one sink_5_12346( A&);
+two sink_5_12346(const A&);
+three sink_5_12346(volatile A&);
+four sink_5_12346(const volatile A&);
+six sink_5_12346(const A&&);
+
+int test5_12346()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12346(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12346(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12346(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12346(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12346(source())) == 6* sizeof(long)> t5;
+ sa<sizeof(sink_5_12346(c_source())) == 6* sizeof(long)> t6;
+ return 0;
+}
+
+one sink_5_12347( A&);
+two sink_5_12347(const A&);
+three sink_5_12347(volatile A&);
+four sink_5_12347(const volatile A&);
+seven sink_5_12347(volatile A&&);
+
+int test5_12347()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12347(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12347(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12347(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12347(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12347(source())) == 7* sizeof(long)> t5;
+ sa<sizeof(sink_5_12347(c_source())) == 2* sizeof(long)> t6;
+ sa<sizeof(sink_5_12347(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12348( A&);
+two sink_5_12348(const A&);
+three sink_5_12348(volatile A&);
+four sink_5_12348(const volatile A&);
+eight sink_5_12348(const volatile A&&);
+
+int test5_12348()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12348(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12348(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12348(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12348(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12348(source())) == 8* sizeof(long)> t5;
+ sa<sizeof(sink_5_12348(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12348(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12348(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12356( A&);
+two sink_5_12356(const A&);
+three sink_5_12356(volatile A&);
+five sink_5_12356( A&&);
+six sink_5_12356(const A&&);
+
+int test5_12356()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12356(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12356(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12356(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12356(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12356(c_source())) == 6* sizeof(long)> t6;
+ return 0;
+}
+
+one sink_5_12357( A&);
+two sink_5_12357(const A&);
+three sink_5_12357(volatile A&);
+five sink_5_12357( A&&);
+seven sink_5_12357(volatile A&&);
+
+int test5_12357()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12357(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12357(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12357(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12357(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12357(c_source())) == 2* sizeof(long)> t6;
+ sa<sizeof(sink_5_12357(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12358( A&);
+two sink_5_12358(const A&);
+three sink_5_12358(volatile A&);
+five sink_5_12358( A&&);
+eight sink_5_12358(const volatile A&&);
+
+int test5_12358()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12358(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12358(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12358(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12358(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12358(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12358(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12358(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12367( A&);
+two sink_5_12367(const A&);
+three sink_5_12367(volatile A&);
+six sink_5_12367(const A&&);
+seven sink_5_12367(volatile A&&);
+
+int test5_12367()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12367(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12367(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12367(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12367(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12367(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12368( A&);
+two sink_5_12368(const A&);
+three sink_5_12368(volatile A&);
+six sink_5_12368(const A&&);
+eight sink_5_12368(const volatile A&&);
+
+int test5_12368()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12368(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12368(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12368(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12368(source())) == 6* sizeof(long)> t5;
+ sa<sizeof(sink_5_12368(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12368(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12368(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12378( A&);
+two sink_5_12378(const A&);
+three sink_5_12378(volatile A&);
+seven sink_5_12378(volatile A&&);
+eight sink_5_12378(const volatile A&&);
+
+int test5_12378()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12378(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12378(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12378(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_12378(source())) == 7* sizeof(long)> t5;
+ sa<sizeof(sink_5_12378(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12378(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_12378(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12456( A&);
+two sink_5_12456(const A&);
+four sink_5_12456(const volatile A&);
+five sink_5_12456( A&&);
+six sink_5_12456(const A&&);
+
+int test5_12456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12456(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12456(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12456(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12456(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12456(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12456(c_source())) == 6* sizeof(long)> t6;
+ return 0;
+}
+
+one sink_5_12457( A&);
+two sink_5_12457(const A&);
+four sink_5_12457(const volatile A&);
+five sink_5_12457( A&&);
+seven sink_5_12457(volatile A&&);
+
+int test5_12457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12457(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12457(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12457(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12457(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12457(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12457(c_source())) == 2* sizeof(long)> t6;
+ sa<sizeof(sink_5_12457(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12458( A&);
+two sink_5_12458(const A&);
+four sink_5_12458(const volatile A&);
+five sink_5_12458( A&&);
+eight sink_5_12458(const volatile A&&);
+
+int test5_12458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12458(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12458(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12458(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12458(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12458(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12458(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12458(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12458(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12467( A&);
+two sink_5_12467(const A&);
+four sink_5_12467(const volatile A&);
+six sink_5_12467(const A&&);
+seven sink_5_12467(volatile A&&);
+
+int test5_12467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12467(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12467(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12467(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12467(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12467(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12467(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12468( A&);
+two sink_5_12468(const A&);
+four sink_5_12468(const volatile A&);
+six sink_5_12468(const A&&);
+eight sink_5_12468(const volatile A&&);
+
+int test5_12468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12468(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12468(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12468(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12468(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12468(source())) == 6* sizeof(long)> t5;
+ sa<sizeof(sink_5_12468(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12468(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12468(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12478( A&);
+two sink_5_12478(const A&);
+four sink_5_12478(const volatile A&);
+seven sink_5_12478(volatile A&&);
+eight sink_5_12478(const volatile A&&);
+
+int test5_12478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12478(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12478(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12478(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_12478(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_12478(source())) == 7* sizeof(long)> t5;
+ sa<sizeof(sink_5_12478(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12478(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_12478(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12567( A&);
+two sink_5_12567(const A&);
+five sink_5_12567( A&&);
+six sink_5_12567(const A&&);
+seven sink_5_12567(volatile A&&);
+
+int test5_12567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12567(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12567(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_12568( A&);
+two sink_5_12568(const A&);
+five sink_5_12568( A&&);
+six sink_5_12568(const A&&);
+eight sink_5_12568(const volatile A&&);
+
+int test5_12568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12568(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12568(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_12568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12578( A&);
+two sink_5_12578(const A&);
+five sink_5_12578( A&&);
+seven sink_5_12578(volatile A&&);
+eight sink_5_12578(const volatile A&&);
+
+int test5_12578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12578(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12578(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_12578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_12578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_12578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_12678( A&);
+two sink_5_12678(const A&);
+six sink_5_12678(const A&&);
+seven sink_5_12678(volatile A&&);
+eight sink_5_12678(const volatile A&&);
+
+int test5_12678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_12678(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_12678(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_12678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_12678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_12678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13456( A&);
+three sink_5_13456(volatile A&);
+four sink_5_13456(const volatile A&);
+five sink_5_13456( A&&);
+six sink_5_13456(const A&&);
+
+int test5_13456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13456(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13456(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13456(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13456(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13456(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13456(c_source())) == 6* sizeof(long)> t6;
+ return 0;
+}
+
+one sink_5_13457( A&);
+three sink_5_13457(volatile A&);
+four sink_5_13457(const volatile A&);
+five sink_5_13457( A&&);
+seven sink_5_13457(volatile A&&);
+
+int test5_13457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13457(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13457(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13457(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13457(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13457(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13457(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_13458( A&);
+three sink_5_13458(volatile A&);
+four sink_5_13458(const volatile A&);
+five sink_5_13458( A&&);
+eight sink_5_13458(const volatile A&&);
+
+int test5_13458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13458(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13458(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13458(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13458(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13458(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13458(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_13458(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_13458(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13467( A&);
+three sink_5_13467(volatile A&);
+four sink_5_13467(const volatile A&);
+six sink_5_13467(const A&&);
+seven sink_5_13467(volatile A&&);
+
+int test5_13467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13467(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13467(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13467(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13467(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13467(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_13467(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_13468( A&);
+three sink_5_13468(volatile A&);
+four sink_5_13468(const volatile A&);
+six sink_5_13468(const A&&);
+eight sink_5_13468(const volatile A&&);
+
+int test5_13468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13468(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13468(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13468(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13468(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13468(source())) == 6* sizeof(long)> t5;
+ sa<sizeof(sink_5_13468(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_13468(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_13468(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13478( A&);
+three sink_5_13478(volatile A&);
+four sink_5_13478(const volatile A&);
+seven sink_5_13478(volatile A&&);
+eight sink_5_13478(const volatile A&&);
+
+int test5_13478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13478(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13478(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_13478(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13478(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_13478(source())) == 7* sizeof(long)> t5;
+ sa<sizeof(sink_5_13478(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_13478(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_13478(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13567( A&);
+three sink_5_13567(volatile A&);
+five sink_5_13567( A&&);
+six sink_5_13567(const A&&);
+seven sink_5_13567(volatile A&&);
+
+int test5_13567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13567(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13567(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_13567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_13568( A&);
+three sink_5_13568(volatile A&);
+five sink_5_13568( A&&);
+six sink_5_13568(const A&&);
+eight sink_5_13568(const volatile A&&);
+
+int test5_13568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13568(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13568(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_13568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_13568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13578( A&);
+three sink_5_13578(volatile A&);
+five sink_5_13578( A&&);
+seven sink_5_13578(volatile A&&);
+eight sink_5_13578(const volatile A&&);
+
+int test5_13578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13578(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13578(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_13578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_13578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_13578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_13678( A&);
+three sink_5_13678(volatile A&);
+six sink_5_13678(const A&&);
+seven sink_5_13678(volatile A&&);
+eight sink_5_13678(const volatile A&&);
+
+int test5_13678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_13678(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_13678(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_13678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_13678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_13678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_14567( A&);
+four sink_5_14567(const volatile A&);
+five sink_5_14567( A&&);
+six sink_5_14567(const A&&);
+seven sink_5_14567(volatile A&&);
+
+int test5_14567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_14567(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_14567(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_14567(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_14567(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_14567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_14567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_14567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+one sink_5_14568( A&);
+four sink_5_14568(const volatile A&);
+five sink_5_14568( A&&);
+six sink_5_14568(const A&&);
+eight sink_5_14568(const volatile A&&);
+
+int test5_14568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_14568(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_14568(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_14568(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_14568(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_14568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_14568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_14568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_14568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_14578( A&);
+four sink_5_14578(const volatile A&);
+five sink_5_14578( A&&);
+seven sink_5_14578(volatile A&&);
+eight sink_5_14578(const volatile A&&);
+
+int test5_14578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_14578(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_14578(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_14578(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_14578(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_14578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_14578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_14578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_14578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_14678( A&);
+four sink_5_14678(const volatile A&);
+six sink_5_14678(const A&&);
+seven sink_5_14678(volatile A&&);
+eight sink_5_14678(const volatile A&&);
+
+int test5_14678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_14678(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_14678(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_14678(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_14678(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_14678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_14678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_14678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+one sink_5_15678( A&);
+five sink_5_15678( A&&);
+six sink_5_15678(const A&&);
+seven sink_5_15678(volatile A&&);
+eight sink_5_15678(const volatile A&&);
+
+int test5_15678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_15678(a)) == 1* sizeof(long)> t1;
+ sa<sizeof(sink_5_15678(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_15678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_15678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_15678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23456(const A&);
+three sink_5_23456(volatile A&);
+four sink_5_23456(const volatile A&);
+five sink_5_23456( A&&);
+six sink_5_23456(const A&&);
+
+int test5_23456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23456(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23456(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23456(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23456(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23456(c_source())) == 6* sizeof(long)> t6;
+ return 0;
+}
+
+two sink_5_23457(const A&);
+three sink_5_23457(volatile A&);
+four sink_5_23457(const volatile A&);
+five sink_5_23457( A&&);
+seven sink_5_23457(volatile A&&);
+
+int test5_23457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23457(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23457(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23457(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23457(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23457(c_source())) == 2* sizeof(long)> t6;
+ sa<sizeof(sink_5_23457(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+two sink_5_23458(const A&);
+three sink_5_23458(volatile A&);
+four sink_5_23458(const volatile A&);
+five sink_5_23458( A&&);
+eight sink_5_23458(const volatile A&&);
+
+int test5_23458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23458(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23458(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23458(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23458(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23458(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_23458(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_23458(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23467(const A&);
+three sink_5_23467(volatile A&);
+four sink_5_23467(const volatile A&);
+six sink_5_23467(const A&&);
+seven sink_5_23467(volatile A&&);
+
+int test5_23467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23467(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23467(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23467(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23467(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_23467(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+two sink_5_23468(const A&);
+three sink_5_23468(volatile A&);
+four sink_5_23468(const volatile A&);
+six sink_5_23468(const A&&);
+eight sink_5_23468(const volatile A&&);
+
+int test5_23468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23468(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23468(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23468(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23468(source())) == 6* sizeof(long)> t5;
+ sa<sizeof(sink_5_23468(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_23468(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_23468(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23478(const A&);
+three sink_5_23478(volatile A&);
+four sink_5_23478(const volatile A&);
+seven sink_5_23478(volatile A&&);
+eight sink_5_23478(const volatile A&&);
+
+int test5_23478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23478(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23478(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23478(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_23478(source())) == 7* sizeof(long)> t5;
+ sa<sizeof(sink_5_23478(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_23478(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_23478(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23567(const A&);
+three sink_5_23567(volatile A&);
+five sink_5_23567( A&&);
+six sink_5_23567(const A&&);
+seven sink_5_23567(volatile A&&);
+
+int test5_23567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23567(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23567(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_23567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+two sink_5_23568(const A&);
+three sink_5_23568(volatile A&);
+five sink_5_23568( A&&);
+six sink_5_23568(const A&&);
+eight sink_5_23568(const volatile A&&);
+
+int test5_23568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23568(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23568(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_23568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_23568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23578(const A&);
+three sink_5_23578(volatile A&);
+five sink_5_23578( A&&);
+seven sink_5_23578(volatile A&&);
+eight sink_5_23578(const volatile A&&);
+
+int test5_23578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23578(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23578(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_23578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_23578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_23578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_23678(const A&);
+three sink_5_23678(volatile A&);
+six sink_5_23678(const A&&);
+seven sink_5_23678(volatile A&&);
+eight sink_5_23678(const volatile A&&);
+
+int test5_23678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_23678(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_23678(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_23678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_23678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_23678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_24567(const A&);
+four sink_5_24567(const volatile A&);
+five sink_5_24567( A&&);
+six sink_5_24567(const A&&);
+seven sink_5_24567(volatile A&&);
+
+int test5_24567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_24567(a)) == 2* sizeof(long)> t1;
+ sa<sizeof(sink_5_24567(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_24567(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_24567(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_24567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_24567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_24567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+two sink_5_24568(const A&);
+four sink_5_24568(const volatile A&);
+five sink_5_24568( A&&);
+six sink_5_24568(const A&&);
+eight sink_5_24568(const volatile A&&);
+
+int test5_24568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_24568(a)) == 2* sizeof(long)> t1;
+ sa<sizeof(sink_5_24568(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_24568(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_24568(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_24568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_24568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_24568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_24568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_24578(const A&);
+four sink_5_24578(const volatile A&);
+five sink_5_24578( A&&);
+seven sink_5_24578(volatile A&&);
+eight sink_5_24578(const volatile A&&);
+
+int test5_24578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_24578(a)) == 2* sizeof(long)> t1;
+ sa<sizeof(sink_5_24578(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_24578(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_24578(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_24578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_24578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_24578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_24578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_24678(const A&);
+four sink_5_24678(const volatile A&);
+six sink_5_24678(const A&&);
+seven sink_5_24678(volatile A&&);
+eight sink_5_24678(const volatile A&&);
+
+int test5_24678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_24678(a)) == 2* sizeof(long)> t1;
+ sa<sizeof(sink_5_24678(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_24678(va)) == 4* sizeof(long)> t3;
+ sa<sizeof(sink_5_24678(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_24678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_24678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_24678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+two sink_5_25678(const A&);
+five sink_5_25678( A&&);
+six sink_5_25678(const A&&);
+seven sink_5_25678(volatile A&&);
+eight sink_5_25678(const volatile A&&);
+
+int test5_25678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_25678(a)) == 2* sizeof(long)> t1;
+ sa<sizeof(sink_5_25678(ca)) == 2* sizeof(long)> t2;
+ sa<sizeof(sink_5_25678(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_25678(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_25678(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_25678(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+three sink_5_34567(volatile A&);
+four sink_5_34567(const volatile A&);
+five sink_5_34567( A&&);
+six sink_5_34567(const A&&);
+seven sink_5_34567(volatile A&&);
+
+int test5_34567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_34567(a)) == 3* sizeof(long)> t1;
+ sa<sizeof(sink_5_34567(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_34567(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_34567(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_34567(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_34567(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_34567(v_source())) == 7* sizeof(long)> t7;
+ return 0;
+}
+
+three sink_5_34568(volatile A&);
+four sink_5_34568(const volatile A&);
+five sink_5_34568( A&&);
+six sink_5_34568(const A&&);
+eight sink_5_34568(const volatile A&&);
+
+int test5_34568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_34568(a)) == 3* sizeof(long)> t1;
+ sa<sizeof(sink_5_34568(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_34568(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_34568(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_34568(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_34568(c_source())) == 6* sizeof(long)> t6;
+ sa<sizeof(sink_5_34568(v_source())) == 8* sizeof(long)> t7;
+ sa<sizeof(sink_5_34568(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+three sink_5_34578(volatile A&);
+four sink_5_34578(const volatile A&);
+five sink_5_34578( A&&);
+seven sink_5_34578(volatile A&&);
+eight sink_5_34578(const volatile A&&);
+
+int test5_34578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_34578(a)) == 3* sizeof(long)> t1;
+ sa<sizeof(sink_5_34578(ca)) == 4* sizeof(long)> t2;
+ sa<sizeof(sink_5_34578(va)) == 3* sizeof(long)> t3;
+ sa<sizeof(sink_5_34578(cva)) == 4* sizeof(long)> t4;
+ sa<sizeof(sink_5_34578(source())) == 5* sizeof(long)> t5;
+ sa<sizeof(sink_5_34578(c_source())) == 8* sizeof(long)> t6;
+ sa<sizeof(sink_5_34578(v_source())) == 7* sizeof(long)> t7;
+ sa<sizeof(sink_5_34578(cv_source())) == 8* sizeof(long)> t8;
+ return 0;
+}
+
+three sink_5_34678(volatile A&);
+four sink_5_34678(const volatile A&);
+six sink_5_34678(const A&&);
+seven sink_5_34678(volatile A&&);
+eight sink_5_34678(const volatile A&&);
+
+int test5_34678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_34678(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_5_34678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_5_34678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_5_34678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_5_34678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_5_34678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_5_34678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_5_35678(volatile A&);
+five sink_5_35678( A&&);
+six sink_5_35678(const A&&);
+seven sink_5_35678(volatile A&&);
+eight sink_5_35678(const volatile A&&);
+
+int test5_35678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_35678(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_5_35678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_5_35678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_5_35678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_5_35678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_5_35678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+four sink_5_45678(const volatile A&);
+five sink_5_45678( A&&);
+six sink_5_45678(const A&&);
+seven sink_5_45678(volatile A&&);
+eight sink_5_45678(const volatile A&&);
+
+int test5_45678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_5_45678(a)) == 4 * sizeof(long)> t1;
+ sa<sizeof(sink_5_45678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_5_45678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_5_45678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_5_45678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_5_45678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_5_45678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_5_45678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test5_12345() + test5_12346() + test5_12347() + test5_12348() +
+ test5_12356() + test5_12357() + test5_12358() + test5_12367() +
+ test5_12368() + test5_12378() + test5_12456() + test5_12457() +
+ test5_12458() + test5_12467() + test5_12468() + test5_12478() +
+ test5_12567() + test5_12568() + test5_12578() + test5_12678() +
+ test5_13456() + test5_13457() + test5_13458() + test5_13467() +
+ test5_13468() + test5_13478() + test5_13567() + test5_13568() +
+ test5_13578() + test5_13678() + test5_14567() + test5_14568() +
+ test5_14578() + test5_14678() + test5_15678() + test5_23456() +
+ test5_23457() + test5_23458() + test5_23467() + test5_23468() +
+ test5_23478() + test5_23567() + test5_23568() + test5_23578() +
+ test5_23678() + test5_24567() + test5_24568() + test5_24578() +
+ test5_24678() + test5_25678() + test5_34567() + test5_34568() +
+ test5_34578() + test5_34678() + test5_35678() + test5_45678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C
new file mode 100644
index 000000000..d00c1e242
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C
@@ -0,0 +1,372 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 6 at a time
+
+one sink_6_123456( A&); // { dg-message "one sink_6_123456|no known conversion" }
+two sink_6_123456(const A&); // { dg-message "note" }
+three sink_6_123456(volatile A&); // { dg-message "note" }
+four sink_6_123456(const volatile A&); // { dg-message "note" }
+five sink_6_123456( A&&); // { dg-message "note" }
+six sink_6_123456(const A&&); // { dg-message "note" }
+
+int test6_123456()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123456(v_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 46 }
+ sink_6_123456(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 48 }
+ return 0;
+}
+
+one sink_6_123457( A&); // { dg-message "one sink_6_123457|no known conversion" }
+two sink_6_123457(const A&); // { dg-message "note" }
+three sink_6_123457(volatile A&); // { dg-message "note" }
+four sink_6_123457(const volatile A&); // { dg-message "note" }
+five sink_6_123457( A&&); // { dg-message "note" }
+seven sink_6_123457(volatile A&&); // { dg-message "note" }
+
+int test6_123457()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123457(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 66 }
+ return 0;
+}
+
+two sink_6_235678(const A&); // { dg-message "note" }
+three sink_6_235678(volatile A&); // { dg-message "note" }
+five sink_6_235678( A&&); // { dg-message "note" }
+six sink_6_235678(const A&&); // { dg-message "note" }
+seven sink_6_235678(volatile A&&); // { dg-message "note" }
+eight sink_6_235678(const volatile A&&); // { dg-message "" }
+
+int test6_235678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_235678(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 84 }
+ sink_6_235678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_6_234678(const A&); // { dg-message "note" }
+three sink_6_234678(volatile A&); // { dg-message "note" }
+four sink_6_234678(const volatile A&); // { dg-message "note" }
+six sink_6_234678(const A&&); // { dg-message "note" }
+seven sink_6_234678(volatile A&&); // { dg-message "note" }
+eight sink_6_234678(const volatile A&&); // { dg-message "note" }
+
+int test6_234678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_234678(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 103 }
+ sink_6_234678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 105 }
+ return 0;
+}
+
+two sink_6_234578(const A&); // { dg-message "note" }
+three sink_6_234578(volatile A&); // { dg-message "note" }
+four sink_6_234578(const volatile A&); // { dg-message "note" }
+five sink_6_234578( A&&); // { dg-message "note" }
+seven sink_6_234578(volatile A&&); // { dg-message "note" }
+eight sink_6_234578(const volatile A&&); // { dg-message "note" }
+
+int test6_234578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_234578(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 123 }
+ return 0;
+}
+
+two sink_6_234568(const A&); // { dg-message "note" }
+three sink_6_234568(volatile A&); // { dg-message "note" }
+four sink_6_234568(const volatile A&); // { dg-message "note" }
+five sink_6_234568( A&&); // { dg-message "note" }
+six sink_6_234568(const A&&); // { dg-message "note" }
+eight sink_6_234568(const volatile A&&); // { dg-message "note" }
+
+int test6_234568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_234568(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 141 }
+ return 0;
+}
+
+two sink_6_234567(const A&); // { dg-message "two sink_6_234567|no known conversion" }
+three sink_6_234567(volatile A&); // { dg-message "note" }
+four sink_6_234567(const volatile A&); // { dg-message "note" }
+five sink_6_234567( A&&); // { dg-message "note" }
+six sink_6_234567(const A&&); // { dg-message "note" }
+seven sink_6_234567(volatile A&&); // { dg-message "note" }
+
+int test6_234567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_234567(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 159 }
+ sink_6_234567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 161 }
+ return 0;
+}
+
+one sink_6_134678( A&);
+three sink_6_134678(volatile A&);
+four sink_6_134678(const volatile A&);
+six sink_6_134678(const A&&); // { dg-message "note" }
+seven sink_6_134678(volatile A&&); // { dg-message "note" }
+eight sink_6_134678(const volatile A&&); // { dg-message "note" }
+
+int test6_134678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_134678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 179 }
+ return 0;
+}
+
+one sink_6_124678( A&);
+two sink_6_124678(const A&); // { dg-message "note" }
+four sink_6_124678(const volatile A&);
+six sink_6_124678(const A&&); // { dg-message "note" }
+seven sink_6_124678(volatile A&&); // { dg-message "note" }
+eight sink_6_124678(const volatile A&&); // { dg-message "note" }
+
+int test6_124678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_124678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 197 }
+ return 0;
+}
+
+one sink_6_123678( A&);
+two sink_6_123678(const A&); // { dg-message "note" }
+three sink_6_123678(volatile A&);
+six sink_6_123678(const A&&); // { dg-message "note" }
+seven sink_6_123678(volatile A&&); // { dg-message "note" }
+eight sink_6_123678(const volatile A&&); // { dg-message "" }
+
+int test6_123678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123678(cva); // { dg-error "lvalue" }
+ sink_6_123678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 216 }
+ return 0;
+}
+
+one sink_6_123567( A&); // { dg-message "one sink_6_123567|no known conversion" }
+two sink_6_123567(const A&); // { dg-message "note" }
+three sink_6_123567(volatile A&); // { dg-message "note" }
+five sink_6_123567( A&&); // { dg-message "note" }
+six sink_6_123567(const A&&); // { dg-message "note" }
+seven sink_6_123567(volatile A&&); // { dg-message "note" }
+
+int test6_123567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123567(cva); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 234 }
+ sink_6_123567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 236 }
+ return 0;
+}
+
+one sink_6_123568( A&);
+two sink_6_123568(const A&);
+three sink_6_123568(volatile A&);
+five sink_6_123568( A&&);
+six sink_6_123568(const A&&);
+eight sink_6_123568(const volatile A&&); // { dg-message "" }
+
+int test6_123568()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123568(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_6_123578( A&);
+two sink_6_123578(const A&);
+three sink_6_123578(volatile A&);
+five sink_6_123578( A&&);
+seven sink_6_123578(volatile A&&);
+eight sink_6_123578(const volatile A&&); // { dg-message "" }
+
+int test6_123578()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123578(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_6_123467( A&); // { dg-message "one sink_6_123467|no known conversion" }
+two sink_6_123467(const A&); // { dg-message "note" }
+three sink_6_123467(volatile A&); // { dg-message "note" }
+four sink_6_123467(const volatile A&); // { dg-message "note" }
+six sink_6_123467(const A&&); // { dg-message "note" }
+seven sink_6_123467(volatile A&&); // { dg-message "note" }
+
+int test6_123467()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_123467(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 288 }
+ sink_6_123467(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 290 }
+ return 0;
+}
+
+one sink_6_124567( A&); // { dg-message "one sink_6_124567|no known conversion" }
+two sink_6_124567(const A&); // { dg-message "note" }
+four sink_6_124567(const volatile A&); // { dg-message "note" }
+five sink_6_124567( A&&); // { dg-message "note" }
+six sink_6_124567(const A&&); // { dg-message "note" }
+seven sink_6_124567(volatile A&&); // { dg-message "note" }
+
+int test6_124567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_124567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 308 }
+ return 0;
+}
+
+one sink_6_125678( A&);
+two sink_6_125678(const A&);
+five sink_6_125678( A&&);
+six sink_6_125678(const A&&);
+seven sink_6_125678(volatile A&&); // { dg-message "" }
+eight sink_6_125678(const volatile A&&); // { dg-message "" }
+
+int test6_125678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_125678(va); // { dg-error "lvalue" }
+ sink_6_125678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+one sink_6_134567( A&); // { dg-message "one sink_6_134567|no known conversion" }
+three sink_6_134567(volatile A&); // { dg-message "note" }
+four sink_6_134567(const volatile A&); // { dg-message "note" }
+five sink_6_134567( A&&); // { dg-message "note" }
+six sink_6_134567(const A&&); // { dg-message "note" }
+seven sink_6_134567(volatile A&&); // { dg-message "note" }
+
+int test6_134567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_134567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 344 }
+ return 0;
+}
+
+one sink_6_135678( A&);
+three sink_6_135678(volatile A&);
+five sink_6_135678( A&&);
+six sink_6_135678(const A&&); // { dg-message "" }
+seven sink_6_135678(volatile A&&);
+eight sink_6_135678(const volatile A&&); // { dg-message "" }
+
+int test6_135678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_6_135678(ca); // { dg-error "lvalue" }
+ sink_6_135678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+int main()
+{
+ return test6_235678() + test6_234678() + test6_234578() + test6_234568() +
+ test6_234567() + test6_134678() + test6_124678() + test6_123678() +
+ test6_123567();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C
new file mode 100644
index 000000000..4be83431d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C
@@ -0,0 +1,687 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 6 at a time
+
+one sink_6_123456( A&);
+two sink_6_123456(const A&);
+three sink_6_123456(volatile A&);
+four sink_6_123456(const volatile A&);
+five sink_6_123456( A&&);
+six sink_6_123456(const A&&);
+
+int test6_123456()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123456(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123456(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123456(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123456(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123456(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123456(c_source())) == 6 * sizeof(long)> t6;
+ return 0;
+}
+
+one sink_6_123457( A&);
+two sink_6_123457(const A&);
+three sink_6_123457(volatile A&);
+four sink_6_123457(const volatile A&);
+five sink_6_123457( A&&);
+seven sink_6_123457(volatile A&&);
+
+int test6_123457()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123457(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123457(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123457(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123457(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123457(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123457(c_source())) == 2 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123457(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_6_123458( A&);
+two sink_6_123458(const A&);
+three sink_6_123458(volatile A&);
+four sink_6_123458(const volatile A&);
+five sink_6_123458( A&&);
+eight sink_6_123458(const volatile A&&);
+
+int test6_123458()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123458(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123458(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123458(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123458(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123458(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123458(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123458(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123458(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_123467( A&);
+two sink_6_123467(const A&);
+three sink_6_123467(volatile A&);
+four sink_6_123467(const volatile A&);
+six sink_6_123467(const A&&);
+seven sink_6_123467(volatile A&&);
+
+int test6_123467()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123467(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123467(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123467(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123467(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123467(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123467(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_6_123468( A&);
+two sink_6_123468(const A&);
+three sink_6_123468(volatile A&);
+four sink_6_123468(const volatile A&);
+six sink_6_123468(const A&&);
+eight sink_6_123468(const volatile A&&);
+
+int test6_123468()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123468(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123468(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123468(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123468(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123468(source())) == 6 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123468(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123468(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123468(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_123478( A&);
+two sink_6_123478(const A&);
+three sink_6_123478(volatile A&);
+four sink_6_123478(const volatile A&);
+seven sink_6_123478(volatile A&&);
+eight sink_6_123478(const volatile A&&);
+
+int test6_123478()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123478(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123478(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123478(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123478(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_123478(source())) == 7 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123478(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123478(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123478(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_123567( A&);
+two sink_6_123567(const A&);
+three sink_6_123567(volatile A&);
+five sink_6_123567( A&&);
+six sink_6_123567(const A&&);
+seven sink_6_123567(volatile A&&);
+
+int test6_123567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123567(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123567(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123567(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_6_123568( A&);
+two sink_6_123568(const A&);
+three sink_6_123568(volatile A&);
+five sink_6_123568( A&&);
+six sink_6_123568(const A&&);
+eight sink_6_123568(const volatile A&&);
+
+int test6_123568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123568(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123568(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123568(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_123578( A&);
+two sink_6_123578(const A&);
+three sink_6_123578(volatile A&);
+five sink_6_123578( A&&);
+seven sink_6_123578(volatile A&&);
+eight sink_6_123578(const volatile A&&);
+
+int test6_123578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123578(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123578(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123578(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_123578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_123678( A&);
+two sink_6_123678(const A&);
+three sink_6_123678(volatile A&);
+six sink_6_123678(const A&&);
+seven sink_6_123678(volatile A&&);
+eight sink_6_123678(const volatile A&&);
+
+int test6_123678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_123678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_123678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_123678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_123678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_123678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_123678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_124567( A&);
+two sink_6_124567(const A&);
+four sink_6_124567(const volatile A&);
+five sink_6_124567( A&&);
+six sink_6_124567(const A&&);
+seven sink_6_124567(volatile A&&);
+
+int test6_124567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_124567(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_124567(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_124567(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_124567(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_124567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_124567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_124567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_6_124568( A&);
+two sink_6_124568(const A&);
+four sink_6_124568(const volatile A&);
+five sink_6_124568( A&&);
+six sink_6_124568(const A&&);
+eight sink_6_124568(const volatile A&&);
+
+int test6_124568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_124568(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_124568(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_124568(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_124568(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_124568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_124568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_124568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_124568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_124578( A&);
+two sink_6_124578(const A&);
+four sink_6_124578(const volatile A&);
+five sink_6_124578( A&&);
+seven sink_6_124578(volatile A&&);
+eight sink_6_124578(const volatile A&&);
+
+int test6_124578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_124578(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_124578(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_124578(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_124578(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_124578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_124578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_124578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_124578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_124678( A&);
+two sink_6_124678(const A&);
+four sink_6_124678(const volatile A&);
+six sink_6_124678(const A&&);
+seven sink_6_124678(volatile A&&);
+eight sink_6_124678(const volatile A&&);
+
+int test6_124678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_124678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_124678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_124678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_124678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_124678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_124678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_124678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_125678( A&);
+two sink_6_125678(const A&);
+five sink_6_125678( A&&);
+six sink_6_125678(const A&&);
+seven sink_6_125678(volatile A&&);
+eight sink_6_125678(const volatile A&&);
+
+int test6_125678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_125678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_125678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_125678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_125678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_125678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_125678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_134567( A&);
+three sink_6_134567(volatile A&);
+four sink_6_134567(const volatile A&);
+five sink_6_134567( A&&);
+six sink_6_134567(const A&&);
+seven sink_6_134567(volatile A&&);
+
+int test6_134567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_134567(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_134567(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_134567(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_134567(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_134567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_134567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_134567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_6_134568( A&);
+three sink_6_134568(volatile A&);
+four sink_6_134568(const volatile A&);
+five sink_6_134568( A&&);
+six sink_6_134568(const A&&);
+eight sink_6_134568(const volatile A&&);
+
+int test6_134568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_134568(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_134568(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_134568(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_134568(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_134568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_134568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_134568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_134568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_134578( A&);
+three sink_6_134578(volatile A&);
+four sink_6_134578(const volatile A&);
+five sink_6_134578( A&&);
+seven sink_6_134578(volatile A&&);
+eight sink_6_134578(const volatile A&&);
+
+int test6_134578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_134578(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_134578(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_134578(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_134578(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_134578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_134578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_134578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_134578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_134678( A&);
+three sink_6_134678(volatile A&);
+four sink_6_134678(const volatile A&);
+six sink_6_134678(const A&&);
+seven sink_6_134678(volatile A&&);
+eight sink_6_134678(const volatile A&&);
+
+int test6_134678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_134678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_134678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_134678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_134678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_134678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_134678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_134678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_135678( A&);
+three sink_6_135678(volatile A&);
+five sink_6_135678( A&&);
+six sink_6_135678(const A&&);
+seven sink_6_135678(volatile A&&);
+eight sink_6_135678(const volatile A&&);
+
+int test6_135678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_135678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_135678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_135678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_135678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_135678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_135678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_6_145678( A&);
+four sink_6_145678(const volatile A&);
+five sink_6_145678( A&&);
+six sink_6_145678(const A&&);
+seven sink_6_145678(volatile A&&);
+eight sink_6_145678(const volatile A&&);
+
+int test6_145678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_145678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_6_145678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_145678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_145678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_145678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_145678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_145678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_145678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_6_234567(const A&);
+three sink_6_234567(volatile A&);
+four sink_6_234567(const volatile A&);
+five sink_6_234567( A&&);
+six sink_6_234567(const A&&);
+seven sink_6_234567(volatile A&&);
+
+int test6_234567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_234567(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_234567(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_234567(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_234567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_234567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_234567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+two sink_6_234568(const A&);
+three sink_6_234568(volatile A&);
+four sink_6_234568(const volatile A&);
+five sink_6_234568( A&&);
+six sink_6_234568(const A&&);
+eight sink_6_234568(const volatile A&&);
+
+int test6_234568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_234568(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_234568(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_234568(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_234568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_234568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_234568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_6_234568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_6_234578(const A&);
+three sink_6_234578(volatile A&);
+four sink_6_234578(const volatile A&);
+five sink_6_234578( A&&);
+seven sink_6_234578(volatile A&&);
+eight sink_6_234578(const volatile A&&);
+
+int test6_234578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_234578(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_234578(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_234578(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_234578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_234578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_6_234578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_234578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_6_234678(const A&);
+three sink_6_234678(volatile A&);
+four sink_6_234678(const volatile A&);
+six sink_6_234678(const A&&);
+seven sink_6_234678(volatile A&&);
+eight sink_6_234678(const volatile A&&);
+
+int test6_234678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_234678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_234678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_234678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_234678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_234678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_234678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_6_235678(const A&);
+three sink_6_235678(volatile A&);
+five sink_6_235678( A&&);
+six sink_6_235678(const A&&);
+seven sink_6_235678(volatile A&&);
+eight sink_6_235678(const volatile A&&);
+
+int test6_235678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_235678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_235678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_235678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_235678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_235678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_235678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_6_245678(const A&);
+four sink_6_245678(const volatile A&);
+five sink_6_245678( A&&);
+six sink_6_245678(const A&&);
+seven sink_6_245678(volatile A&&);
+eight sink_6_245678(const volatile A&&);
+
+int test6_245678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_245678(a)) == 2 * sizeof(long)> t1;
+ sa<sizeof(sink_6_245678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_6_245678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_6_245678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_245678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_245678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_245678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_245678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+three sink_6_345678(volatile A&);
+four sink_6_345678(const volatile A&);
+five sink_6_345678( A&&);
+six sink_6_345678(const A&&);
+seven sink_6_345678(volatile A&&);
+eight sink_6_345678(const volatile A&&);
+
+int test6_345678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_6_345678(a)) == 3 * sizeof(long)> t1;
+ sa<sizeof(sink_6_345678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_6_345678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_6_345678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_6_345678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_6_345678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_6_345678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_6_345678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test6_123456() + test6_123457() + test6_123458() + test6_123467() +
+ test6_123468() + test6_123478() + test6_123567() + test6_123568() +
+ test6_123578() + test6_123678() + test6_124567() + test6_124568() +
+ test6_124578() + test6_124678() + test6_125678() + test6_134567() +
+ test6_134568() + test6_134578() + test6_134678() + test6_135678() +
+ test6_145678() + test6_234567() + test6_234568() + test6_234578() +
+ test6_234678() + test6_235678() + test6_245678() + test6_345678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C
new file mode 100644
index 000000000..7e7a6648e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C
@@ -0,0 +1,111 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {char x[1];};
+struct two {char x[2];};
+struct three {char x[3];};
+struct four {char x[4];};
+struct five {char x[5];};
+struct six {char x[6];};
+struct seven {char x[7];};
+struct eight {char x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 7 at a time
+
+one sink_7_1234567( A&); // { dg-message "one sink_7_1234567|no known conversion" }
+two sink_7_1234567(const A&); // { dg-message "note" }
+three sink_7_1234567(volatile A&); // { dg-message "note" }
+four sink_7_1234567(const volatile A&); // { dg-message "note" }
+five sink_7_1234567( A&&); // { dg-message "note" }
+six sink_7_1234567(const A&&); // { dg-message "note" }
+seven sink_7_1234567(volatile A&&); // { dg-message "note" }
+
+int test7_1234567()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_7_1234567(cv_source()); // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 47 }
+ return 0;
+}
+
+one sink_7_1235678( A&);
+two sink_7_1235678(const A&);
+three sink_7_1235678(volatile A&);
+five sink_7_1235678( A&&);
+six sink_7_1235678(const A&&);
+seven sink_7_1235678(volatile A&&);
+eight sink_7_1235678(const volatile A&&); // { dg-message "" }
+
+int test7_1235678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_7_1235678(cva); // { dg-error "lvalue" }
+ return 0;
+}
+
+two sink_7_2345678(const A&); // { dg-message "note" }
+three sink_7_2345678(volatile A&); // { dg-message "note" }
+four sink_7_2345678(const volatile A&); // { dg-message "note" }
+five sink_7_2345678( A&&); // { dg-message "note" }
+six sink_7_2345678(const A&&); // { dg-message "note" }
+seven sink_7_2345678(volatile A&&); // { dg-message "note" }
+eight sink_7_2345678(const volatile A&&); // { dg-message "note" }
+
+int test7_2345678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_7_2345678(a); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 84 }
+ return 0;
+}
+
+one sink_7_1234678( A&);
+two sink_7_1234678(const A&); // { dg-message "note" }
+three sink_7_1234678(volatile A&);
+four sink_7_1234678(const volatile A&);
+six sink_7_1234678(const A&&); // { dg-message "note" }
+seven sink_7_1234678(volatile A&&); // { dg-message "note" }
+eight sink_7_1234678(const volatile A&&); // { dg-message "note" }
+
+int test7_1234678()
+{
+ A a;
+ const A ca = a; // { dg-error "deleted" }
+ volatile A va;
+ const volatile A cva = a; // { dg-error "deleted" }
+ sink_7_1234678(source()); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 103 }
+ return 0;
+}
+
+int main()
+{
+ return test7_2345678() + test7_1234678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C
new file mode 100644
index 000000000..55fc5d760
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C
@@ -0,0 +1,233 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 7 at a time
+
+one sink_7_1234567( A&);
+two sink_7_1234567(const A&);
+three sink_7_1234567(volatile A&);
+four sink_7_1234567(const volatile A&);
+five sink_7_1234567( A&&);
+six sink_7_1234567(const A&&);
+seven sink_7_1234567(volatile A&&);
+
+int test7_1234567()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1234567(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1234567(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1234567(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1234567(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1234567(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1234567(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1234567(v_source())) == 7 * sizeof(long)> t7;
+ return 0;
+}
+
+one sink_7_1234568( A&);
+two sink_7_1234568(const A&);
+three sink_7_1234568(volatile A&);
+four sink_7_1234568(const volatile A&);
+five sink_7_1234568( A&&);
+six sink_7_1234568(const A&&);
+eight sink_7_1234568(const volatile A&&);
+
+int test7_1234568()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1234568(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1234568(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1234568(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1234568(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1234568(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1234568(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1234568(v_source())) == 8 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1234568(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_7_1234578( A&);
+two sink_7_1234578(const A&);
+three sink_7_1234578(volatile A&);
+four sink_7_1234578(const volatile A&);
+five sink_7_1234578( A&&);
+seven sink_7_1234578(volatile A&&);
+eight sink_7_1234578(const volatile A&&);
+
+int test7_1234578()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1234578(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1234578(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1234578(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1234578(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1234578(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1234578(c_source())) == 8 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1234578(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1234578(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_7_1234678( A&);
+two sink_7_1234678(const A&);
+three sink_7_1234678(volatile A&);
+four sink_7_1234678(const volatile A&);
+six sink_7_1234678(const A&&);
+seven sink_7_1234678(volatile A&&);
+eight sink_7_1234678(const volatile A&&);
+
+int test7_1234678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1234678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1234678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1234678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1234678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1234678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1234678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1234678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_7_1235678( A&);
+two sink_7_1235678(const A&);
+three sink_7_1235678(volatile A&);
+five sink_7_1235678( A&&);
+six sink_7_1235678(const A&&);
+seven sink_7_1235678(volatile A&&);
+eight sink_7_1235678(const volatile A&&);
+
+int test7_1235678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1235678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1235678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1235678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1235678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1235678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1235678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1235678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_7_1245678( A&);
+two sink_7_1245678(const A&);
+four sink_7_1245678(const volatile A&);
+five sink_7_1245678( A&&);
+six sink_7_1245678(const A&&);
+seven sink_7_1245678(volatile A&&);
+eight sink_7_1245678(const volatile A&&);
+
+int test7_1245678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1245678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1245678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1245678(va)) == 4 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1245678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1245678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1245678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1245678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1245678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+one sink_7_1345678( A&);
+three sink_7_1345678(volatile A&);
+four sink_7_1345678(const volatile A&);
+five sink_7_1345678( A&&);
+six sink_7_1345678(const A&&);
+seven sink_7_1345678(volatile A&&);
+eight sink_7_1345678(const volatile A&&);
+
+int test7_1345678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_1345678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_7_1345678(ca)) == 4 * sizeof(long)> t2;
+ sa<sizeof(sink_7_1345678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_1345678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_1345678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_1345678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_1345678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_1345678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+two sink_7_2345678(const A&);
+three sink_7_2345678(volatile A&);
+four sink_7_2345678(const volatile A&);
+five sink_7_2345678( A&&);
+six sink_7_2345678(const A&&);
+seven sink_7_2345678(volatile A&&);
+eight sink_7_2345678(const volatile A&&);
+
+int test7_2345678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_7_2345678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_7_2345678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_7_2345678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_7_2345678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_7_2345678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_7_2345678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_7_2345678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test7_1234567() + test7_1234568() + test7_1234578() + test7_1234678() +
+ test7_1235678() + test7_1245678() + test7_1345678() + test7_2345678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C
new file mode 100644
index 000000000..442479386
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C
@@ -0,0 +1,62 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test overload resolution among reference types
+
+// { dg-do compile { target c++11 } }
+// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+struct three {long x[3];};
+struct four {long x[4];};
+struct five {long x[5];};
+struct six {long x[6];};
+struct seven {long x[7];};
+struct eight {long x[8];};
+
+struct A
+{
+ A();
+ A(const volatile A&&);
+};
+
+ A source();
+const A c_source();
+ volatile A v_source();
+const volatile A cv_source();
+
+// 8 at a time
+
+one sink_8_12345678( A&);
+two sink_8_12345678(const A&);
+three sink_8_12345678(volatile A&);
+four sink_8_12345678(const volatile A&);
+five sink_8_12345678( A&&);
+six sink_8_12345678(const A&&);
+seven sink_8_12345678(volatile A&&);
+eight sink_8_12345678(const volatile A&&);
+
+int test8_12345678()
+{
+ A a;
+ const A ca;
+ volatile A va;
+ const volatile A cva;
+ sa<sizeof(sink_8_12345678(a)) == 1 * sizeof(long)> t1;
+ sa<sizeof(sink_8_12345678(ca)) == 2 * sizeof(long)> t2;
+ sa<sizeof(sink_8_12345678(va)) == 3 * sizeof(long)> t3;
+ sa<sizeof(sink_8_12345678(cva)) == 4 * sizeof(long)> t4;
+ sa<sizeof(sink_8_12345678(source())) == 5 * sizeof(long)> t5;
+ sa<sizeof(sink_8_12345678(c_source())) == 6 * sizeof(long)> t6;
+ sa<sizeof(sink_8_12345678(v_source())) == 7 * sizeof(long)> t7;
+ sa<sizeof(sink_8_12345678(cv_source())) == 8 * sizeof(long)> t8;
+ return 0;
+}
+
+int main()
+{
+ return test8_12345678();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C
new file mode 100644
index 000000000..a221f32d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C
@@ -0,0 +1,21 @@
+// PR c++/36744
+// { dg-do run { target c++11 } }
+
+struct S
+{
+ S(): i(2) {}
+ S(S const&s): i(s.i) {}
+ int i;
+};
+
+void f(S x) { x.i = 0; }
+
+extern "C" void abort (void);
+int main()
+{
+ S y;
+ f(static_cast<S&&>(y));
+ if (y.i != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C
new file mode 100644
index 000000000..fc83b1b56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C
@@ -0,0 +1,24 @@
+// { dg-do run { target c++11 } }
+// Contributed by Sylvain Pion
+static int rvalue_constructions = 0;
+
+struct A {
+ A () { }
+ A (const A&) { }
+ A (A&&) { ++rvalue_constructions; }
+ ~A () { }
+};
+
+A f() { return A(); }
+
+extern "C" {
+ void abort(void);
+}
+
+int main()
+{
+ A c = f();
+
+ if (rvalue_constructions != 0)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C
new file mode 100644
index 000000000..0ca3a1fba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C
@@ -0,0 +1,76 @@
+// { dg-do compile { target c++11 } }
+enum class Color1 {
+ Red,
+ Green,
+ Blue
+};
+
+enum struct Color2 {
+ Red, // { dg-message "previously declared here" }
+ Orange,
+ Yellow,
+ Green,
+ Blue,
+ Indigo = Green + 2,
+ Violet,
+ Red // { dg-error "redeclaration" }
+};
+
+enum Color {
+ Red, Green, Blue
+};
+
+enum class Color3 {
+ Red
+};
+
+enum Color color;
+enum Color3 color3;
+
+void f(int);
+void f2(Color3);
+
+void g()
+{
+ int i = 0;
+ f(color); // okay: unscoped enum
+ f(color3); // { dg-error "cannot convert" }
+ f2(color); // { dg-error "cannot convert" }
+ f2(color3);
+ f2(i); // { dg-error "cannot convert" }
+ i = color3; // { dg-error "cannot convert" }
+ color3 = i; // { dg-error "cannot convert" }
+ f(static_cast<int>(color3)); // okay
+
+ int a[5];
+ a[color3]; // { dg-error "array subscript is not an integer" }
+
+ bool b = color3; // { dg-error "cannot convert" }
+}
+
+void h()
+{
+ Color1 c1 = Color1::Red;
+ Color2 c2 = Color1::Red; // { dg-error "cannot convert" }
+ c2 = Color1::Red; // { dg-error "cannot convert" }
+
+ c2 = Color2::Red;
+ int c3 = Color::Red;
+}
+
+template<typename T, T value>
+struct constant { };
+
+template<typename T>
+int& sfinae(constant<T, T::Green>*);
+
+float& sfinae(void*);
+
+void sfinae_test()
+{
+ int& test1 = sfinae((constant<Color1, Color1::Green>*)0);
+ int& test2 = sfinae((constant<Color2, Color2::Green>*)0);
+ float& test3 = sfinae((constant<Color1, Color1::Red>*)0);
+ int& test4 = sfinae((constant<Color, Green>*)0);
+ float& test5 = sfinae((constant<Color, Red>*)0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C
new file mode 100644
index 000000000..bb8ad750b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+enum class E { e = 10 };
+enum E2 { e2 = 10 };
+
+struct C {
+ int arr[E::e]; // { dg-error "non-integral type" }
+ int arr2[E2::e2]; // OK
+ int i: E::e; // { dg-error "non-integral type" }
+ int i2: E2::e2; // OK
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C
new file mode 100644
index 000000000..8c24e86ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+enum class E1 { e1 }; // { dg-warning "scoped enums" }
+enum E2 : char { e2 }; // { dg-warning "scoped enums" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C
new file mode 100644
index 000000000..8dc2fa647
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+enum class Col { red, yellow, green };
+
+int x = Col::red; // { dg-error "cannot convert" }
+Col y = Col::red;
+
+void f()
+{
+ if (y) { } // { dg-error "could not convert" }
+}
+
+enum direction { left='l', right='r' };
+void g() {
+ // OK
+ direction d;
+ // OK
+ d = left;
+ // OK
+ d = direction::right;
+}
+enum class altitude { high='h', low='l' };
+void h() {
+ altitude a;
+ a = high; // { dg-error "not declared in this scope" }
+ a = altitude::low;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C
new file mode 100644
index 000000000..0e015d902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+template< typename T_VECTOR >
+void f(const T_VECTOR &a, decltype(a[0]) t = 0);
+template< typename T >
+void f(const T &a, decltype(a*1) t = 0);
+
+int main() {
+ int c;
+ f(c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C
new file mode 100644
index 000000000..25ef77d00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C
@@ -0,0 +1,18 @@
+// PR c++/48452
+// { dg-do compile { target c++11 } }
+namespace std {
+ template <class T> T&& declval();
+}
+
+template<class T, class... Args>
+decltype(T(std::declval<Args>()...), char()) f(int);
+
+template<class, class...>
+char (&f(...))[2];
+
+struct A { virtual ~A() = 0; };
+struct B {};
+
+static_assert(sizeof(f<A, int, int>(0)) != 1, "Error"); // a
+static_assert(sizeof(f<B, void, int>(0)) != 1, "Error"); // b
+static_assert(sizeof(f<void, int, int>(0)) != 1, "Error"); // c
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C
new file mode 100644
index 000000000..89bd76da8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C
@@ -0,0 +1,57 @@
+// PR c++/48468
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+template<class T>
+T&& declval() noexcept;
+
+template< class T >
+inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) // { dg-error "Z" }
+{
+ x.foo();
+}
+
+template< class T,
+ bool Noexcept = noexcept( declval<T&>().foo() ) // { dg-error "no member|not convert" }
+
+>
+inline void f2( T& x ) noexcept( Noexcept )
+{
+ x.foo();
+}
+
+// a common and trivial mistake
+template< class T >
+inline void f3( T& x ) noexcept( declval<T&>().foo() ) // { dg-error "Z" }
+{
+ x.foo();
+}
+
+struct X
+{
+ void foo();
+};
+
+struct Y
+{
+ void foo() noexcept;
+};
+
+struct Z {};
+
+int main()
+{
+ X x; Y y; Z z;
+
+ static_assert( !noexcept( f1(x) ), "OK." );
+ static_assert( !noexcept( f2(x) ), "OK." );
+ // static_assert( !noexcept( f3(x) ), "shall be ill-formed(OK)." );
+
+ static_assert( noexcept( f1(y) ), "OK." );
+ static_assert( noexcept( f2(y) ), "OK." );
+ // static_assert( noexcept( f3(y) ), "shall be ill-formed(OK)." );
+
+ noexcept( f1(z) ); // { dg-message "required" }
+ static_assert( noexcept( f2(z) ), "shall be ill-formed." ); // { dg-error "no match" }
+ noexcept( f3(z) ); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C
new file mode 100644
index 000000000..22a984727
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C
@@ -0,0 +1,18 @@
+// PR c++/48535
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T{})
+>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+struct A { virtual ~A() = 0; };
+
+static_assert(sizeof(f<A>(0)) != 1, "Error"); // (a)
+static_assert(sizeof(f<void()>(0)) != 1, "Error"); // (b)
+static_assert(sizeof(f<int&>(0)) != 1, "Error"); // (d)
+static_assert(sizeof(f<const int&>(0)) == 1, "Error"); // (e)
+static_assert(sizeof(f<int[]>(0)) != 1, "Error"); // (f)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C
new file mode 100644
index 000000000..3cff1b4b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C
@@ -0,0 +1,20 @@
+// PR c++/48581
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template<class T,
+ class = decltype(foo(create<T>()))
+>
+auto f(int) -> char;
+
+template<class>
+auto f(...) -> char (&)[2];
+
+struct S {};
+void foo(S);
+
+static_assert(sizeof(f<S>(0)) == 1, "Error"); // (#)
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C
new file mode 100644
index 000000000..14e5e058a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C
@@ -0,0 +1,27 @@
+// PR c++/48557
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rval_ref
+{
+ typedef T&& type;
+};
+
+template<>
+struct add_rval_ref<void>
+{
+ typedef void type;
+};
+
+template<class T>
+typename add_rval_ref<T>::type create();
+
+template<class T, class U,
+ class = decltype(create<T>() + create<U>())
+>
+char f(int);
+
+template<class, class>
+char (&f(...))[2];
+
+static_assert(sizeof(f<void, int>(0)) != 1, "Error"); // (a)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C
new file mode 100644
index 000000000..d8b322890
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C
@@ -0,0 +1,12 @@
+// PR c++/48531
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T())
+>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+static_assert(sizeof(f<int[]>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C
new file mode 100644
index 000000000..56cbdadc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C
@@ -0,0 +1,17 @@
+// PR c++/48531
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T())
+>
+char f(int);
+
+template<class>
+double f(...);
+
+struct B2 {
+ B2(...);
+};
+
+#define SA(X) static_assert ((X), #X)
+SA(sizeof(f<B2[2]>(0)) != 1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C
new file mode 100644
index 000000000..c56a5d419
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C
@@ -0,0 +1,31 @@
+// PR c++/48530
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T{})
+>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+struct DelDtor {
+ ~DelDtor() = delete;
+};
+
+static_assert(sizeof(f<DelDtor[2]>(0)) != 1, "Error");
+
+struct A
+{
+ static DelDtor *p;
+};
+
+template<class T,
+ class = decltype(delete T::p, (T*)0)
+>
+char g(int);
+
+template<class>
+char (&g(...))[2];
+
+static_assert(sizeof(g<DelDtor>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C
new file mode 100644
index 000000000..ea46df0ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C
@@ -0,0 +1,17 @@
+// PR c++/48530
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T())
+>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+struct DelDtor {
+ DelDtor() = default;
+ ~DelDtor() = delete;
+};
+
+static_assert(sizeof(f<DelDtor>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C
new file mode 100644
index 000000000..52cc6add1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C
@@ -0,0 +1,13 @@
+// PR c++/48737
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template<class T, class... Args>
+decltype(T{create<Args>()...}, char()) f(int);
+
+template<class, class...>
+char (&f(...))[2];
+
+static_assert(sizeof(f<int[1], int, int>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C
new file mode 100644
index 000000000..6f617b289
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C
@@ -0,0 +1,39 @@
+// PR c++/44967
+// { dg-do compile { target c++11 } }
+
+template <typename T> T&& declval();
+
+template<typename T1, typename T2, typename... Args>
+struct has_construct
+{
+ typedef char one;
+ typedef struct {char _m[2]; } two;
+
+ template<typename U1, typename U2, typename... Args2>
+ static decltype(declval<U1>().construct(declval<U2*>(), declval<Args2>()...), one()) test(int);
+ template<typename, typename, typename...>
+ static two test(...);
+
+ static const bool value = sizeof(test<T1, T2, Args...>(0)) == 1;
+};
+
+
+struct A0
+{};
+
+struct A1
+{
+ void construct(int*, int);
+};
+
+template<typename _Tp>
+struct A2
+{
+ template<typename _Tp1, typename... _Args>
+ void construct(_Tp1*, _Args&&...) {}
+};
+
+#define SA(X) static_assert(X,#X)
+SA((!has_construct<A0, int, int>::value)); // ok
+SA((has_construct<A1, int, int>::value)); // bang
+SA((has_construct<A2<int>, int>::value)); // bang
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C
new file mode 100644
index 000000000..882efe768
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C
@@ -0,0 +1,23 @@
+// PR c++/48744
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rval_ref {
+ typedef T&& type;
+};
+
+template<>
+struct add_rval_ref<void> {
+ typedef void type;
+};
+
+template<class T>
+typename add_rval_ref<T>::type create();
+
+template<class T, class Arg>
+decltype(T{create<Arg>()}, char()) f(int);
+
+template<class, class>
+char (&f(...))[2];
+
+static_assert(sizeof(f<int, void>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C
new file mode 100644
index 000000000..743d7cfc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C
@@ -0,0 +1,18 @@
+// PR c++/48735
+// { dg-do compile { target c++11 } }
+
+template<class T,
+ class = decltype(T{})
+>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+struct ND {
+ // Make ND() non-aggregate.
+ virtual void f();
+ ND() = delete;
+};
+
+static_assert(sizeof(f<ND[1]>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C
new file mode 100644
index 000000000..2c55b8a18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C
@@ -0,0 +1,23 @@
+// PR c++/48745
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rval_ref {
+ typedef T&& type;
+};
+
+template<>
+struct add_rval_ref<void> {
+ typedef void type;
+};
+
+template<class T>
+typename add_rval_ref<T>::type create();
+
+template<class T, class... Args>
+decltype(T{create<Args>()...}, char()) f(int);
+
+template<class, class...>
+char (&f(...))[2];
+
+static_assert(sizeof(f<int, void>(0)) != 1, "Error"); // #
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C
new file mode 100644
index 000000000..53d5c9b0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C
@@ -0,0 +1,28 @@
+// PR c++/48647
+// { dg-do compile { target c++11 } }
+
+template< class T >
+T&& declval();
+
+template< class T, class U >
+decltype( true ? declval<T>() : declval<U>() ) test( int );
+
+template< class T, class U >
+void test( ... );
+
+
+template< class T, class U >
+struct is_same {
+ static const bool value = false;
+};
+
+template< class T >
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+#define SA(X) static_assert ((X),#X)
+
+typedef decltype( test<int*, double*>(0) ) void_expected;
+SA ((is_same<void_expected, void>::value));
+SA ((!is_same<void_expected, void*>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C
new file mode 100644
index 000000000..6d275d317
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C
@@ -0,0 +1,29 @@
+// PR c++/49058
+// This error is not subject to SFINAE because it doesn't happen in the
+// deduction context.
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+template<typename T> T val();
+
+struct F1
+{
+ void operator()();
+};
+
+template<typename F>
+struct Bind
+{
+ template<typename R
+ = decltype( val<F>()( ) )>
+ R f();
+
+ template<typename R
+ = decltype( val<const F>()( ) )> // { dg-error "no match" }
+ R f() const;
+};
+
+int main()
+{
+ Bind<F1> b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C
new file mode 100644
index 000000000..0ff872c9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C
@@ -0,0 +1,10 @@
+// PR c++/49105
+// { dg-do compile { target c++11 } }
+
+template<class T, class = decltype(T{})>
+char f(int);
+
+template<class T>
+auto f(...) -> char(&)[2];
+
+static_assert(sizeof(f<const int&&>(0)) == 1, "Error"); // #
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C
new file mode 100644
index 000000000..f55e1d8c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C
@@ -0,0 +1,38 @@
+// PR c++/49229
+// { dg-do compile { target c++11 } }
+
+extern void* enabler;
+
+template<bool, class = void>
+struct enable_if {};
+
+template<class T>
+struct enable_if<true, T> {
+ typedef T type;
+};
+
+template<class... Bn>
+struct and_;
+
+template<class B1>
+struct and_<B1> : B1 {};
+
+template<class, class>
+struct is_same {
+ static constexpr bool value = false;
+};
+
+template<class T>
+struct is_same<T, T> {
+ static constexpr bool value = true;
+};
+
+template<class... T>
+struct S {
+ template<class... U,
+ typename enable_if<and_<is_same<T, U>...>::value>::type*& = enabler // { dg-error "no type" }
+ >
+ S(U...){}
+};
+
+S<bool> s(0); // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C
new file mode 100644
index 000000000..ddd484a47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C
@@ -0,0 +1,20 @@
+// PR c++/50157
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T val();
+
+template<class T, class Arg, class =
+ decltype(::new T(val<Arg>()))
+>
+auto test(int) -> char;
+
+template<class, class>
+auto test(...) -> char (&)[2];
+
+struct P {
+ explicit operator bool(); // (#13)
+};
+
+typedef decltype(test<bool, P>(0)) type; // OK
+typedef decltype(test<float, P>(0)) type2; // Error (#17)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C
new file mode 100644
index 000000000..1eeba64bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C
@@ -0,0 +1,16 @@
+// PR c++/50324
+// { dg-do compile { target c++11 } }
+
+struct complete { };
+struct incomplete;
+
+template<class T> auto f(T *) -> decltype(T{}) *;
+template<class T> char f(T);
+
+int main()
+{
+ complete *p = 0;
+ static_assert(sizeof(f(p)) == sizeof(void*), "");
+ incomplete *q = 0;
+ static_assert(sizeof(f(q)) == 1u, "");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C
new file mode 100644
index 000000000..8792778ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C
@@ -0,0 +1,17 @@
+// PR c++/51047
+// { dg-do compile { target c++11 } }
+
+template<typename T> T &&declval();
+template<class T> decltype(declval<T>().x) f(T *);
+template<class T> char f(T);
+struct B1{ int x; };
+struct B2{ int x; };
+struct D : public B1, B2{};
+struct S { int x; };
+int main()
+{
+ S *p = nullptr;
+ static_assert(sizeof(f(p)) == sizeof(int), "");
+ D *q = nullptr;
+ static_assert(sizeof(f(q)) == 1u, "");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C
new file mode 100644
index 000000000..5009c8406
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C
@@ -0,0 +1,56 @@
+// { dg-do compile { target c++11 } }
+
+namespace std { template <class T> T&& declval(); }
+
+template<typename _Tp, typename... _Args>
+ class is_constructible_mini
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+
+ template<typename _Tp1, typename... _Args1>
+ static decltype(::new _Tp1(std::declval<_Args1>()...), __one())
+ __test(int);
+
+ template<typename, typename...>
+ static __two __test(...);
+
+ public:
+ static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1;
+ };
+
+/*
+template<typename _Tp>
+ class is_constructible_mini<_Tp>
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+
+ template<typename _Tp1>
+ static decltype(::new _Tp1, __one()) __test(int);
+
+ template<typename>
+ static __two __test(...);
+
+ public:
+ static const bool value
+ = sizeof(__test<typename std::remove_cv<_Tp>::type>(0)) == 1;
+ };
+*/
+
+struct A
+{
+ A(int);
+};
+
+struct B { };
+
+static_assert( is_constructible_mini<A, int>::value, "");
+static_assert( is_constructible_mini<A, A>::value, "");
+static_assert( !is_constructible_mini<A, int, double>::value, "");
+
+static_assert( !is_constructible_mini<A>::value, ""); // doesn't compile without the
+ // partial specialization
+
+static_assert( is_constructible_mini<B>::value, "");
+static_assert( is_constructible_mini<const B>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C
new file mode 100644
index 000000000..6fcf5f756
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+
+template <class... T> struct tuple;
+template <class T> struct tuple<T> { T t; };
+
+template <class T, class U> struct pair;
+template<> struct pair<int,double> { };
+
+template <class... Ts>
+struct A
+{
+ template <class... Us,
+ class V = tuple<pair<Ts,Us>...> >
+ static void f(Us...)
+ {
+ V v;
+ }
+ template <class U>
+ static void f(bool);
+};
+
+int main()
+{
+ A<int,float>::f<double>(1.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C
new file mode 100644
index 000000000..8695ebca3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C
@@ -0,0 +1,13 @@
+// PR c++/51973
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f(T t) { }
+
+template <class T> decltype(f<T>(0)) g();
+template <class T> decltype(f<T*>(0)) g();
+
+int main()
+{
+ g<void>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C
new file mode 100644
index 000000000..97945c6bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C
@@ -0,0 +1,18 @@
+// PR c++/51989
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct is_container
+{
+ template <typename U, typename V = decltype(((U*)0)->begin())>
+ static char test(U* u);
+
+ template <typename U> static long test(...);
+
+ enum { value = sizeof test<T>(0) == 1 };
+};
+
+int main()
+{
+ return is_container<void>::value;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C
new file mode 100644
index 000000000..f543c1f24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C
@@ -0,0 +1,27 @@
+// PR c++/52422
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rval_ref
+{
+ typedef T&& type;
+};
+
+template<>
+struct add_rval_ref<void>
+{
+ typedef void type;
+};
+
+template<class T>
+typename add_rval_ref<T>::type create();
+
+template<class T,
+ class = decltype(create<T>()())
+>
+auto f(int) -> char(&)[1];
+
+template<class>
+auto f(...) -> char(&)[2];
+
+static_assert(sizeof(f<void>(0)) != 1, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C
new file mode 100644
index 000000000..615a2bc9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C
@@ -0,0 +1,27 @@
+// PR c++/52422
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct add_rval_ref
+{
+ typedef T&& type;
+};
+
+template<>
+struct add_rval_ref<void>
+{
+ typedef void type;
+};
+
+template<class T>
+typename add_rval_ref<T>::type create();
+
+template<class T, class U,
+ class = decltype( (create<T>().*create<U>())() )
+>
+auto f(int) -> char(&)[1];
+
+template<class, class>
+auto f(...) -> char(&)[2];
+
+static_assert(sizeof(f<void, void>(0)) != 1, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C
new file mode 100644
index 000000000..86b610324
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C
@@ -0,0 +1,13 @@
+// PR c++/52363
+// { dg-do compile { target c++11 } }
+
+#include <type_traits>
+
+struct proxy
+{
+ void operator=(int const&);
+ void operator=(int&&) const;
+};
+
+static_assert( !std::is_assignable<proxy, int>::value, "" );
+static_assert( std::is_assignable<const proxy, int>::value, "" );
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C
new file mode 100644
index 000000000..6597bc337
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C
@@ -0,0 +1,14 @@
+// PR c++/52363
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic" }
+
+#include <type_traits>
+
+struct proxy
+{
+ void operator=(int const&);
+ void operator=(int&&) const;
+};
+
+static_assert( !std::is_assignable<proxy, int>::value, "" );
+static_assert( std::is_assignable<const proxy, int>::value, "" );
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C
new file mode 100644
index 000000000..e89106aac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C
@@ -0,0 +1,36 @@
+// PR c++/51213
+// { dg-do compile { target c++11 } }
+
+class C {
+ typedef int type;
+};
+
+template<int>
+struct I;
+
+template<>
+struct I<2> { };
+
+template<class T, class = typename T::type>
+auto f(int) -> char;
+
+template<class>
+auto f(...) -> char (&)[2];
+
+static_assert(sizeof(f<C>(0)) == 2, "Ouch");
+
+typedef int testf[sizeof(f<C>(0)) == 2 ? 1 : -1];
+
+I<sizeof(f<C>(0))> vf;
+
+template<class T>
+auto g(int) -> decltype(typename T::type(), char());
+
+template<class>
+auto g(...) -> char (&)[2];
+
+static_assert(sizeof(g<C>(0)) == 2, "Ouch");
+
+typedef int testg[sizeof(g<C>(0)) == 2 ? 1 : -1];
+
+I<sizeof(g<C>(0))> vg;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C
new file mode 100644
index 000000000..2e860ee69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+template<class T, unsigned = sizeof(T)>
+auto f(int) -> char;
+
+template<class>
+auto f(...) -> char(&)[2];
+
+static_assert(sizeof(f<void>(0)) != 1, "");
+static_assert(sizeof(f<void()>(0)) != 1, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C
new file mode 100644
index 000000000..8183bda39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C
@@ -0,0 +1,146 @@
+// PR c++/54191
+// { dg-do compile { target c++11 } }
+
+struct B
+{};
+
+struct D
+ : private B
+{};
+
+template<typename T>
+T &&declval();
+
+
+template<typename From, typename = decltype(B{declval<From>()})>
+constexpr bool test_braced_cast_to_base(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_base(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_base<D>(0), "");
+
+
+template<typename From, typename = decltype(D{declval<From>()})>
+constexpr bool test_braced_cast_to_derived(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_derived(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_derived<B>(0), "");
+
+
+typedef B *PB;
+
+template<typename From, typename = decltype(PB{declval<From>()})>
+constexpr bool test_braced_cast_to_ptr_to_base(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_ptr_to_base(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_ptr_to_base<D *>(0), "");
+
+
+typedef D *PD;
+
+template<typename From, typename = decltype(PD{declval<From>()})>
+constexpr bool test_braced_cast_to_ptr_to_derived(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_ptr_to_derived(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_ptr_to_derived<B *>(0), "");
+
+
+template<typename From, typename To,
+ typename = decltype(static_cast<To>(declval<From>()))>
+constexpr bool test_static_cast(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_static_cast(bool)
+{ return false; }
+
+static_assert(!test_static_cast<B &, D &>(0), "");
+static_assert(!test_static_cast<B *, D *>(0), "");
+
+
+template<typename From, typename To,
+ typename = decltype(dynamic_cast<To>(declval<From>()))>
+constexpr bool test_dynamic_cast(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_dynamic_cast(bool)
+{ return false; }
+
+static_assert(!test_dynamic_cast<D &, B &>(0), "");
+static_assert(!test_dynamic_cast<D *, B *>(0), "");
+
+
+int B::*pm = 0;
+
+template<typename T, typename = decltype(declval<T>().*pm)>
+constexpr bool test_member_ptr_dot(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_member_ptr_dot(bool)
+{ return false; }
+
+static_assert(!test_member_ptr_dot<D>(0), "");
+
+
+template<typename T, typename = decltype(declval<T>()->*pm)>
+constexpr bool test_member_ptr_arrow(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_member_ptr_arrow(bool)
+{ return false; }
+
+static_assert(!test_member_ptr_arrow<D *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(declval<T>() < declval<U>())>
+constexpr bool test_rel_op(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_rel_op(bool)
+{ return false; }
+
+static_assert(!test_rel_op<D *, B *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(declval<T>() == declval<U>())>
+constexpr bool test_eq(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_eq(bool)
+{ return false; }
+
+static_assert(!test_eq<D *, B *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(false ? declval<T>() : declval<U>())>
+constexpr bool test_cond_op(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_cond_op(bool)
+{ return false; }
+
+static_assert(!test_cond_op<B *, D *>(0), "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C
new file mode 100644
index 000000000..1b24966e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+namespace std { template <class T> T&& declval(); }
+
+template<typename _Tp, typename... _Args>
+ class is_constructible_mini
+ {
+ typedef char __one;
+ typedef struct { char __arr[2]; } __two;
+
+ template<typename _Tp1, typename... _Args1>
+ static decltype(::new _Tp1(std::declval<_Args1>()...), __one())
+ __test(int);
+
+ template<typename, typename...>
+ static __two __test(...);
+
+ public:
+ static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1;
+ };
+
+static_assert( !is_constructible_mini<int[], int>::value, "");
+static_assert( !is_constructible_mini<void, int>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C
new file mode 100644
index 000000000..18e5fecb2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C
@@ -0,0 +1,21 @@
+// PR c++/54541
+// { dg-do compile { target c++11 } }
+
+template <typename T> T&& declval();
+
+struct X;
+
+X f(int);
+
+template <class T>
+void g(decltype((void)f(declval<T>())) *)
+{}
+
+template <class T>
+void g(...)
+{}
+
+int main()
+{
+ g<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C
new file mode 100644
index 000000000..bd6f624f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C
@@ -0,0 +1,17 @@
+// PR c++/54542
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f(decltype(new T(1, 2)) *)
+{
+ T(1, 2);
+}
+
+template <class T>
+void f(...)
+{}
+
+int main()
+{
+ f<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C
new file mode 100644
index 000000000..a7a23a317
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C
@@ -0,0 +1,46 @@
+// PR c++/54738
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& declval();
+
+template<class F, class T1, class... Ts>
+decltype(((*declval<T1>()).*declval<F>())(declval<Ts>()...))
+test1(int);
+
+template<class...>
+void test1(...);
+
+template<class F, class T1, class... Ts>
+decltype((declval<T1>().*declval<F>())(declval<Ts>()...))
+test2(int);
+
+template<class...>
+void test2(...);
+
+struct S {};
+
+typedef void (S::*Func)(int) const;
+typedef void (S::*Func2)(int);
+
+typedef decltype(test1<Func, S*>(0)) type1a;
+typedef decltype(test1<Func, S*&>(0)) type1b;
+typedef decltype(test1<Func, S*, int, int>(0)) type1c;
+typedef decltype(test1<Func, S*&, int, int>(0)) type1d;
+
+typedef decltype(test2<Func, S>(0)) type2a;
+typedef decltype(test2<Func, S&>(0)) type2b;
+typedef decltype(test2<Func, S, int, int>(0)) type2c;
+typedef decltype(test2<Func, S&, int, int>(0)) type2d;
+
+typedef decltype(test1<Func, S*, S>(0)) type3a;
+typedef decltype(test1<Func, S*&, S>(0)) type3b;
+
+typedef decltype(test2<Func, S, S>(0)) type4a;
+typedef decltype(test2<Func, S&, S>(0)) type4b;
+
+typedef decltype(test1<Func2, const S*, int>(0)) type5a;
+typedef decltype(test1<Func2, const S*&, int>(0)) type5b;
+
+typedef decltype(test2<Func2, const S, int>(0)) type6a;
+typedef decltype(test2<Func2, const S&, int>(0)) type6b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C
new file mode 100644
index 000000000..14c31f681
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C
@@ -0,0 +1,31 @@
+// PR c++/56208
+// { dg-do compile { target c++11 } }
+
+struct ostream {
+ ostream& operator<<(int);
+};
+
+struct sfinae_base {
+
+ typedef char one;
+ typedef char (&two)[2];
+
+ template<class T>
+ static T make();
+
+ template<unsigned> struct ok { typedef int type; };
+
+ template<class U, class T>
+ static one test(decltype((make<U>() << make<T>()), 0));
+
+ template<class, class>
+ static two test(...);
+};
+
+template<class T>
+struct is_printable : private sfinae_base
+{
+ enum { value = sizeof(test<ostream&, T>(0)) == sizeof(one) };
+};
+
+typedef int ok[is_printable<int>::value ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C
new file mode 100644
index 000000000..bbcae6226
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C
@@ -0,0 +1,26 @@
+// PR c++/56913
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+T &&declval();
+
+template<typename T, typename U,
+ typename = decltype((declval<T>().*declval<U>())())>
+constexpr bool test(int)
+{
+ return true;
+}
+
+template<typename T, typename U>
+constexpr bool test(...)
+{
+ return false;
+}
+
+struct S
+{};
+
+static_assert(!test<S, void (S::*)() &>(0), "");
+static_assert(test<S, void (S::*)() &&>(0), "");
+static_assert(test<S &, void (S::*)() &>(0), "");
+static_assert(!test<S &, void (S::*)() &&>(0), "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C
new file mode 100644
index 000000000..bd375145f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C
@@ -0,0 +1,35 @@
+// PR c++/56970
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct has
+{
+ template <typename>
+ constexpr static int test(...) {
+ return 0;
+ }
+
+ template <typename C>
+ constexpr static int test(decltype(sizeof(C::x))) { // Doesn't compile.
+ return 1; // Is a member variable.
+ }
+
+ template <typename C, int c = sizeof(decltype(((C*)nullptr)->x()))>
+ constexpr static int test(int) {
+ return 2; // Is a member function.
+ }
+
+ static const int value = test<T>(0);
+};
+
+struct foo {
+ int x;
+};
+
+struct bar {
+ int x();
+};
+
+static_assert(has<int>::value == 0, "");
+static_assert(has<foo>::value == 1, "");
+static_assert(has<bar>::value == 2, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C
new file mode 100644
index 000000000..20e859c23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C
@@ -0,0 +1,13 @@
+// PR c++/57419
+// { dg-do compile { target c++11 } }
+
+template< typename q >
+decltype( &q::f ) t( q ) {}
+
+char t( ... ) { return {}; }
+
+class c { void f() = delete; };
+class d { static void f() = delete; };
+
+static_assert( sizeof( t( c() ) ), "c" );
+static_assert( sizeof( t( d() ) ), "d" );
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C
new file mode 100644
index 000000000..1058a2864
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C
@@ -0,0 +1,25 @@
+// Source: Comment 16 of PR51213
+// { dg-do compile { target c++11 } }
+
+template <class T>
+T && declval();
+
+template <class T>
+constexpr auto hasSize(int) -> decltype(declval<T&>().size(), bool())
+{ return true; }
+
+template <class T>
+constexpr bool hasSize(...)
+{ return false; }
+
+struct A
+{
+ int size();
+};
+
+struct B : private A
+{
+};
+
+static_assert(hasSize<A>(0), "A");
+static_assert(!hasSize<B>(0), "B");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C
new file mode 100644
index 000000000..ba728d9de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C
@@ -0,0 +1,21 @@
+// PR c++/57874
+// { dg-do compile { target c++11 } }
+
+namespace NX
+{
+ struct X {};
+ void foo(X) {}
+}
+
+namespace NY
+{
+ struct Y {};
+}
+
+template<class T>
+auto ADLfoo(T&&) -> decltype((foo(T{}), short()));
+
+char ADLfoo(...);
+
+static_assert(sizeof(ADLfoo(NY::Y{})) == 1, "");
+static_assert(sizeof(ADLfoo(NX::X{})) == 2, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C
new file mode 100644
index 000000000..59381f341
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C
@@ -0,0 +1,29 @@
+// PR c++/58932
+// { dg-do compile { target c++11 } }
+
+using nullptr_t = decltype(nullptr);
+
+template<typename T, typename Sfinae = nullptr_t>
+struct B {
+ static float& int_if_addable();
+};
+
+template<typename T>
+struct B<T, decltype( (T() + T()), nullptr )> {
+ static int& int_if_addable();
+};
+
+struct X { };
+
+struct Y { };
+Y operator+(Y, Y);
+
+struct Z { };
+Z operator+(Z, Z) = delete;
+
+int main()
+{
+ float& a = B<X>::int_if_addable();
+ int& b = B<Y>::int_if_addable();
+ float& c = B<Z>::int_if_addable();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C
new file mode 100644
index 000000000..421a06e5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template <class T, class U,
+ class = decltype(create<T>() = create<U>())
+ >
+char test(int);
+
+template <class, class>
+double test(...);
+
+int main() {
+ test<int[], int[]>(0); // #1
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C
new file mode 100644
index 000000000..4ee014680
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C
@@ -0,0 +1,31 @@
+// PR c++/48113
+// { dg-do compile { target c++11 } }
+
+template<typename T> T declval();
+
+struct tuple { };
+
+struct F1
+{
+ void operator()(tuple, int);
+};
+
+typedef void (*F2)(tuple, int);
+
+template<typename F, typename T>
+struct Bind
+{
+ template<typename A,
+ typename R = decltype( F()(declval<T&>(), A()) )>
+ R f(A);
+
+ template<typename A,
+ typename R = decltype( F()(declval<volatile T&>(), A()) )>
+ R f(A) volatile;
+};
+
+int main()
+{
+ Bind<F1, tuple>().f(0); // OK
+ Bind<F2, tuple>().f(0); // ERROR, should be OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
new file mode 100644
index 000000000..18b3d8fa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ void f();
+ void f(int);
+ typedef int g;
+};
+
+template <class T> decltype (T::f) f();
+template <class T> void f();
+
+template <class T> decltype (T::g) g();
+template <class T> void g();
+
+int main()
+{
+ f<A>();
+ g<A>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C
new file mode 100644
index 000000000..43381d05d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C
@@ -0,0 +1,14 @@
+// PR c++/48449
+// { dg-do compile { target c++11 } }
+
+template<class T, class = decltype(T())>
+char f(int);
+
+template<class>
+char (&f(...))[2];
+
+struct A { virtual ~A() = 0; };
+
+static_assert(sizeof(f<int&>(0)) != 1, "Error");
+static_assert(sizeof(f<void()>(0)) != 1, "Error");
+static_assert(sizeof(f<A>(0)) != 1, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C
new file mode 100644
index 000000000..68656c6d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C
@@ -0,0 +1,24 @@
+// PR c++/48450
+// { dg-do compile { target c++11 } }
+
+namespace std {
+ template <class T> T&& declval();
+}
+
+template<class To, class From,
+ class = decltype(static_cast<To>(std::declval<From>()))
+>
+char f(int);
+
+template<class, class>
+char (&f(...))[2];
+
+struct A { virtual ~A() = 0; };
+struct B {};
+struct D : B {};
+
+static_assert(sizeof(f<A, int>(0)) != 1, "Error"); // a
+static_assert(sizeof(f<int*, const void*>(0)) != 1, "Error"); // b
+static_assert(sizeof(f<D*, const B*>(0)) != 1, "Error"); // c
+static_assert(sizeof(f<int B::*, const int D::*>(0)) != 1, "Error"); // d
+static_assert(sizeof(f<B, void>(0)) != 1, "Error"); // e
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C
new file mode 100644
index 000000000..49b5a9703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+void foo()
+{
+ static_assert(1, "okay");
+ static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" }
+}
+
+class X {
+ static_assert(1, "okay");
+ static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" }
+};
+
+static_assert(1, "okay");
+static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C
new file mode 100644
index 000000000..216f2595b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C
@@ -0,0 +1,8 @@
+// PR c++/60254
+// { dg-do compile { target c++11 } }
+
+template<typename T> bool foo(T)
+{
+ int i;
+ static_assert(foo(i), "Error"); // { dg-error "non-constant condition|not usable" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C
new file mode 100644
index 000000000..8a7362d5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C
@@ -0,0 +1,10 @@
+// PR c++/60254
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename T> bool foo(T)
+ {
+ static_assert(foo(0), "Error"); // { dg-error "non-constant condition|constant expression" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C
new file mode 100644
index 000000000..1ef2bc602
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C
@@ -0,0 +1,35 @@
+// { dg-do compile { target c++11 } }
+template<int I>
+struct accept_evens {
+ static_assert( I % 2 == 0, "I must be an even number"); // { dg-error "even number" }
+};
+
+template<int I>
+struct accept_evens_ok {
+ static_assert( I % 2 == 0, "I must be an even number");
+};
+
+template<int I>
+void accept_odds() {
+ static_assert( I % 2 == 1, "I must be an odd number"); // { dg-error "odd number" }
+}
+
+template<int I>
+void accept_odds_ok() {
+ static_assert( I % 2 == 1, "I must be an odd number");
+}
+
+void f()
+{
+ accept_odds<1>();
+ accept_odds<2>();
+ accept_odds<3>();
+ accept_odds_ok<5>();
+ accept_odds_ok<7>();
+}
+
+accept_evens<0> ok0;
+accept_evens<1> error1;
+accept_evens<2> ok2;
+accept_evens_ok<4> ok4;
+accept_evens_ok<6> ok6;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C
new file mode 100644
index 000000000..addde13c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+static_assert(7 / 0, "X"); // { dg-error "non-constant condition" "non-constant" }
+// { dg-warning "division by zero" "zero" { target *-*-* } 2 }
+// { dg-error "division by zero is not a constant-expression" "not a constant" { target *-*-* } 2 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C
new file mode 100644
index 000000000..9a7473509
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0 " }
+// PR C++/30033
+// Make sure that the static assert does not crash the GC.
+
+template <class T>
+struct default_delete
+{
+ void
+ operator() (T * ptr) const
+ {
+ static_assert (sizeof (T) > 0, "Can't delete pointer to incomplete type");
+ }
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C
new file mode 100644
index 000000000..36cf2eb3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C
@@ -0,0 +1,21 @@
+// PR c++/50837
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct z
+{
+ static constexpr bool test_constexpr()
+ {
+ return true;
+ }
+
+ static void test()
+ {
+ static_assert(test_constexpr(), "test1");
+ }
+};
+
+int main()
+{
+ z<int>::test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C
new file mode 100644
index 000000000..5323e7167
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C
@@ -0,0 +1,4 @@
+// PR c++/51397
+// { dg-do compile { target c++11 } }
+
+static_assert('X' != '\130', "'X' has the wrong value"); // { dg-error "'X' has the wrong value" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C
new file mode 100644
index 000000000..f571de28a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C
@@ -0,0 +1,21 @@
+// PR c++/53166
+// { dg-do compile { target c++11 } }
+// { dg-options "-Waddress" }
+
+template <typename X, X a>
+struct A
+{
+ static_assert (a != nullptr, "oops");
+ static_assert (nullptr != a, "oops");
+
+ int f()
+ {
+ static_assert (a != nullptr, "oops");
+ static_assert (nullptr != a, "oops");
+ return 1;
+ }
+};
+
+int i1;
+A<int*, &i1> a1;
+int i2 = a1.f();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C
new file mode 100644
index 000000000..ea23afb85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+static_assert (1 == 0); // { dg-error "expected (string-literal|',') before" }
+
+static_assert (1 == 0,); // { dg-error "expected string-literal before '\\)'" }
+
+static_assert (1 == 0, "oops"); // { dg-error "static assertion failed" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C
new file mode 100644
index 000000000..fccaa449c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C
@@ -0,0 +1,7 @@
+// PR c++/58837
+// { dg-require-effective-target c++11 }
+
+void f();
+static_assert(f, "");
+struct A {};
+static_assert(A::~A, ""); // { dg-error "non-static member function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C
new file mode 100644
index 000000000..09273c5f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C
@@ -0,0 +1,91 @@
+// { dg-do compile { target c++11 } }
+
+// [basic.types]/10:
+// Scalar types, standard-layout class types (Clause 9), arrays of such
+// types and cv-qualified versions of these types (3.9.3) are collectively
+// called standard-layout types.
+
+// [class]/7:
+// A standard-layout class is a class that:
+// * has no non-static data members of type non-standard-layout class (or
+// array of such types) or reference,
+// * has no virtual functions (10.3) and no virtual base classes (10.1),
+// * has the same access control (Clause 11) for all non-static data members,
+// * has no non-standard-layout base classes,
+// * either has no non-static data members in the most-derived class and at
+// most one base class with non-static data members, or has no base classes
+// with non-static data members, and
+// * has no base classes of the same type as the first non-static data member.
+
+#include <type_traits>
+
+#define TRY(expr) static_assert (expr, #expr)
+#define YES(type) TRY(std::is_standard_layout<type>::value); \
+ TRY(std::is_standard_layout<type[]>::value); \
+ TRY(std::is_standard_layout<const volatile type>::value)
+#define NO(type) TRY(!std::is_standard_layout<type>::value); \
+ TRY(!std::is_standard_layout<type[]>::value); \
+ TRY(!std::is_standard_layout<const volatile type>::value)
+#define NONPOD(type) TRY(!std::is_pod<type>::value); \
+ TRY(!std::is_pod<type[]>::value); \
+ TRY(!std::is_pod<const volatile type>::value)
+
+struct A;
+
+YES(int);
+YES(__complex int);
+YES(void *);
+YES(int A::*);
+typedef int (A::*pmf)();
+YES(pmf);
+
+struct A { ~A(); };
+YES(A);
+NONPOD(A);
+struct F: public A { int i; };
+YES(F);
+NONPOD(F);
+struct G: public A { A a; };
+NO(G);
+struct M { A a; };
+YES(M);
+
+class B
+{
+ int i;
+ __complex int c;
+ void *p;
+ double ar[4];
+ int A::* pm;
+ int (A::*pmf)();
+};
+YES(B);
+struct D: public B { };
+YES(D);
+struct E: public B { int q; };
+NO(E);
+struct D2: public B { };
+YES(D2);
+struct I: public D, public D2 { };
+NO(I);
+
+struct C
+{
+ int i;
+private:
+ int j;
+};
+NO(C);
+struct H: public C { };
+NO(H);
+struct N { C c; };
+NO(N);
+
+struct J { virtual void f(); };
+struct J2: J { };
+NO(J);
+NO(J2);
+struct K { };
+struct L: virtual K {};
+YES(K);
+NO(L);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
new file mode 100644
index 000000000..7caaa7cee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
@@ -0,0 +1,115 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fext-numeric-literals" }
+
+// Integer imaginary...
+
+constexpr unsigned long long
+operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 0; }
+
+constexpr unsigned long long
+operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 1; }
+
+constexpr unsigned long long
+operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 2; }
+
+constexpr unsigned long long
+operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" }
+{ return 4 * n + 3; }
+
+// Floating-point imaginary...
+
+constexpr long double
+operator"" i(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 0.0L; }
+
+constexpr long double
+operator"" I(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 1.0L; }
+
+constexpr long double
+operator"" j(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 2.0L; }
+
+constexpr long double
+operator"" J(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4.0L * n + 3.0L; }
+
+// Fixed-point...
+
+constexpr long double
+operator"" k(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 0; }
+
+constexpr long double
+operator"" K(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 1; }
+
+constexpr long double
+operator"" r(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 2; }
+
+constexpr long double
+operator"" R(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 1) + 3; }
+
+// Machine-defined...
+
+constexpr long double
+operator"" w(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 0; }
+
+constexpr long double
+operator"" W(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 1; }
+
+constexpr long double
+operator"" q(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 2; }
+
+constexpr long double
+operator"" Q(long double n) // { dg-warning "shadowed by implementation" }
+{ return 4 * (n + 2) + 3; }
+
+int
+main()
+{
+ auto ii = 1i;
+ auto Ii = 1I;
+ auto ji = 1j;
+ auto Ji = 1J;
+
+ auto ifp = 1.0i;
+ auto Ifp = 1.0I;
+ auto jfp = 1.0j;
+ auto Jfp = 1.0J;
+
+ auto kfp = 1.0k; // { dg-error "fixed-point types not supported" }
+ auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" }
+ auto rfp = 1.0r; // { dg-error "fixed-point types not supported" }
+ auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" }
+
+ auto wfp = 1.0w; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } }
+ auto Wfp = 1.0W; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } }
+ auto qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } }
+ auto Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } }
+}
+
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
new file mode 100644
index 000000000..0b245f4a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
@@ -0,0 +1,115 @@
+// { dg-do compile { target c++11 } }
+
+
+// Integer imaginary...
+
+constexpr unsigned long long
+operator"" i(unsigned long long n)
+{ return 4 * n + 0; }
+
+constexpr unsigned long long
+operator"" I(unsigned long long n)
+{ return 4 * n + 1; }
+
+constexpr unsigned long long
+operator"" j(unsigned long long n)
+{ return 4 * n + 2; }
+
+constexpr unsigned long long
+operator"" J(unsigned long long n)
+{ return 4 * n + 3; }
+
+// Floating-point imaginary...
+
+constexpr long double
+operator"" i(long double n)
+{ return 4.0L * n + 0.0L; }
+
+constexpr long double
+operator"" I(long double n)
+{ return 4.0L * n + 1.0L; }
+
+constexpr long double
+operator"" j(long double n)
+{ return 4.0L * n + 2.0L; }
+
+constexpr long double
+operator"" J(long double n)
+{ return 4.0L * n + 3.0L; }
+
+// Fixed-point...
+
+constexpr long double
+operator"" k(long double n)
+{ return 4 * (n + 1) + 0; }
+
+constexpr long double
+operator"" K(long double n)
+{ return 4 * (n + 1) + 1; }
+
+constexpr long double
+operator"" r(long double n)
+{ return 4 * (n + 1) + 2; }
+
+constexpr long double
+operator"" R(long double n)
+{ return 4 * (n + 1) + 3; }
+
+// Machine-defined...
+
+constexpr long double
+operator"" w(long double n)
+{ return 4 * (n + 2) + 0; }
+
+constexpr long double
+operator"" W(long double n)
+{ return 4 * (n + 2) + 1; }
+
+constexpr long double
+operator"" q(long double n)
+{ return 4 * (n + 2) + 2; }
+
+constexpr long double
+operator"" Q(long double n)
+{ return 4 * (n + 2) + 3; }
+
+int
+main()
+{
+ auto ii = 1i;
+ auto Ii = 1I;
+ auto ji = 1j;
+ auto Ji = 1J;
+
+ auto ifp = 1.0i;
+ auto Ifp = 1.0I;
+ auto jfp = 1.0j;
+ auto Jfp = 1.0J;
+
+ auto kfp = 1.0k;
+ auto Kfp = 1.0K;
+ auto rfp = 1.0r;
+ auto Rfp = 1.0R;
+
+ auto wfp = 1.0w;
+ auto Wfp = 1.0W;
+ auto qfp = 1.0q;
+ auto Qfp = 1.0Q;
+}
+
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
+// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C
new file mode 100644
index 000000000..dad9200cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C
@@ -0,0 +1,6 @@
+// PR c++/54249
+// { dg-do compile { target c++11 } }
+
+#include <stddef.h>
+
+::nullptr_t n;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C
new file mode 100644
index 000000000..434d45824
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C
@@ -0,0 +1,135 @@
+// PR c++/52764
+// { dg-require-effective-target stdint_types }
+// { dg-do compile { target c++11 } }
+
+#include <stdint.h>
+
+#ifdef __INT8_TYPE__
+# if (!defined INT8_MAX \
+ || !defined INT8_MIN)
+# error
+# endif
+#endif
+#ifdef __UINT8_TYPE__
+# if !defined UINT8_MAX
+# error
+# endif
+#endif
+#ifdef __INT16_TYPE__
+# if (!defined INT16_MAX \
+ || !defined INT16_MIN)
+# error
+# endif
+#endif
+#ifdef __UINT16_TYPE__
+# if !defined UINT16_MAX
+# error
+# endif
+#endif
+#ifdef __INT32_TYPE__
+# if (!defined INT32_MAX \
+ || !defined INT32_MIN)
+# error
+# endif
+#endif
+#ifdef __UINT32_TYPE__
+# if !defined UINT32_MAX
+# error
+# endif
+#endif
+#ifdef __INT64_TYPE__
+# if (!defined INT64_MAX \
+ || !defined INT64_MIN)
+# error
+# endif
+#endif
+#ifdef __UINT64_TYPE__
+# if !defined UINT64_MAX
+# error
+# endif
+#endif
+
+#if (!defined INT_LEAST8_MAX \
+ || !defined INT_LEAST8_MIN \
+ || !defined UINT_LEAST8_MAX \
+ || !defined INT_LEAST16_MAX \
+ || !defined INT_LEAST16_MIN \
+ || !defined UINT_LEAST16_MAX \
+ || !defined INT_LEAST32_MAX \
+ || !defined INT_LEAST32_MIN \
+ || !defined UINT_LEAST32_MAX \
+ || !defined INT_LEAST64_MAX \
+ || !defined INT_LEAST64_MIN \
+ || !defined UINT_LEAST64_MAX)
+#error
+#endif
+
+#if (!defined INT_FAST8_MAX \
+ || !defined INT_FAST8_MIN \
+ || !defined UINT_FAST8_MAX \
+ || !defined INT_FAST16_MAX \
+ || !defined INT_FAST16_MIN \
+ || !defined UINT_FAST16_MAX \
+ || !defined INT_FAST32_MAX \
+ || !defined INT_FAST32_MIN \
+ || !defined UINT_FAST32_MAX \
+ || !defined INT_FAST64_MAX \
+ || !defined INT_FAST64_MIN \
+ || !defined UINT_FAST64_MAX)
+#error
+#endif
+
+#ifdef __INTPTR_TYPE__
+# if (!defined INTPTR_MAX \
+ || !defined INTPTR_MIN)
+# error
+# endif
+#endif
+#ifdef __UINTPTR_TYPE__
+# if !defined UINTPTR_MAX
+# error
+# endif
+#endif
+
+#if (!defined INTMAX_MAX \
+ || !defined INTMAX_MIN \
+ || !defined UINTMAX_MAX)
+#error
+#endif
+
+#if (!defined PTRDIFF_MAX \
+ || !defined PTRDIFF_MIN)
+#error
+#endif
+
+#if (!defined SIG_ATOMIC_MAX \
+ || !defined SIG_ATOMIC_MIN)
+#error
+#endif
+
+#if !defined SIZE_MAX
+#error
+#endif
+
+#if (!defined WCHAR_MAX \
+ || !defined WCHAR_MIN)
+#error
+#endif
+
+#if (!defined WINT_MAX \
+ || !defined WINT_MIN)
+#error
+#endif
+
+#if (!defined INT8_C \
+ || !defined INT16_C \
+ || !defined INT32_C \
+ || !defined INT64_C \
+ || !defined UINT8_C \
+ || !defined UINT16_C \
+ || !defined UINT32_C \
+ || !defined UINT64_C \
+ || !defined INTMAX_C \
+ || !defined UINTMAX_C)
+#error
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C
new file mode 100644
index 000000000..5f5a236a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C
@@ -0,0 +1,8 @@
+// PR c++/47198
+// { dg-do compile { target c++11 } }
+
+struct S
+{
+ template < int > sometype foo (); // { dg-error "sometype. does not name a type" }
+ S () = default;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C
new file mode 100644
index 000000000..9d8a3bd8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct S { };
+
+struct T
+{
+ S s;
+};
+
+void f(T const &);
+
+void g()
+{
+ f((T){S()});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C
new file mode 100644
index 000000000..616f2f4b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-abi" { target arm_eabi } }
+#include <stdarg.h>
+
+struct S { };
+void f(S const &);
+
+void g(va_list args)
+{
+ f(va_arg(args, S));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C
new file mode 100644
index 000000000..33f6c9eb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+template<typename T = int> void f()
+{
+ static_assert(is_same<T, int>::value,
+ "T can only be instantiated with an int");
+}
+
+template<typename T = int, typename U>
+void f(U)
+{
+ static_assert(is_same<T, int>::value,
+ "T can only be instantiated with an int");
+}
+
+void g()
+{
+ float pi = 3.14159;
+ f();
+ f(pi);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C
new file mode 100644
index 000000000..2a41e22e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+template <class T, class U = double>
+void f(T t = 0, U u = 0); // { dg-message "note" }
+
+void g()
+{
+ f(1, 'c'); // f<int,char>(1,'c')
+ f(1); // f<int,double>(1,0)
+ f(); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 }
+ f<int>(); // f<int,double>(0,0)
+ f<int,char>(); // f<int,char>(0,0)
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C
new file mode 100644
index 000000000..2d59f4766
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U = typename T::value_type>
+void f(T);
+
+void f(...);
+
+struct X {
+ typedef int value_type;
+};
+
+void g()
+{
+ f(X()); // okay
+ f(17); // okay?
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C
new file mode 100644
index 000000000..783ff5b19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+class X {
+ template<typename T = int> friend void f(X) { }
+ template<typename T> friend void g(X); // { dg-message "previously declared here" }
+ template<typename T = int> friend void h(X); // { dg-error "function template friend" }
+};
+
+template<typename T = int> void g(X) // { dg-error "default template argument" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C
new file mode 100644
index 000000000..dd84d260e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+template <class Z = void, class T>
+void Foo(T)
+{
+ struct X {};
+}
+
+template <class T = int, typename U>
+void f(const U&)
+{
+ auto g = [] () {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C
new file mode 100644
index 000000000..1186e8056
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C
@@ -0,0 +1,67 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test the "Augmented" template argument deduction when binding an lvalue to an rvalue reference.
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+template <class T, T v>
+struct integral_constant
+{
+ static const T value = v;
+ typedef T value_type;
+ typedef integral_constant<T, v> type;
+};
+
+typedef integral_constant<bool, true> true_type;
+typedef integral_constant<bool, false> false_type;
+
+template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {};
+template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {};
+
+template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {};
+template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {};
+
+template <bool is_lvalue_ref, bool is_rvalue_ref, class T>
+void
+test1(T&&)
+{
+ sa<is_lvalue_reference<T&&>::value == is_lvalue_ref> t1;
+ sa<is_rvalue_reference<T&&>::value == is_rvalue_ref> t2;
+}
+
+template <bool is_lvalue_ref, bool is_rvalue_ref, class T>
+void
+test2(const T&&) // { dg-message "argument" }
+{
+ sa<is_lvalue_reference<const T&&>::value == is_lvalue_ref> t1;
+ sa<is_rvalue_reference<const T&&>::value == is_rvalue_ref> t2;
+}
+
+template <bool is_lvalue_ref, bool is_rvalue_ref, class T>
+void
+test3(T*&&)
+{
+ sa<is_lvalue_reference<T*&&>::value == is_lvalue_ref> t1;
+ sa<is_rvalue_reference<T*&&>::value == is_rvalue_ref> t2;
+}
+
+struct A {};
+
+A a;
+
+A source() {return A();}
+A* sourcep() {return 0;}
+
+int main()
+{
+ test1<true, false>(a);
+ test1<false, true>(source());
+ test2<false, true>(a); // { dg-error "lvalue" }
+ test2<false, true>(source());
+ test3<false, true>(&a);
+ test3<false, true>(sourcep());
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C
new file mode 100644
index 000000000..7d9a906d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C
@@ -0,0 +1,118 @@
+// Tests for late-specified return type.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5" }
+
+auto f() -> int
+{
+ return 0;
+}
+
+template<class T, class U>
+auto add(T t, U u) -> decltype (t+u)
+{
+ return t+u;
+}
+
+template<class T, class U>
+decltype(T()+U()) add2(T t, U u)
+{
+ return t+u;
+}
+
+template <class T, class U>
+U ag (T, U)
+{
+ return U();
+}
+
+template<class T, class U>
+auto add3(T t, U u) -> decltype (ag(t,u))
+{
+ return ag(t,u);
+}
+
+template<class T, class U>
+decltype(*(T*)0+*(U*)0) add4(T t, U u)
+{
+ return t+u;
+}
+
+template <class T>
+struct A
+{
+ T f() {}
+ template <class U>
+ T g() {}
+ template <class V>
+ struct B
+ {
+ int MEM;
+ };
+};
+
+template <class T>
+auto f(T* t) -> decltype (t->f())
+{
+ return t->f();
+}
+
+template <class T>
+auto g(T t) -> decltype (t.f())
+{
+ return t.f();
+}
+
+template <class T, class U>
+auto h(T t, U u) -> decltype (t.template g<U>())
+{
+ return t.template g<U>();
+}
+
+struct D { };
+struct C: public A<int>::B<D>
+{
+};
+
+template <class T, class U, class V>
+auto k(T t, U u, V v) -> decltype (t.U::template B<V>::MEM)
+{
+ return t.U::template B<V>::MEM;
+}
+
+template <class T>
+auto l(T t) -> decltype (t)
+{
+ return t;
+}
+
+template <class T, T u>
+auto m(T t) -> decltype (u)
+{
+ return t;
+}
+
+A<int> a, *p;
+
+int main()
+{
+ // { dg-final { scan-assembler "_Z3addIidEDTplfp_fp0_ET_T0_" } }
+ auto i = add(1, 2.0);
+ // { dg-final { scan-assembler "_Z4add4IidEDTpldecvPT_Li0EdecvPT0_Li0EES0_S2_" } }
+ auto i4 = add4(1, 2.0);
+ // { dg-final { scan-assembler "_Z4add2IidEDTplcvT__EcvT0__EES0_S1_" } }
+ auto i2 = add2(1, 2.0);
+ // { dg-final { scan-assembler "_Z4add3IidEDTcl2agfp_fp0_EET_T0_" } }
+ auto i3 = add3(1, 2.0);
+ // { dg-final { scan-assembler "_Z1fI1AIiEEDTclptfp_1fEEPT_" } }
+ f(p);
+ // { dg-final { scan-assembler "_Z1gI1AIiEEDTcldtfp_1fEET_" } }
+ g(a);
+ // { dg-final { scan-assembler "_Z1hI1AIiEdEDTcldtfp_1gIT0_EEET_S2_" } }
+ h(a,1.0);
+ // { dg-final { scan-assembler "_Z1kI1C1AIiE1DEDtdtfp_srNT0_1BIT1_EE3MEMET_S4_S6_" } }
+ k( C(), A<int>(), D() );
+ // { dg-final { scan-assembler "_Z1lIiEDtfp_ET_" } }
+ l(1);
+ // { dg-final { scan-assembler "_Z1mIiLi1EEDtT0_ET_" } }
+ m<int,1>(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C
new file mode 100644
index 000000000..888d6f958
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C
@@ -0,0 +1,16 @@
+// PR c++/37967
+// Negative test for auto
+// { dg-do compile { target c++11 } }
+
+auto f1 () -> int;
+auto f2 (); // { dg-error "without trailing return type" "" { target { ! c++1y } } }
+int f3 () -> int; // { dg-error "trailing return type" }
+auto *f4 () -> int; // { dg-error "trailing return type" }
+
+struct A
+{
+ auto f5 () const -> int;
+ auto f6 (); // { dg-error "without trailing return type" "" { target { ! c++1y } } }
+ int f7 () -> int; // { dg-error "trailing return type" }
+ auto *f8 () -> int; // { dg-error "trailing return type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C
new file mode 100644
index 000000000..ced5d5eaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C
@@ -0,0 +1,64 @@
+// More auto/decltype mangling tests.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+template <class T>
+struct B
+{
+ static int i;
+};
+
+int&& x();
+
+template <class T>
+struct A
+{
+ static int i;
+ static int &ir;
+ static int &&irr;
+ template <class U>
+ auto f(U u) -> decltype (u + i);
+ template <class U>
+ auto fr(U u) -> decltype (u + ir);
+ template <class U>
+ auto frr(U u) -> decltype (u + irr);
+ template <class U>
+ auto g(U u) -> decltype (u + sizeof (i));
+ template <class U>
+ auto h(U u) -> decltype (u + B<U>::i);
+ template <class U>
+ auto j(U u) -> decltype (u + x());
+};
+
+template<class T> template<class U>
+auto A<T>::f(U u) -> decltype (u + i)
+{
+ return u + i;
+}
+
+template <class... Args>
+int f (Args... args);
+
+template <class... Args>
+auto g (Args... args) -> decltype (f ((args+1)...))
+{
+ return (f ((args+1)...));
+}
+
+int main()
+{
+ // { dg-final { scan-assembler "_ZN1AIiE1fIiEEDTplfp_L_ZNS0_1iEEET_" } }
+ A<int>().f(1);
+ // { dg-final { scan-assembler "_ZN1AIiE2frIiEEDTplfp_L_ZNS0_2irEEET_" } }
+ A<int>().fr(1);
+ // { dg-final { scan-assembler "_ZN1AIiE3frrIiEEDTplfp_L_ZNS0_3irrEEET_" } }
+ A<int>().frr(1);
+ // { dg-final { scan-assembler "_ZN1AIiE1gIiEEDTplfp_szL_ZNS0_1iEEET_" } }
+ A<int>().g(1);
+ // { dg-final { scan-assembler "_ZN1AIiE1hIiEEDTplfp_sr1BIT_E1iES3_" } }
+ A<int>().h(1);
+ // { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } }
+ A<int>().j(1);
+ // { dg-final { scan-assembler "_Z1gIJidEEDTcl1fspplfp_Li1EEEDpT_" } }
+ g(42, 1.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C
new file mode 100644
index 000000000..0ca96e48d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C
@@ -0,0 +1,12 @@
+// PR c++/38597
+// { dg-do compile { target c++11 } }
+
+template<class T, class U>
+auto f(T,U) -> decltype(T() + U())
+{ return T() + U(); }
+
+template<class T> void g(T){} // { dg-message "note" }
+
+int main() { g(f); } // { dg-error "no matching function" }
+// { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C
new file mode 100644
index 000000000..48f31452e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C
@@ -0,0 +1,10 @@
+// PR c++/38798, DR 770
+// { dg-do compile { target c++11 } }
+
+struct A {};
+auto foo() -> struct A {}
+
+enum B {};
+auto bar() -> enum B {}
+
+auto baz() -> struct C {} {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C
new file mode 100644
index 000000000..023874049
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C
@@ -0,0 +1,6 @@
+// PR c++/49003
+// { dg-do compile { target c++11 } }
+
+struct A {
+ auto a() const -> decltype(this) { return this; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C
new file mode 100644
index 000000000..b3397ea3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C
@@ -0,0 +1,14 @@
+// PR c++/50365
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+
+struct B {
+ B();
+ A* f();
+};
+
+B::B()
+{
+ int(f()->i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C
new file mode 100644
index 000000000..304845e66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C
@@ -0,0 +1,25 @@
+// PR c++/54359
+// { dg-require-effective-target c++11 }
+
+int& ref(int& x) { return x; }
+const int& ref(const int& x) { return x; }
+
+class A {
+ int x;
+ int f() const;
+ auto test1() const -> decltype(this);
+ auto test2() const -> decltype(ref(x));
+ auto test3() const -> decltype(f());
+};
+
+auto A::test1() const -> decltype(this) {
+ return this;
+}
+
+auto A::test2() const -> decltype(ref(x)) {
+ return ref(x);
+}
+
+auto A::test3() const -> decltype(f()) {
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C
new file mode 100644
index 000000000..d7895b38e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C
@@ -0,0 +1,12 @@
+// PR c++/56646
+// { dg-require-effective-target c++11 }
+
+struct A {
+ void f();
+};
+
+void A::f() {
+ struct B {
+ auto g() -> void { }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C
new file mode 100644
index 000000000..9085b71a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C
@@ -0,0 +1,133 @@
+// PR c++/57016
+// { dg-require-effective-target c++11 }
+
+template < typename _Tp, _Tp __v > struct integral_constant
+{
+ static constexpr _Tp value = __v;
+};
+template < bool, typename, typename > struct conditional;
+template < typename ... >struct __and_;
+template
+ <
+ typename
+ _B1,
+ typename
+ _B2 > struct __and_ <_B1, _B2 >:conditional < _B1::value, _B2, _B1 >::type
+{};
+template < typename _Pp > struct __not_:integral_constant < bool, _Pp::value >
+{};
+template < typename > struct add_rvalue_reference;
+template
+ < typename _Tp > typename add_rvalue_reference < _Tp >::type declval ();
+template < bool, typename _Iftrue, typename > struct conditional
+{
+ typedef _Iftrue type;
+};
+template < class, class > struct pair;
+template < typename > class allocator;
+template < typename, typename, typename > struct binary_function;
+template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool >
+{};
+template < typename > struct hash;
+template < >struct hash <int >
+{};
+template
+ <
+ typename,
+ typename,
+ typename,
+ typename, typename, typename, typename, typename > struct _Hashtable_base;
+template
+ <
+ typename,
+ typename
+ > struct __is_noexcept_hash:integral_constant < bool, noexcept ((declval)) >
+{}
+;
+struct _Identity;
+template < bool, bool _Constant_iterators, bool > struct _Hashtable_traits
+ ;
+struct _Mod_range_hashing;
+struct _Default_ranged_hash;
+struct _Prime_rehash_policy;
+template
+ <
+ typename
+ _Tp,
+ typename
+ _Hash
+ >
+ using
+ __cache_default
+ =
+ __not_
+ <
+ __and_
+ <
+ integral_constant
+ < bool, __is_final (_Hash) >, __is_noexcept_hash < _Tp, _Hash > >>;
+template < typename _Key, typename _Value, typename, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename, typename _RehashPolicy, typename _Traits > class _Hashtable:
+_Hashtable_base
+ < _Key, _Value, _ExtractKey, _Equal, _H1, _H2, _RehashPolicy, _Traits >
+{}
+;
+template
+ <
+ bool
+ _Cache > using __uset_traits = _Hashtable_traits < _Cache, true, true >;
+template
+ <
+ typename
+ _Value,
+ typename
+ _Hash
+ =
+ hash
+ <
+ _Value
+ >,
+ typename
+ _Pred
+ =
+ equal_to
+ <
+ _Value
+ >,
+ typename
+ _Alloc
+ =
+ allocator
+ <
+ _Value
+ >,
+ typename
+ _Tr
+ =
+ __uset_traits
+ <
+ __cache_default
+ <
+ _Value,
+ _Hash
+ >::value
+ >
+ >
+ using
+ __uset_hashtable
+ =
+ _Hashtable
+ <
+ _Value,
+ _Value,
+ _Alloc,
+ _Identity,
+ _Pred,
+ _Hash,
+ _Mod_range_hashing, _Default_ranged_hash, _Prime_rehash_policy, _Tr >;
+template < class _Value, class = hash < _Value > >class unordered_set
+{
+ typedef __uset_hashtable < _Value > iterator;
+ template < typename > pair < iterator, bool > emplace ();
+}
+;
+template class unordered_set < int >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C
new file mode 100644
index 000000000..3fed57042
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C
@@ -0,0 +1,86 @@
+// { dg-do compile { target c++11 } }
+
+// [basic.types]/10:
+// Scalar types, trivial class types (Clause 9), arrays of such types and
+// cv-qualified versions of these types (3.9.3) are collectively called
+// trivial types.
+
+// [class]/6:
+// A trivially copyable class is a class that:
+// * has no non-trivial copy constructors (12.8),
+// * has no non-trivial copy assignment operators (13.5.3, 12.8), and
+// * has a trivial destructor (12.4).
+// A trivial class is a class that has a trivial default constructor (12.1)
+// and is trivially copyable.
+
+#include <type_traits>
+
+#define TRY(expr) static_assert (expr, #expr)
+#define YES(type) TRY(std::is_trivial<type>::value); \
+ TRY(std::is_trivial<type[]>::value); \
+ TRY(std::is_trivial<const volatile type>::value)
+#define NO(type) TRY(!std::is_trivial<type>::value); \
+ TRY(!std::is_trivial<type[]>::value); \
+ TRY(!std::is_trivial<const volatile type>::value)
+
+struct A;
+
+YES(int);
+YES(__complex int);
+YES(void *);
+YES(int A::*);
+typedef int (A::*pmf)();
+YES(pmf);
+
+struct A { ~A(); };
+NO(A);
+struct F: public A { int i; };
+NO(F);
+struct G: public A { A a; };
+NO(G);
+struct M { A a; };
+NO(M);
+
+class B
+{
+ int i;
+ __complex int c;
+ void *p;
+ double ar[4];
+ int A::* pm;
+ int (A::*pmf)();
+};
+YES(B);
+struct D: public B { };
+YES(D);
+struct E: public B { int q; };
+YES(E);
+struct D2: public B { };
+YES(D2);
+struct I: public D, public D2 { };
+YES(I);
+
+struct C
+{
+ int i;
+private:
+ int j;
+};
+YES(C);
+struct H: public C { };
+YES(H);
+struct N { C c; };
+YES(N);
+
+struct J { virtual void f(); };
+struct J2: J { };
+NO(J);
+NO(J2);
+struct K { };
+struct L: virtual K {};
+YES(K);
+NO(L);
+
+// PR c++/41421
+struct O { O(int); };
+NO(O);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C
new file mode 100644
index 000000000..11389bfbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+bool operator"" _yn(const char*, size_t);
+
+typedef bool (*pfunk)(const char*, size_t);
+pfunk p = &operator"" _yn;
+
+bool tf = p("Hello,\0 World!", 14);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C
new file mode 100644
index 000000000..d8d672e57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C
@@ -0,0 +1,41 @@
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+class Foo { };
+
+int
+operator"" _Foo(); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(int *); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(unsigned long int); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(double); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(const float *, std::size_t); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(const wchar_t *, int); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(const char16_t *); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(char...); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(unsigned long long int, char); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(const char *, std::size_t, int); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(long double &); // { dg-error "has invalid argument list" }
+
+Foo
+operator"" _Foo(std::size_t, const char16_t *); // { dg-error "has invalid argument list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C
new file mode 100644
index 000000000..4680288d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C
@@ -0,0 +1,38 @@
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+class Foo { };
+
+Foo
+operator"" _Foo(const char *);
+
+Foo
+operator"" _Foo(unsigned long long int);
+
+Foo
+operator"" _Foo(long double);
+
+Foo
+operator"" _Foo(char);
+
+Foo
+operator"" _Foo(wchar_t);
+
+Foo
+operator"" _Foo(char16_t);
+
+Foo
+operator"" _Foo(char32_t);
+
+Foo
+operator"" _Foo(const char *, std::size_t);
+
+Foo
+operator"" _Foo(const wchar_t *, std::size_t);
+
+Foo
+operator"" _Foo(const char16_t *, std::size_t);
+
+Foo
+operator"" _Foo(const char32_t *, std::size_t);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C
new file mode 100644
index 000000000..b9cb8e093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C
@@ -0,0 +1,14 @@
+// PR c++/52521
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+int operator "" _a (const char *);
+int operator "" _a (const char *, std::size_t);
+int a = 123_a;
+int a2 = "abc"_a;
+
+int operator "" _b (const char *, std::size_t);
+int operator "" _b (const char *);
+int b = 123_b;
+int b2 = "abc"_b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C
new file mode 100644
index 000000000..87e00826e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+extern "C" {
+
+int
+operator"" _badclinkage(unsigned long long); // { dg-error "operator with C linkage" }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C
new file mode 100644
index 000000000..3093a7c05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+#include <string>
+
+std::string operator"" _xxx(const char*, size_t);
+
+std::string operator"" _yyy(const char*, size_t);
+
+std::string concat = "Hello, "_xxx "World!"_yyy; // { dg-error "inconsistent user-defined literal suffixes" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C
new file mode 100644
index 000000000..d4f10c297
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+
+#include <string>
+
+std::string operator"" _www(const char*, size_t);
+
+std::string concat01 = "Hello, " "World!"_www;
+
+std::string concat10 = "Hello, "_www "World!";
+
+std::string concat11 = "Hello, "_www "World!"_www;
+
+
+class Tachyon { };
+
+Tachyon operator"" _fast(const char*, size_t);
+
+int operator"" _fast(const char32_t*, size_t);
+
+int speedy01 = "Hello, " U"World!"_fast;
+
+int speedy10 = "Hello, "_fast U"World!";
+
+int speedy11 = "Hello, "_fast U"World!"_fast;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C
new file mode 100644
index 000000000..4c2f7eda3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+constexpr unsigned long long
+operator"" _grow(unsigned long long n)
+{ return 2 * n; }
+
+double buffer[25_grow];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C
new file mode 100644
index 000000000..cb4c35965
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C
@@ -0,0 +1,17 @@
+// { dg-options "-std=c++98" }
+
+#include <cstddef>
+
+int
+operator"" _mm(long double m) // { dg-warning "user-defined literals only available with" }
+{ return int(1000.0L * m); }
+
+int in = 0.0254_mm; // { dg-error "invalid suffix" }
+
+int
+operator"" _Q(const char *, std::size_t) // { dg-warning "user-defined literals only available with" }
+{ return 42; }
+
+int x = "Hello"_Q; // { dg-error "invalid conversion from" "invalid" }
+
+// { dg-error "expected" "expected" { target *-*-* } 15 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C
new file mode 100644
index 000000000..a68e2e020
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+// Check that undeclared literal operator calls and literals give appropriate errors.
+
+int i = operator"" _Bar('x'); // { dg-error "was not declared in this scope" }
+int j = 'x'_Bar; // { dg-error "unable to find character literal operator|with|argument" }
+
+int ii = operator"" _BarCharStr("Howdy, Pardner!"); // { dg-error "was not declared in this scope" }
+int jj = "Howdy, Pardner!"_BarCharStr; // { dg-error "unable to find string literal operator|Possible missing length argument" }
+
+unsigned long long iULL = operator"" _BarULL(666ULL); // { dg-error "was not declared in this scope" }
+unsigned long long jULL = 666_BarULL; // { dg-error "unable to find numeric literal operator" }
+
+long double iLD = operator"" _BarLD(666.0L); // { dg-error "was not declared in this scope" }
+long double jLD = 666.0_BarLD; // { dg-error "unable to find numeric literal operator" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C
new file mode 100644
index 000000000..fef1a5342
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C
@@ -0,0 +1,33 @@
+// { dg-do run { target c++11 } }
+
+// Make sure embedded quotes are not a problem for string and char literals.
+
+#include <cstdint>
+#include <cassert>
+
+int operator"" _embedchar(char)
+{ return 41; }
+
+int operator"" _embedstr(const char*, std::size_t len)
+{ return 42 + len; }
+
+void
+test()
+{
+ int i = '\''_embedchar;
+
+ int j = "\""_embedstr;
+ assert(j == 43);
+
+ int k = "foo\""_embedstr;
+ assert(k == 46);
+
+ int l = "\"bar"_embedstr;
+ assert(l == 46);
+}
+
+int
+main()
+{
+ test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C
new file mode 100644
index 000000000..54d7b7a1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target c++11 } }
+
+long double
+operator"" _Hertz(long double);
+
+class Foo
+{
+public:
+ Foo() { }
+
+ friend Foo operator"" _Bar(char);
+
+ friend long double
+ operator"" _Hertz(long double omega)
+ { return omega / 6.28318530717958648; }
+};
+
+Foo
+operator"" _Bar(char)
+{ return Foo(); }
+
+Foo f1 = operator"" _Bar('x');
+
+Foo f2 = 'x'_Bar;
+
+long double fm1 = operator"" _Hertz(552.92L);
+
+long double fm2 = 552.92_Hertz;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C
new file mode 100644
index 000000000..d69db561b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C
@@ -0,0 +1,51 @@
+// { dg-do run { target c++11 } }
+
+// Test user-defined literals.
+// Test simple operator declaration and definition.
+
+#include <cstring>
+#include <string>
+#include <complex>
+#include <cassert>
+
+long double operator"" _v(long double);
+std::string operator"" _w(const char16_t*, size_t);
+unsigned operator"" _w(const char*);
+
+std::complex<double>
+operator"" _i(long double y)
+{ return std::complex<double>(0.0L, y); }
+
+void
+test1()
+{
+ long double x = operator"" _v(1.2L);
+ assert(x == 2.2L);
+
+ std::string s = operator"" _w(u"one", 3);
+ assert(s == "boo");
+
+ unsigned u = operator"" _w("Hello, World!");
+ assert(u == 13U);
+
+ std::complex<double> i = operator"" _i(2.0);
+ assert(i == std::complex<double>(0.0, 2.0));
+}
+
+int
+main()
+{
+ test1();
+}
+
+long double
+operator"" _v(long double x)
+{ return x + 1.0L; }
+
+std::string
+operator"" _w(const char16_t*, size_t)
+{ return std::string("boo"); }
+
+unsigned
+operator"" _w(const char* str)
+{ return strlen(str); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C
new file mode 100644
index 000000000..ea6095d14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C
@@ -0,0 +1,63 @@
+// { dg-do compile { target c++11 } }
+
+#include <cstdint>
+
+int operator"" _bar (long double);
+
+double operator"" _foo (long long unsigned);
+
+int i = 12_bar; // { dg-error "unable to find numeric literal operator|with|argument" }
+
+double d = 1.2_foo; // { dg-error "unable to find numeric literal operator|with|argument" }
+
+int operator"" _char(char);
+
+int operator"" _wchar_t(wchar_t);
+
+int operator"" _char16_t(char16_t);
+
+int operator"" _char32_t(char32_t);
+
+int cwcx = 'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
+int cc16 = 'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
+int cc32 = 'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" }
+
+int wccx = L'c'_char; // { dg-error "unable to find character literal operator|with|argument" }
+int wcc16 = L'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
+int wcc32 = L'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" }
+
+int c16c = u'c'_char; // { dg-error "unable to find character literal operator|with|argument" }
+int c16wc = u'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
+int c16c32 = u'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" }
+
+int c32c = U'c'_char; // { dg-error "unable to find character literal operator|with|argument" }
+int c32wc = U'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
+int c32c16 = U'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
+
+int operator"" _char_str(const char*, std::size_t);
+
+int operator"" _wchar_t_str(const wchar_t*, std::size_t);
+
+int operator"" _char16_t_str(const char16_t*, std::size_t);
+
+int operator"" _char32_t_str(const char32_t*, std::size_t);
+
+int strwstr = "str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int strstr16 = "str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int strstr32 = "str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+
+int str8wstr = u8"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str8str16 = u8"str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str8str32 = u8"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+
+int wstrstr = L"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int wstrstr16 = L"str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int wstrstr32 = L"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+
+int str16str = u"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str16wstr = u"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str16str32 = u"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+
+int str32str = U"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str32wstr = U"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
+int str32str16 = U"str"_char16_t_str; // { dg-error "unable to find string literal operator string operator|with|arguments" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C
new file mode 100644
index 000000000..fd8b9a05b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+
+// Literal operators can be inline.
+
+inline int
+operator"" _thing1(char cc)
+{ return 42 * cc; }
+
+int operator"" _thing2(char cc);
+
+class Foo
+{
+ int
+ friend operator"" _thing2(char cc)
+ { return 42 * cc; }
+};
+
+int i = operator"" _thing1('x');
+int j = 'x'_thing1;
+
+int iF = operator"" _thing2('x');
+int jF = 'x'_thing2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C
new file mode 100644
index 000000000..3e99807fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+
+extern "C"_badlinkage { // { dg-error "expected unqualified-id before" }
+
+int foo();
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C
new file mode 100644
index 000000000..8840dcdce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C
@@ -0,0 +1,8 @@
+// PR c++/52521
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler "_Zli2_wPKc" } }
+
+int operator "" _w(const char*);
+int main() {
+ 123_w;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C
new file mode 100644
index 000000000..2a3145254
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+class Foo
+{
+public:
+ Foo() { }
+ int operator"" _Bar(char32_t); // { dg-error "must be a non-member function" }
+};
+
+int i = operator"" _Bar(U'x'); // { dg-error "was not declared in this scope" }
+int j = U'x'_Bar; // { dg-error "unable to find character literal operator" }
+
+int
+Foo::operator"" _Bar(char32_t) // { dg-error "must be a non-member function" }
+{ return 42; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C
new file mode 100644
index 000000000..73298900b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C
@@ -0,0 +1,42 @@
+// { dg-do run { target c++11 } }
+
+// Test user-defined literals.
+// Test simple operator declaration and definition in namespaces.
+
+#include <cmath>
+#include <limits>
+
+namespace Long
+{
+ long double operator"" _LL(long double);
+}
+
+namespace Short
+{
+ short
+ operator"" _SS(long double x)
+ { return std::fmod(x, static_cast<long double>(std::numeric_limits<short>::max())); }
+}
+
+void
+test1()
+{
+ long double x = Long::operator "" _LL(1.2L);
+
+ using namespace Short;
+ short s = operator"" _SS(1.2L);
+ short s2 = 1.2_SS;
+}
+
+int
+main()
+{
+ test1();
+}
+
+namespace Long
+{
+ long double
+ operator"" _LL(long double x)
+ { return x + 2.0L; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
new file mode 100644
index 000000000..89c7581ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+// Test user-defined literals.
+// Test error on non-function declaration.
+
+double operator"" _baddecl; // { dg-error "as non-function" }
+
+template<char...>
+ int operator"" _badtmpldecl; // { dg-error "as non-function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C
new file mode 100644
index 000000000..ddaa1aa6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+// Test user-defined literals.
+// Test error on non-empty string after 'operator' keyword.
+
+double operator"hi" _badword(long double); // { dg-error "expected empty string after" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C
new file mode 100644
index 000000000..d1f323884
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+float operator ""_abc(const char*);
+
+int operator""_def(long double);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C
new file mode 100644
index 000000000..790726fb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+char32_t
+operator"" (char32_t C) // { dg-error "expected suffix identifier" }
+{ return C; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C
new file mode 100644
index 000000000..9120ae45d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+// Test user-defined literals.
+// Test warning on declaration without leading underscore.
+
+long double operator"" nounder(long double); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
+
+template<char...>
+ int operator"" nounder(); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C
new file mode 100644
index 000000000..d71f4a240
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+// Can't have *both* literal operator template and raw literal operator.
+
+int
+operator"" _abc(const char*)
+ {
+ return 42;
+ }
+
+template<char...>
+ int
+ operator"" _abc() // { dg-error "literal operator template|conflicts with raw literal operator" }
+ {
+ return 13;
+ }
+
+template<char...>
+ int
+ operator"" _def()
+ {
+ return 12;
+ }
+
+int
+operator"" _def(const char*) // { dg-error "raw literal operator|conflicts with literal operator template" }
+ {
+ return 43;
+ }
+
+int
+operator"" _ghi(long double)
+ {
+ return 42;
+ }
+
+template<char...>
+ int
+ operator"" _ghi() // OK
+ {
+ return 13;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C
new file mode 100644
index 000000000..d7e5e4b1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Woverflow" }
+// PR c++/52654
+int
+operator"" _w(unsigned long long)
+{ return 0; }
+
+int
+operator"" _w(long double)
+{ return 0.0L; }
+
+int i = 12345678901234567890123456789012345678901234567890_w;
+int j = 12345678901234567890123456789.012345678901234567890e+1234567890_w;
+int k = 12345678901234567890123456789.012345678901234567890e-1234567890_w;
+
+// { dg-warning "integer literal exceeds range of " "" { target *-*-* } 12 }
+// { dg-warning "floating literal exceeds range of " "" { target *-*-* } 13 }
+// { dg-warning "floating literal truncated to zero" "" { target *-*-* } 14 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C
new file mode 100644
index 000000000..057978c32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// PR c++/52654
+
+int
+operator"" _w(const char*)
+{ return 0; }
+
+template<char...>
+ int
+ operator"" _tw()
+ { return 0; }
+
+int i = 12345678901234567890123456789012345678901234567890_w;
+int j = 12345678901234567890123456789.012345678901234567890e+1234567890_w;
+int k = 12345678901234567890123456789.012345678901234567890e-1234567890_w;
+
+int ti = 12345678901234567890123456789012345678901234567890_tw;
+int tj = 12345678901234567890123456789.012345678901234567890e+1234567890_tw;
+int tk = 12345678901234567890123456789.012345678901234567890e-1234567890_tw;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C
new file mode 100644
index 000000000..64b6f8266
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+int
+operator"" _badpreproc(const char *str)
+{ return 0; }
+
+#if 123_badpreproc // { dg-error "user-defined literal in preprocessor expression" }
+# error ("user-defined literal in preprocessor expression") // { dg-error "user-defined literal in preprocessor expression" }
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C
new file mode 100644
index 000000000..8969c96d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C
@@ -0,0 +1,27 @@
+// { dg-do compile { target c++11 } }
+// PR c++/50958
+
+typedef decltype(sizeof(0)) size_type;
+
+constexpr size_type
+cstrlen_impl(const char* s, size_type i)
+{
+ return s[i] ? cstrlen_impl(s, i + 1) : i;
+}
+
+constexpr size_type
+cstrlen(const char* s)
+{
+ return s ? cstrlen_impl(s, 0) : throw 0;
+}
+
+constexpr size_type
+operator "" _lenraw(const char* digits)
+{
+ return cstrlen(digits);
+}
+
+static_assert(123_lenraw == 3, "Ouch");
+static_assert(1_lenraw == 1, "Ouch");
+static_assert(012_lenraw == 3, "Ouch");
+static_assert(0_lenraw == 1, "Ouch");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C
new file mode 100644
index 000000000..be68333f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+// Make sure handing a string to a raw literal generates a sensible error message.
+
+int operator"" _embedraw(const char*)
+{ return 41; }
+
+int k = "Boo!"_embedraw; // { dg-error "unable to find string literal operator" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C
new file mode 100644
index 000000000..c3259ed9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C
@@ -0,0 +1,20 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+#include <cstring>
+
+int
+operator"" _raw_umber(const char * str)
+{
+ return strlen(str);
+}
+
+int
+main()
+{
+ int i = 0123012301230123012301230123012301230123012301230123012301230123_raw_umber;
+ assert( i == 64 );
+
+ int j = 90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789_raw_umber;
+ assert( j == 101 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C
new file mode 100644
index 000000000..7ca37b2a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+#include <string>
+
+std::string operator"" _i18n(const char*, std::size_t);
+
+std::string vogon_poem = R"V0G0N(
+ O freddled gruntbuggly thy micturations are to me
+ As plured gabbleblochits on a lurgid bee.
+ Groop, I implore thee my foonting turlingdromes.
+ And hooptiously drangle me with crinkly bindlewurdles,
+ Or I will rend thee in the gobberwarts with my blurlecruncheon, see if I don't.
+
+ (by Prostetnic Vogon Jeltz; see p. 56/57)
+)V0G0N"_i18n;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C
new file mode 100644
index 000000000..4241d0a80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C
@@ -0,0 +1,39 @@
+// { dg-do run { target c++11 } }
+
+#include <cstdint>
+#include <cassert>
+
+int operator"" _foo(const char*) { return 0; }
+int operator"" _foo(unsigned long long int) { return 1; }
+int operator"" _foo(long double) { return 2; }
+int operator"" _foo(char) { return 3; }
+int operator"" _foo(wchar_t) { return 4; }
+int operator"" _foo(char16_t) { return 5; }
+int operator"" _foo(char32_t) { return 6; }
+int operator"" _foo(const char*, std::size_t) { return 7; }
+int operator"" _foo(const wchar_t*, std::size_t) { return 8; }
+int operator"" _foo(const char16_t*, std::size_t) { return 9; }
+int operator"" _foo(const char32_t*, std::size_t) { return 10; }
+template<char...> int operator"" _foo2() { return 20; }
+int operator"" _foo2(unsigned long long int) { return 21; }
+
+namespace bar {
+int operator"" _foo(unsigned long long int) { return 101; }
+}
+using namespace bar;
+
+int
+main()
+{
+ assert(123_foo == 101);
+ assert(0.123_foo == 2);
+ assert('c'_foo == 3);
+ assert(L'c'_foo == 4);
+ assert(u'c'_foo == 5);
+ assert(U'c'_foo == 6);
+ assert("abc"_foo == 7);
+ assert(L"abc"_foo == 8);
+ assert(u"abc"_foo == 9);
+ assert(U"abc"_foo == 10);
+ assert(123_foo2 == 21);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C
new file mode 100644
index 000000000..c63559060
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C
@@ -0,0 +1,49 @@
+// { dg-do compile { target c++11 } }
+
+// Test that the standard suffixes shadow any user-defined suffixes of the same name.
+long double
+operator"" L(long double x) // { dg-warning "floating point suffix|shadowed by implementation" }
+{ return x; }
+
+unsigned long long int
+operator"" ULL(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return k; }
+
+long double
+operator"" l(long double x) // { dg-warning "floating point suffix|shadowed by implementation" }
+{ return x; }
+
+unsigned long long int
+operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return k; }
+
+// Namespaces are no hiding place.
+namespace Long
+{
+
+long double
+operator"" L(long double x) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return x; }
+
+unsigned long long int
+operator"" ULL(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return k; }
+
+long double
+operator"" l(long double x) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return x; }
+
+unsigned long long int
+operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" }
+{ return k; }
+
+}
+
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 5 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 9 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 13 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 17 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 25 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 29 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 33 }
+// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 37 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C
new file mode 100644
index 000000000..acfda45d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C
@@ -0,0 +1,46 @@
+// { dg-do compile { target c++11 } }
+// PR c++/50941
+
+typedef decltype(sizeof(0)) size_type;
+
+constexpr size_type
+operator"" _len(const char*, size_type len)
+{
+ return len;
+}
+
+constexpr size_type
+operator"" _len(const wchar_t*, size_type len)
+{
+ return len;
+}
+
+constexpr size_type
+operator"" _len(const char16_t*, size_type len)
+{
+ return len;
+}
+
+constexpr size_type
+operator"" _len(const char32_t*, size_type len)
+{
+ return len;
+}
+
+static_assert( ""_len == 0, "Ouch");
+static_assert(u8""_len == 0, "Ouch");
+static_assert( L""_len == 0, "Ouch");
+static_assert( u""_len == 0, "Ouch");
+static_assert( U""_len == 0, "Ouch");
+
+static_assert( "1"_len == 1, "Ouch");
+static_assert(u8"1"_len == 1, "Ouch");
+static_assert( L"1"_len == 1, "Ouch");
+static_assert( u"1"_len == 1, "Ouch");
+static_assert( U"1"_len == 1, "Ouch");
+
+static_assert( "123"_len == 3, "Ouch");
+static_assert(u8"123"_len == 3, "Ouch");
+static_assert( L"123"_len == 3, "Ouch");
+static_assert( u"123"_len == 3, "Ouch");
+static_assert( U"123"_len == 3, "Ouch");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C
new file mode 100644
index 000000000..734a0f38a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target stdint_types }
+// PR c++/55582
+
+#include "udlit-string-literal.h"
+
+using namespace my_string_literals;
+
+decltype("Hello, World!"s) s;
+decltype(u8"Hello, World!"s) s8;
+decltype(L"Hello, World!"s) ws;
+decltype(u"Hello, World!"s) s16;
+decltype(U"Hello, World!"s) s32;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h
new file mode 100644
index 000000000..e61034ec4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h
@@ -0,0 +1,22 @@
+#pragma GCC system_header
+
+#include <string>
+
+inline namespace my_string_literals
+{
+ std::string
+ operator"" s(const char* str, std::size_t len)
+ { return std::string{str, len}; }
+
+ std::wstring
+ operator"" s(const wchar_t* str, std::size_t len)
+ { return std::wstring{str, len}; }
+
+ std::u16string
+ operator"" s(const char16_t* str, std::size_t len)
+ { return std::u16string{str, len}; }
+
+ std::u32string
+ operator"" s(const char32_t* str, std::size_t len)
+ { return std::u32string{str, len}; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C
new file mode 100644
index 000000000..7283fed9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+#include <string>
+
+std::string operator"" 5X(const char*, std::size_t); // { dg-error "expected suffix identifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C
new file mode 100644
index 000000000..189e44597
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+
+#include "udlit_system_header"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C
new file mode 100644
index 000000000..de21b6602
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C
@@ -0,0 +1,50 @@
+// { dg-do run { target c++11 } }
+
+// Test user-defined literals.
+// Test template operator declaration and definition.
+
+#include <cassert>
+
+template<char...>
+ int operator"" _abc();
+
+template<>
+ int
+ operator"" _abc<>()
+ { return -1; }
+
+template<>
+ int
+ operator"" _abc<'L','U','E'>()
+ { return 42; }
+
+template<>
+ int
+ operator"" _abc<'6','6','6'>()
+ { return 21; }
+
+int
+test1()
+{
+ int i = operator"" _abc<'1','2','3'>();
+ assert(i == 45);
+ int universal_meaning = operator"" _abc<'L','U','E'>();
+ assert(universal_meaning == 42);
+ int b = operator"" _abc<'6','6','6'>();
+ int z = operator"" _abc<>();
+ assert(z == -1);
+ int j = 123_abc;
+ assert(j == i);
+ int jb = 666_abc;
+ assert(jb == b);
+}
+
+int
+main()
+{
+ test1();
+}
+
+template<char... Chars>
+ int operator"" _abc()
+ { return 42 + sizeof...(Chars); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C
new file mode 100644
index 000000000..678a53e3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+
+template<char...>
+ int operator"" _xyz(unsigned long long); // { dg-error "has invalid argument list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C
new file mode 100644
index 000000000..cec79a5ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+
+template<char...>
+ int operator"" _abc();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
new file mode 100644
index 000000000..f681ecfbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+class Foo { };
+
+template<wchar_t...>
+ Foo operator"" _Foo(); // { dg-error "literal operator template|has invalid parameter list" }
+
+template<char>
+ Foo operator"" _Bar(); // { dg-error "literal operator template|has invalid parameter list" }
+
+template<typename... Type>
+ Foo operator"" _Bar(); // { dg-error "literal operator template|has invalid parameter list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
new file mode 100644
index 000000000..bc7eaf66f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+
+class Foo { };
+
+template<char...>
+ Foo operator"" _Foo();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header
new file mode 100644
index 000000000..d541f24f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header
@@ -0,0 +1,6 @@
+
+#pragma GCC system_header
+
+char
+operator"" stdsuffix(char __c)
+{ return __c/2; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C
new file mode 100644
index 000000000..ff415fc57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C
@@ -0,0 +1,34 @@
+// Negative test for C++11 unrestricted unions
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "implicitly deleted because" }
+
+struct A
+{
+ A();
+ A(const A&);
+ ~A();
+};
+
+union B
+{
+ A a; // { dg-error "union member" }
+};
+
+B b; // { dg-error "B::B\\(\\)" "B::B" }
+B b2(b); // { dg-error "B::B\\(const B&\\)" "B::B" }
+
+struct C
+{
+ union
+ {
+ A a; // { dg-error "union member" }
+ };
+};
+
+C c; // { dg-error "C::C\\(\\)" "C::C" }
+C c2(c); // { dg-error "C::C\\(const C&\\)" "C::C" }
+
+// { dg-error "B::~B" "B::~B" { target *-*-* } 17 }
+// { dg-error "B::~B" "B::~B" { target *-*-* } 18 }
+// { dg-error "C::~C" "C::~C" { target *-*-* } 28 }
+// { dg-error "C::~C" "C::~C" { target *-*-* } 29 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C
new file mode 100644
index 000000000..514409414
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C
@@ -0,0 +1,34 @@
+// Positive test for C++11 unrestricted unions
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ A();
+ A(const A&);
+ ~A();
+};
+
+union B
+{
+ A a;
+ B();
+ B(const B&);
+ ~B();
+};
+
+B b;
+B b2(b);
+
+struct C
+{
+ union
+ {
+ A a;
+ };
+ C();
+ C(const C&);
+ ~C();
+};
+
+C c;
+C c2(c);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C
new file mode 100644
index 000000000..d95d30c6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C
@@ -0,0 +1,68 @@
+// Runtime test for C++11 unrestricted unions
+// { dg-do run { target c++11 } }
+
+int c, d;
+struct A
+{
+ int i;
+ A(): i(1) { ++c; }
+ A(const A&): i(2) { ++c; }
+ ~A() { ++d; }
+};
+
+union B
+{
+ A a;
+ B() { }
+ B(const B& b) { }
+ ~B() { }
+};
+
+struct C
+{
+ union { A a; };
+ C() { }
+ C(const C&) { }
+ ~C() { }
+};
+
+union D
+{
+ A a;
+ D(): a() { }
+ D(const D& d): a(d.a) { }
+ ~D() { a.~A(); }
+};
+
+struct E
+{
+ union { A a; };
+ E(): a() { }
+ E(const E& e): a (e.a) { }
+ ~E() { a.~A(); }
+};
+
+int main()
+{
+ {
+ B b1;
+ B b2(b1);
+
+ C c1;
+ C c2(c1);
+ }
+
+ if (c != 0 || d != 0)
+ return c+d*10;
+
+ {
+ D d1;
+ D d2(d1);
+
+ E e1;
+ E e2(e1);
+ }
+
+ if (c != 4 || d != 4)
+ return c*100+d*1000;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C
new file mode 100644
index 000000000..cf9916dc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C
@@ -0,0 +1,17 @@
+// PR c++/48537
+// { dg-do compile { target c++11 } }
+
+struct SFoo
+{
+ SFoo() =delete; // { dg-message "declared" }
+};
+
+union UFoo // { dg-error "deleted" }
+{
+ SFoo foo;
+};
+
+int main()
+{
+ UFoo(); // { dg-error "deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C
new file mode 100644
index 000000000..8d2bc98da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C
@@ -0,0 +1,24 @@
+// PR c++/49803
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct X
+{
+ X() = delete;
+};
+
+union Y
+{
+ // N3291=11-0061 12.6.2/8 says no initialization of
+ // of other variant members (i.e. m_x) should
+ // be performed.
+ Y() : m_char1{ }
+ { }
+
+ struct
+ {
+ char m_char1;
+ };
+
+ X m_x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C
new file mode 100644
index 000000000..c1b94bb5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C
@@ -0,0 +1,34 @@
+// I, Howard Hinnant, hereby place this code in the public domain.
+
+// Test: Unamed rvalue references are treated as lvalues.
+
+// { dg-do compile { target c++11 } }
+
+template <bool> struct sa;
+template <> struct sa<true> {};
+
+struct one {long x[1];};
+struct two {long x[2];};
+
+struct A {};
+
+one foo(const A&) {return one();}
+two foo(A&&) {return two();}
+
+template<typename _Tp>
+inline _Tp&&
+movel(_Tp& __t)
+{ return static_cast<_Tp&&>(__t); }
+
+A&& source() {static A a; return movel(a);}
+
+int test1()
+{
+ sa<sizeof(foo(source())) == 2 * sizeof(long)> t1;
+ return 0;
+}
+
+int main()
+{
+ return test1();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C
new file mode 100644
index 000000000..50956d21a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C
@@ -0,0 +1,16 @@
+// PR c++/45236
+// { dg-do compile { target c++11 } }
+
+template <class T, class S> class foo;
+
+template<template<int...> class C, int... II, class S>
+struct foo<C<II...>,S>
+{
+ template <class U>
+ struct bar { typedef int type; };
+};
+
+template <int... I>
+struct A {};
+
+foo<A<3>, float>::bar<int> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C
new file mode 100644
index 000000000..74e01ec36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C
@@ -0,0 +1,475 @@
+// { dg-do run { target c++11 } }
+// A basic implementation of TR1's bind using variadic teplates
+// Contributed by Douglas Gregor <doug.gregor@gmail.com>
+#include <cassert>
+
+// Trivial reference_wrapper
+template<typename T>
+struct reference_wrapper
+{
+ reference_wrapper(T& x) : ptr(&x) { }
+
+ operator T&() const { return *ptr; }
+
+ T& get() const { return *ptr; }
+
+ T* ptr;
+};
+
+template<typename T> reference_wrapper<T> ref(T& x) { return x; }
+template<typename T> reference_wrapper<const T> cref(const T& x) { return x; }
+
+// Simple type-traits we'll need
+template<typename T>
+struct add_reference
+{
+ typedef T& type;
+};
+
+template<typename T>
+struct add_reference<T&>
+{
+ typedef T& type;
+};
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+// For creating the constructor parameters of tuple<>
+template<typename T>
+struct add_const_reference
+{
+ typedef const T& type;
+};
+
+template<typename T>
+struct add_const_reference<T&>
+{
+ typedef T& type;
+};
+
+// 6.1.3 Class template tuple: Needed for bind() implementation
+template<typename... Values>
+class tuple;
+
+template<> class tuple<> { };
+
+template<typename Head, typename... Tail>
+class tuple<Head, Tail...>
+ : private tuple<Tail...>
+{
+ typedef tuple<Tail...> inherited;
+
+ public:
+ tuple() { }
+
+ // implicit copy-constructor is okay
+
+ tuple(typename add_const_reference<Head>::type v,
+ typename add_const_reference<Tail>::type... vtail)
+ : m_head(v), inherited(vtail...) { }
+
+ template<typename... VValues>
+ tuple(const tuple<VValues...>& other)
+ : m_head(other.head()), inherited(other.tail()) { }
+
+ template<typename... VValues>
+ tuple& operator=(const tuple<VValues...>& other)
+ {
+ m_head = other.head();
+ tail() = other.tail();
+ return *this;
+ }
+
+ typename add_reference<Head>::type head() { return m_head; }
+ typename add_reference<const Head>::type head() const { return m_head; }
+ inherited& tail() { return *this; }
+ const inherited& tail() const { return *this; }
+
+ protected:
+ Head m_head;
+};
+
+template<typename T>
+struct make_tuple_result
+{
+ typedef T type;
+};
+
+template<typename T>
+struct make_tuple_result<reference_wrapper<T> >
+{
+ typedef T& type;
+};
+
+// 6.1.3.2 Tuple creation functions
+struct ignore_t {
+ template<typename T> ignore_t& operator=(const T&) { return *this; }
+} ignore;
+
+template<typename... Values>
+tuple<typename make_tuple_result<Values>::type...>
+make_tuple(const Values&... values)
+{
+ return tuple<typename make_tuple_result<Values>::type...>(values...);
+}
+
+template<typename... Values>
+tuple<Values&...> tie(Values&... values)
+{
+ return tuple<Values&...>(values...);
+}
+
+// 6.1.3.3 Tuple helper classes
+template<typename Tuple>
+struct tuple_size;
+
+template<>
+struct tuple_size<tuple<> >
+{
+ static const __SIZE_TYPE__ value = 0;
+};
+
+template<typename Head, typename... Tail>
+struct tuple_size<tuple<Head, Tail...> >
+{
+ static const __SIZE_TYPE__ value = 1 + tuple_size<tuple<Tail...> >::value;
+};
+
+template<int I, typename Tuple>
+struct tuple_element;
+
+template<int I, typename Head, typename... Tail>
+struct tuple_element<I, tuple<Head, Tail...> >
+{
+ typedef typename tuple_element<I-1, tuple<Tail...> >::type type;
+};
+
+template<typename Head, typename... Tail>
+struct tuple_element<0, tuple<Head, Tail...> >
+{
+ typedef Head type;
+};
+
+// 6.1.3.4 Element access
+template<int I, typename Tuple>
+class get_impl;
+
+template<int I, typename Head, typename... Values>
+class get_impl<I, tuple<Head, Values...> >
+{
+ typedef typename tuple_element<I-1, tuple<Values...> >::type Element;
+ typedef typename add_reference<Element>::type RJ;
+ typedef typename add_const_reference<Element>::type PJ;
+ typedef get_impl<I-1, tuple<Values...> > Next;
+
+ public:
+ static RJ get(tuple<Head, Values...>& t)
+ { return Next::get(t.tail()); }
+
+ static PJ get(const tuple<Head, Values...>& t)
+ { return Next::get(t.tail()); }
+};
+
+template<typename Head, typename... Values>
+class get_impl<0, tuple<Head, Values...> >
+{
+ typedef typename add_reference<Head>::type RJ;
+ typedef typename add_const_reference<Head>::type PJ;
+
+ public:
+ static RJ get(tuple<Head, Values...>& t) { return t.head(); }
+ static PJ get(const tuple<Head, Values...>& t) { return t.head(); }
+};
+
+template<int I, typename... Values>
+typename add_reference<
+ typename tuple_element<I, tuple<Values...> >::type
+ >::type
+get(tuple<Values...>& t)
+{
+ return get_impl<I, tuple<Values...> >::get(t);
+}
+
+template<int I, typename... Values>
+typename add_const_reference<
+ typename tuple_element<I, tuple<Values...> >::type
+ >::type
+get(const tuple<Values...>& t)
+{
+ return get_impl<I, tuple<Values...> >::get(t);
+}
+
+// 6.1.3.5 Relational operators
+inline bool operator==(const tuple<>&, const tuple<>&) { return true; }
+
+template<typename T, typename... TTail, typename U, typename... UTail>
+bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u)
+{
+ return t.head() == u.head() && t.tail() == u.tail();
+}
+
+template<typename... TValues, typename... UValues>
+bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(t == u);
+}
+
+inline bool operator<(const tuple<>&, const tuple<>&) { return false; }
+
+template<typename T, typename... TTail, typename U, typename... UTail>
+bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u)
+{
+ return (t.head() < u.head() ||
+ (!(t.head() < u.head()) && t.tail() < u.tail()));
+}
+
+template<typename... TValues, typename... UValues>
+bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return u < t;
+}
+
+template<typename... TValues, typename... UValues>
+bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(u < t);
+}
+
+template<typename... TValues, typename... UValues>
+bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(t < u);
+}
+
+// enable_if, the breakfast of champions
+template<bool Cond, typename Type = void>
+struct enable_if {
+ typedef Type type;
+};
+
+template<typename Type>
+struct enable_if<false, Type> { };
+
+// 3.6 Function object binders
+
+// 3.6.1 Class template is_bind_expression
+template<typename T>
+struct is_bind_expression {
+ static const bool value = false;
+};
+
+// 3.6.2 Class template is_placeholder
+template<typename T>
+struct is_placeholder {
+ static const int value = 0;
+};
+
+// 3.6.3 Function template bind
+template<int I> struct placeholder {} ;
+
+template<int N> struct int_c { };
+
+// A tuple of integer values
+template<int...> struct int_tuple {};
+
+// make_indexes_impl is a helper for make_indexes
+template<int I, typename IntTuple, typename... Types>
+struct make_indexes_impl;
+
+
+template<int I, int... Indexes, typename T, typename... Types>
+struct make_indexes_impl<I, int_tuple<Indexes...>, T, Types...>
+{
+ typedef typename make_indexes_impl<I+1,
+ int_tuple<Indexes..., I>,
+ Types...>::type type;
+};
+
+template<int I, int... Indexes>
+struct make_indexes_impl<I, int_tuple<Indexes...> > {
+ typedef int_tuple<Indexes...> type;
+};
+
+// make_indexes takes a variable-length number of N types and
+// generates an int_tuple that contains <0, 1, 2, ..., N-1>. These can
+// be used as indexes for tuple's get or tuple_element operation.
+template<typename... Types>
+struct make_indexes : make_indexes_impl<0, int_tuple<>, Types...> { };
+
+// Get the Ith tuple element, but only if I is in bounds.
+template<int I, typename Tuple, typename = void>
+struct safe_tuple_element{ };
+
+template<int I, typename... Values>
+struct safe_tuple_element<I, tuple<Values...>,
+ typename enable_if<(I >= 0 &&
+ I < tuple_size<tuple<Values...> >::value)
+ >::type>
+{
+ typedef typename tuple_element<I, tuple<Values...> >::type type;
+};
+
+// mu maps a bound argument to an actual argument, given a tuple of
+// the arguments passed to the function object returned by bind().
+
+// Return the stored reference from reference_wrapper
+template<typename T, typename... Args>
+inline T& mu(reference_wrapper<T>& bound_arg, const tuple<Args&...>&)
+{
+ return bound_arg.get();
+}
+
+// Unwrap a tuple into separate arguments and forward to the function
+// object f.
+template<typename F, int... Indexes, typename... Args>
+inline typename F::result_type
+unwrap_and_forward(F& f, int_tuple<Indexes...>, const tuple<Args&...>& args)
+{
+ return f(get<Indexes>(args)...);
+}
+
+// Evaluate the inner bind expression
+template<typename Bound, typename... Args>
+inline typename enable_if<is_bind_expression<Bound>::value,
+ typename Bound::result_type>::type
+mu(Bound& bound_arg, const tuple<Args&...>& args)
+{
+ typedef typename make_indexes<Args...>::type Indexes;
+ return unwrap_and_forward(bound_arg, Indexes(), args);
+}
+
+// Retrieve the Ith argument from args
+template<typename Bound, typename... Args>
+inline typename safe_tuple_element<is_placeholder<Bound>::value - 1,
+ tuple<Args...> >::type
+mu(Bound& bound_arg, const tuple<Args&...>& args)
+{
+ return get<is_placeholder<Bound>::value-1>(args);
+}
+
+// Return the stored value.
+template<typename T>
+struct is_reference_wrapper {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_reference_wrapper<reference_wrapper<T> > {
+ static const bool value = true;
+};
+
+template<typename Bound, typename... Args>
+inline typename enable_if<(!is_bind_expression<Bound>::value
+ && !is_placeholder<Bound>::value
+ && !is_reference_wrapper<Bound>::value),
+ Bound&>::type
+mu(Bound& bound_arg, const tuple<Args&...>&)
+{
+ return bound_arg;
+}
+
+//
+template<typename F, typename... BoundArgs, int... Indexes, typename... Args>
+typename F::result_type
+apply_functor(F& f, tuple<BoundArgs...>& bound_args, int_tuple<Indexes...>,
+ const tuple<Args&...>& args)
+{
+ return f(mu(get<Indexes>(bound_args), args)...);
+}
+
+template<typename F, typename... BoundArgs>
+class bound_functor
+{
+ typedef typename make_indexes<BoundArgs...>::type indexes;
+
+ public:
+ typedef typename F::result_type result_type;
+
+ explicit bound_functor(const F& f, const BoundArgs&... bound_args)
+ : f(f), bound_args(bound_args...) { }
+
+ template<typename... Args>
+ typename F::result_type operator()(Args&... args) {
+ return apply_functor(f, bound_args, indexes(), tie(args...));
+ }
+
+ private:
+ F f;
+ tuple<BoundArgs...> bound_args;
+};
+
+template<typename F, typename... BoundArgs>
+struct is_bind_expression<bound_functor<F, BoundArgs...> > {
+ static const bool value = true;
+};
+
+template<typename F, typename... BoundArgs>
+inline bound_functor<F, BoundArgs...>
+bind(const F& f, const BoundArgs&... bound_args)
+{
+ return bound_functor<F, BoundArgs...>(f, bound_args...);
+}
+
+
+// 3.6.4 Placeholders
+template<int I>
+struct is_placeholder<placeholder<I> > {
+ static const int value = I;
+};
+
+placeholder<1> _1;
+placeholder<2> _2;
+placeholder<3> _3;
+placeholder<4> _4;
+placeholder<5> _5;
+placeholder<6> _6;
+placeholder<7> _7;
+placeholder<8> _8;
+placeholder<9> _9;
+
+// Test code
+template<typename T>
+struct plus {
+ typedef T result_type;
+
+ T operator()(T x, T y) { return x + y; }
+};
+
+template<typename T>
+struct multiplies {
+ typedef T result_type;
+
+ T operator()(T x, T y) { return x * y; }
+};
+
+template<typename T>
+struct negate {
+ typedef T result_type;
+
+ T operator()(T x) { return -x; }
+};
+
+int main()
+{
+ int seventeen = 17;
+ int forty_two = 42;
+
+ assert(bind(plus<int>(), _1, _2)(seventeen, forty_two) == 59);
+ assert(bind(plus<int>(), _1, _1)(seventeen, forty_two) == 34);
+ assert(bind(plus<int>(), _2, _1)(seventeen, forty_two) == 59);
+ assert(bind(plus<int>(), 5, _1)(seventeen, forty_two) == 22);
+ assert(bind(plus<int>(), ref(seventeen), _2)(seventeen, forty_two) == 59);
+ assert(bind(plus<int>(), bind(multiplies<int>(), 3, _1), _2)(seventeen, forty_two)
+ == 93);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C
new file mode 100644
index 000000000..211ede611
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C
@@ -0,0 +1,72 @@
+// { dg-do compile { target c++11 } }
+
+#define ONE
+#define TWO
+#define THREE
+
+struct Something {};
+Something ___;
+
+template <class F>
+struct Trial
+{
+ F f;
+public:
+ Trial() : f() {}
+ Trial( const F& ff ) : f(ff) { }
+ template <typename... Args>
+ struct Sig { typedef int ResultType; };
+
+ template <typename... Args>
+ struct Sig<Something,Args...> { typedef int ResultType; };
+
+#ifdef ONE
+
+template <typename... Args>
+typename Sig<Something,Args...>::ResultType operator()(const Something& s, const Args&... args) const
+{
+ return f(args...);
+}
+#endif
+#ifdef TWO
+template <typename... Args>
+typename Sig<Args...>::ResultType operator()(const Args&... args) const
+{
+ return f(args...);
+}
+#endif
+};
+
+struct Internal
+{
+
+template <typename... Args>
+struct Sig { typedef int ResultType; };
+
+template <typename... Args>
+struct Sig<Something,Args...> { typedef int ResultType; };
+
+template <typename... Args>
+int operator()(const Args&... args) const
+{
+ int n = sizeof...(Args);
+ return n;
+}
+
+ static Trial<Internal>& full() { static Trial<Internal> f; return f; }
+};
+
+static Trial<Internal>& internal = Internal::full();
+
+int main()
+{
+ int n = 0;
+#ifdef ONE
+ n = internal(___,1,2);
+#endif
+#ifdef THREE
+ n = internal(___,1,2,3);
+ n = internal(___,1,2,3,4);
+#endif
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C
new file mode 100644
index 000000000..8b5ee0dd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C
@@ -0,0 +1,17 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/39637
+// { dg-do compile { target c++11 } }
+
+template<class... Types>
+void
+f(Types...)
+{
+ enum {e = sizeof(Types)}; // { dg-error "parameter packs not expanded with '...'" }
+ enum {e1 = sizeof...(Types)};
+}
+
+int
+main()
+{
+ f(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C
new file mode 100644
index 000000000..33b27a540
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C
@@ -0,0 +1,12 @@
+// PR c++/49205
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct A {
+ template<typename ...T> A(T...);
+ A(std::initializer_list<short>);
+ A(std::initializer_list<long>);
+};
+
+A a{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C
new file mode 100644
index 000000000..53182d3e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C
@@ -0,0 +1,22 @@
+// PR c++/55232
+// { dg-do compile { target c++11 } }
+
+struct vector
+{
+ typedef int value_type;
+};
+
+template< class U, class... T >
+struct X
+{
+ void push_back( typename T::value_type ... vals )
+ {
+ U::asoeuth; // { dg-error "" }
+ }
+};
+
+int main()
+{
+ X< int, vector > x;
+ x.push_back( 0 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C
new file mode 100644
index 000000000..b30160409
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+template<typename ... Elements> class Tuple;
+Tuple<>* t; // OK: Elements is empty
+Tuple* u; // { dg-error "template-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C
new file mode 100644
index 000000000..3df356aaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<typename... Types> struct Tuple { };
+
+Tuple<> t0; // Types contains no arguments
+Tuple<int> t1; // Types contains one argument: int
+Tuple<int, float> t2; // Types contains two arguments: int and float
+Tuple<0> error; // { dg-error "mismatch" "mismatch" }
+// { dg-error "expected a type" "expected a type" { target *-*-* } 7 }
+// { dg-error "in declaration" "in declaration" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C
new file mode 100644
index 000000000..9991fa2fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<typename... Types>
+ void f(Types... args);
+
+void g() {
+ f(); // okay: args contains no arguments
+ f(1); // okay: args contains one int argument
+ (2, 1.0); // okay: args contains two arguments, an int and a double
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C
new file mode 100644
index 000000000..bc55b2d55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename... Types>
+ void f(Types... rest);
+
+template<typename... Types>
+ void g(Types... rest) {
+ f(&rest...); // ``&rest...'' is a pack expansion, ``&rest'' is its pattern
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C
new file mode 100644
index 000000000..fe29e7176
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C
@@ -0,0 +1,39 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U> struct is_same {
+ static const bool value = false;
+};
+
+template<typename T> struct is_same<T, T> {
+ static const bool value = true;
+};
+
+template<typename...> struct Tuple {};
+template<typename T1, typename T2> struct Pair {};
+
+template<typename... Args1>
+ struct zip {
+ template<typename... Args2>
+ struct with {
+ typedef Tuple<Pair<Args1, Args2>...> type; // { dg-error "mismatched argument pack" }
+ };
+ };
+
+static_assert
+ (is_same<zip<short, int>::with<unsigned short, unsigned>::type,
+ Tuple<Pair<short, unsigned short>, Pair<int, unsigned> > >::value,
+ "zip");
+
+typedef zip<short>::with<unsigned short, unsigned>::type T2; // error: different number of arguments specified
+ // for Args1 and Args2
+
+template<typename... Args> void f(Args...);
+
+template<typename... Args> void g(Args... args)
+{
+ f(const_cast<const Args*>(&args)...); // okay: ``Args'' and ``args'' are expanded
+ f(5 ...); // { dg-error "contains no argument packs" }
+ f(args); // { dg-error "parameter packs not expanded" }
+ // { dg-message "args" "note" { target *-*-* } 36 }
+ f(h(args...) + args...); // okay: first ``args'' expanded within h, second ``args'' expanded within f.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C
new file mode 100644
index 000000000..600b79868
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+template<class T> class A { /* ... */ };
+template<class T, class U = T> class B { /* ... */ };
+template<class... Types> class C { /* ... */ };
+
+template<template<class> class P> class X { /* ... */ };
+template<template<class...> class Q> class Y { /* ... */ };
+
+X<A> xA; // okay
+X<B> xB; // { dg-error "mismatch" "mismatch" }
+// { dg-error "expected a template" "expected" { target *-*-* } 11 }
+// { dg-error "invalid type" "invalid" { target *-*-* } 11 }
+X<C> xC; // { dg-error "mismatch" "mismatch" }
+// { dg-error "expected a template" "expected" { target *-*-* } 14 }
+// { dg-error "invalid type" "invalid" { target *-*-* } 14 }
+Y<A> yA;
+Y<B> yB;
+Y<C> yC; // okay
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C
new file mode 100644
index 000000000..015d9d840
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<class... Types> struct B { // { dg-error "declaration of" }
+ void f3();
+ void f4();
+};
+
+template<class... Types> void B<Types...>::f3() { } // OK
+template<class... Types> void B<Types>::f4() { } // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C
new file mode 100644
index 000000000..8a723ab75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<class X, class Y, class... Z> X f(Y); // { dg-message "note" }
+void g()
+{
+ int i = f<int>(5.6);
+ int j = f(5.6); // { dg-error "no matching" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 }
+ f<void>(f<int, bool>);
+ f<void>(f<int>); // { dg-error "no matching" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 9 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C
new file mode 100644
index 000000000..26651f74d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+template<class X, class Y, class Z> X f(Y,Z); // { dg-message "note" }
+template<class... Args> void f2();
+void g()
+{
+ f<int,const char*,double>("aa",3.0);
+ f<int,const char*>("aa",3.0); // Z is deduced to be double
+ f<int>("aa",3.0); // Y is deduced to be char*, and
+ // Z is deduced to be double
+ f("aa",3.0); // { dg-error "no matching" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 }
+ f2<char, short, int, long>(); // okay
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C
new file mode 100644
index 000000000..841562f81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename... Types> void f(Types... values);
+
+void g()
+{
+ f<int*, float*>(0, 0, 0); // Types is deduced to the sequence int*, float*, int
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C
new file mode 100644
index 000000000..185a96346
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+template<class...> struct Tuple { };
+
+template<class... Types> void f(Types&...);
+template<class... Types1, class... Types2> void g(Tuple<Types1...>, Tuple<Types2...>);
+
+void h(int x, float& y)
+{
+ const int z = x;
+ f(x, y, z); // Types is deduced to int, const int, float
+ g(Tuple<short, int, long>(), Tuple<float, double>()); // Types1 is deduced to short, int long
+ // Types2 is deduced to float, double
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C
new file mode 100644
index 000000000..c1bf837a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct Tuple { };
+template<typename... Types> char& g(Tuple<Types...>); // #1
+template<typename T1, typename... Types> short& g(Tuple<T1, Types...>); // #2
+template<typename T1, typename... Types> int& g(Tuple<T1, Types&...>); // #3
+
+void f() {
+ // char& x1 = g(Tuple<>()); // calls #1
+ short& y1 = g(Tuple<int, float>()); // calls #2
+ // int& z1 = g(Tuple<int, float&>()); // calls #3
+ // int& z2 = g(Tuple<int>()); // calls #3
+ // int& z3 = g(Tuple<int>()); // calls #3
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C
new file mode 100644
index 000000000..581e4dbee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+template<class> struct X { static const bool primary = true; };
+template<class R, class... ArgTypes> struct X<R(int, ArgTypes...)> {
+ static const bool primary = false;
+};
+template<class... Types> struct Y { static const bool primary = true; };
+template<class T, class... Types> struct Y<T, Types&...> {
+ static const bool primary = false;
+};
+
+static_assert (X<int>::primary, "uses primary template");
+static_assert (!X<int(int, float, double)>::primary,
+ "uses partial specialization");
+static_assert (X<int(float, int)>::primary, "uses primary template");
+static_assert (Y<>::primary, "uses primary template");
+static_assert (!Y<int&, float&, double&>::primary,
+ "uses partial specialization");
+static_assert (Y<int, float, double>::primary, "uses primary template");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C
new file mode 100644
index 000000000..0617b1ae3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args> char& f(Args... args); // #1
+template<typename T1, typename... Args> short& f(T1 a1, Args... args); // #2
+template<typename T1, typename T2> int& f(T1 a2, T2 a3); // #3
+
+void g() {
+ char& x = f(); // calls #1
+ short& y = f(1, 2, 3); // calls #2
+ int& z = f(1, 2); // calls #3
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C
new file mode 100644
index 000000000..605c55bea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+template<class T, class U> struct A { };
+template<class... T, class ... U> void f( A<T,U>... p);
+
+void g() {
+ f<int>(
+ A<int,unsigned>(),
+ A<short,unsigned short>()
+ );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C
new file mode 100644
index 000000000..4a8074529
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C
@@ -0,0 +1,14 @@
+// PR c++/56774
+// { dg-require-effective-target c++11 }
+
+template <class ... Args>
+struct mytype {};
+
+template <class T, class ... Args>
+void something( mytype<T, Args...> )
+{ }
+
+int main()
+{
+ something<int, char, bool>( mytype<int, char, bool>() );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C
new file mode 100644
index 000000000..bb98531c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C
@@ -0,0 +1,95 @@
+// { dg-do run { target c++11 } }
+// A basic implementation of TR1's function using variadic teplates
+// Contributed by Douglas Gregor <doug.gregor@gmail.com>
+#include <cassert>
+
+template<typename Signature>
+class function;
+
+template<typename R, typename... Args>
+class invoker_base
+{
+ public:
+ virtual ~invoker_base() { }
+ virtual R invoke(Args...) = 0;
+ virtual invoker_base* clone() = 0;
+};
+
+template<typename F, typename R, typename... Args>
+class functor_invoker : public invoker_base<R, Args...>
+{
+ public:
+ explicit functor_invoker(const F& f) : f(f) { }
+ R invoke(Args... args) { return f(args...); }
+ functor_invoker* clone() { return new functor_invoker(f); }
+
+ private:
+ F f;
+};
+
+template<typename R, typename... Args>
+class function<R (Args...)> {
+ public:
+ typedef R result_type;
+
+ function() : invoker (0) { }
+
+ function(const function& other) : invoker(0) {
+ if (other.invoker)
+ invoker = other.invoker->clone();
+ }
+
+ template<typename F>
+ function(const F& f) : invoker(0) {
+ invoker = new functor_invoker<F, R, Args...>(f);
+ }
+
+ ~function() {
+ if (invoker)
+ delete invoker;
+ }
+
+ function& operator=(const function& other) {
+ function(other).swap(*this);
+ return *this;
+ }
+
+ template<typename F>
+ function& operator=(const F& f) {
+ function(f).swap(*this);
+ return *this;
+ }
+
+ void swap(function& other) {
+ invoker_base<R, Args...>* tmp = invoker;
+ invoker = other.invoker;
+ other.invoker = tmp;
+ }
+
+ result_type operator()(Args... args) const {
+ assert(invoker);
+ return invoker->invoke(args...);
+ }
+
+ private:
+ invoker_base<R, Args...>* invoker;
+};
+
+struct plus {
+ template<typename T> T operator()(T x, T y) { return x + y; }
+};
+
+struct multiplies {
+ template<typename T> T operator()(T x, T y) { return x * y; }
+};
+
+int main()
+{
+ function<int(int, int)> f1 = plus();
+ assert(f1(3, 5) == 8);
+
+ f1 = multiplies();
+ assert(f1(3, 5) == 15);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C
new file mode 100644
index 000000000..ac072c6b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C
@@ -0,0 +1,55 @@
+// { dg-do run { target c++11 } }
+
+// PR c++/33510
+#define SIZE_FROM_CTOR
+extern "C" void abort ();
+
+template<int M, int N> struct pair
+{
+ int i, j;
+ pair () : i (M), j (N) {}
+};
+
+template<int... M> struct S
+{
+ template<int... N> static int *foo ()
+ {
+#ifdef SIZE_FROM_CTOR
+ static int x[] = { (M + N)..., -1 };
+#else
+ static int x[1 + sizeof... N] = { (M + N)..., -1 };
+#endif
+ return x;
+ }
+};
+
+template<typename... M> struct R
+{
+ template<typename... N> static int *foo ()
+ {
+#ifdef SIZE_FROM_CTOR
+ static int x[] = { (sizeof(M) + sizeof(N))..., -1 };
+#else
+ static int x[1 + sizeof... N] = { (sizeof(M) + sizeof(N))..., -1 };
+#endif
+ return x;
+ }
+};
+
+int *bar ()
+{
+ return S<0, 1, 2>::foo<0, 1, 2> ();
+}
+
+int *baz ()
+{
+ return R<char, short, int>::foo<float, double, long> ();
+}
+
+
+int main ()
+{
+ int *p = bar ();
+ if (p[0] != 0 || p[1] != 2 || p[2] != 4 || p[3] != -1)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C
new file mode 100644
index 000000000..f235c36c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C
@@ -0,0 +1,79 @@
+// { dg-do compile { target c++11 } }
+
+struct int_placeholder;
+
+template<typename T>
+struct do_replace
+{
+ typedef T type;
+};
+
+template<>
+struct do_replace<int_placeholder>
+{
+ typedef int type;
+};
+
+template<typename T> struct lambdalike
+{
+ typedef T type;
+};
+
+template<template<typename...> class TT, typename... Args>
+struct lambdalike<TT<Args...> > {
+ typedef TT<typename do_replace<Args>::type...> type;
+};
+
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+template<typename... Elements> struct tuple;
+template<typename T1, typename T2> struct pair;
+
+static_assert(is_same<lambdalike<tuple<float, int_placeholder, double>>::type,
+ tuple<float, int, double>>::value,
+ "MPL lambda-like replacement on tuple");
+static_assert(is_same<lambdalike<pair<float, int_placeholder>>::type,
+ pair<float, int>>::value,
+ "MPL lambda-like replacement on pair");
+
+
+struct _1 {};
+
+template<typename Arg0, typename Lambda>
+struct eval
+{
+ typedef Lambda type;
+};
+
+template<typename Arg0>
+struct eval<Arg0, _1>
+{
+ typedef Arg0 type;
+};
+
+template<typename Arg0, template<typename...> class T, typename... Pack>
+struct eval<Arg0, T<Pack...> >
+{
+ typedef T< typename eval<Arg0, Pack>::type... > type;
+};
+
+static_assert(is_same<eval<int, tuple<float, _1, double>>::type,
+ tuple<float, int, double>>::value, "eval tuple");
+static_assert(is_same<eval<int, pair<_1, double>>::type,
+ pair<int, double>>::value, "eval pair");
+static_assert(is_same<eval<int,
+ tuple<pair<_1, _1>, pair<float, float>,
+ pair<double, _1>>>::type,
+ tuple<pair<int, int>, pair<float, float>, pair<double, int>>>::value,
+ "recursive eval");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C
new file mode 100644
index 000000000..aca58e394
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C
@@ -0,0 +1,49 @@
+// { dg-do run { target c++11 } }
+// A basic implementation of TR1's mem_fn using variadic teplates
+// Contributed by Douglas Gregor <doug.gregor@gmail.com>
+#include <cassert>
+
+template<typename R, typename Class, typename... Args>
+class Mem_fn
+{
+ public:
+ explicit Mem_fn(R (Class::*pmf)(Args...)) : pmf(pmf) { }
+
+ R operator()(Class& object, Args... args)
+ {
+ return (object.*pmf)(args...);
+ }
+
+ R operator()(Class* object, Args... args)
+ {
+ return (object->*pmf)(args...);
+ }
+
+ R (Class::*pmf)(Args...);
+};
+
+template<typename R, typename Class, typename... Args>
+inline Mem_fn<R, Class, Args...>
+mem_fn(R (Class::* pmf)(Args...))
+{
+ return Mem_fn<R, Class, Args...>(pmf);
+}
+
+class X {
+ public:
+ int negate(int x) { return -x; }
+ int plus(int x, int y) { return x + y; }
+};
+
+int main()
+{
+ X x;
+ X* xp = &x;
+
+ assert(mem_fn(&X::negate)(x, 17) == -17);
+ assert(mem_fn(&X::negate)(xp, 17) == -17);
+ assert(mem_fn(&X::plus)(x, 17, 25) == 42);
+ assert(mem_fn(&X::plus)(xp, 17, 25) == 42);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C
new file mode 100644
index 000000000..af7c86fca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C
@@ -0,0 +1,18 @@
+// { dg-do run { target c++11 } }
+// Contributed by Peter Dimov
+// PR c++/32597
+#include <assert.h>
+#include <new>
+
+int k = 5;
+
+template< class... Args > void f( Args... args )
+{
+ new( &k ) int( args... );
+}
+
+int main()
+{
+ f();
+ assert( k == 0 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C
new file mode 100644
index 000000000..413e0701d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C
@@ -0,0 +1,23 @@
+// { dg-do run { target c++11 } }
+// PR c++/32597
+#include <assert.h>
+#include <new>
+
+template< class... Args > void f( Args... args )
+{
+ {
+ int x = 17;
+ (void)x;
+ }
+
+ {
+ int y(args...);
+ assert(y == 0);
+ }
+
+}
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C
new file mode 100644
index 000000000..4aa5dbab2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+template <class... T>
+void f(T..., int, T...) { }
+
+int main()
+{
+ f(0);
+ f<int>(0,0,0);
+ f<int,int>(0,0,0,0,0);
+ f(0,0,0); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C
new file mode 100644
index 000000000..a82a098c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C
@@ -0,0 +1,25 @@
+// PR c++/55220
+// { dg-do compile { target c++11 } }
+
+template <typename ...> struct something_like_tuple
+{
+
+};
+
+template <typename, typename> struct is_last
+{
+ static const bool value = false;
+};
+
+// Head is non-deducible, so this can't work as the user intended
+template <typename T, template <typename ...> class Tuple, typename ... Head>
+struct is_last<T, Tuple<Head ..., T>>
+{
+ static const bool value = true;
+};
+
+#define SA(X) static_assert (X, #X)
+
+typedef something_like_tuple<char, int, float> something_like_tuple_t;
+SA ((is_last<float, something_like_tuple_t>::value == false));
+SA ((is_last<int, something_like_tuple_t>::value == false));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C
new file mode 100644
index 000000000..ee90c9b87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C
@@ -0,0 +1,36 @@
+// { dg-do compile { target c++11 } }
+// PR c++/33939
+template<typename T>
+struct refs_only;
+
+template<typename T>
+struct refs_only<T &>
+{};
+
+template<typename T>
+refs_only<T> foo( T && t)
+{
+ return refs_only<T>();
+}
+
+template<typename... T>
+struct va_refs_only;
+
+template<typename T>
+struct va_refs_only<T>
+ : refs_only<T>
+{};
+
+template<typename... T>
+va_refs_only<T...> bar( T &&... t)
+{
+ return va_refs_only<T...>();
+}
+
+int main()
+{
+ int j = 0;
+ foo(j);
+ bar(j); // error: invalid use of incomplete type 'struct refs_only<int>'
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C
new file mode 100644
index 000000000..2837c856b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C
@@ -0,0 +1,11 @@
+// PR c++/56679
+// { dg-require-effective-target c++11 }
+
+template <template <typename> class... Args>
+struct Foo {
+ static const int value = sizeof...(Args);
+};
+
+template <typename> struct Bar { };
+
+const int test = Foo<Bar>::value;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C
new file mode 100644
index 000000000..dfc245d16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C
@@ -0,0 +1,14 @@
+// PR c++/57471
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ static constexpr bool value = true;
+};
+
+template<typename... Types>
+struct B
+{
+ static_assert(A::value, "");
+ static_assert(sizeof...(Types) == 0, "");
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C
new file mode 100644
index 000000000..7296500a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C
@@ -0,0 +1,15 @@
+// PR c++/59435
+// { dg-require-effective-target c++11 }
+
+template <typename... E>
+struct T
+{
+ T(unsigned int i = sizeof...(E)){} // does not compile
+
+ static constexpr unsigned int U = sizeof...(E);
+ T(unsigned int j, unsigned int i = U){} // compile
+};
+
+template <typename... T>
+void test(int i = sizeof...(T)) // compile
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C
new file mode 100644
index 000000000..fc81e9d5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+// PR c++/33509
+template<int M, int N> struct pair
+{
+ int i, j;
+ pair() : i(M), j(N) {}
+};
+
+template<int... M> struct S
+{
+ template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched" }
+ {
+ return 1;
+ }
+};
+
+int bar ()
+{
+ return S<0, 1, 2>::foo<0, 1, 3> ();
+}
+
+int wibble()
+{
+ return S<0, 1, 2>::foo<0, 1> (); // { dg-error "no matching" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C
new file mode 100644
index 000000000..5d08d1347
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// PR c++/34101
+template<typename> struct A {};
+
+template<template<typename> class...> struct B {};
+
+template<template<typename> class T> void foo(const B<T>&);
+
+void bar()
+{
+ foo(B<A>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C
new file mode 100644
index 000000000..b1c6b3d78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C
@@ -0,0 +1,293 @@
+// { dg-do run { target c++11 } }
+// An implementation of TR1's <tuple> using variadic teplates
+// Contributed by Douglas Gregor <doug.gregor@gmail.com>
+
+#include <string>
+#include <cassert>
+#include <cstring>
+
+// Trivial reference_wrapper
+template<typename T>
+struct reference_wrapper
+{
+ reference_wrapper(T& x) : ptr(&x) { }
+
+ operator T&() const { return *ptr; }
+
+ T* ptr;
+};
+
+template<typename T> reference_wrapper<T> ref(T& x) { return x; }
+template<typename T> reference_wrapper<const T> cref(const T& x) { return x; }
+
+// Simple type-traits we'll need
+template<typename T>
+struct add_reference
+{
+ typedef T& type;
+};
+
+template<typename T>
+struct add_reference<T&>
+{
+ typedef T& type;
+};
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+// For creating the constructor parameters of tuple<>
+template<typename T>
+struct add_const_reference
+{
+ typedef const T& type;
+};
+
+template<typename T>
+struct add_const_reference<T&>
+{
+ typedef T& type;
+};
+
+// 6.1.3 Class template tuple
+template<typename... Values>
+class tuple;
+
+template<> class tuple<> { };
+
+template<typename Head, typename... Tail>
+class tuple<Head, Tail...>
+ : private tuple<Tail...>
+{
+ typedef tuple<Tail...> inherited;
+
+ public:
+ tuple() { }
+
+ // implicit copy-constructor is okay
+
+ tuple(typename add_const_reference<Head>::type v,
+ typename add_const_reference<Tail>::type... vtail)
+ : m_head(v), inherited(vtail...) { }
+
+ template<typename... VValues>
+ tuple(const tuple<VValues...>& other)
+ : m_head(other.head()), inherited(other.tail()) { }
+
+ template<typename... VValues>
+ tuple& operator=(const tuple<VValues...>& other)
+ {
+ m_head = other.head();
+ tail() = other.tail();
+ return *this;
+ }
+
+ typename add_reference<Head>::type head() { return m_head; }
+ typename add_reference<const Head>::type head() const { return m_head; }
+ inherited& tail() { return *this; }
+ const inherited& tail() const { return *this; }
+
+ protected:
+ Head m_head;
+};
+
+template<typename T>
+struct make_tuple_result
+{
+ typedef T type;
+};
+
+template<typename T>
+struct make_tuple_result<reference_wrapper<T> >
+{
+ typedef T& type;
+};
+
+// 6.1.3.2 Tuple creation functions
+struct ignore_t {
+ template<typename T> ignore_t& operator=(const T&) { return *this; }
+} ignore;
+
+template<typename... Values>
+tuple<typename make_tuple_result<Values>::type...>
+make_tuple(const Values&... values)
+{
+ return tuple<typename make_tuple_result<Values>::type...>(values...);
+}
+
+template<typename... Values>
+tuple<Values&...> tie(Values&... values)
+{
+ return tuple<Values&...>(values...);
+}
+
+// 6.1.3.3 Tuple helper classes
+template<typename Tuple>
+struct tuple_size;
+
+template<>
+struct tuple_size<tuple<> >
+{
+ static const std::size_t value = 0;
+};
+
+template<typename Head, typename... Tail>
+struct tuple_size<tuple<Head, Tail...> >
+{
+ static const std::size_t value = 1 + tuple_size<tuple<Tail...> >::value;
+};
+
+template<int I, typename Tuple>
+struct tuple_element;
+
+template<int I, typename Head, typename... Tail>
+struct tuple_element<I, tuple<Head, Tail...> >
+{
+ typedef typename tuple_element<I-1, tuple<Tail...> >::type type;
+};
+
+template<typename Head, typename... Tail>
+struct tuple_element<0, tuple<Head, Tail...> >
+{
+ typedef Head type;
+};
+
+// 6.1.3.4 Element access
+template<int I, typename Tuple>
+class get_impl;
+
+template<int I, typename Head, typename... Values>
+class get_impl<I, tuple<Head, Values...> >
+{
+ typedef typename tuple_element<I-1, tuple<Values...> >::type Element;
+ typedef typename add_reference<Element>::type RJ;
+ typedef typename add_const_reference<Element>::type PJ;
+ typedef get_impl<I-1, tuple<Values...> > Next;
+
+ public:
+ static RJ get(tuple<Head, Values...>& t)
+ { return Next::get(t.tail()); }
+
+ static PJ get(const tuple<Head, Values...>& t)
+ { return Next::get(t.tail()); }
+};
+
+template<typename Head, typename... Values>
+class get_impl<0, tuple<Head, Values...> >
+{
+ typedef typename add_reference<Head>::type RJ;
+ typedef typename add_const_reference<Head>::type PJ;
+
+ public:
+ static RJ get(tuple<Head, Values...>& t) { return t.head(); }
+ static PJ get(const tuple<Head, Values...>& t) { return t.head(); }
+};
+
+template<int I, typename... Values>
+typename add_reference<
+ typename tuple_element<I, tuple<Values...> >::type
+ >::type
+get(tuple<Values...>& t)
+{
+ return get_impl<I, tuple<Values...> >::get(t);
+}
+
+template<int I, typename... Values>
+typename add_const_reference<
+ typename tuple_element<I, tuple<Values...> >::type
+ >::type
+get(const tuple<Values...>& t)
+{
+ return get_impl<I, tuple<Values...> >::get(t);
+}
+
+// 6.1.3.5 Relational operators
+inline bool operator==(const tuple<>&, const tuple<>&) { return true; }
+
+template<typename T, typename... TTail, typename U, typename... UTail>
+bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u)
+{
+ return t.head() == u.head() && t.tail() == u.tail();
+}
+
+template<typename... TValues, typename... UValues>
+bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(t == u);
+}
+
+inline bool operator<(const tuple<>&, const tuple<>&) { return false; }
+
+template<typename T, typename... TTail, typename U, typename... UTail>
+bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u)
+{
+ return (t.head() < u.head() ||
+ (!(t.head() < u.head()) && t.tail() < u.tail()));
+}
+
+template<typename... TValues, typename... UValues>
+bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return u < t;
+}
+
+template<typename... TValues, typename... UValues>
+bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(u < t);
+}
+
+template<typename... TValues, typename... UValues>
+bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u)
+{
+ return !(t < u);
+}
+
+int a0[tuple_size<tuple<> >::value == 0? 1 : -1];
+int a1[tuple_size<tuple<int, float, double> >::value == 3? 1 : -1];
+int a2a[is_same<tuple_element<0, tuple<int, float, double> >::type, int>
+ ::value? 1 : -1];
+int a2b[is_same<tuple_element<1, tuple<int, float, double> >::type, float>
+ ::value? 1 : -1];
+int a2c[is_same<tuple_element<2, tuple<int, float, double> >::type, double>
+ ::value? 1 : -1];
+
+int main()
+{
+ tuple<> t0;
+ tuple<int> t1(1);
+ tuple<int, float> t2(1, 3.14159f);
+ tuple<int, float, const char*> t3a(1, 3.14159f, "Hello, world!");
+ tuple<long, double, std::string> t3b(t3a);
+ t3b = t3a;
+ // t3a = t3b; DPG: triggers an error, as it should.
+
+ tuple<int, float, std::string> t3c =
+ make_tuple(17, 2.718281828, std::string("Fun"));
+
+ int seventeen = 17;
+ double pi = 3.14159;
+ tuple<int&, double&> seventeen_pi = make_tuple(ref(seventeen), ref(pi));
+ tuple<int&, const double&> seventeen_pi2 =
+ make_tuple(ref(seventeen), cref(pi));
+ tuple<int&, double&> seventeen_pi_tied = tie(seventeen, pi);
+ assert(get<0>(t3a) == 1);
+ assert(get<1>(t3a) == 3.14159f);
+ assert(std::strcmp(get<2>(t3a), "Hello, world!") == 0);
+
+ assert(t3a == t3b);
+ assert(!(t3a != t3b));
+ assert(!(t3a < t3b));
+ assert(!(t3a > t3b));
+ assert(t3a <= t3b && t3b <= t3a);
+ assert(t3a >= t3b && t3b >= t3a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
new file mode 100644
index 000000000..0a7acba61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
@@ -0,0 +1,13 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40155
+// { dg-do compile { target c++11 } }
+
+template <typename T> struct identity
+{ typedef T type; };
+
+template <typename RT, typename... A>
+int forward_call(RT (*) (A...), typename identity<A>::type...);
+
+int g (double);
+
+int i = forward_call(&g, 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C
new file mode 100644
index 000000000..29b528ccc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct tuple { };
+
+template<typename... Args1, typename... Args2>
+void foo(tuple<Args1..., Args2...>, tuple<Args1...>, tuple<Args2...>);
+
+struct X{ };
+
+void bar()
+{
+ tuple<int, float> tif;
+ tuple<double, X> tdx;
+ tuple<int, float, double, X> tall;
+ foo(tall, tif, tdx);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C
new file mode 100644
index 000000000..263640dd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C
@@ -0,0 +1,12 @@
+// PR c++/50086
+// { dg-do compile { target c++11 } }
+
+template<typename T> void tfun();
+template<typename T> void fun1(T);
+template<typename... Types> void fun2(Types... args);
+
+int main()
+{
+ fun1(tfun<int>); // ok
+ fun2(tfun<int>); // error: unresolved overloaded function type
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C
new file mode 100644
index 000000000..179919a5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C
@@ -0,0 +1,24 @@
+// PR c++/52796
+// { dg-do run { target c++11 } }
+
+inline void *operator new(__SIZE_TYPE__ s, void *p) { return p; }
+
+struct A
+{
+ int i;
+ template<class... Ts>
+ A(Ts&&... ts): i(ts...) { }
+};
+
+static union {
+ unsigned char c[sizeof(A)];
+ int i;
+};
+
+int main()
+{
+ i = 0xdeadbeef;
+ new(c) A;
+ if (i != 0)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C
new file mode 100644
index 000000000..ed80849b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename...>
+class tuple;
+
+template<typename... Args>
+class tuple { };
+
+template<typename T1, class... Args>
+class tuple1p { };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C
new file mode 100644
index 000000000..03fa39cd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+template<typename T1, typename T2>
+struct pair {};
+
+template<typename... Args>
+struct tuple {
+ static const int value = 0;
+};
+
+template<>
+struct tuple<pair<int, float> > { };
+
+template<typename... Outer>
+struct X {
+ template<typename... Inner>
+ struct Y
+ {
+ typedef tuple<pair<Outer, Inner>...> type; // { dg-error "mismatched argument pack lengths" }
+ };
+};
+
+X<int, double>::Y<short, char, double>::type honk;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C
new file mode 100644
index 000000000..502601f87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C
@@ -0,0 +1,15 @@
+// PR c++/43143
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+T&& declval();
+
+template<class T, class... Args>
+void test() {
+ T t(declval<Args>()...);
+}
+
+int main() {
+ test<const int>(); // OK
+ test<int[23]>(); // Error
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C
new file mode 100644
index 000000000..8bcedfff6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C
@@ -0,0 +1,23 @@
+// PR c++/43382
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct Container
+{ T f() const; };
+
+template<class T>
+T deref(const T& t)
+{ return t; }
+
+
+template <class T, class... Args>
+auto
+deref(const T& u, int r, Args... args)
+-> decltype(deref(u.f(), args...))
+{ return deref(u.f(), args...); }
+
+int main(void)
+{
+ Container<Container<int>> v;
+ deref(v,1,2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C
new file mode 100644
index 000000000..9214b01c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+struct nAny {
+ template<class... T>
+ nAny(T&&...);
+};
+
+template<class T>
+T&& create();
+
+template<class T, class... Args>
+void test() {
+ T t(create<Args>()...);
+ (void) t;
+}
+
+int main() {
+ test<nAny>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C
new file mode 100644
index 000000000..69510e61b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template<class T, class... Args>
+void test() {
+ T t(create<Args>()...); // { dg-error "incomplete" }
+ (void) t;
+}
+
+int main() {
+ test<int[]>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C
new file mode 100644
index 000000000..4ba384c72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C
@@ -0,0 +1,25 @@
+// PR c++/47289
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+template <template <typename... __ARGS> class _F, typename... _ARGS>
+auto reverse (_ARGS... args) -> decltype(_F<_ARGS...>::call_function(args...)) {
+ return _F<_ARGS...>::call_function(args...);
+}
+
+template <typename _T>
+_T sum(_T x) { return x; }
+
+template <typename _T, typename... _ARGS>
+_T sum(_T x, _ARGS... args) { return x + sum(args...); }
+
+template <typename _T, typename... _ARGS>
+struct call_sum {
+ static _T call_function(_T x1, _ARGS... args) { return sum(x1, args...); }
+};
+
+int main() {
+ // This shouldn't be an error; this is bug 35722.
+ reverse<call_sum>(1,2); // { dg-bogus "no match" "" }
+ // { dg-bogus "sorry, unimplemented" "candidate explanation" { target *-*-* } 6 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C
new file mode 100644
index 000000000..efa4c34cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C
@@ -0,0 +1,21 @@
+// Origin: PR c++/47326
+// { dg-do compile { target c++11 } }
+
+template <int _N>
+struct A
+{
+ typedef int value_type;
+};
+
+template <typename... _ARGS>
+auto
+f (_ARGS... args) -> typename A<sizeof...(args)>::value_type
+{
+ return 12;
+}
+
+int
+main()
+{
+ f(1,2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C
new file mode 100644
index 000000000..d22f87c1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C
@@ -0,0 +1,15 @@
+// PR c++/48451
+// { dg-do compile { target c++11 } }
+
+namespace std {
+ template <class T> T&& declval();
+}
+
+template<class T, class... Args,
+ class = decltype(T(std::declval<Args>()...))
+ >
+char f(int);
+
+struct From2Ints { From2Ints(int, int); };
+
+static_assert(sizeof(f<From2Ints, int, int>(0)) == 1, "Error"); // b
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C
new file mode 100644
index 000000000..2e396c6f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C
@@ -0,0 +1,10 @@
+// PR c++/48736
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& create();
+
+template<class T, class... Args,
+ class = decltype(T{create<Args>()...}) // Line X
+>
+char f(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C
new file mode 100644
index 000000000..3ecfb7398
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C
@@ -0,0 +1,17 @@
+// PR c++/48292
+// { dg-do compile { target c++11 } }
+
+template <typename... Args> int g(Args...);
+
+template <int N = 0>
+struct A
+{
+ template <typename... Args>
+ static auto f(Args... args) -> decltype(g(args...));
+};
+
+int main()
+{
+ A<>::f();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C
new file mode 100644
index 000000000..2bdeb3226
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct count;
+
+template<>
+struct count<> {
+ static const int value = 0;
+};
+
+template<typename T, typename... Args>
+struct count<T, Args...> {
+ static const int value = 1 + count<Args...>::value;
+};
+
+int a0[count<>::value == 0? 1 : -1];
+int a1[count<char>::value == 1? 1 : -1];
+int a2[count<char, short>::value == 2? 1 : -1];
+int a3[count<char, short, int>::value == 3? 1 : -1];
+int a4[count<char, short, int, long>::value == 4? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C
new file mode 100644
index 000000000..47a9ed9a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C
@@ -0,0 +1,15 @@
+// PR c++/45698
+// { dg-do compile { target c++11 } }
+
+template <class... Ts> struct tuple { };
+
+template<class... Ts>
+struct A {
+ template<typename T> struct N { };
+ tuple<N<Ts>...> tup;
+};
+
+int main()
+{
+ A<int, double> a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C
new file mode 100644
index 000000000..09bac287a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C
@@ -0,0 +1,20 @@
+// PR c++/48424
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+template<typename... Args1>
+struct S
+{
+ template<typename... Args2>
+ void f(Args1... args1, Args2&&... args2)
+ {
+ }
+};
+
+int main()
+{
+ S<int, double> s;
+ s.f(1,2.0,false,'a');
+}
+
+// { dg-final { scan-assembler "_ZN1SIJidEE1fIJbcEEEvidDpOT_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C
new file mode 100644
index 000000000..50d7e943a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C
@@ -0,0 +1,19 @@
+// PR c++/49420
+// { dg-do compile { target c++11 } }
+
+struct A { };
+
+template <class T> struct B
+{
+ typedef typename T::type type ; // { dg-error "no type" }
+};
+
+template <typename Array, typename... Args>
+typename B<Array>::type
+get(const Array& a, Args... args);
+
+int main()
+{
+ A a;
+ int x = get(a, 1, 2, 3); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C
new file mode 100644
index 000000000..8f02fed04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C
@@ -0,0 +1,21 @@
+// PR c++/49251
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-parameter" }
+
+struct A {};
+template <int> int f(A);
+
+template< int... Indices >
+struct indices {};
+
+template< class... Args >
+void sink( Args&&... ) {}
+
+template< class T, int... Indices >
+void unpack_test( T && t, indices<Indices...> ) {
+ sink( f<Indices>(t)... );
+}
+
+int main() {
+ unpack_test( A(), indices<>() );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C
new file mode 100644
index 000000000..82ffe83c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C
@@ -0,0 +1,27 @@
+// PR c++/49785
+// { dg-do compile { target c++11 } }
+
+template <typename, typename ...> struct B { };
+template <typename> class A;
+
+template <typename R, typename ... S>
+struct A <R (S ...)> : public B <R, S ...>
+{
+ struct C {};
+ template <typename D> A (D, C = C ()) { }
+ R operator () (...);
+};
+
+template <typename R, typename ... S, typename T>
+auto operator >> (A <R (S ...)>, T)->A <R (S ...)>
+{
+ []() {};
+}
+
+int
+main ()
+{
+ A <int (int, int)> a = [](int, int) {};
+ auto b = []{};
+ (a >> b) (3, 5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C
new file mode 100644
index 000000000..bb781859c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C
@@ -0,0 +1,19 @@
+// PR c++/49593
+// { dg-do compile { target c++11 } }
+
+template<typename... T> void f(T...) { }
+
+template<typename... Args>
+static void
+g(Args&&... args)
+{
+ f( static_cast<Args>(args)... );
+ f( (Args)args... );
+ f( Args(args)... );
+ f( Args{args}... );
+}
+
+int main()
+{
+ g(1, '2', 3.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C
new file mode 100644
index 000000000..05a9a79f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C
@@ -0,0 +1,32 @@
+// Origin: PR c++/48320
+// { dg-do compile { target c++11 } }
+
+template<class... T>
+struct tuple
+{
+ typedef int type;
+};
+
+template<int... Indices>
+struct indices
+{
+};
+
+template<unsigned i, class Tuple>
+struct tuple_element
+{
+ typedef Tuple type;
+};
+
+template<class Tuple,
+ int... Indices,
+ class Result = tuple<typename tuple_element<Indices, Tuple>::type...> >
+Result
+f(Tuple&&, indices<Indices...>);
+
+
+void
+foo()
+{
+ f(tuple<int, char, unsigned> (), indices<2, 1, 0> ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C
new file mode 100644
index 000000000..04663d2b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+template <class T> struct A { typedef T type; };
+
+template <template <class...> class T, class... U>
+void f(typename T<U...>::type);
+
+int main()
+{
+ f<A,int>(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C
new file mode 100644
index 000000000..ee742ebb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C
@@ -0,0 +1,11 @@
+// This should fail deduction, before it produces a candidate.
+// { dg-do compile { target c++11 } }
+
+template <class... T>
+void f(T... ts); // { dg-message "deduction" }
+
+struct B { };
+int main()
+{
+ f<int>(B(), 1); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C
new file mode 100644
index 000000000..78cd23e20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C
@@ -0,0 +1,13 @@
+// PR c++/51046
+// { dg-do compile { target c++11 } }
+
+template<int... IS>
+void f()
+{
+ for (int i : IS); // { dg-error "not expanded" }
+}
+
+int main()
+{
+ f<0, 1, 2>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C
new file mode 100644
index 000000000..661ed3d49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+// A tuple type
+template<typename... Args> struct tuple { };
+
+// Determine if two types are the same
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+// Append 'T' to the end of Tuple
+template<typename T, typename Tuple>
+struct append_to_tuple;
+
+template<typename T, typename... Args>
+struct append_to_tuple<T, tuple<Args...> > {
+ typedef tuple<Args..., T> type;
+};
+
+// Reverse a sequence of arguments (and return the result as a tuple)
+template<typename... Args> struct reverse;
+
+template<typename T, typename... Args>
+struct reverse<T, Args...> {
+ typedef typename append_to_tuple<T, typename reverse<Args...>::type>::type
+ type;
+};
+
+template<>
+struct reverse<> {
+ typedef tuple<> type;
+};
+
+int a0[is_same<reverse<>::type, tuple<> >::value? 1 : -1];
+int a1[is_same<reverse<int>::type, tuple<int> >::value? 1 : -1];
+int a2[is_same<reverse<char, int>::type, tuple<int, char> >::value? 1 : -1];
+int a3[is_same<reverse<char, int, long>::type, tuple<long, int, char> >::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C
new file mode 100644
index 000000000..e26ee4e9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C
@@ -0,0 +1,24 @@
+// PR c++/48322
+// { dg-do compile { target c++11 } }
+
+template <class... T> struct tuple;
+template <class T> struct tuple<T> { T t; };
+
+template <class T, class U> struct pair;
+template<> struct pair<int,double> { };
+
+template <class... Ts>
+struct A
+{
+ template <class... Us,
+ class V = tuple<pair<Ts,Us>...> >
+ static void f()
+ {
+ V v;
+ }
+};
+
+int main()
+{
+ A<int>::f<double>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C
new file mode 100644
index 000000000..21121962d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C
@@ -0,0 +1,12 @@
+// PR c++/51507
+// { dg-do compile { target c++11 } }
+
+template<typename ...>
+struct foo { typedef void type; };
+template<typename ...Ts>
+auto g(Ts ...ts)->
+ typename foo<decltype(ts)...>::type
+{}
+int main() {
+ g(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C
new file mode 100644
index 000000000..aa21ddddd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C
@@ -0,0 +1,23 @@
+// PR c++/52043
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wreturn-type" }
+
+template < class T > struct Container
+{
+ T f ();
+};
+
+template < class T >
+T deref (T)
+{} // { dg-warning "no return" }
+
+template < class T, class ... Args >
+auto deref (T u, int, Args ... args)->decltype (deref (u.f (), args ...))
+{} // { dg-warning "no return" }
+
+void
+foo ()
+{
+ Container < Container < int > > v;
+ deref (v, 2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C
new file mode 100644
index 000000000..f0ab9fc22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C
@@ -0,0 +1,14 @@
+// PR c++/52824
+// { dg-do compile { target c++11 } }
+
+template<typename G, typename H>
+struct foo
+{};
+
+template<typename... G>
+struct bar : foo<G...>
+{};
+
+int main() {
+ bar<int, float> f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C
new file mode 100644
index 000000000..d69c6f912
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C
@@ -0,0 +1,29 @@
+// PR c++/52292
+// { dg-do compile { target c++11 } }
+
+template <template <typename...> class T>
+struct foo {
+ template <typename... U>
+ foo(T<U...> x) { }
+};
+
+template <typename T>
+struct bar {
+ bar(T x) : value(x) { }
+
+ T value;
+};
+
+struct generic : private foo<bar> {
+ template <typename T>
+ generic(bar<T> x) : foo(x)
+ {
+ }
+
+};
+
+int main()
+{
+ bar<int> x(32);
+ generic y(x); // FAILS
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C
new file mode 100644
index 000000000..89fd6b00d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C
@@ -0,0 +1,25 @@
+// PR c++/52380
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct S
+{
+ template<typename U>
+ struct Unary // Line 5
+ {};
+
+ template<unsigned, typename... Args>
+ struct Dispatch // Line 9
+ : public Unary<Args...>
+ {};
+
+ template<typename... Args>
+ struct Variadic
+ : public Dispatch<sizeof...(Args), Args...>
+ {};
+};
+
+int main()
+{
+ S<void>::Variadic<void> z;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C
new file mode 100644
index 000000000..513c7e54a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C
@@ -0,0 +1,8 @@
+// PR c++/47220
+// { dg-do compile { target c++11 } }
+
+template < typename ... > struct A;
+
+struct B : A < // { dg-error "invalid" }
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C
new file mode 100644
index 000000000..2e0d593ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C
@@ -0,0 +1,15 @@
+// PR c++/51148
+// { dg-do compile { target c++11 } }
+
+template<typename... Types>
+struct S
+{};
+
+template<typename... Types>
+struct T
+{
+ friend class S<Types>; // { dg-error "parameter packs not expanded" }
+};
+
+int main()
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C
new file mode 100644
index 000000000..8c2d3b233
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C
@@ -0,0 +1,16 @@
+// PR c++/50303
+// { dg-do compile { target c++11 } }
+
+template<typename Interface>
+struct A1 {
+};
+
+template<template<class I> class... Actions>
+void g2() {
+ g2<Actions...>();
+}
+
+int main()
+{
+ g2<A1>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C
new file mode 100644
index 000000000..711830141
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C
@@ -0,0 +1,19 @@
+// PR c++/50830
+// { dg-do compile { target c++11 } }
+
+template<template<class> class...>
+struct list_templates {};
+
+template<class>
+struct aa {};
+
+template<class... T>
+struct test {};
+
+template<template<class> class... F, class T>
+struct test<list_templates<F...>, T>
+{
+ struct inner {};
+};
+
+test<list_templates<aa>, int> a4; // error
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C
new file mode 100644
index 000000000..8a59c981a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args> struct tuple1 { };
+template<typename... Args> struct tuple2 { };
+
+template<typename T, typename U>
+struct same_tuple_args {
+ static const bool value = false;
+};
+
+template<typename... Args>
+struct same_tuple_args<tuple1<Args...>, tuple2<Args...> > {
+ static const bool value = true;
+};
+
+int same0[same_tuple_args<tuple1<>, tuple2<> >::value? 1 : -1];
+int same1[same_tuple_args<tuple1<int>, tuple2<int> >::value? 1 : -1];
+int same2[same_tuple_args<tuple1<float, int>, tuple2<float, int> >::value? 1 : -1];
+int diff0[!same_tuple_args<tuple1<>, tuple2<int> >::value? 1 : -1];
+int diff1[!same_tuple_args<tuple1<int, float>, tuple2<float, int> >::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C
new file mode 100644
index 000000000..f73c8b512
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C
@@ -0,0 +1,8 @@
+// PR c++/52008
+// { dg-do compile { target c++11 } }
+
+template <int I, typename T, typename... Ts>
+struct A;
+
+template<typename... Ts>
+struct A<0, Ts...>; // { dg-error "not more specialized" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C
new file mode 100644
index 000000000..3006f87ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C
@@ -0,0 +1,11 @@
+// PR c++/38543
+// { dg-do compile { target c++11 } }
+
+template< typename ... T > void foo( T ... args );
+template<> void foo( ){}
+template<> void foo(int,double){}
+int main()
+{
+ foo( 0, 0.0 );
+ return 55;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C
new file mode 100644
index 000000000..1b9c28686
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C
@@ -0,0 +1,27 @@
+// PR c++/53305
+// { dg-do compile { target c++11 } }
+
+template<class... Ts> struct tuple { };
+
+struct funct
+{
+ template<class... argTs>
+ int operator()(argTs...);
+};
+
+template<class...> struct test;
+
+template<template <class...> class tp,
+ class... arg1Ts, class... arg2Ts>
+struct test<tp<arg1Ts...>, tp<arg2Ts...>>
+{
+ template<class func, class...arg3Ts>
+ auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s)
+ -> decltype(fun(arg1s..., arg3s...));
+};
+
+int main()
+{
+ test<tuple<>, tuple<char,int>> t2;
+ t2.test2(funct(), 'a', 2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C
new file mode 100644
index 000000000..0265f0991
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C
@@ -0,0 +1,46 @@
+// PR c++/53039
+// { dg-do compile { target c++11 } }
+
+template <class, class>
+struct is_convertible
+{
+ static const bool value = true;
+};
+
+template<bool, class T>
+struct enable_if
+{
+ typedef T type;
+};
+
+template <bool...>
+struct Xs
+{
+ static const bool value = true;
+};
+
+template<typename... BTs>
+ class BType
+ {
+ template <typename... BUs,
+ typename enable_if<
+ Xs<is_convertible<BUs, BTs>::value...>::value,
+ bool>::type = false>
+ void fooX(BUs&&...);
+ };
+
+template <typename... ATs>
+ struct AType
+ {
+ template <typename... AUs,
+ typename enable_if<
+ Xs<is_convertible<AUs, ATs>::value...>::value,
+ bool>::type = false>
+ void foo(AUs&&...);
+ };
+
+int main()
+{
+ AType<int, int> t;
+ t.foo(1, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C
new file mode 100644
index 000000000..d4181b02c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C
@@ -0,0 +1,17 @@
+// PR c++/53862
+// { dg-do compile { target c++11 } }
+
+typedef unsigned long size_t;
+
+template<typename> struct is_scalar { static const bool value = true; };
+template<bool, typename T> struct enable_if { typedef T type; };
+
+template <size_t N, typename... Args>
+void f(Args...) {}
+
+template <size_t N, typename T, typename... Args>
+typename enable_if<is_scalar<T>::value, void>::type f(T, Args...) {}
+
+int main() {
+ f<1>(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C
new file mode 100644
index 000000000..fcdd2a718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++11 } }
+
+template <typename ...> struct S;
+
+int i = S<int,>::undefined; // { dg-error "template argument 2 is invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C
new file mode 100644
index 000000000..a1c64f30f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C
@@ -0,0 +1,14 @@
+// Origin: PR c++/53609
+// { dg-do compile { target c++11 } }
+
+template<class...I> struct List {};
+template<int T> struct Z {static const int value = T;};
+template<int...T> using LZ = List<Z<T>...>;
+
+template<class...U>
+struct F
+{
+ using N = LZ<U::value...>;
+};
+
+F<Z<1>, Z<2> >::N A;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C
new file mode 100644
index 000000000..addbd7479
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+template<typename R, typename... ArgTypes>
+struct make_function_type
+{
+ typedef R type(ArgTypes...);
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1];
+int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1];
+int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1];
+int a3[is_same<make_function_type<int, float, double>::type, int(float, double)>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C
new file mode 100644
index 000000000..17ca9e5fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C
@@ -0,0 +1,22 @@
+// Origin: PR c++/53609
+// { dg-do compile { target c++11 } }
+
+template<class...I> struct List{ static const bool is_ok = false;};
+template<int T> struct Z
+{
+ static const int value = T;
+ static const int value_square = T * T;
+};
+
+template<template<int> class U>
+struct List<U<2>, U<3>, U<4>, U<9>> { static const bool is_ok = true;};
+
+template<int...T> using LZ = List<Z<T>...>;
+
+template<class...T>
+struct F
+{
+ using N = LZ<T::value..., T::value_square...>;
+};
+
+static_assert (F<Z<2>, Z<3>>::N::is_ok, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C
new file mode 100644
index 000000000..6b893a77c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C
@@ -0,0 +1,22 @@
+// Origin: PR c++/53609
+// { dg-do compile { target c++11 } }
+
+template<class...I> struct List{ static const bool is_ok = false;};
+template<int T> struct Z
+{
+ static const int value = T;
+ static const int value_square = T * T;
+};
+
+template<template<int> class U>
+struct List<U<2>, U<3>, U<4>, U<9>> { static const bool is_ok = true;};
+
+template<int...T> using LZ = List<Z<T>...>;
+
+template<class...T>
+struct F
+{
+ using N = LZ<T::value..., Z<4>::value, Z<9>::value>;
+};
+
+static_assert (F<Z<2>, Z<3>>::N::is_ok, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C
new file mode 100644
index 000000000..83b2429a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C
@@ -0,0 +1,9 @@
+// Core 1609
+// { dg-require-effective-target c++11 }
+
+template<typename... T>
+void f2(int a = 0, T... b, int c = 1);
+
+int main(){
+ f2<>(); // parameter a has the value 0 and parameter c has the value 1
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C
new file mode 100644
index 000000000..db0b268e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C
@@ -0,0 +1,63 @@
+// PR c++/56782
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& declval();
+
+struct is_convertible_impl {
+ template<class T>
+ static void sink(T);
+
+ template<class T, class U, class = decltype(sink<U>(declval<T>()))>
+ static auto test(int) -> char;
+
+ template<class, class>
+ static auto test(...) -> char(&)[2];
+};
+
+template<class T, class U>
+struct is_convertible : is_convertible_impl
+{
+ static const bool value = sizeof(test<T, U>(0)) == 1;
+};
+
+template<bool, class>
+struct enable_if {};
+
+template<class T>
+struct enable_if<true, T> { typedef T type; };
+
+template<bool, class If, class Else>
+struct conditional { typedef If type; };
+
+template<class If, class Else>
+struct conditional<false, If, Else> { typedef Else type; };
+
+template<class...>
+struct and_;
+
+template<>
+struct and_<>
+{
+ static const bool value = true;
+};
+
+template<class P>
+struct and_<P> : P
+{
+};
+
+template<class P1, class P2>
+struct and_<P1, P2> : conditional<P1::value, P2, P1>::type
+{
+};
+
+template<class... T>
+struct Tuple {
+ template<class... U,
+ class = typename enable_if<and_<is_convertible<U, T>... >::value, int>::type
+ >
+ Tuple(U&&...){}
+};
+
+static_assert(is_convertible<Tuple<>, Tuple<>>::value, "Ouch"); //#1
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C
new file mode 100644
index 000000000..5d05d3d52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C
@@ -0,0 +1,15 @@
+// PR c++/56060
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct baz { };
+template<typename T> T bar();
+
+template<typename T, typename ... U>
+baz<decltype(bar<T>()(bar<U> ...))> // { dg-error "cannot be used" }
+foo();
+
+int main()
+{
+ foo<int>(); // { dg-error "no matching" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C
new file mode 100644
index 000000000..65edda59f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C
@@ -0,0 +1,13 @@
+// PR c++/59730
+// { dg-do compile { target c++11 } }
+
+template <typename> void declval();
+template <typename> void forward();
+template <typename> class D;
+template <typename _Functor, typename... _Bound_args>
+class D <_Functor(_Bound_args...)> {
+ template <typename... _Args, decltype(declval<_Functor>)>
+ void operator()(...) {
+ 0(forward<_Args>...);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C
new file mode 100644
index 000000000..0c91db581
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C
@@ -0,0 +1,9 @@
+// PR c++/58606
+// { dg-require-effective-target c++11 }
+
+template<int&...I> struct A
+{
+ template<typename> struct B;
+
+ template<typename T> struct B<T*> {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C
new file mode 100644
index 000000000..7f606d84a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C
@@ -0,0 +1,10 @@
+// PR c++/58466
+// { dg-require-effective-target c++11 }
+
+template<char, char...> struct A;
+
+template<typename> struct B;
+
+template<char... C> struct B<A<C...>> {};
+
+B<A<'X'>> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C
new file mode 100644
index 000000000..a4ee63533
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C
@@ -0,0 +1,6 @@
+// PR c++/59989
+// { dg-require-effective-target c++11 }
+
+template<typename T> struct X {};
+template<template<typename...> class D, typename ...U> int test(D<U...>*);
+int n = test<X, int>(0); // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C
new file mode 100644
index 000000000..8207d9832
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C
@@ -0,0 +1,12 @@
+// PR c++/60248
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -fabi-version=2" }
+
+template<int...> struct A {};
+
+template<> struct A<0>
+{
+ typedef enum { e } B;
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C
new file mode 100644
index 000000000..895a548e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+template<typename R, typename... ArgTypes>
+struct make_function_type
+{
+ typedef R type(const ArgTypes&...);
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1];
+int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1];
+int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1];
+int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C
new file mode 100644
index 000000000..6a30efed9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C
@@ -0,0 +1,9 @@
+// PR c++/60219
+// { dg-require-effective-target c++11 }
+
+template<typename..., int> void foo();
+
+void bar()
+{
+ foo<0>; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C
new file mode 100644
index 000000000..a65351db4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C
@@ -0,0 +1,9 @@
+// PR c++/54440
+// { dg-do compile { target c++11 } }
+
+template <class...T> struct A
+{
+ template <T... t, class U> struct B { };
+};
+
+A<int,char>::B<42,'a',float> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C
new file mode 100644
index 000000000..d7dccc53f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C
@@ -0,0 +1,12 @@
+// PR c++/54440
+// { dg-do compile { target c++11 } }
+
+template <class...T> struct A
+{
+ template <template <T> class... TP, class U> struct B { };
+};
+
+template <int I> struct C { };
+template <char C> struct D { };
+
+A<int,char>::B<C,D,float> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C
new file mode 100644
index 000000000..42a92f6b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C
@@ -0,0 +1,6 @@
+// PR c++/58648
+// { dg-require-effective-target c++11 }
+
+template<int, typename...T, T...> int foo();
+
+int i = foo<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C
new file mode 100644
index 000000000..d377d3616
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+template<typename R, typename... ArgTypes>
+struct make_function_type
+{
+ typedef R type(const ArgTypes&... args);
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1];
+int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1];
+int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1];
+int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C
new file mode 100644
index 000000000..d54022a7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+template<typename R, typename... ArgTypes>
+struct make_function_type
+{
+ typedef R type(const ArgTypes&......);
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+int a0[is_same<make_function_type<int>::type, int(...)>::value? 1 : -1];
+int a1[is_same<make_function_type<int, float>::type, int(const float&...)>::value? 1 : -1];
+int a2[is_same<make_function_type<int, float>::type, int(const float&,...)>::value? 1 : -1];
+int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&...)>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C
new file mode 100644
index 000000000..fc0e2ddcf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C
@@ -0,0 +1,47 @@
+// { dg-do compile { target c++11 } }
+template<typename...> class tuple { };
+
+template<typename T, template<typename T> class... Metafunctions>
+struct apply_all
+{
+ typedef tuple<typename Metafunctions<T>::type...> type;
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+template<typename T>
+struct add_pointer {
+ typedef T* type;
+};
+
+template<typename T>
+struct add_pointer<T&>
+{
+ typedef T& type;
+};
+
+template<typename T>
+struct add_reference {
+ typedef T& type;
+};
+
+template<typename T>
+struct add_reference<T&>
+{
+ typedef T& type;
+};
+
+int a0[is_same<apply_all<int>::type,tuple<> >::value? 1 : -1];
+int a1[is_same<apply_all<int, add_pointer>::type,tuple<int*> >::value? 1 : -1];
+int a2[is_same<apply_all<int, add_pointer, add_reference>::type,tuple<int*, int&> >::value? 1 : -1];
+int a3[is_same<apply_all<int&, add_pointer, add_reference>::type,tuple<int&, int&> >::value? 1 : -1];
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C
new file mode 100644
index 000000000..0ae2672bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+struct tuple {
+ static const int value = 0;
+};
+
+template<typename T, template<class T> class... Metafunctions>
+struct tuple<Metafunctions<T>...> {
+ static const int value = 1;
+};
+
+template<typename T> struct add_pointer;
+template<typename T> struct add_reference;
+
+int a0[tuple<int, float>::value == 0? 1 : -1];
+int a1[tuple<add_pointer<int>, add_pointer<float> >::value == 0? 1 : -1];
+int a2[tuple<>::value == 0? 1 : -1];
+int a3[tuple<add_pointer<int> >::value == 1? 1 : -1];
+int a4[tuple<add_pointer<int>, add_reference<int> >::value == 1? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C
new file mode 100644
index 000000000..3d127ea51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args = int> // { dg-error "default argument" }
+class tuple2;
+
+template<typename... = int> // { dg-error "default argument" }
+class tuple3;
+
+template<typename T1, typename T2, typename... Rest>
+struct two_or_more {}; // { dg-error "provided for" }
+
+typedef two_or_more<int> bad; // { dg-error "2 or more" "2 or more" }
+// { dg-error "invalid type" "invalid type" { target *-*-* } 11 }
+
+void f()
+{
+ two_or_more<int, float> z = 5; // { dg-error "two_or_more<int, float>" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C
new file mode 100644
index 000000000..5b5a23464
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C
@@ -0,0 +1,47 @@
+// { dg-do compile { target c++11 } }
+template<typename T> struct add_pointer;
+template<typename T> struct add_reference;
+
+template<template<class T> class... Metafunctions>
+struct metatuple {
+ static const int value = 0;
+};
+
+template<>
+struct metatuple<add_pointer> {
+ static const int value = 1;
+};
+
+template<template<class T> class Meta>
+struct metatuple<Meta, Meta> { // { dg-error "candidates" }
+ static const int value = 2;
+};
+
+template<template<class T> class... Metafunctions>
+struct metatuple<add_pointer, Metafunctions...> { // { dg-error "" }
+ static const int value = 3;
+};
+
+template<template<class T> class First,
+ template<class T> class... Metafunctions>
+struct metatuple<First, Metafunctions...> { // { dg-error "struct" }
+ static const int value = 4;
+};
+
+template<template<class T> class First,
+ template<class T> class Second,
+ template<class T> class... Metafunctions>
+struct metatuple<First, Second, Metafunctions...> { // { dg-error "struct" }
+ static const int value = 5;
+};
+
+int a0[metatuple<>::value == 0? 1 : -1];
+int a1[metatuple<add_pointer>::value == 1? 1 : -1];
+int a2a[metatuple<add_pointer, add_pointer>::value == 2? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" }
+int a2b[metatuple<add_reference, add_reference>::value == 2? 1 : -1];
+int a3[metatuple<add_pointer, add_reference>::value == 3? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" }
+int a4[metatuple<add_reference>::value == 4? 1 : -1];
+int a5[metatuple<add_reference, add_pointer>::value == 5? 1 : -1];
+
+// { dg-error "incomplete" "incomplete" { target *-*-* } 40 }
+// { dg-error "incomplete" "incomplete" { target *-*-* } 42 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C
new file mode 100644
index 000000000..a379bd1fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename T, int... Dims>
+struct array { };
+
+array<int> a0;
+array<int, 1> a1;
+array<int, 1, 2, 3, 4> a1234;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C
new file mode 100644
index 000000000..932d25b80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+template<typename R, typename... ArgTypes>
+struct make_function_type
+{
+ typedef R type(ArgTypes... args);
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1];
+int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1];
+int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1];
+int a3[is_same<make_function_type<int, float, double>::type, int(float, double const)>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C
new file mode 100644
index 000000000..15825f3bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+template<typename T, int... Dims>
+struct array {
+ static const int value = 0;
+};
+
+template<>
+struct array<int, 17> {
+ static const int value = 1;
+};
+
+template<int... Dims>
+struct array<float, 1, Dims...> {
+ static const int value = 2;
+};
+
+template<typename T, int... Dims>
+struct array<T, 1, Dims...> {
+ static const int value = 3;
+};
+
+int a0[array<int>::value == 0? 1 : -1];
+int a1[array<int, 17>::value == 1? 1 : -1];
+int a2[array<float, 1, 2, 3>::value == 2? 1 : -1];
+int a3[array<double, 1, 2, 3>::value == 3? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C
new file mode 100644
index 000000000..4f172cd4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+template<typename T, T... Values>
+struct vector_c { };
+
+vector_c<int, 17, 42> intvec;
+vector_c<char, 'a', 'b', 'c'> charvec;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C
new file mode 100644
index 000000000..5963760d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+template<int... Values>
+struct sum;
+
+template<>
+struct sum<> {
+ static const int value = 0;
+};
+
+template<int Value, int... Values>
+struct sum<Value, Values...> {
+ static const int value = Value + sum<Values...>::value;
+};
+
+int a0[sum<>::value == 0? 1 : -1];
+int a1[sum<1, 2, 3, 4, 5>::value == 15? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C
new file mode 100644
index 000000000..2dbf09253
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+template<template<int, int> class Meta, int Initial, int... Values>
+struct accumulate {
+ static const int value = Initial;
+};
+
+template<template<int, int> class Meta, int Initial, int Value, int... Rest>
+struct accumulate<Meta, Initial, Value, Rest...> {
+ static const int value =
+ Meta<Value, accumulate<Meta, Initial, Rest...>::value>::value;
+};
+
+template<int X, int Y>
+struct sum {
+ static const int value = X + Y;
+};
+
+template<int X, int Y>
+struct prod {
+ static const int value = X * Y;
+};
+
+int a0[accumulate<sum,0,1,2,3,4,5>::value == 15? 1 : -1];
+int a1[accumulate<prod,1,1,2,3,4,5>::value == 120? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C
new file mode 100644
index 000000000..d690bb966
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+template<typename Signature>
+struct function_traits;
+
+template<typename R, typename... ArgTypes>
+struct function_traits<R(ArgTypes...)> {
+ typedef R result_type;
+};
+
+template<typename T, typename U>
+struct same_type {
+ static const bool value = false;
+};
+
+template<typename T>
+struct same_type<T, T> {
+ static const bool value = true;
+};
+
+int a0[same_type<function_traits<int()>::result_type, int>::value? 1 : -1];
+int a1[same_type<function_traits<int(float)>::result_type, int>::value? 1 : -1];
+int a2[same_type<function_traits<int(double, char)>::result_type, int>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C
new file mode 100644
index 000000000..b0278613c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++11 } }
+template<typename Signature>
+struct function_traits;
+
+template<typename R, typename... ArgTypes>
+struct function_traits<R(ArgTypes......)> {
+ typedef R result_type;
+};
+
+template<typename T, typename U>
+struct same_type {
+ static const bool value = false;
+};
+
+template<typename T>
+struct same_type<T, T> {
+ static const bool value = true;
+};
+
+int a0[same_type<function_traits<int(double, char...)>::result_type, int>::value? 1 : -1];
+int a1[same_type<function_traits<int(double, char,...)>::result_type, int>::value? 1 : -1];
+int a2[same_type<function_traits<int(char,...)>::result_type, int>::value? 1 : -1];
+int a3[same_type<function_traits<int(...)>::result_type, int>::value? 1 : -1];
+int a4[same_type<function_traits<int(double x, char...)>::result_type, int>::value? 1 : -1];
+int a5[same_type<function_traits<int(double, char y...)>::result_type, int>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C
new file mode 100644
index 000000000..8931e0fa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C
@@ -0,0 +1,35 @@
+// { dg-do compile { target c++11 } }
+template<typename Signature>
+struct function_traits;
+
+template<typename R, typename... ArgTypes>
+struct function_traits<R(ArgTypes...)> {
+ typedef R result_type;
+};
+
+template<typename R, typename Class, typename... ArgTypes>
+struct function_traits<R (Class::*)(ArgTypes...)> {
+ typedef R result_type;
+};
+
+template<typename R, typename Class, typename... ArgTypes>
+struct function_traits<R (Class::*)(ArgTypes...) const> {
+ typedef R result_type;
+};
+
+template<typename T, typename U>
+struct same_type {
+ static const bool value = false;
+};
+
+template<typename T>
+struct same_type<T, T> {
+ static const bool value = true;
+};
+
+struct X {};
+
+int a0[same_type<function_traits<int (X::*)()>::result_type, int>::value? 1 : -1];
+int a1[same_type<function_traits<int (X::*)(float)>::result_type, int>::value? 1 : -1];
+int a2[same_type<function_traits<int (X::*)(double, char)>::result_type, int>::value? 1 : -1];
+int a3[same_type<function_traits<int (X::*)(double, char) const>::result_type, int>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C
new file mode 100644
index 000000000..c4a5b55cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+class tuple {};
+
+void f()
+{
+ tuple<> x;
+ tuple<int> y;
+ tuple<int, float> z;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C
new file mode 100644
index 000000000..0d8c0c95a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<typename... T>
+void eat(T...);
+
+void f()
+{
+ eat();
+ eat(1);
+ eat(1, 2);
+ eat(17, 3.14159, "Hello, World!");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C
new file mode 100644
index 000000000..cffd703ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C
@@ -0,0 +1,12 @@
+// { dg-options "-g" }
+// { dg-do compile { target c++11 } }
+template<typename... T>
+void eat(T...) { }
+
+void f()
+{
+ eat();
+ eat(1);
+ eat(1, 2);
+ eat(17, 3.14159, "Hello, World!");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C
new file mode 100644
index 000000000..0c5f6ee98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<typename... T>
+void eat(const T&...) { }
+
+void f()
+{
+ eat();
+ eat(1);
+ eat(1, 2);
+ eat(17, 3.14159, "Hello, World!");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C
new file mode 100644
index 000000000..bd25b8493
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+void print_all() {}
+
+template<typename T, typename... Rest>
+void print_all(const T& t, const Rest&... rest)
+{
+ print_all(rest...);
+}
+
+void f()
+{
+ print_all();
+ print_all(1);
+ print_all(1, 3.14159);
+ print_all("Hello, World!", 17, 3.14159);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C
new file mode 100644
index 000000000..ae92bac8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<int I, typename... Args>
+void get_ith(const Args&... args);
+
+void f()
+{
+ get_ith<1>(1, 2, 3);
+ get_ith<1, int>(1, 2.0, 'x');
+ get_ith<1, int, double>(1, 2.0, 'x');
+ get_ith<1, int, double, char>(1, 2.0, 'x');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C
new file mode 100644
index 000000000..8365c9ba5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<int I, typename... Args>
+void get_ith(const Args&... args); // { dg-message "note" }
+
+void f()
+{
+ get_ith<1, float>(1, 2.0, 'x');
+ get_ith<1, int, double, char, int>(1, 2.0, 'x'); // { dg-error "too few arguments" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C
new file mode 100644
index 000000000..c60e6d057
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename... Args>
+void f(const T&, const Args&... args)
+{
+ f(args); // { dg-error "packs not expanded" }
+}
+
+template<typename... Values>
+struct tuple_base { };
+
+template<typename... Values>
+struct tuple : tuple_base<Values> { }; // { dg-error "packs not expanded" }
+
+// { dg-message "args" "note" { target *-*-* } 5 }
+// { dg-message "Values" "note" { target *-*-* } 12 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C
new file mode 100644
index 000000000..db488ef55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename... Values>
+struct tuple
+{
+ static const __SIZE_TYPE__ length = sizeof...(Values);
+};
+
+int a0[tuple<>::length == 0? 1 : -1];
+int a1[tuple<int>::length == 1? 1 : -1];
+int a2[tuple<int, float>::length == 2? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C
new file mode 100644
index 000000000..62031a3d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+template<int... Values>
+struct int_vec {};
+
+template<int... Values>
+struct int_vec<0, (Values+1)...> {}; // { dg-error "involves template parameter" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C
new file mode 100644
index 000000000..b603478ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+struct tuple {};
+
+template<typename T, typename... Args>
+struct tuple<Args..., T> { }; // { dg-error "end" }
+
+
+template<int... Values>
+struct int_vec { };
+
+template<int I, int... Values>
+struct int_vec<Values..., I> { }; // { dg-error "end" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C
new file mode 100644
index 000000000..8e8f81493
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C
@@ -0,0 +1,15 @@
+// { dg-options "-fabi-version=0" }
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+class tuple {};
+
+void f_none(tuple<>) {}
+void f_one(tuple<int>) {}
+void f_two(tuple<int, float>) {}
+void f_nested(tuple<int, tuple<double, char>, float>) { }
+
+
+// { dg-final { scan-assembler "_Z6f_none5tupleIJEE" } }
+// { dg-final { scan-assembler "_Z5f_one5tupleIJiEE" } }
+// { dg-final { scan-assembler "_Z5f_two5tupleIJifEE" } }
+// { dg-final { scan-assembler "_Z8f_nested5tupleIJiS_IJdcEEfEE" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C
new file mode 100644
index 000000000..e4df9b8bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++11 } }
+template<typename... Values, typename T>
+struct backward_tuple {}; // { dg-error "end" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C
new file mode 100644
index 000000000..df113679f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C
@@ -0,0 +1,14 @@
+// A function parameter pack is only deduced if it's at the end
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+void f(const Args&... args, int oops);
+
+int main()
+{
+ f<>(1);
+ f(1);
+ f<int>(1,2);
+ f(1,2); // { dg-error "no match" }
+}
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C
new file mode 100644
index 000000000..b1aa141dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C
@@ -0,0 +1,12 @@
+// { dg-options "-fabi-version=5" }
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+void f(Args...) { }
+
+void g()
+{
+ f<int*, float*, double*>(0, 0, 0);
+ f<int*>(0,0,0);
+}
+// { dg-final { scan-assembler "_Z1fIIPiPfPdEEvDpT_" } }
+// { dg-final { scan-assembler "_Z1fIIPiiiEEvDpT_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C
new file mode 100644
index 000000000..b2f1f8dc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+int f(const Args&...);
+
+void g()
+{
+ int (*fp)(const int&, const float&) = &f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C
new file mode 100644
index 000000000..01df2e0c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+int f(const Args&...);
+
+template<typename T> void g(T) { }
+
+void h()
+{
+ g(&f<int, float>);
+}
+
+// { dg-final { scan-assembler "_Z1gIPFiRKiRKfEEvT_"} }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C
new file mode 100644
index 000000000..2a79bc8e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+int& f(Args...);
+
+template<typename T1, typename T2>
+float& f(T1, T2);
+
+float& g() {
+ return f(17, 3.14159);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C
new file mode 100644
index 000000000..0ea4ba6a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+int& f(Args&...);
+
+template<typename... Args>
+float& f(const Args&...);
+
+int& g(int x, float y)
+{
+ return f(x, y);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C
new file mode 100644
index 000000000..53916a934
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+template<typename T> struct wrap { };
+
+template<typename... Args>
+int& f(const Args&...);
+
+template<typename... Args>
+float& f(const wrap<Args>&...);
+
+int& g(int x, float y, double z)
+{
+ return f(x, y, z);
+}
+
+float& h(wrap<int> x, wrap<float> y, wrap<double> z)
+{
+ return f(x, y, z);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C
new file mode 100644
index 000000000..e672e76db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename T, typename... Args>
+int& f(const T&, Args...);
+
+template<typename T>
+float& f(const T&);
+
+float& g() {
+ return f(17);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C
new file mode 100644
index 000000000..49c26753e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+int& f(...);
+
+template<typename... Args>
+float& f(Args...);
+
+float& g() {
+ return f(17, 3.14159);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C
new file mode 100644
index 000000000..6595b7f8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C
@@ -0,0 +1,38 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+struct tuple {
+ static const int value = 0;
+};
+
+template<>
+struct tuple<> {
+ static const int value = 1;
+};
+
+template<>
+struct tuple<int> {
+ static const int value = 2;
+};
+
+
+template<>
+struct tuple<int, float> {
+ static const int value = 3;
+};
+
+template<typename T>
+struct tuple<T, T> {
+ static const int value = 4;
+};
+
+template<>
+struct tuple<float, float> {
+ static const int value = 5;
+};
+
+int a0[tuple<float>::value == 0? 1 : -1];
+int a1[tuple<>::value == 1? 1 : -1];
+int a2[tuple<int>::value == 2? 1 : -1];
+int a3[tuple<int, float>::value == 3? 1 : -1];
+int a4[tuple<int, int>::value == 4? 1 : -1];
+int a5[tuple<float, float>::value == 5? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C
new file mode 100644
index 000000000..99e169934
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+int& f(int, double, ...);
+
+template<typename... Args>
+float& f(Args...);
+
+float& g() {
+ return f(17, 3.14159, 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C
new file mode 100644
index 000000000..e072caae4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<typename T1, typename T2>
+float& f(T1, T2);
+
+template<typename... Args>
+int& f(Args...);
+
+float& g() {
+ return f(17, 3.14159);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C
new file mode 100644
index 000000000..28ef85712
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename T, T... Values>
+struct vector_c { };
+
+vector_c<int, 1, 2, 3> v1;
+vector_c<char, 'a', 'b', 'c'> v2;
+vector_c<long, 1u, 2, 3l> v3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C
new file mode 100644
index 000000000..ef3d15047
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+template<typename F, typename... BoundArgs>
+class bound_functor
+{
+ public:
+ typedef typename F::result_type result_type;
+
+ template<typename... Args>
+ typename F::result_type operator()(Args&... args);
+};
+
+template<typename F, typename... BoundArgs>
+template<typename... Args>
+typename F::result_type
+bound_functor<F, BoundArgs...>::operator()(Args&... args)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C
new file mode 100644
index 000000000..3fbeefdaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename F, typename... BoundArgs>
+class bound_functor
+{
+ public:
+ bound_functor();
+};
+
+template<typename F, typename... BoundArgs>
+bound_functor<F, BoundArgs...>::bound_functor()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C
new file mode 100644
index 000000000..bdf25cf3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename F, typename... BoundArgs>
+class bound_functor
+{
+ public:
+ bound_functor(const BoundArgs&... bound_args);
+};
+
+template<typename F, typename... BoundArgs>
+bound_functor<F, BoundArgs...>::bound_functor(const BoundArgs&...)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C
new file mode 100644
index 000000000..50b2445ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+template<typename... Elements>
+struct tuple { };
+
+template<typename T, typename... Elements>
+struct tuple<T, Elements...> {
+ int foo();
+};
+
+template<typename T, typename... Elements>
+struct tuple<T*, Elements...> {
+ int bar();
+};
+
+template<typename T, typename... Elements>
+int tuple<T, Elements...>::foo() { return 0; }
+
+template<typename T, typename... Elements>
+int tuple<T*, Elements...>::bar() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C
new file mode 100644
index 000000000..a3d2bf1c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+template<typename T, int... Dims>
+struct array {
+ int foo();
+};
+
+template<typename T>
+struct array<T, 0> {
+ int bar();
+};
+
+template<typename T, int... Dims>
+int array<T, Dims...>::foo() { }
+
+template<typename T>
+int array<T, 0>::bar() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C
new file mode 100644
index 000000000..14233225a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+#include <typeinfo>
+
+template<typename... Args>
+void foo(Args...) { }
+
+template<typename... Args>
+void bar(Args... args) {
+ foo(Args()...);
+ foo(args = args...);
+ foo(reinterpret_cast<void*>(&args)...);
+ foo(const_cast<const Args>(args)...);
+ foo(static_cast<void*>(&args)...);
+ foo(dynamic_cast<void*>(&args)...);
+ foo(typeid(Args)...);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C
new file mode 100644
index 000000000..817883ce2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+template<class T, typename... VarArgs>
+void print(T t, VarArgs args); // { dg-error "packs not expanded" }
+// { dg-message "VarArgs" "note" { target *-*-* } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C
new file mode 100644
index 000000000..3dc74cc4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename ... Args>
+struct tuple_base {};
+
+template<typename ... Args>
+struct tuple : public tuple_base<Args...>
+{
+};
+
+tuple<> zero;
+tuple<int> one;
+tuple<float, int> two;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C
new file mode 100644
index 000000000..57bbcfe2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C
@@ -0,0 +1 @@
+template<typename... Args> class tuple; // { dg-error "variadic templates" "" { target { ! c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C
new file mode 100644
index 000000000..d06c5f6b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C
@@ -0,0 +1,2 @@
+// { dg-options "-std=gnu++98 -pedantic" }
+template<typename... Args> class tuple; // { dg-warning "variadic templates" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C
new file mode 100644
index 000000000..010b3a5d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C
@@ -0,0 +1,2 @@
+// { dg-options "-std=gnu++98 -pedantic-errors" }
+template<typename... Args> class tuple; // { dg-error "variadic templates" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C
new file mode 100644
index 000000000..945b95c76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C
@@ -0,0 +1,3 @@
+// { dg-options "-pedantic" }
+// { dg-do compile { target c++11 } }
+template<typename... Args> class tuple;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C
new file mode 100644
index 000000000..d7c313d58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+template<int... Indexes>
+ struct _Index_tuple { };
+
+template<int _Num, typename _Tuple = _Index_tuple<> >
+struct _Build_index_tuple;
+
+template<int _Num, int... _Indexes>
+struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> >
+ : _Build_index_tuple<_Num - 1,
+ _Index_tuple<_Indexes..., sizeof...(_Indexes)> >
+{
+};
+
+template<int... _Indexes>
+struct _Build_index_tuple<0, _Index_tuple<_Indexes...> >
+{
+ typedef _Index_tuple<_Indexes...> __type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C
new file mode 100644
index 000000000..e2ef931ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+struct unused;
+template<typename T1 = unused, typename T2 = unused, typename T3 = unused,
+ typename T4 = unused, typename T5 = unused, typename T6 = unused>
+struct tuple {};
+
+template<typename... Args>
+tuple<Args...> foo() { } // { dg-bogus "cannot expand" "" }
+
+int main()
+{
+ foo<int,int,int,int,int,int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C
new file mode 100644
index 000000000..ac9222151
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template<typename Result, typename Functor, typename... ArgTypes>
+Result bind(Functor, ArgTypes...) { }
+
+void f()
+{
+ bind<int>(17, 20, 22);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C
new file mode 100644
index 000000000..6e328cfe0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target c++11 } }
+template<typename... Elements> struct tuple {};
+
+template<typename... Args>
+struct nested
+{
+ typedef tuple<tuple<Args, Args...>...> type;
+};
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+int a0[is_same<nested<int, float>::type,
+ tuple<tuple<int, int, float>,
+ tuple<float, int, float> > >::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C
new file mode 100644
index 000000000..edcdfa856
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C
@@ -0,0 +1,22 @@
+// { dg-do run { target c++11 } }
+extern "C" void abort();
+
+template<typename T, T... Values>
+void f(T* expected_values, int n)
+{
+ if (sizeof...(Values) != n)
+ abort ();
+
+ T values[] = { Values... };
+ for (int i = 0; i < n; ++i)
+ if (values[i] != expected_values[i])
+ abort();
+}
+
+int main()
+{
+ int test_arr1[3] = { 1, 2, 3 };
+ f<int, 1, 2, 3>(test_arr1, 3);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C
new file mode 100644
index 000000000..660e09a00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C
@@ -0,0 +1,34 @@
+// { dg-do compile { target c++11 } }
+template<typename T>
+struct stored_value
+{
+ explicit stored_value() : value() { }
+
+ explicit stored_value(const T& value) : value(value) { }
+
+ stored_value(int, const T& value) : value(value) { }
+
+ T value;
+};
+
+template<typename... Values>
+struct myclass : public stored_value<Values>...
+{
+ myclass() { }
+
+ explicit myclass(const Values&... values)
+ : stored_value<Values>(values)... { }
+
+ explicit myclass(int x, const Values&... values)
+ : stored_value<Values>(x, values)... { }
+
+};
+
+void f()
+{
+ int i;
+ float f;
+ myclass<int*, float*> ifp1;
+ myclass<int*, float*> ifp2(&i, &f);
+ myclass<int*, float*> ifp3(1, &i, &f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C
new file mode 100644
index 000000000..8b049968b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+struct tuple_base {
+ static const int value = 0;
+};
+
+template<>
+struct tuple_base<int> {
+ static const int value = 1;
+};
+
+template<>
+struct tuple_base<int, float> {
+ static const int value = 2;
+};
+
+template<>
+struct tuple_base<float, int> {
+ static const int value = 3;
+};
+
+template<typename... Args>
+struct int_tuple : tuple_base<int, Args...> { };
+
+template<typename... Args>
+struct tuple_int : tuple_base<Args..., int> { };
+
+int a0a[int_tuple<int>::value == 0? 1 : -1];
+int a0b[int_tuple<int>::value == 0? 1 : -1];
+int a1a[int_tuple<>::value == 1? 1 : -1];
+int a1b[tuple_int<>::value == 1? 1 : -1];
+int a2[int_tuple<float>::value == 2? 1 : -1];
+int a3[tuple_int<float>::value == 3? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C
new file mode 100644
index 000000000..df26c6a2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C
@@ -0,0 +1,21 @@
+// { dg-do run { target c++11 } }
+template <typename T, T... Args> struct bomb;
+
+template <typename T>
+struct bomb<T> {
+ static const T value = 0;
+};
+
+template <typename T, T v, T... Args>
+struct bomb<T, v, Args...> {
+ static const T value = v + bomb<T, Args...>::value;
+};
+
+extern "C" void abort();
+
+int main() {
+ bomb<int, 1, 2, 3, 4> b;
+ if (b.value != 10)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C
new file mode 100644
index 000000000..101d220c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct list {};
+
+template<typename Sequence, typename Head>
+struct push_front;
+
+template<typename... Elements, typename Head>
+struct push_front<list<Elements...>, Head> {
+ typedef list<Head, Elements> type; // { dg-error "parameter packs not expanded" }
+};
+
+// { dg-message "Elements" "note" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C
new file mode 100644
index 000000000..41f83c3ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+struct A {};
+struct B {};
+struct C {};
+
+template<typename... Mixins>
+struct mixed_up : public Mixins...
+{
+};
+
+void fA(A);
+void fB(B);
+void fC(C);
+
+void g()
+{
+ mixed_up<A, B, C> m;
+ fA(m);
+ fB(m);
+ fC(m);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C
new file mode 100644
index 000000000..533ed46f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C
@@ -0,0 +1,32 @@
+// { dg-do run { target c++11 } }
+struct A {};
+struct B {};
+struct C {};
+
+template<typename... Exceptions> void f(int idx) throw(Exceptions...) {
+ if (idx == 0) throw A();
+ else if (idx == 1) throw B();
+ else if (idx == 2) throw C();
+}
+
+extern "C" void abort();
+
+int main()
+{
+ try {
+ f<A, B, C>(0);
+ abort();
+ } catch (A) {
+ }
+ try {
+ f<A, B, C>(1);
+ abort();
+ } catch (B) {
+ }
+ try {
+ f<A, B, C>(2);
+ abort();
+ } catch (C) {
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C
new file mode 100644
index 000000000..1af653179
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target c++11 } }
+template <class... Types> class A
+{
+public:
+ template <Types... Values> class X { /* ... */ }; // { dg-error "not a valid type for a template non-type parameter" }
+};
+
+template<class... Types> class B
+{
+public:
+ template <Types*... Values> class X {
+ typename A<Types*...>::template X<Values...> foo;
+ };
+};
+
+int i;
+float f;
+
+A<int*, float*>::X<&i, &f> apple1;
+B<int, float>::X<&i, &f> banana1;
+
+A<int*, float*>::X<&i> apple2; // { dg-error "wrong number of template arguments" "wrong number" }
+// { dg-error "invalid type" "invalid" { target *-*-* } 22 }
+A<int*, float*>::X<&i, &f, &f> apple3; // { dg-error "wrong number of template arguments" "wrong number" }
+// { dg-error "invalid type" "invalid" { target *-*-* } 24 }
+A<int, float> apple4;
+
+// { dg-prune-output "provided for" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C
new file mode 100644
index 000000000..a3aa07063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target c++11 } }
+
+template<typename...> struct tuple { };
+
+template<template<typename T> class Meta, typename... Values>
+struct apply_all
+{
+ typedef tuple<typename Meta<Values>::type...> type;
+};
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+template<typename T>
+struct add_reference {
+ typedef T& type;
+};
+
+template<typename T>
+struct add_reference<T&> {
+ typedef T& type;
+};
+
+static_assert(is_same<apply_all<add_reference, int, int&, float>::type,
+ tuple<int&, int&, float&> >::value,
+ "check apply");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C
new file mode 100644
index 000000000..d8d1ef9d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C
@@ -0,0 +1,13 @@
+// PR c++/33496
+// { dg-do compile { target c++11 } }
+
+template<int... N> int foo ()
+{
+ return sizeof... (N ()); // { dg-error "" }
+ return sizeof... (N) (); // { dg-error "" }
+}
+
+int bar ()
+{
+ return foo<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C
new file mode 100644
index 000000000..79badaa02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C
@@ -0,0 +1,21 @@
+// PR c++/33496
+// { dg-do compile { target c++11 } }
+
+template<int M, int N> struct pair
+{
+ int i, j;
+ pair () : i (M), j (N) {}
+};
+
+template<int... M> struct S
+{
+ template<int... N> static int foo ()
+ {
+ return sizeof... (pair<M, N>); // { dg-error "" }
+ }
+};
+
+int bar ()
+{
+ return S<0, 1, 2>::foo<0, 1> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C
new file mode 100644
index 000000000..0a42435c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C
@@ -0,0 +1,22 @@
+// PR c++/33496
+// { dg-do compile { target c++11 } }
+
+template<int M, int N> struct pair
+{
+ int i, j;
+ pair () : i (M), j (N) {}
+};
+
+template<int... M> struct S
+{
+ template<int... N> static int *foo ()
+ {
+ static int x[] = { (M + N)... }; // { dg-error "mismatched argument pack lengths" }
+ return x;
+ }
+};
+
+int *bar ()
+{
+ return S<0, 1, 2>::foo<0, 1> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C
new file mode 100644
index 000000000..389199cc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C
@@ -0,0 +1,6 @@
+// PR c++/33213
+// { dg-do compile { target c++11 } }
+
+template<template<typename> class...> struct A;
+
+template<template<typename...> class... B> struct A<B...> {}; // { dg-error "mismatch|'template<class ...> class ... B ...'" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C
new file mode 100644
index 000000000..e2d7fa7a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+template<typename... Args>
+struct tuple_base {
+ static const int value = 0;
+};
+
+template<>
+struct tuple_base<int*>
+{
+ static const int value = 1;
+};
+
+template<typename T>
+struct tuple_base<T*>
+{
+ static const int value = 2;
+};
+
+template<typename... Args>
+struct tuple_of_pointers : tuple_base<Args*...> { };
+
+int a1[tuple_of_pointers<int>::value == 1? 1 : -1];
+int a2[tuple_of_pointers<float>::value == 2? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C
new file mode 100644
index 000000000..0612e735c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C
@@ -0,0 +1,27 @@
+// PR c++/31434
+// { dg-do run { target c++11 } }
+
+extern "C" void abort ();
+
+template<typename... T> inline int foo (const T...) { return 1; }
+template<typename... T> inline int foo (const T *...) { return 2; }
+
+void
+bar (int *a)
+{
+ a[0] = foo (0);
+ a[1] = foo (*a);
+ a[2] = foo<int> (a);
+ a[3] = foo<int> (2, 3, 4, 5);
+ a[4] = foo<int> (a, a + 1, a + 2);
+}
+
+int
+main ()
+{
+ int a[5];
+ bar (a);
+ if (a[0] != 1 || a[1] != 1 || a[2] != 2 || a[3] != 1 || a[4] != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C
new file mode 100644
index 000000000..0877255c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C
@@ -0,0 +1,11 @@
+// PR c++/33461
+// { dg-do compile { target c++11 } }
+
+template<typename> struct A;
+
+template<typename... T> struct A<T*> // { dg-error "not expanded|T|not used|T" }
+{
+ struct B;
+};
+
+A<void*> a; // { dg-error "incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C
new file mode 100644
index 000000000..f9bbc3532
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C
@@ -0,0 +1,11 @@
+// PR c++/33461
+// { dg-do compile { target c++11 } }
+
+template<typename> struct A;
+
+template<typename... T> struct A<T*...> // { dg-bogus "cannot expand" "" }
+{
+ struct B;
+};
+
+A<void*> a; // { dg-bogus "incomplete type" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C
new file mode 100644
index 000000000..507fc7e4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C
@@ -0,0 +1,8 @@
+// PR c++/31441
+// { dg-do compile { target c++11 } }
+
+template<typename> struct A;
+
+template<typename... T> struct A<T...> { }; // { dg-bogus "cannot expand" "" }
+
+A<int> a; // { dg-bogus "incomplete type" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C
new file mode 100644
index 000000000..debe75c61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C
@@ -0,0 +1,25 @@
+// PR c++/32565
+// { dg-do compile { target c++11 } }
+
+template<typename...> struct A1;
+template<template<int...> class T> struct A1<T<0> > {};
+template<typename...> struct A2;
+template<template<int...> class T> struct A2<T<0, 1> > {};
+template<typename...> struct A3;
+template<template<int, int...> class T> struct A3<T<0, 1> > {};
+template<typename...> struct A4;
+template<template<typename...> class T> struct A4<T<int> > {};
+template<typename...> struct A5;
+template<template<typename...> class T> struct A5<T<int, long> > {};
+template<typename...> struct A6;
+template<template<typename, typename...> class T> struct A6<T<int, long> > {};
+template<int> struct B1 {};
+template<int, int> struct B2 {};
+template<typename> struct B3 {};
+template<typename, typename> struct B4 {};
+A1<B1<0> > a1;
+A2<B2<0, 1> > a2;
+A3<B2<0, 1> > a3;
+A4<B3<int> > a4;
+A5<B4<int, long> > a5;
+A6<B4<int, long> > a6;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C
new file mode 100644
index 000000000..708104af9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C
@@ -0,0 +1,9 @@
+// PR c++/32565
+// { dg-do compile { target c++11 } }
+
+template<typename...> struct A1;
+template<template<int, int...> class T> struct A1<T<0, 1> > {};
+template<int, int, int...> struct B1 {};
+A1<B1<0, 1> > a1;
+template<int...> struct B2 {};
+A1<B2<0, 1> > a2; // { dg-error "incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C
new file mode 100644
index 000000000..2213ef7d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C
@@ -0,0 +1,18 @@
+// PR c++/33943
+// { dg-do compile { target c++11 } }
+
+template<typename... A> struct foo {};
+
+template<typename A0, typename... A1> struct bar {};
+
+template<typename U> struct baz;
+
+template<template<typename...> class T, typename... U> struct baz< T<U...> >
+{};
+
+template<template<typename, typename...> class T, typename U, typename... V>
+struct baz< T<U, V...> >
+{};
+
+baz< foo<int, short> > b1;
+baz< bar<int, short> > b2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C
new file mode 100644
index 000000000..f3c009257
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C
@@ -0,0 +1,23 @@
+// PR c++/33965
+// { dg-do compile { target c++11 } }
+template<typename T>
+struct foo
+{
+ static bool const value = false;
+};
+
+template<template<typename...> class T, typename... Args>
+struct foo<T<Args...> >
+{
+ static bool const value = true;
+};
+
+template<int I>
+struct int_
+{};
+
+int main()
+{
+ static_assert(foo<int_<0> >::value == false,
+ "picked up partial specialization, but should not have");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C
new file mode 100644
index 000000000..b96c7198d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+template<template<typename...> class TT>
+TT<int, float, double> foo(TT<int, float>)
+{
+ return TT<int, float, double>();
+}
+
+template<typename T>
+int& foo(T)
+{
+ static int i = 0; return i;
+}
+
+template<typename T, typename U>
+struct pair {};
+
+void bar()
+{
+ pair<int, float> p;
+ int& i = foo(p);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C
new file mode 100644
index 000000000..1e59c1af7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+// Contributed by Eric Niebler
+template<typename T, typename U>
+struct pair
+{};
+
+template<typename T>
+struct test;
+
+template<template<typename...> class T, typename... Args>
+struct test<T<Args...> >
+{};
+
+test<pair<int, double> > t;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C
new file mode 100644
index 000000000..795da571d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C
@@ -0,0 +1,38 @@
+// { dg-do compile { target c++11 } }
+template<typename T1, typename T2>
+struct pair {};
+
+template<typename... Args>
+struct tuple {
+ static const int value = 0;
+};
+
+template<>
+struct tuple<pair<int, float> > {
+ static const int value = 1;
+};
+
+template<typename U>
+struct tuple<pair<int, U> > {
+ static const int value = 2;
+};
+
+template<typename T, typename U>
+struct tuple<pair<T, U>, pair<T, U> > {
+ static const int value = 3;
+};
+
+
+template<typename... Outer>
+struct X {
+ template<typename... Inner>
+ struct Y
+ {
+ typedef tuple<pair<Outer, Inner>...> type;
+ };
+};
+
+int a0[X<int, double>::Y<short, char>::type::value == 0? 1 : -1];
+int a1[X<int>::Y<float>::type::value == 1? 1 : -1];
+int a2[X<int>::Y<double>::type::value == 2? 1 : -1];
+int a3[X<int, int>::Y<double, double>::type::value == 3? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C
new file mode 100644
index 000000000..587a0e89e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+template<template<typename...> class TT>
+struct X { };
+
+template<typename T, typename U> struct pair { };
+
+X<pair> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C
new file mode 100644
index 000000000..71f341cbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+template<int N> struct Int2Type { };
+
+template<typename... T>
+struct Outer {
+ template<typename... U>
+ void foo(Int2Type<sizeof...(T)>, Int2Type<sizeof...(U)>);
+};
+
+
+Outer<short, int, long> outer;
+
+void g4() {
+ outer.foo<float, double>(Int2Type<3>(), Int2Type<2>());
+}
+
+template<typename... T, template<T...> class X> void f1();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C
new file mode 100644
index 000000000..99159a2c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C
@@ -0,0 +1,70 @@
+// Various tests for variadic templates and partial specialization.
+// { dg-do compile { target c++11 } }
+
+// PR c++/36846
+template<typename A, typename B>
+struct pair;
+
+template<typename... T>
+struct pairs;
+
+template<typename... AS, typename... BS>
+struct pairs<pair<AS, BS>...> {
+ struct mismatched_packs {};
+};
+
+template class pairs<
+ pair<int, int>,
+ pair<int, int>
+>;
+
+template<int A, int B>
+struct point;
+
+template<typename... T>
+struct points;
+
+template<int... AS, int... BS>
+struct points<point<AS, BS>...> {
+ struct mismatched_packs {};
+};
+
+template class points<
+ point<0, 1>,
+ point<0, 1>
+>;
+
+// PR c++/35477
+template <class...ARGS> struct tuple {};
+template <class A, class B> struct test {};
+template <class... ARGS, class B> struct test<B, tuple<ARGS...>>
+{
+ template <class T> struct inside {};
+};
+
+// PR c++/38276
+template<typename...> struct A;
+
+template<typename, typename> struct B;
+
+template<typename... T, typename... U> struct B<A<T...>, A<U...> >
+{
+ static int i;
+};
+
+B<A<>, A<int> > b1;
+
+B<A<int>, A<> > b2;
+
+// PR c++/35784
+template <typename...> struct p;
+
+template <typename, typename> struct d;
+
+template <typename... A, typename... B>
+struct d<p<A...>, p<B...> > { typedef int t; };
+
+typedef d<p<>, p<int, float> >::t q;
+typedef d<q, d<p<int>, p<float> >::t> r; // *
+
+typedef d<d<p<>, p<int, float> >::t, d<p<>, p<> >::t> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C
new file mode 100644
index 000000000..63a1103a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C
@@ -0,0 +1,11 @@
+// PR c++/35297
+// { dg-do compile { target c++11 } }
+
+template <class T=int, class... ARGS>
+struct test2 {};
+
+int main()
+{
+ test2<> a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C
new file mode 100644
index 000000000..f5f3228f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C
@@ -0,0 +1,33 @@
+// PR c++/40595
+// { dg-do compile { target c++11 } }
+
+template<int N>
+struct S
+{
+ typedef int type;
+};
+
+template<typename T>
+struct Get
+{
+ static T get();
+};
+
+template<typename F>
+struct B
+{
+ template<typename ... Args>
+ typename S<sizeof( Get<F>::get() (Get<Args>::get() ...) )>::type
+ f(Args&& ... a);
+};
+
+struct X
+{
+ bool operator()(int) const;
+};
+
+int main()
+{
+ B<X> b;
+ b.f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C
new file mode 100644
index 000000000..e383938e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C
@@ -0,0 +1,17 @@
+// PR c++/39863
+// { dg-do compile { target c++11 } }
+
+template <typename... T>
+struct A {};
+
+template <typename T, typename U>
+struct S {};
+
+template <typename... T, typename... U>
+A< S<T, U>... > f(U... u)
+{ return A< S<T, U>... >(); }
+
+int main()
+{
+ f<int>(0.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C
new file mode 100644
index 000000000..189c4ebf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41785
+// { dg-do compile { target c++11 } }
+
+struct a {};
+
+template < typename T, typename ENCLOSING >
+struct base;
+
+template < typename... T >
+struct derived
+ : public base< T, derived< T... > >...
+{};
+
+template < typename... T>
+struct base< a, derived< T... > >
+{
+ typedef derived< T... >
+ Derived;
+};
+
+int main()
+{
+ derived< a > instance;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C
new file mode 100644
index 000000000..b251cc3da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C
@@ -0,0 +1,35 @@
+// PR c++/42266
+// { dg-do compile { target c++11 } }
+
+template<typename... _Elements>
+ class tuple;
+
+template<typename _Arg>
+ class _Mu;
+
+template<typename _Signature>
+ struct _Bind;
+
+template<typename _Functor, typename... _Bound_args>
+ class _Bind<_Functor(_Bound_args...)>
+ {
+ template<typename... _Args, typename
+ = decltype(_Functor()(_Mu<_Bound_args>()(_Bound_args(),
+ tuple<_Args...>())...) )>
+ void __call() { }
+ };
+
+template<typename _Functor, typename _Arg>
+ _Bind<_Functor(_Arg)>
+ bind(_Functor, _Arg) { }
+
+struct State
+{
+ bool ready() { return true; }
+
+ void f()
+ {
+ bind(&State::ready, this);
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C
new file mode 100644
index 000000000..c463cac17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C
@@ -0,0 +1,410 @@
+// PR c++/42358
+// { dg-do assemble { target c++11 } }
+
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+typedef __SIZE_TYPE__ size_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::size_t;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct __sfinae_types {
+ typedef char __one;
+ typedef struct {
+ } __two;
+ };
+ template<typename _Tp, _Tp __v> struct integral_constant {
+ static const _Tp value = __v;
+ typedef _Tp value_type;
+ typedef integral_constant<_Tp, __v> type;
+ };
+ typedef integral_constant<bool, false> false_type;
+ template<typename> struct remove_cv;
+ template<typename> struct __is_void_helper : public false_type {
+ };
+ template<typename _Tp> struct is_void : public integral_constant<bool, (__is_void_helper<typename remove_cv<_Tp>::type>::value)> {
+ };
+ template<typename> struct is_array : public false_type {
+ };
+ template<typename> struct is_function : public false_type {
+ };
+ template<typename, unsigned _Uint = 0> struct extent : public integral_constant<std::size_t, 0> {
+ };
+ template<typename _Tp> struct remove_const {
+ typedef _Tp type;
+ };
+ template<typename _Tp> struct remove_volatile {
+ typedef _Tp type;
+ };
+ template<typename _Tp> struct remove_cv {
+ typedef typename remove_const<typename remove_volatile<_Tp>::type>::type type;
+ };
+ template<typename> struct is_lvalue_reference : public false_type {
+ };
+ template<typename> struct is_rvalue_reference : public false_type {
+ };
+ template<typename _Tp> struct is_reference : public integral_constant<bool, (is_lvalue_reference<_Tp>::value || is_rvalue_reference<_Tp>::value)> {
+ };
+ template<typename _Tp> struct remove_reference {
+ typedef _Tp type;
+ };
+ template<typename _Tp, bool = !is_reference<_Tp>::value && !is_void<_Tp>::value> struct __add_rvalue_reference_helper {
+ typedef _Tp type;
+ };
+ template<typename _Tp> struct add_rvalue_reference : public __add_rvalue_reference_helper<_Tp> {
+ };
+ template<typename _Tp> typename add_rvalue_reference<_Tp>::type declval();
+ template<typename _From, typename _To, bool = (is_void<_From>::value || is_void<_To>::value || is_function<_To>::value || is_array<_To>::value)> struct __is_convertible_helper {
+ };
+ template<typename _From, typename _To> struct __is_convertible_helper<_From, _To, false> : public __sfinae_types {
+ static __one __test(_To);
+ static __two __test(...);
+ static const bool __value = sizeof(__test(declval<_From>())) == 1;
+ };
+ template<typename _From, typename _To> struct is_convertible : public integral_constant<bool, __is_convertible_helper<_From, _To>::__value> {
+ };
+ template<bool, typename _Tp = void> struct enable_if {
+ };
+ template<typename _Tp> struct enable_if<true, _Tp> {
+ typedef _Tp type;
+ };
+ template<typename _Tp> struct identity {
+ typedef _Tp type;
+ };
+ template<typename _Tp> inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type forward(typename std::identity<_Tp>::type& __t) {
+ }
+ template<typename _Tp> inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type forward(typename std::identity<_Tp>::type __t) {
+ }
+ template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) {
+ }
+ template<class _T1, class _T2> struct pair {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ template<class _U1, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type> pair(_U1&& __x, const _T2& __y) : first(std::forward<_U1>(__x)), second(__y) {
+ }
+ template<class _U2, class = typename std::enable_if<std::is_convertible<_U2, _T2>::value>::type> pair(const _T1& __x, _U2&& __y) : first(__x), second(std::forward<_U2>(__y)) {
+ }
+ template<class _U1, class _U2, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) {
+ }
+ template<class _U1, class _U2> pair(pair<_U1, _U2>&& __p) : first(std::move(__p.first)), second(std::move(__p.second)) {
+ }
+ template<class _U1, class _U2> pair& operator=(pair<_U1, _U2>&& __p) {
+ }
+ };
+ struct input_iterator_tag {
+ };
+ struct output_iterator_tag {
+ };
+ struct forward_iterator_tag : public input_iterator_tag {
+ };
+ struct bidirectional_iterator_tag : public forward_iterator_tag {
+ };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator> struct iterator_traits {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Iter> inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
+ }
+ template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag) {
+ }
+ template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) {
+ return std::__distance(__first, __last, std::__iterator_category(__first));
+ }
+ template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference> {
+ };
+ template<typename _Container> class back_insert_iterator : public iterator<output_iterator_tag, void, void, void, void> {
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ new_allocator() throw() {
+ }
+ new_allocator(const new_allocator&) throw() {
+ }
+ template<typename _Tp1> new_allocator(const new_allocator<_Tp1>&) throw() {
+ }
+ template<typename... _Args> void construct(pointer __p, _Args&&... __args) {
+ }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ allocator() throw() {
+ }
+ template<typename _Tp1> allocator(const allocator<_Tp1>&) throw() {
+ }
+ };
+ extern template class allocator<char>;
+ extern template class allocator<wchar_t>;
+ template<typename _Arg, typename _Result> struct unary_function {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> {
+ bool operator()(const _Tp& __x, const _Tp& __y) const {
+ }
+ };
+ template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
+ const typename _Pair::first_type& operator()(const _Pair& __x) const {
+ }
+ };
+ struct _Rb_tree_node_base {
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ };
+ template<typename _Val> struct _Rb_tree_node : public _Rb_tree_node_base {
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ _Val _M_value_field;
+ template<typename... _Args> _Rb_tree_node(_Args&&... __args) : _Rb_tree_node_base(), _M_value_field(std::forward<_Args>(__args)...) {
+ }
+ };
+ template<typename _Tp> struct _Rb_tree_iterator {
+ typedef _Tp value_type;
+ typedef _Tp& reference;
+ typedef _Tp* pointer;
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef _Rb_tree_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
+ typedef _Rb_tree_node<_Tp>* _Link_type;
+ _Base_ptr _M_node;
+ };
+ template<typename _Tp> struct _Rb_tree_const_iterator {
+ typedef _Tp value_type;
+ typedef const _Tp& reference;
+ typedef const _Tp* pointer;
+ typedef _Rb_tree_iterator<_Tp> iterator;
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef _Rb_tree_const_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
+ typedef const _Rb_tree_node<_Tp>* _Link_type;
+ explicit _Rb_tree_const_iterator(_Link_type __x) : _M_node(__x) {
+ }
+ _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) {
+ }
+ _Base_ptr _M_node;
+ };
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > class _Rb_tree {
+ typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator;
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ public:
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ typedef const _Rb_tree_node<_Val>* _Const_Link_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Alloc allocator_type;
+ _Node_allocator& _M_get_Node_allocator() {
+ }
+ _Link_type _M_get_node() {
+ }
+ template<typename... _Args> _Link_type _M_create_node(_Args&&... __args) {
+ _Link_type __tmp = _M_get_node();
+ try {
+ _M_get_Node_allocator().construct(__tmp, std::forward<_Args>(__args)...);
+ }
+ catch(...) {
+ }
+ }
+ template<typename _Key_compare, bool _Is_pod_comparator = __is_pod(_Key_compare)> struct _Rb_tree_impl : public _Node_allocator {
+ _Key_compare _M_key_compare;
+ _Rb_tree_node_base _M_header;
+ size_type _M_node_count;
+ _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), _M_node_count(0) {
+ }
+ void _M_initialize() {
+ }
+ };
+ _Rb_tree_impl<_Compare> _M_impl;
+ _Base_ptr& _M_rightmost() {
+ }
+ _Link_type _M_begin() {
+ }
+ _Link_type _M_end() {
+ }
+ _Const_Link_type _M_end() const {
+ }
+ static _Link_type _S_right(_Base_ptr __x) {
+ }
+ static const_reference _S_value(_Const_Base_ptr __x) {
+ }
+ static const _Key& _S_key(_Const_Base_ptr __x) {
+ return _KeyOfValue()(_S_value(__x));
+ }
+ typedef _Rb_tree_iterator<value_type> iterator;
+ typedef _Rb_tree_const_iterator<value_type> const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ iterator _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __y, const value_type& __v);
+ iterator _M_insert_lower(_Base_ptr __x, _Base_ptr __y, const value_type& __v);
+ iterator _M_insert_equal_lower(const value_type& __x);
+ iterator _M_lower_bound(_Link_type __x, _Link_type __y, const _Key& __k);
+ iterator _M_upper_bound(_Link_type __x, _Link_type __y, const _Key& __k);
+ _Rb_tree(const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_impl(__comp, __a) {
+ }
+ iterator end() {
+ }
+ iterator _M_insert_equal_(const_iterator __position, const value_type& __x);
+ template<typename _InputIterator> void _M_insert_unique(_InputIterator __first, _InputIterator __last);
+ template<typename _InputIterator> void _M_insert_equal(_InputIterator __first, _InputIterator __last);
+ size_type count(const key_type& __k) const;
+ pair<iterator, iterator> equal_range(const key_type& __k);
+ pair<const_iterator, const_iterator> equal_range(const key_type& __k) const;
+ };
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) {
+ _Link_type __z = _M_create_node(__v);
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_lower(_Base_ptr __x, _Base_ptr __p, const _Val& __v) {
+ _Link_type __z = _M_create_node(__v);
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_lower(const _Val& __v) {
+ _Link_type __x = _M_begin();
+ _Link_type __y = _M_end();
+ return _M_insert_lower(__x, __y, __v);
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) {
+ _Link_type __x = _M_begin();
+ _Link_type __y = _M_end();
+ while (__x != 0) {
+ if (_M_impl._M_key_compare(_S_key(__x), __k)) __x = _S_right(__x);
+ else {
+ _Link_type __xu(__x), __yu(__y);
+ return pair<iterator, iterator>(_M_lower_bound(__x, __y, __k), _M_upper_bound(__xu, __yu, __k));
+ }
+ }
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) const {
+ _Const_Link_type __y = _M_end();
+ return pair<const_iterator, const_iterator>(const_iterator(__y), const_iterator(__y));
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_(const_iterator __position, const _Val& __v) {
+ if (__position._M_node == _M_end()) {
+ if (__position._M_node == _M_rightmost()) return _M_insert_(0, _M_rightmost(), __v);
+ else return _M_insert_equal_lower(__v);
+ }
+ }
+ template<typename _Key, typename _Val, typename _KoV, typename _Cmp, typename _Alloc> template<class _II> void _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>:: _M_insert_equal(_II __first, _II __last) {
+ for (;
+ __first != __last;
+ ++__first) _M_insert_equal_(end(), *__first);
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: count(const _Key& __k) const {
+ pair<const_iterator, const_iterator> __p = equal_range(__k);
+ const size_type __n = std::distance(__p.first, __p.second);
+ }
+ template<class _E> class initializer_list {
+ public:
+ typedef _E value_type;
+ typedef const _E& reference;
+ typedef const _E& const_reference;
+ typedef size_t size_type;
+ typedef const _E* iterator;
+ typedef const _E* const_iterator;
+ iterator _M_array;
+ size_type _M_len;
+ initializer_list(const_iterator __a, size_type __l) : _M_array(__a), _M_len(__l) {
+ }
+ const_iterator begin() const {
+ }
+ const_iterator end() const {
+ }
+ };
+ template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class multimap {
+ typedef _Key key_type;
+ typedef _Tp mapped_type;
+ typedef std::pair<const _Key, _Tp> value_type;
+ typedef _Compare key_compare;
+ typedef _Alloc allocator_type;
+ typedef typename _Alloc::value_type _Alloc_value_type;
+ typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type;
+ typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type;
+ _Rep_type _M_t;
+ public:
+ typedef typename _Pair_alloc_type::pointer pointer;
+ typedef typename _Pair_alloc_type::const_pointer const_pointer;
+ typedef typename _Pair_alloc_type::reference reference;
+ typedef typename _Pair_alloc_type::const_reference const_reference;
+ typedef typename _Rep_type::iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ typedef typename _Rep_type::reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ multimap(initializer_list<value_type> __l, const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) {
+ _M_t._M_insert_equal(__l.begin(), __l.end());
+ }
+ template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last) : _M_t() {
+ }
+ template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last, const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) {
+ }
+ template<typename _InputIterator> void insert(_InputIterator __first, _InputIterator __last) {
+ }
+ size_type count(const key_type& __x) const {
+ return _M_t.count(__x);
+ }
+ std::pair<iterator, iterator> equal_range(const key_type& __x) {
+ return _M_t.equal_range(__x);
+ }
+ template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator==(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&);
+ template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator<(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&);
+ };
+}
+extern "C" {
+ extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__));
+}
+using namespace std;
+int test01() {
+ typedef multimap<int,double> Container;
+ typedef Container::iterator iterator;
+ typedef pair<iterator,iterator> itpair;
+ Container m({
+ {
+ 1, 1.0 }
+ }
+ );
+ itpair ip = m.equal_range(1);
+ ((distance(ip.first, ip.second) == 3) ? static_cast<void> (0) : __assert_fail ("distance(ip.first, ip.second) == 3", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 36, __PRETTY_FUNCTION__));
+ ((m.count(7) == 2) ? static_cast<void> (0) : __assert_fail ("m.count(7) == 2", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 54, __PRETTY_FUNCTION__));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C
new file mode 100644
index 000000000..8398b2a66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C
@@ -0,0 +1,22 @@
+// PR c++/43054
+// { dg-do compile { target c++11 } }
+
+template<typename R> struct future { };
+
+template<typename Fn, typename... Args>
+ auto
+ async(Fn&& fn, Args&&... args)
+ -> future<decltype(fn(args...))>;
+
+template<typename Fn, typename... Args>
+ auto
+ async(Fn&& fn, Args&&... args)
+ -> future<decltype(fn(args...))>;
+
+int work2(int value);
+
+void work(int value)
+{
+ async(work2, value);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C
new file mode 100644
index 000000000..9e40737d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+template<typename ... Args>
+struct foo
+{
+ static bool const value = true;
+};
+
+template<typename ... Args>
+struct foo< typename Args::is_applied... > // { dg-error "not used|Args" }
+{
+ static bool const value = false;
+};
+
+struct not_applied { typedef void is_applied; };
+struct applied { typedef applied is_applied; };
+
+int main()
+{
+ foo<applied, applied> i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C
new file mode 100644
index 000000000..6dec6dfc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+struct A {};
+
+template<typename... T> struct B : T...
+{
+ B() : T()... {}
+};
+
+B<A> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C
new file mode 100644
index 000000000..ace905aad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> struct A
+{
+ int i __attribute__((aligned(__alignof(T)))); // { dg-error "parameter packs|T" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C
new file mode 100644
index 000000000..d0a8b951a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+struct A
+{
+ operator int();
+};
+
+template <typename... T> struct B : A
+{
+ using A::operator T; // { dg-error "parameter packs|T" }
+};
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C
new file mode 100644
index 000000000..1036537eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+template<typename... T, typename = T> struct A {}; // { dg-error "must be at the end" }
+
+
+template<template<typename... T, typename = T> class U> struct B // { dg-error "must be at the end" }
+{
+ template<int> U<int> foo(); // { dg-error "mismatch|constant|invalid|invalid" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C
new file mode 100644
index 000000000..3ee7bad45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C
@@ -0,0 +1,31 @@
+// { dg-do compile { target c++11 } }
+// PR c++/34055
+template<typename...> struct A;
+
+template<typename...T> struct A<T*> // { dg-error "parameter packs|T" }
+{
+ void foo();
+};
+
+template<typename...T> void A<T*>::foo() {} // { dg-error "invalid declarator" }
+
+
+
+template<typename...> struct B;
+
+template<typename...T> struct B<T&> // { dg-error "parameter packs|T" }
+{
+ void foo();
+};
+
+template<typename...T> void B<T&>::foo() {} // { dg-error "invalid declarator" }
+
+
+template<typename...> struct C;
+
+template<typename...T> struct C<T()> // { dg-error "parameter packs|T" }
+{
+ void foo();
+};
+
+template<typename...T> void C<T()>::foo() {} // { dg-error "invalid declarator" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C
new file mode 100644
index 000000000..c2a6ae5d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// PR c++/34102
+struct A {};
+
+template<typename> struct B : virtual A {};
+
+template<typename...T> struct C : B<T> {}; // { dg-error "parameter packs|T" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C
new file mode 100644
index 000000000..bb2f82922
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// PR c++/34103
+template<typename> struct A {};
+
+template<typename...T> void foo(A<T>, A<T>); // { dg-error "parameter packs|T" }
+
+template<typename...T> void foo(A<T>, A<T>) {} // { dg-error "parameter packs|T" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C
new file mode 100644
index 000000000..5bb2a21e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+template<template<typename... T> class Comp, typename... T> void f( T... Value)
+{
+ static_assert( Comp<T>::value > 0, "" ); // { dg-error "parameter packs|T" }
+}
+
+template<template<typename... T> class Comp, typename... T> void g( T... Value)
+{
+ static_assert( Comp<T...>::value > 0, "" );
+}
+
+template <typename... T>
+struct Foo
+{
+ static const int value=1;
+};
+
+int main()
+{
+ f<Foo>( 2 );
+ g<Foo>( 2 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C
new file mode 100644
index 000000000..91ee60932
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+template<typename T, T a, T... Params>
+struct max
+{
+ static const T value = a > max<T, Params>::value ? a : max<T, Params>::value; // { dg-error "not expanded|Params" }
+};
+
+template<typename T, T a, T b>
+struct max<T, a, b>
+{
+ static const T value = a > b ? a : b;
+};
+
+static const int value1 = max< int, 1, 2>::value;
+static const int value2 = max< int, 1, 3, 5>::value;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
new file mode 100644
index 000000000..ee0ed01b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C
@@ -0,0 +1,50 @@
+// { dg-do compile { target c++11 } }
+
+template<typename Fun, typename... Args> // { dg-error "template parameter" }
+struct call;
+
+template<typename Fun, typename Arg0>
+struct call // { dg-error "redeclared here" }
+{
+ template<typename Sig>
+ struct result;
+
+ template<typename X, typename Y>
+ struct result<X(Y)>
+ {
+ typedef X type;
+ };
+};
+
+
+template<typename Fun, int... N> // { dg-error "template parameter" }
+struct call2;
+
+template<typename Fun, int N>
+struct call2 // { dg-error "redeclared here" }
+{
+ template<typename Sig>
+ struct result;
+
+ template<typename X, typename Y>
+ struct result<X(Y)>
+ {
+ typedef X type;
+ };
+};
+
+template<typename Fun, template<typename> class... TT> // { dg-error "template parameter" }
+struct call3;
+
+template<typename Fun, template<typename> class TT>
+struct call3 // { dg-error "redeclared here" }
+{
+ template<typename Sig>
+ struct result;
+
+ template<typename X, typename Y>
+ struct result<X(Y)>
+ {
+ typedef X type;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C
new file mode 100644
index 000000000..74f35f733
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+template<int...> struct A
+{
+ void foo();
+};
+
+struct B
+{
+ template<int N> friend void A<N>::A::foo(); // { dg-error "declared as friend" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C
new file mode 100644
index 000000000..a032bfc0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<typename T, typename... U> struct A<T, U> // { dg-error "parameter packs|U" }
+{
+ template<typename> struct B;
+
+ template<typename X> struct B<X*> {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C
new file mode 100644
index 000000000..1b1e66926
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// PR c++/34751
+struct A {};
+
+template<typename... Args = int> // { dg-error "cannot have a default" }
+void f(Args... args = 0); // { dg-error "cannot have a default argument" }
+
+template<typename... Args>
+void g(Args... = 0); // { dg-error "cannot have a default argument" }
+
+
+template<int, typename T = A, int T::*...p = 0 > struct B {}; // { dg-error "cannot have a default argument|no default argument" }
+
+B<0> b;
+
+template<int, typename T = A, int T::*... = 0 > struct C {}; // { dg-error "cannot have a default argument|no default argument" }
+
+C<0> c;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C
new file mode 100644
index 000000000..496acaefa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> struct A
+{
+ template<T> struct B {}; // { dg-error "not expanded|T" }
+};
+
+A<int>::B<0> b;
+
+template<typename... T> struct B
+{
+ template<T> B(); // { dg-error "not expanded|T" }
+};
+
+B<int> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C
new file mode 100644
index 000000000..c42fe49d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+template<template<int> class... T> struct A
+{
+ void foo(T<0>); // { dg-error "not expanded|T" }
+ void bar(T<0>); // { dg-error "not expanded|T" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C
new file mode 100644
index 000000000..3ef089db9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++11 } }
+template<typename> struct A {};
+
+template<template<typename> class... T> void foo(T<int>) {} // { dg-error "not expanded|T" }
+
+template void foo<A>(A<int>); // { dg-error "does not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C
new file mode 100644
index 000000000..5b106e187
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+template<int... N> struct A
+{
+ static void foo()
+ {
+ int i = N; // { dg-error "not expanded|N" }
+ }
+};
+
+void bar()
+{
+ A<0>::foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C
new file mode 100644
index 000000000..11315ca14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> struct A
+{
+ static const int i __attribute__((aligned(__alignof(T)))) = 0; // { dg-error "not expanded|T" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C
new file mode 100644
index 000000000..bc5902394
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> int foo()
+{
+ T t; // { dg-error "parameter packs|T" }
+ return t;
+}
+
+void bar()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C
new file mode 100644
index 000000000..c20501f92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> int foo()
+{
+ typename T::X x; // { dg-error "parameter packs|T" }
+ return x;
+}
+
+void bar()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C
new file mode 100644
index 000000000..2590f35cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename... T> struct A
+{
+ T* x[1]; // { dg-error "parameter packs|T" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C
new file mode 100644
index 000000000..0827beee6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+
+template<typename _Tp>
+ _Tp&& forward(_Tp&& __t) { return __t; } // { dg-message "note" }
+
+void f(...);
+
+template<typename... Args>
+void g(Args&&... args)
+{
+ f(forward<Args...>(args...)); // { dg-error "no matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 11 }
+}
+
+void h()
+{
+ g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C
new file mode 100644
index 000000000..9af855e3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+struct A
+{
+ template<typename... T> struct B;
+};
+
+template<typename... T> struct A::B<T*> {}; // { dg-error "parameter packs|T" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C
new file mode 100644
index 000000000..e38d33978
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+struct A {};
+
+template<typename... T> struct B : T...
+{
+ B() : T(x)... {} // { dg-error "not declared" }
+};
+
+B<A> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C
new file mode 100644
index 000000000..0128b6100
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+template<typename...> struct A;
+
+template<typename...T> struct A<T*> // { dg-error "not expanded|T" }
+{
+ friend void foo();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C
new file mode 100644
index 000000000..c047a1963
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "note" }
+
+void f() { }
+
+template<class U, class... T>
+void f(){ f<T...>(); } // { dg-error "no matching" }
+
+int main()
+{
+ f<char>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C
new file mode 100644
index 000000000..21891f1c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++11 } }
+
+template<class U, class... T>
+void f() // { dg-message "note" }
+{
+ f<T...>(); // { dg-error "no matching" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 }
+}
+
+template<>
+void f() { } // { dg-error "template-id" }
+
+int main()
+{
+ f<char>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C
new file mode 100644
index 000000000..cad264377
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+
+template <typename... Types> struct package {};
+
+template <int ArgGen> struct wrapper_gen {};
+
+template <int ArgNest> struct wrapper_nest
+{
+ typedef wrapper_gen<ArgNest> type_nest;
+};
+
+template <int... ArgPack>
+struct wrapper_pack
+{
+ typedef package<wrapper_gen <ArgPack>...> type_pack;
+ // incorrect error: expansion pattern 'wrapper_gen<ArgNest>'
+ // contains no argument packs
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C
new file mode 100644
index 000000000..8a5a66a10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+// { dg-prune-output "invalid" }
+
+template<int>struct A{};
+template<class...U>void f(U...){
+ A<sizeof...U> x; // { dg-error "surrounded by parentheses" }
+}
+
+
+template<int...> struct Indices;
+template<class> struct Next_increasing_indices;
+template<int...I> struct Next_increasing_indices<Indices<I...> > {
+ typedef Indices<I...,sizeof...I> type; // { dg-error "surrounded by parentheses" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C
new file mode 100644
index 000000000..e360a99be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+struct foo {
+ foo(int a, float b);
+};
+
+struct bar : foo {
+ template<typename... Args>
+ bar(Args&&... args) : foo(2, args){} // { dg-error "parameter packs" }
+};
+
+bar b(2,1.);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C
new file mode 100644
index 000000000..72d58b958
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C
@@ -0,0 +1,22 @@
+// PR c++/55542
+// { dg-do compile { target c++11 } }
+
+template <typename ... P>
+struct B
+{
+ template <typename O>
+ B (O *o, void (O::*f) (P ... p)) {}
+};
+class C
+{
+ void foo (void *, int);
+ template <typename ... A>
+ void bar (A ... a);
+ B <void *> c;
+ B <void *, int> d;
+ C (int) : c (this, &C::bar), d (this, &C::foo) {}
+};
+template <typename ... A>
+void C::bar (A ...)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C
new file mode 100644
index 000000000..e07d33b7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-std=gnu++98 -Wc++11-compat" }
+int static_assert; // { dg-warning "is a keyword" }
+int nullptr; // { dg-warning "is a keyword" }
+
+void foo()
+{
+ static_assert = 5;
+ nullptr = 5;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C
new file mode 100644
index 000000000..324b009e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C
@@ -0,0 +1,5 @@
+// PR c++/50810
+// { dg-do compile { target c++11 } }
+// { dg-options "-std=gnu++98 -Wc++11-compat" }
+
+signed char data[] = { 0xff }; // { dg-warning "narrowing" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C
new file mode 100644
index 000000000..204b4ae99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C
@@ -0,0 +1,5 @@
+// PR c++/50810
+// { dg-do compile { target c++11 } }
+// { dg-options "-std=gnu++98 -Wc++11-compat -Wno-narrowing" }
+
+signed char data[] = { 0xff };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-neg.C
new file mode 100644
index 000000000..134b3b89c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-neg.C
@@ -0,0 +1,58 @@
+// { dg-do compile { target c++11_only } }
+
+class [[deprecated]] A // { dg-warning "attribute directive ignored" }
+{
+};
+
+[[deprecated]]
+int
+foo(int n) // { dg-warning "attribute directive ignored" }
+{
+ return 42 + n;
+}
+
+class [[deprecated("B has been superceded by C")]] B // { dg-warning "attribute directive ignored" }
+{
+};
+
+[[deprecated("bar is unsafe; use foobar instead")]]
+int
+bar(int n) // { dg-warning "attribute directive ignored" }
+{
+ return 42 + n - 1;
+}
+
+#if __cplusplus > 201103L
+
+// Deprecate C for C++14 onwards.
+class [[deprecated]] C;
+
+// Deprecate foobar for C++14 onwards.
+[[deprecated]]
+int
+foobar(int n);
+
+#endif
+
+class C
+{
+};
+
+int
+foobar(int n)
+{
+ return 43 + n - 1;
+}
+
+int
+main()
+{
+ A aaa;
+ int n = foo(12);
+
+ B bbb;
+ int m = bar(666);
+
+ C ccc;
+ int l = foobar(8);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated.C
new file mode 100644
index 000000000..698268a77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/attr-deprecated.C
@@ -0,0 +1,58 @@
+// { dg-do compile { target c++1y } }
+
+class [[deprecated]] A
+{
+};
+
+[[deprecated]]
+int
+foo(int n)
+{
+ return 42 + n;
+}
+
+class [[deprecated("B has been superceded by C")]] B
+{
+};
+
+[[deprecated("bar is unsafe; use foobar instead")]]
+int
+bar(int n)
+{
+ return 42 + n - 1;
+}
+
+#if __cplusplus > 201103L
+
+// Deprecate C for C++14 onwards.
+class [[deprecated]] C;
+
+// Deprecate foobar for C++14 onwards.
+[[deprecated]]
+int
+foobar(int n);
+
+#endif
+
+class C
+{
+};
+
+int
+foobar(int n)
+{
+ return 43 + n - 1;
+}
+
+int
+main()
+{
+ A aaa; // { dg-warning "is deprecated" }
+ int n = foo(12); // { dg-warning "is deprecated" }
+
+ B bbb; // { dg-warning "is deprecated" "B has been superceded by C" }
+ int m = bar(666); // { dg-warning "is deprecated" "bar is unsafe; use foobar instead" }
+
+ C ccc; // { dg-warning "is deprecated" }
+ int l = foobar(8); // { dg-warning "is deprecated" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-dtor1.C
new file mode 100644
index 000000000..0a109fe8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-dtor1.C
@@ -0,0 +1,21 @@
+// DR 1586
+// { dg-do run { target c++1y } }
+
+template <class T>
+void f (T* p)
+{
+ p->~auto();
+}
+
+int d;
+struct A { ~A() { ++d; } };
+
+int main()
+{
+ f(new int(42));
+ f(new A);
+ if (d != 1)
+ throw;
+
+ (new int)->~auto();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn1.C
new file mode 100644
index 000000000..7a5b4908a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn1.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++1y } }
+
+constexpr auto f() { return (char)42; }
+#define SA(X) static_assert ((X),#X)
+SA (f() == 42);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn10.C
new file mode 100644
index 000000000..890cfda12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn10.C
@@ -0,0 +1,16 @@
+// A template declared with auto should be declared with auto in an
+// explicit instantiation or explicit specialization, too.
+// { dg-do compile { target c++1y } }
+
+template <class T>
+auto f(T t) { return t; }
+
+template<> auto f<int>(int);
+template auto f<float>(float);
+template<> auto f(int*);
+template auto f(float*);
+
+template<> short f<short>(short); // { dg-error "does not match" }
+template char f<char>(char); // { dg-error "does not match" }
+template<> short f(short*); // { dg-error "does not match" }
+template char f(char*); // { dg-error "does not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn11.C
new file mode 100644
index 000000000..132f959db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn11.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++1y } }
+
+auto f() { return; } // OK, return type is void
+auto* g() { return; } // { dg-error "no value" }
+auto* h() { } // { dg-error "no return statements" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn12.C
new file mode 100644
index 000000000..04ea81929
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn12.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++1y } }
+// { dg-final { scan-assembler "_ZN1AIiEcvDaEv" } }
+
+template <class T>
+struct A {
+ T t;
+ operator auto() { return t+1; }
+};
+
+int main()
+{
+ int i = A<int>{42};
+ return (i != 43);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn13.C
new file mode 100644
index 000000000..8f4e10501
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn13.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++1y } }
+
+struct A {
+ template <class T>
+ operator auto() { return T(); } // { dg-warning "auto.*template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn14.C
new file mode 100644
index 000000000..f17c0e289
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn14.C
@@ -0,0 +1,5 @@
+// PR c++/56177
+// { dg-do compile { target c++1y } }
+
+auto f ();
+auto f () { return 33; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn15.C
new file mode 100644
index 000000000..987aa96b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn15.C
@@ -0,0 +1,51 @@
+// { dg-do compile { target c++1y } }
+// { dg-options "-Wno-return-local-addr" }
+
+template<class,class> struct same_type;
+template<class T> struct same_type<T,T> {};
+
+int& f();
+int i;
+
+decltype(auto) g() { return f(); }
+decltype(auto) h1() { return i; }
+decltype(auto) h2() { return (i); }
+decltype(auto) h2a() { return 0,i; }
+
+struct A { int i; };
+A a;
+
+decltype(auto) h3() { return a.i; }
+decltype(auto) h4() { return (a.i); }
+
+template <class T>
+decltype(auto) h5(T t) { return t.i; }
+template <class T>
+decltype(auto) h6(T t) { return (t.i); }
+
+int main()
+{
+ decltype(auto) i = f();
+ same_type<decltype(i),int&>();
+ decltype(auto) i2 = i;
+ same_type<decltype(i2),int&>();
+ decltype(auto) i3 = ::i;
+ same_type<decltype(i3),int>();
+ decltype(auto) i4 = (::i);
+ same_type<decltype(i4),int&>();
+ decltype(auto) i5 = a.i;
+ same_type<decltype(i5),int>();
+ decltype(auto) i6 = (a.i);
+ same_type<decltype(i6),int&>();
+ decltype(auto) i7 = true ? ::i : ::i;
+ same_type<decltype(i7),int&>();
+
+ same_type<decltype(g()),int&>();
+ same_type<decltype(h1()),int>();
+ same_type<decltype(h2()),int&>();
+ same_type<decltype(h2a()),int&>();
+ same_type<decltype(h3()),int>();
+ same_type<decltype(h4()),int&>();
+ same_type<decltype(h5(a)),int>();
+ same_type<decltype(h6(a)),int&>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn16.C
new file mode 100644
index 000000000..233f26f81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn16.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++1y } }
+
+template<class,class> struct ST;
+template<class T> struct ST<T,T> {};
+
+int j;
+auto x3 = []()->auto&& { return j; }; // OK: return type is int&
+
+int main()
+{
+ ST<decltype(x3()),int&>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn17.C
new file mode 100644
index 000000000..ee668b626
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn17.C
@@ -0,0 +1,21 @@
+// { dg-do run { target c++1y } }
+
+int c;
+int d;
+
+struct A
+{
+ A() { ++c; }
+ A(const A&) { ++c; }
+ ~A() { ++d; }
+};
+
+A g() { return A(); }
+decltype(auto) f() { return g(); }
+
+int main()
+{
+ f();
+ if (c < 1 || c != d)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn18.C
new file mode 100644
index 000000000..ca1b0b033
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn18.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++1y } }
+
+struct A
+{
+ virtual int f() { return 1; } // { dg-message "overriding" }
+ virtual auto g() { return 1; } // { dg-error "virtual" }
+};
+
+struct B: A
+{
+ auto f() { return 1; } // { dg-error "return type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn19.C
new file mode 100644
index 000000000..ecd8b91e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn19.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++1y } }
+
+template <class T>
+auto f() { return T::i; }
+
+extern template auto f<int>(); // does not force instantiation
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn2.C
new file mode 100644
index 000000000..f89c86ce3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn2.C
@@ -0,0 +1,3 @@
+// { dg-do compile { target c++1y } }
+
+auto f() { return f(); } // { dg-error "auto" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn20.C
new file mode 100644
index 000000000..818b6f5da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn20.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++1y } }
+
+template <class T>
+auto f(T) { return 42; }
+template <class T>
+auto g(T) { return 0.0; }
+
+int main()
+{
+ int (*p)(int) = &f; // OK
+ p = &g; // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn21.C
new file mode 100644
index 000000000..df23a8148
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn21.C
@@ -0,0 +1,6 @@
+// N3638: decltype(auto) must stand alone
+// { dg-do compile { target c++1y } }
+
+void f();
+decltype(auto) g1() { return &f; }
+decltype(auto)* g2() { return f; } // { dg-error "decltype.auto" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn22.C
new file mode 100644
index 000000000..0077b89e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn22.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++1y } }
+
+struct A
+{
+ operator auto();
+};
+
+// { dg-final { scan-assembler "_ZN1AcvDaEv" } }
+A::operator auto() { return 42; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C
new file mode 100644
index 000000000..f153e2a7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn23.C
@@ -0,0 +1,10 @@
+// PR c++/58561
+// { dg-do compile { target c++1y } }
+// { dg-options "-g" }
+
+auto foo();
+
+namespace N
+{
+ using ::foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn24.C
new file mode 100644
index 000000000..dfff2029c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn24.C
@@ -0,0 +1,13 @@
+// PR c++/60314
+// { dg-do compile { target c++1y } }
+// { dg-options "-g" }
+
+// fine
+decltype(auto) qux() { return 42; }
+
+struct foo
+{
+ // also ICEs if not static
+ static decltype(auto) bar()
+ { return 42; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C
new file mode 100644
index 000000000..628a685f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C
@@ -0,0 +1,15 @@
+// PR c++/60574
+// { dg-options "-flto" }
+// { dg-do compile { target c++1y } }
+
+struct A
+{
+ virtual auto foo() {} // { dg-error "virtual.*deduced" }
+};
+
+struct B : A
+{
+ auto foo();
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn3.C
new file mode 100644
index 000000000..73ec5a7c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn3.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++1y } }
+
+bool b;
+auto f()
+{
+ if (b)
+ return 42;
+ else
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn4.C
new file mode 100644
index 000000000..4c3227a0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn4.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++1y } }
+
+template <class T>
+constexpr auto f(T t) { return t+1; }
+
+#define SA(X) static_assert((X),#X)
+SA(f(1)==2);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn5.C
new file mode 100644
index 000000000..b85714002
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn5.C
@@ -0,0 +1,10 @@
+// { dg-do run { target c++1y } }
+
+int i;
+auto& f() { return i; }
+
+int main()
+{
+ f() = 42;
+ return i != 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn6.C
new file mode 100644
index 000000000..123132ddf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn6.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++1y } }
+
+template <class T, class U> struct ST;
+template <class T> struct ST<T,T> {};
+
+int g(int);
+char& g(char);
+double&& g(double);
+
+template <class T> auto&& f(T t)
+{ return g(t); } // { dg-warning "reference to temporary" }
+
+int main()
+{
+ ST<decltype(f(1)),int&&>();
+ ST<decltype(f('\0')),char&>();
+ ST<decltype(f(1.0)),double&&>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn7.C
new file mode 100644
index 000000000..deb664c3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn7.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++1y } }
+
+auto f();
+
+template <class T> auto f(T);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn8.C
new file mode 100644
index 000000000..1badd6a5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn8.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++1y } }
+
+auto f() { return 42; } // { dg-message "old declaration .auto" }
+auto f(); // OK
+int f(); // { dg-error "new declaration" }
+
+template <class T> auto f(T t) { return t; }
+template <class T> T f(T t);
+
+int main()
+{
+ f(42); // { dg-error "ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn9.C
new file mode 100644
index 000000000..018d42cce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn9.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++1y } }
+// { dg-final { scan-assembler "_Z1fIiERDaRKT_S1_" } }
+
+template <class T>
+auto& f(const T& t, T u) { return t; }
+
+int main()
+{
+ int i;
+ f(i,i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-mangle1.C
new file mode 100644
index 000000000..0ea437ca4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-mangle1.C
@@ -0,0 +1,12 @@
+// Mangling for decltype(auto)
+// { dg-do compile { target c++1y } }
+
+void f();
+
+// { dg-final { scan-assembler "_Z2g1IiEDcv" } }
+template <class T> decltype(auto) g1() { return &f; }
+template decltype(auto) g1<int>();
+
+// { dg-final { scan-assembler "_Z2g2IiEDav" } }
+template <class T> auto g2() { return &f; }
+template auto g2<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-neg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-neg1.C
new file mode 100644
index 000000000..a6f31f63d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-neg1.C
@@ -0,0 +1,16 @@
+// PR c++/60312
+// { dg-do compile { target c++1y } }
+
+template<typename> struct A;
+
+template<> struct A<auto> // { dg-error "auto|template argument" }
+{
+ template<int> void foo();
+};
+
+void bar()
+{
+ A<auto>().foo<0>(); // { dg-error "auto|template argument" }
+}
+
+// { dg-prune-output "expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/complex_literals.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/complex_literals.h
new file mode 100644
index 000000000..ea328e39e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/complex_literals.h
@@ -0,0 +1,12 @@
+
+#include <complex>
+
+#pragma GCC system_header
+
+std::complex<float>
+operator""if(long double ximag)
+{ return std::complex<float>(0.0F, static_cast<float>(ximag)); }
+
+std::complex<float>
+operator""if(unsigned long long nimag)
+{ return std::complex<float>(0.0F, static_cast<float>(nimag)); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/context-conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/context-conv1.C
new file mode 100644
index 000000000..fe20cab3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/context-conv1.C
@@ -0,0 +1,32 @@
+// N3323
+
+#define assert(E) if(!(E))__builtin_abort();
+
+template<class T>
+class zero_init
+{
+public:
+ zero_init( )
+ : val( static_cast<T>(0) ) { }
+ zero_init( T val ) : val( val )
+ { }
+ operator T & ( ) { return val; }
+ operator T ( ) const { return val; }
+private:
+ T val;
+};
+
+void f()
+{
+ zero_init<int*> p; assert( p == 0 );
+ p = new int(7);
+ assert( *p == 7 );
+ delete p; // error!
+
+ zero_init<int> i; assert( i == 0 );
+ i = 7;
+ assert( i == 7 );
+ switch( i ) { } // error!
+
+ int *vp = new int[i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/cplusplus.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/cplusplus.C
new file mode 100644
index 000000000..2cfd84fad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/cplusplus.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++1y } }
+
+#if __cplusplus <= 201103L
+#error
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C
new file mode 100644
index 000000000..453fe106a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target { ! c++1y } } }
+
+#define assert(E) if(!(E))__builtin_abort();
+
+#define m(x) 0
+
+int
+main()
+{
+ int i = m(1'2)+(3'4);
+ assert(i == 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C
new file mode 100644
index 000000000..6c342a7a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++1y } }
+
+int
+main()
+{
+ int i = 0;
+ i = 1048''576; // { dg-error "adjacent digit separators" }
+ i = 0X'100000; // { dg-error "digit separator after base indicator" }
+ i = 0x'100000; // { dg-error "digit separator after base indicator" }
+ i = 0004''000'000); // { dg-error "adjacent digit separators" }
+ i = 0B1'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0; // OK
+ i = 0b'0001'0000'0000'0000'0000'0000; // { dg-error "digit separator after base indicator" }
+ i = 0b0001'0000'0000'0000'0000'0000'; // { dg-error "digit separator outside digit sequence" }
+ unsigned u = 0b0001'0000'0000'0000'0000'0000'U; // { dg-error "digit separator outside digit sequence" }
+
+ double d = 0.0;
+ d = 1'.602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" }
+ d = 1.'602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" }
+ d = 1.602''176'565e-19; // { dg-error "adjacent digit separators" }
+ d = 1.602'176'565'e-19; // { dg-error "digit separator adjacent to exponent" }
+ d = 1.602'176'565e'-19; // { dg-error "digit separator adjacent to exponent" }
+ d = 1.602'176'565e-'19; // { dg-error "digit separator adjacent to exponent" }
+ d = 1.602'176'565e-1'9; // OK
+ d = 1.602'176'565e-19'; // { dg-error "digit separator outside digit sequence" }
+ float f = 1.602'176'565e-19'F; // { dg-error "digit separator outside digit sequence" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep.C
new file mode 100644
index 000000000..cc670fe06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/digit-sep.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++1y } }
+
+#define assert(E) if(!(E))__builtin_abort();
+
+#define m(x) 0
+
+int
+main()
+{
+ assert(1048576 == 1'048'576);
+ assert(1048576 == 0X100000);
+ assert(1048576 == 0x10'0000);
+ assert(1048576 == 0'004'000'000);
+ assert(1048576 == 0B100000000000000000000);
+ assert(1048576 == 0b0001'0000'0000'0000'0000'0000);
+
+ assert(1.602'176'565e-19 == 1.602176565e-19);
+ assert(1.602'176'565e-1'9 == 1.602176565e-19);
+
+ int i = m(1'2)+(3'4);
+ assert(i == 34);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/fn-generic-member-ool.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/fn-generic-member-ool.C
new file mode 100644
index 000000000..1d7c812d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/fn-generic-member-ool.C
@@ -0,0 +1,36 @@
+// Out-of-line generic member function definitions.
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A {
+ void f(auto x);
+};
+
+void A::f(auto x) {} // injects a new list
+
+template <typename T>
+struct B {
+ void f(auto x);
+};
+
+template <typename T>
+void B<T>::f(auto x) {} // injects a new list
+
+struct C {
+ template <int N>
+ void f(auto x);
+};
+
+template <int N>
+void C::f(auto x) {} // extends existing inner list
+
+template <typename T>
+struct D
+{
+ template <int N>
+ void f(auto x);
+};
+
+template <typename T>
+template <int N>
+void D<T>::f(auto x) {} // extends existing inner list
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C
new file mode 100644
index 000000000..478d6a50b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C
@@ -0,0 +1,26 @@
+// Testcase for an extension to allow return type deduction when the lambda
+// contains more than just a single return-statement.
+
+// { dg-do run { target c++1y } }
+
+bool b;
+template <class T>
+T f (T t)
+{
+ return [=] {
+ auto i = t+1;
+ if (b)
+ return i+1;
+ else
+ return i+1;
+ }();
+}
+
+int main()
+{
+ // Pointless, but well-formed.
+ [] { return 1; return 2; }();
+
+ if (f(1) != 3)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C
new file mode 100644
index 000000000..0069a6eae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C
@@ -0,0 +1,26 @@
+// Generic lambda conversion to function ptr test from N3690 5.1.2.6
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void f1(int (*)(int)) { }
+void f2(char (*)(int)) { }
+void g(int (*)(int)) { } // #1
+void g(char (*)(char)) { } // #2
+void h(int (*)(int)) { } // #3
+void h(char (*)(int)) { } // #4
+
+int main()
+{
+ auto glambda = [](auto a) { return a; };
+ int (*fp)(int) = glambda;
+ f1(glambda); // OK
+ f2(glambda); // { dg-error "invalid user-defined conversion" }
+ g(glambda); // { dg-error "ambiguous" }
+ h(glambda); // OK: calls #3 since it is convertible from ID
+ int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK
+
+ auto GL = [](auto a) { return a; };
+ int (*GL_int)(int) = GL; // OK: through conversion function template
+ GL_int(3);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C
new file mode 100644
index 000000000..c22bb97ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C
@@ -0,0 +1,42 @@
+// Generic lambda type dependence test part from N3690 5.1.2.12
+// { dg-do compile { target c++1y } }
+
+void f(int, const int (&)[2] = {}) { } // #1
+void f(const int&, const int (&)[1]) { } // #2
+
+void test()
+{
+ const int x = 17;
+ auto g = [](auto a) {
+ f(x); // OK: calls #1, does not capture x
+ };
+ auto g2 = [=](auto a) {
+ int selector[sizeof(a) == 1 ? 1 : 2]{};
+ f(x, selector); // OK: is a dependent expression, so captures x
+ };
+}
+
+struct S {
+ struct N {
+ auto test () { return 7.f; }
+ };
+};
+
+#include <utility>
+
+int main()
+{
+ auto f = [] <typename T> (T const& s) mutable {
+ typename T::N x;
+ return x.test ();
+ };
+ auto g = [] (auto const& s) {
+ typename std::decay<decltype (s)>::type::N x;
+ return x.test ();
+ };
+
+ S i;
+ f(i);
+ g(i);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C
new file mode 100644
index 000000000..3e67ebd16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C
@@ -0,0 +1,10 @@
+// Mixed explicit and implicit generic lambda test.
+// { dg-do compile { target c++1y } }
+
+int main()
+{
+ auto f = [] <typename T> (T a, auto b) { return a + b; };
+ auto g = [] <typename T> (auto a, T b) { return a + b; };
+
+ return f (1.0, 3) + g (1.0, 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C
new file mode 100644
index 000000000..f0e9a5bbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C
@@ -0,0 +1,51 @@
+// Ensure that generic lambdas properly construct and destroy user types.
+// { dg-options "-DUSE_AUTO_SYNTAX" }
+// { dg-do run { target c++1y } }
+
+int i = 3;
+
+struct S
+{
+ S () { ++i; }
+ S (S const&) { ++i; }
+ S (S&& old) { old.shadow = true; i += 2; }
+ ~S () { if (shadow) i -= 2; else --i; }
+
+ bool shadow = false;
+};
+
+extern "C" void printf(...);
+#define assert(e) if (e); else \
+ printf ("%s:%d: !(%s)\n", __FILE__, __LINE__, #e), __builtin_abort ();
+
+int main ()
+{
+ assert (i == 3);
+ {
+ S s; assert (i == 4);
+
+ #if USE_AUTO_SYNTAX
+ auto byref = [] (auto& r) { (void) r; };
+ auto bycref = [] (auto const& r) { (void) r; };
+ auto byval = [] (auto v, auto const x) { assert (i == x); (void) v; };
+ auto byrval = [] (auto&& r, auto const x) { S steal (static_cast<S&&>(r));
+ assert (i == x); };
+
+ #elif USE_EXPLICIT_TEMPLATE_SYNTAX
+ auto byref = [] <typename T> (T& r) { (void) r; };
+ auto bycref = [] <typename T> (T const& r) { (void) r; };
+ auto byval = [] <typename T, typename I>
+ (T v, I const x) { assert (i == x); (void) v; };
+ auto byrval = [] <typename T, typename I>
+ (T&& r, I const x) { S steal (static_cast<S&&>(r));
+ assert (i == x); };
+ #endif
+
+ byref (s); assert (i == 4);
+ bycref (s); assert (i == 4);
+ byval (s, 5); assert (i == 4);
+ byrval (static_cast<S&&>(s), 6); assert (i == 5);
+ }
+ assert (i == 3);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C
new file mode 100644
index 000000000..7065ac606
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic.C
@@ -0,0 +1,14 @@
+// Basic generic lambda test
+// { dg-do run { target c++1y } }
+
+template <typename T, typename U> struct pair {};
+template <typename... T> struct tuple {};
+
+int main()
+{
+ auto a = [] (auto, pair<auto,auto> v) { return sizeof (v); };
+ auto b = [] (auto, pair<pair<auto,auto>,auto>... v) { return sizeof... (v); };
+
+ a(1, pair<int, float>());
+ b(2, pair<pair<short,char>, double>(), pair<pair<float,long>, int>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C
new file mode 100644
index 000000000..f646b85b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C
@@ -0,0 +1,24 @@
+// PR c++/59271
+// { dg-do compile { target c++1y } }
+
+extern "C" int printf (const char *, ...);
+
+void f(int n)
+{
+ int a[n];
+
+ for (auto& i : a)
+ {
+ i = &i - a;
+ }
+
+ [&a] (auto m)
+ {
+ for (auto i : a)
+ {
+ printf ("%d", i);
+ }
+
+ return m;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C
new file mode 100644
index 000000000..b722aa7b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-x.C
@@ -0,0 +1,25 @@
+// Explicit generic lambda test from N3690 5.1.2.5
+// { dg-do compile { target c++1y } }
+
+#include <iostream>
+
+int main()
+{
+ auto glambda = [] <typename A, typename B> (A a, B&& b) { return a < b; };
+ bool b = glambda(3, 3.14); // OK
+ auto vglambda = [] <typename P> (P printer) {
+ return [=] <typename... T> (T&& ... ts) { // OK: ts is a function parameter pack
+ printer(std::forward<decltype(ts)>(ts)...);
+ return [=]() {
+ printer(ts ...);
+ };
+ };
+ };
+ auto p = vglambda( [] <typename A,
+ typename B,
+ typename C> (A v1, B v2, C v3)
+ { std::cout << v1 << v2 << v3; } );
+ auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14
+ q(); // OK: outputs 1a3.14
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C
new file mode 100644
index 000000000..fbd74220d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xcfun.C
@@ -0,0 +1,26 @@
+// Explicit generic lambda conversion to function ptr test from N3690 5.1.2.6
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void f1(int (*)(int)) { }
+void f2(char (*)(int)) { }
+void g(int (*)(int)) { } // #1
+void g(char (*)(char)) { } // #2
+void h(int (*)(int)) { } // #3
+void h(char (*)(int)) { } // #4
+
+int main()
+{
+ auto glambda = [] <typename T> (T a) { return a; };
+ int (*fp)(int) = glambda;
+ f1(glambda); // OK
+ f2(glambda); // { dg-error "invalid user-defined conversion" }
+ g(glambda); // { dg-error "ambiguous" }
+ h(glambda); // OK: calls #3 since it is convertible from ID
+ int& (*fpi)(int*) = [] <typename T> (T* a) -> auto& { return *a; }; // OK
+
+ auto GL = [] <typename T> (T a) { return a; };
+ int (*GL_int)(int) = GL; // OK: through conversion function template
+ GL_int(3);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C
new file mode 100644
index 000000000..f6e9e5bff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic-xudt.C
@@ -0,0 +1,5 @@
+// Ensure that generic lambdas properly construct and destroy user types.
+// { dg-do compile { target c++1y } }
+// { dg-options "-DUSE_EXPLICIT_TEMPLATE_SYNTAX" }
+
+#include "lambda-generic-udt.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C
new file mode 100644
index 000000000..9721e87d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-generic.C
@@ -0,0 +1,23 @@
+// Generic lambda test from N3690 5.1.2.5
+// { dg-do compile { target c++1y } }
+
+#include <iostream>
+
+int main()
+{
+ auto glambda = [](auto a, auto&& b) { return a < b; };
+ bool b = glambda(3, 3.14); // OK
+ auto vglambda = [](auto printer) {
+ return [=](auto&& ... ts) { // OK: ts is a function parameter pack
+ printer(std::forward<decltype(ts)>(ts)...);
+ return [=]() {
+ printer(ts ...);
+ };
+ };
+ };
+ auto p = vglambda( [](auto v1, auto v2, auto v3)
+ { std::cout << v1 << v2 << v3; } );
+ auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14
+ q(); // OK: outputs 1a3.14
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init.C
new file mode 100644
index 000000000..f9a80059b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init.C
@@ -0,0 +1,8 @@
+// Test for the explicit initializer extension of C++1y
+// { dg-do compile { target c++1y } }
+
+int main()
+{
+ int j = [i = 2]{sizeof(i); return i;}();
+ return (j != 2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C
new file mode 100644
index 000000000..252546414
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init1.C
@@ -0,0 +1,13 @@
+// N3648: capture init
+// { dg-options "-w" }
+// { dg-do run { target c++1y } }
+
+int main()
+{
+ int x = 41;
+ auto r = [x = x+1]{ return x; }();
+ if (r != 42) __builtin_abort();
+
+ static auto *p = &r;
+ [&x=r]{ if (&x != p) __builtin_abort(); }();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C
new file mode 100644
index 000000000..83ec57e67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init2.C
@@ -0,0 +1,13 @@
+// N3648: redundancy and capture init
+// { dg-do compile { target c++1y } }
+
+int main()
+{
+ int x = 42;
+ [=,x]{}; // { dg-error "redundant" }
+ [=,&x]{};
+ [&,&x]{}; // { dg-error "redundant" }
+ [&,x]{};
+ [=,x=24]{};
+ [&,&r=x]{};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C
new file mode 100644
index 000000000..433722846
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init3.C
@@ -0,0 +1,11 @@
+// N3648: capture init at non-block scope
+// { dg-options "-w" }
+// { dg-do run { target c++1y } }
+
+int i = 42;
+int j = [x=i]{ return x; }();
+
+int main()
+{
+ if (j != 42) __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C
new file mode 100644
index 000000000..0affb31bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init4.C
@@ -0,0 +1,13 @@
+// N3648: capture init example from paper
+// { dg-do run { target c++1y } }
+
+int x = 4;
+auto y = [&r = x, x = x+1]()->int {
+ r += 2;
+ return x+2;
+}(); // Updates ::x to 6, and initializes y to 7.
+
+int main()
+{
+ if (x != 6 || y != 7) __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init5.C
new file mode 100644
index 000000000..b136f45ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init5.C
@@ -0,0 +1,10 @@
+// Test for paren and brace initializers
+// { dg-do run { target c++1y } }
+
+#include <initializer_list>
+
+int main()
+{
+ if ([x(42)]{ return x; }() != 42) __builtin_abort();
+ if ([x{1,2}]{ return x.begin()[0]; }() != 1) __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C
new file mode 100644
index 000000000..2b82bca45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init6.C
@@ -0,0 +1,12 @@
+// Test that simple captures are not named in the closure type, but
+// initialized captures are named.
+// { dg-do compile { target c++1y } }
+
+int main()
+{
+ int i;
+ auto lam = [i,j=42]{};
+ lam.j;
+ lam.j.foo; // { dg-error "::j" }
+ lam.i; // { dg-error "no member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init7.C
new file mode 100644
index 000000000..224cd1a61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/lambda-init7.C
@@ -0,0 +1,6 @@
+// PR c++/59349
+// { dg-do compile { target c++1y } }
+
+int foo () {
+ [bar()]{}; // { dg-error "empty initializer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/mangle1.C
new file mode 100644
index 000000000..0642f1479
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/mangle1.C
@@ -0,0 +1,14 @@
+// Test that the parens don't show up in the mangling
+// { dg-do compile { target c++1y } }
+// { dg-options "-Wno-return-local-addr" }
+// { dg-final { scan-assembler "_Z1gI1AEDTdtfp_1iET_" } }
+
+struct A { int i; };
+
+template <class T>
+auto g(T t)->decltype((t.i)) { return t.i; }
+
+int main()
+{
+ g(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57640.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57640.C
new file mode 100644
index 000000000..b9debe145
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57640.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++1y } }
+
+#include <chrono>
+
+using namespace std::literals::chrono_literals;
+
+auto blooper = operator"" min(45.0L);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58500.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58500.C
new file mode 100644
index 000000000..ec7d564b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58500.C
@@ -0,0 +1,7 @@
+// PR c++/58500
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A {};
+
+void foo(auto (A::*)());
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58533.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58533.C
new file mode 100644
index 000000000..34d43aabd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58533.C
@@ -0,0 +1,7 @@
+// PR c++/58533
+// { dg-do compile { target c++1y } }
+
+void foo()
+{
+ void (*fp)(auto); // { dg-error "auto|not permitted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58534.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58534.C
new file mode 100644
index 000000000..dd5073182
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58534.C
@@ -0,0 +1,7 @@
+// PR c++/58534
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+template<typename> void foo(const auto&) {}
+
+template<typename, typename...T> void foo(const auto&, T...) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58535.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58535.C
new file mode 100644
index 000000000..e0718480b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58535.C
@@ -0,0 +1,8 @@
+// PR c++/58535
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A
+{
+ virtual void foo(auto); // { dg-error "templates" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58536.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58536.C
new file mode 100644
index 000000000..05c00b362
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58536.C
@@ -0,0 +1,10 @@
+// PR c++/58536
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A
+{
+ A(auto);
+};
+
+A::A(auto) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58548.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58548.C
new file mode 100644
index 000000000..122b96f50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58548.C
@@ -0,0 +1,8 @@
+// PR c++/58548
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void foo(auto)
+{
+ struct A { int i; };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58549.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58549.C
new file mode 100644
index 000000000..1b54af4a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58549.C
@@ -0,0 +1,8 @@
+// PR c++/58549
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void foo(auto)
+{
+ void bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58637.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58637.C
new file mode 100644
index 000000000..ecc925811
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58637.C
@@ -0,0 +1,4 @@
+// PR c++/58637
+// { dg-do compile { target c++1y } }
+
+template<> void foo(auto); // { dg-error "auto|not a template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58708.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58708.C
new file mode 100644
index 000000000..226b318f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr58708.C
@@ -0,0 +1,59 @@
+// { dg-do run { target c++1y } }
+
+template<typename, typename>
+ struct is_same
+ {
+ static constexpr bool value = false;
+ };
+
+template<typename _Tp>
+ struct is_same<_Tp, _Tp>
+ {
+ static constexpr bool value = true;
+ };
+
+template<typename CharT, CharT... Str>
+ struct Foo
+ {
+ using char_type = CharT;
+ char_type chars[sizeof...(Str)]{Str...};
+ };
+
+template<typename CharT, CharT... Str>
+ Foo<CharT, Str...>
+ operator""_foo()
+ {
+ return Foo<CharT, Str...>();
+ }
+
+int
+main()
+{
+ auto fooU = U"\x10000\x10001\x10002"_foo;
+ if (is_same<decltype(fooU)::char_type, char32_t>::value != true) __builtin_abort();
+ if (sizeof(fooU.chars)/sizeof(char32_t) != 3) __builtin_abort();
+ if (fooU.chars[0] != 65536) __builtin_abort();
+ if (fooU.chars[1] != 65537) __builtin_abort();
+ if (fooU.chars[2] != 65538) __builtin_abort();
+
+ auto foo = "\x61\x62\x63"_foo;
+ if (is_same<decltype(foo)::char_type, char>::value != true) __builtin_abort();
+ if (sizeof(foo.chars)/sizeof(char) != 3) __builtin_abort();
+ if (foo.chars[0] != 97) __builtin_abort();
+ if (foo.chars[1] != 98) __builtin_abort();
+ if (foo.chars[2] != 99) __builtin_abort();
+
+ auto wfoo = L"\x01020304\x05060708"_foo;
+ if (is_same<decltype(wfoo)::char_type, wchar_t>::value != true) __builtin_abort();
+ if (sizeof(wfoo.chars)/sizeof(wchar_t) != 2) __builtin_abort();
+ if (wfoo.chars[0] != 16909060) __builtin_abort();
+ if (wfoo.chars[1] != 84281096) __builtin_abort();
+
+ auto foou = u"\x0102\x0304\x0506\x0708"_foo;
+ if (is_same<decltype(foou)::char_type, char16_t>::value != true) __builtin_abort();
+ if (sizeof(foou.chars)/sizeof(char16_t) != 4) __builtin_abort();
+ if (foou.chars[0] != 258) __builtin_abort();
+ if (foou.chars[1] != 772) __builtin_abort();
+ if (foou.chars[2] != 1286) __builtin_abort();
+ if (foou.chars[3] != 1800) __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59110.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59110.C
new file mode 100644
index 000000000..c78d645cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59110.C
@@ -0,0 +1,4 @@
+// PR c++/59110
+// { dg-do compile { target c++1y } }
+
+int i = *(auto*)0; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59112.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59112.C
new file mode 100644
index 000000000..bc9d99eb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59112.C
@@ -0,0 +1,10 @@
+// PR c++/59112
+// { dg-do compile { target c++1y } }
+
+void foo()
+{
+ struct A
+ {
+ A(auto) {} // { dg-error "auto|not permitted" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59113.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59113.C
new file mode 100644
index 000000000..8d2bf7fbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59113.C
@@ -0,0 +1,9 @@
+// PR c++/59113
+// { dg-do compile { target c++1y } }
+
+void foo()
+{
+ void bar(auto) {} // { dg-error "function-definition|auto|not permitted" }
+}
+
+auto i = 0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59629.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59629.C
new file mode 100644
index 000000000..b6e561f2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59629.C
@@ -0,0 +1,4 @@
+// PR c++/59629
+// { dg-do compile { target c++1y } }
+
+void foo(int i = []{ auto 0; }()); // { dg-error "expected|could not convert" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59635.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59635.C
new file mode 100644
index 000000000..80d9f4de4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59635.C
@@ -0,0 +1,6 @@
+// PR c++/59635
+// { dg-do compile { target c++1y } }
+
+auto f = [] (auto, ...) { return 0; };
+
+int (*p) (int, ...) = f; // { dg-message "unimplemented" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59636.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59636.C
new file mode 100644
index 000000000..6128753e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59636.C
@@ -0,0 +1,4 @@
+// PR c++/59636
+// { dg-do compile { target c++1y } }
+
+auto f = []() { return []<>() {}; }; // { dg-error "expected identifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59638.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59638.C
new file mode 100644
index 000000000..0125bdcbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr59638.C
@@ -0,0 +1,14 @@
+// PR c++/59638
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void (*a)(auto); // { dg-error "template declaration" }
+
+void (*b)(auto) = 0; // { dg-error "template declaration" }
+
+typedef void (*f)(auto); // { dg-error "template declaration" }
+
+struct A
+{
+ int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60033.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60033.C
new file mode 100644
index 000000000..f918d33fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60033.C
@@ -0,0 +1,20 @@
+// PR c++/60033
+// { dg-do compile { target c++1y } }
+
+template <typename... T>
+auto f(T&&... ts)
+{
+ return sizeof...(ts);
+}
+
+template <typename... T>
+auto g(T&&... ts) {
+ return [&] (auto v) {
+ return f(ts...);
+ };
+}
+
+int main()
+{
+ return g(1,2,3,4)(5) == 4 ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60052.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60052.C
new file mode 100644
index 000000000..6ac772020
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60052.C
@@ -0,0 +1,15 @@
+// PR c++/60052
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A
+{
+ void foo(auto);
+};
+
+void A::foo(auto) {}
+
+struct B
+{
+ void bar(auto);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60053.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60053.C
new file mode 100644
index 000000000..846039052
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60053.C
@@ -0,0 +1,15 @@
+// PR c++/60053
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A
+{
+ void foo(auto);
+};
+
+void A::foo(auto) {}
+
+template<typename> struct B
+{
+ template<typename T> void bar(auto);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60064.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60064.C
new file mode 100644
index 000000000..e61704e8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60064.C
@@ -0,0 +1,21 @@
+// PR c++/60064
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+class A
+{
+ int m;
+ friend void foo (auto) {}
+ friend void foo2 (auto);
+};
+
+void foo2 (auto i)
+{
+ A a;
+ a.m = i;
+}
+
+int main ()
+{
+ foo2 (7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60065.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60065.C
new file mode 100644
index 000000000..2cf8da12b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60065.C
@@ -0,0 +1,8 @@
+// PR c++/60065
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+template <int> void foo(auto... x);
+template <typename> void foo2(auto... x);
+template <int> void foo3(auto... x, auto y, auto... z);
+template <typename> void foo4(auto... x, auto y, auto... z);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60190.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60190.C
new file mode 100644
index 000000000..9a5b484a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60190.C
@@ -0,0 +1,4 @@
+// PR c++/60190
+// { dg-do compile { target c++1y } }
+
+auto f = []<int>() -> int() {}; // { dg-error "returning a function|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60311.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60311.C
new file mode 100644
index 000000000..001e99327
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60311.C
@@ -0,0 +1,15 @@
+// PR c++/60311
+// { dg-do compile { target c++1y } }
+
+template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+
+struct B {
+ template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+};
+
+template <typename T>
+struct C {
+ template<void(*)(auto)> struct A {}; // { dg-error "auto" }
+};
+
+using D = C<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60332.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60332.C
new file mode 100644
index 000000000..c0a67a9f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60332.C
@@ -0,0 +1,6 @@
+// PR c++/60332
+// { dg-do compile { target c++1y } }
+
+void foo();
+
+auto f = (auto(*)())(&foo); // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60376.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60376.C
new file mode 100644
index 000000000..51d088a2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60376.C
@@ -0,0 +1,12 @@
+// PR c++/60376
+// { dg-do compile { target c++1y } }
+
+struct A
+{
+ int foo();
+};
+
+template<typename> void bar()
+{
+ using (A().foo); // { dg-error "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60377.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60377.C
new file mode 100644
index 000000000..6d1d416ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60377.C
@@ -0,0 +1,10 @@
+// PR c++/60377
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void foo(auto, void (f*)()); // { dg-error "expected" }
+
+struct A
+{
+ int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60384.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60384.C
new file mode 100644
index 000000000..f206647e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60384.C
@@ -0,0 +1,9 @@
+// PR c++/60384
+// { dg-do compile { target c++1y } }
+
+template<typename> int foo();
+
+struct A
+{
+ typedef auto foo<>(); // { dg-error "typedef declared 'auto'" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60390.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60390.C
new file mode 100644
index 000000000..5cd5539f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60390.C
@@ -0,0 +1,26 @@
+// PR c++/60390
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A
+{
+ void foo (auto);
+};
+
+class B
+{
+ int m;
+ friend void A::foo (auto);
+};
+
+void A::foo (auto i)
+{
+ B b;
+ b.m = i;
+}
+
+int main ()
+{
+ A a;
+ a.foo (7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60391.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60391.C
new file mode 100644
index 000000000..68746aedf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60391.C
@@ -0,0 +1,10 @@
+// PR c++/60391
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+namespace N
+{
+ int operator"" _X(auto) {} // { dg-error "invalid" }
+}
+
+namespace N {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60393.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60393.C
new file mode 100644
index 000000000..8e89be499
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60393.C
@@ -0,0 +1,10 @@
+// PR c++/60393
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+void (*f)(auto) + 0; // { dg-error "expected" }
+
+struct A
+{
+ int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60627.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60627.C
new file mode 100644
index 000000000..9e2116e9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60627.C
@@ -0,0 +1,12 @@
+// PR c++/60627
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+template<typename T> void foo(T) {}
+
+template void foo(auto); // { dg-error "auto|does not match" }
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/regress1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/regress1.C
new file mode 100644
index 000000000..5bb804258
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/regress1.C
@@ -0,0 +1,12 @@
+// PR c++/60409
+// { dg-do compile { target c++1y } }
+
+struct A
+{
+ void foo();
+};
+
+template<typename T> void bar(T)
+{
+ (A().foo)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C
new file mode 100644
index 000000000..951fa3c5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C
@@ -0,0 +1,13 @@
+// Origin: Dodji Seketeli <dodji@redhat.com>
+// { dg-do compile { target c++1y } }
+
+#include "../system-binary-constants-1.h"
+
+int
+foo (void)
+{
+#if BINARY_INT_CONSTANT_IN_SYSTEM_HEADER
+ return 23;
+#endif
+ return 0b1101; // { dg-bogus "binary constants are a C..1y feature or GCC extension" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template-neg.C
new file mode 100644
index 000000000..c99b2f727
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template-neg.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target { c++11 && { ! c++1y } } } }
+
+template<typename CharT, CharT... String>
+ int
+ operator"" _script()
+ { return 42; } // { dg-error "literal operator template|has invalid parameter list" }
+
+int i = "hi!"_script;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template.C
new file mode 100644
index 000000000..d6b44d9c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-char-template.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++1y } }
+
+template<typename CharT, CharT... String>
+ int
+ operator"" _script()
+ { return 42; }
+
+int i = "hi!"_script;
+int i8 = u8"hi!"_script;
+int iw = L"hi!"_script;
+int i16 = u"hi!"_script;
+int i32 = U"hi!"_script;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-empty-string-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-empty-string-neg.C
new file mode 100644
index 000000000..7c23641e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-empty-string-neg.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++1y } }
+
+int
+operator "*"_s(unsigned long long) // { dg-error "expected empty string after 'operator'" }
+{ return 0; }
+
+int
+operator L"*"_Ls(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator u"*"_s16(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator U"*"_s32(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator u8"*"_u8s(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-enc-prefix-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-enc-prefix-neg.C
new file mode 100644
index 000000000..51def3aca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-enc-prefix-neg.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++1y } }
+
+int
+operator L""_Ls(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator u""_s16(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator U""_s32(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
+
+int
+operator u8""_u8s(unsigned long long) // { dg-error "invalid encoding prefix in literal operator" }
+{ return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-userdef-string.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-userdef-string.C
new file mode 100644
index 000000000..f6c3baec9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/udlit-userdef-string.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++1y } }
+
+#include "complex_literals.h"
+
+auto cx = 1.1if;
+
+auto cn = 123if;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla-initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla-initlist1.C
new file mode 100644
index 000000000..b642ed415
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla-initlist1.C
@@ -0,0 +1,22 @@
+// { dg-do run { target c++1y } }
+
+#include <initializer_list>
+
+struct A
+{
+ int i;
+ A(std::initializer_list<int>) { }
+ A(int i): i{i} { }
+ ~A() {}
+};
+
+int x = 4;
+int main(int argc, char **argv)
+{
+ { int i[x] = { 42, 42, 42, 42 }; }
+ {
+ A a[x] = { argc };
+ if (a[1].i != 42)
+ __builtin_abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla1.C
new file mode 100644
index 000000000..5708cf84e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla1.C
@@ -0,0 +1,40 @@
+// { dg-do compile { target c++1y } }
+
+#include <typeinfo>
+
+void f(int n)
+{
+ int a[n];
+ int aa[n][n]; // { dg-error "" }
+ &a; // { dg-error "" }
+ sizeof a; // { dg-error "" }
+ typeid(a); // { dg-error "" }
+ decltype(a) a2; // { dg-error "" }
+ typedef int at[n]; // { dg-error "" }
+ int (*p)[n]; // { dg-error "" }
+ int (&r)[n] = a; // { dg-error "" }
+ struct A
+ {
+ int a[n]; // { dg-error "" }
+ };
+}
+
+template <class T>
+void g(int n)
+{
+ int a[n];
+ int aa[n][n]; // { dg-error "" }
+ &a; // { dg-error "" }
+ sizeof a; // { dg-error "" }
+ typeid(a); // { dg-error "" }
+ decltype(a) a2; // { dg-error "" }
+ typedef int at[n]; // { dg-error "" }
+ int (*p)[n]; // { dg-error "" }
+ int (&r)[n] = a; // { dg-error "" }
+ struct A
+ {
+ int a[n]; // { dg-error "" }
+ };
+}
+
+template void g<int>(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla10.C
new file mode 100644
index 000000000..c3f71b5c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla10.C
@@ -0,0 +1,24 @@
+// PR c++/57402
+// { dg-do compile { target c++1y } }
+
+int i = 2;
+
+int main()
+{
+ {
+ int a[i];
+ a[1] = 0xbeef;
+ }
+ {
+ int a[i] = { 1 };
+ if (a[1] != 0)
+ __builtin_abort ();
+ a[1] = 0xbeef;
+ }
+ {
+ int a[i] = { };
+ if (a[1] != 0)
+ __builtin_abort ();
+ a[1] = 0xbeef;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla11.C
new file mode 100644
index 000000000..c84b0bbb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla11.C
@@ -0,0 +1,8 @@
+// PR c++/60251
+// { dg-do compile { target c++1y } }
+
+void foo(int n)
+{
+ int x[n];
+ [&x]() { decltype(x) y; }; // { dg-error "decltype of array of runtime bound" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla12.C
new file mode 100644
index 000000000..d605e72a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla12.C
@@ -0,0 +1,7 @@
+// PR c++/60250
+// { dg-do compile { target c++1y } }
+
+template<typename> void foo()
+{
+ typedef int T[ ([](){ return 1; }()) ]; // { dg-error "runtime bound" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla13.C
new file mode 100644
index 000000000..9b69452d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla13.C
@@ -0,0 +1,8 @@
+// PR c++/60227
+// { dg-do compile { target c++1y } }
+
+void foo(int n)
+{
+ int a[n];
+ int (&r)[n] = {}; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla2.C
new file mode 100644
index 000000000..6aa5fcfe9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla2.C
@@ -0,0 +1,14 @@
+// N3639 allows initialization and capture of VLAs
+// { dg-do run { target c++1y } }
+
+void f(int n)
+{
+ int ar[n] = { 42 };
+ auto l = [&] { return ar[0]; };
+ if (l() != 42) __builtin_abort ();
+}
+
+int main()
+{
+ f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla3.C
new file mode 100644
index 000000000..75470365a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla3.C
@@ -0,0 +1,29 @@
+// Test for throwing bad_array_length on invalid array length
+// { dg-do run { target c++1y } }
+
+#include <new>
+
+int f(int i)
+{
+ int ar[i]{1,2,3,4};
+ return ar[i-1];
+}
+
+void g(int i)
+{
+ int ar[i];
+ ar[0] = 42;
+}
+
+int main()
+{
+ int ok = 0;
+ f(4); // OK
+ try { f(3); } // too small
+ catch (std::bad_array_length) { ++ok; }
+ try { g(-24); } // negative
+ catch (std::bad_array_length) { ++ok; }
+
+ if (ok != 2)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla4.C
new file mode 100644
index 000000000..9de1d28fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla4.C
@@ -0,0 +1,23 @@
+// Test for range-based for with VLAs.
+// { dg-do run { target c++1y } }
+
+#include <new>
+
+void f(int i)
+{
+ int ar[i];
+ int j = 0;
+ for (int& x : ar)
+ x = ++j;
+ [&ar]{
+ int k = 0;
+ for (int x : ar)
+ if (x != ++k)
+ __builtin_abort();
+ }();
+}
+
+int main()
+{
+ f(42); // OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla5.C
new file mode 100644
index 000000000..5f0dfdf30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla5.C
@@ -0,0 +1,8 @@
+// PR c++/55149
+// { dg-do compile { target c++1y } }
+
+void test(int n) {
+ int r[n];
+ [&r]() { return r + 0; };
+ [r]() { return r + 0; }; // { dg-error "captured by copy" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla6.C
new file mode 100644
index 000000000..ca527a84c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla6.C
@@ -0,0 +1,15 @@
+// PR c++/57404
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+
+void f (int i)
+{
+ int a[i];
+ [&a] {};
+}
+
+void g (int i)
+{
+ int a[i];
+ [&a] {} ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla7.C
new file mode 100644
index 000000000..df34c8219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla7.C
@@ -0,0 +1,12 @@
+// PR c++/55520
+// { dg-options "-Wno-vla" }
+// { dg-require-effective-target c++11 }
+
+int main(int argc, char** argv)
+{
+ int x[1][argc];
+
+ [&x](int i) { // { dg-error "variable.size" }
+ x[0][i] = 0; // { dg-prune-output "assignment" }
+ }(5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla8.C
new file mode 100644
index 000000000..5077ae343
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla8.C
@@ -0,0 +1,31 @@
+// PR c++/55149
+// { dg-do compile { target c++1y } }
+
+template<unsigned int TA>
+ struct SA
+ {
+ SA (const int & PA);
+ int nt;
+ };
+
+template<typename TB>
+ inline void
+ test(TB aa)
+ {
+ ;
+ }
+
+template<unsigned int TA>
+ inline
+ SA<TA>::SA(const int & PA)
+ {
+ float e[nt];
+ test([&e](int i, int j){ return e[i] < e[j]; });
+ }
+
+int main()
+{
+ int d;
+ SA<2> iso(d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla9.C
new file mode 100644
index 000000000..5f49d11e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/vla9.C
@@ -0,0 +1,31 @@
+// PR c++/57408
+// { dg-do compile { target c++1y } }
+
+template<typename Callable>
+ struct Impl
+ {
+ Callable func;
+ Impl(Callable f) : func(f) { }
+ virtual void run() { func(); }
+ };
+
+template<typename Callable>
+void call(Callable f)
+ {
+ Impl<Callable>(f).run();
+ }
+
+extern "C" int printf(const char*, ...);
+
+int main(){
+ int y = 2;
+ float fa[2][y]; // { dg-error "array of array of runtime bound" }
+ fa[0][0]=0.8;
+ fa[0][1]=1.8;
+ auto fx=[&](){
+ for(int c=0; c<2; c++){
+ printf("use me", fa[0][c]); // { dg-error "capture of variable-size type" }
+ }
+ };
+ call(fx);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/anonunion1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/anonunion1.C
new file mode 100644
index 000000000..c48a8cdc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/anonunion1.C
@@ -0,0 +1,14 @@
+// PR debug/9039
+// Verify that the debugging backends don't get confused by ALIAS_DECLs.
+
+int foo()
+{
+ union
+ {
+ int z;
+ unsigned int w;
+ };
+
+ w = 0;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/const1.C
new file mode 100644
index 000000000..7cbc57141
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/const1.C
@@ -0,0 +1,11 @@
+// PR c++/6381
+// Bug: we were emitting the initializer for bar, which referenced foo,
+// which was not emitted.
+
+// { dg-options "-O" }
+// { dg-do link }
+
+static const int foo[] = { 0 };
+static const int * const bar[] = { foo };
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/const2.C
new file mode 100644
index 000000000..8e98f8b19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/const2.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Apr 2005 <nathan@codesourcery.com>
+
+// { dg-options "-ggdb2" }
+// Origin: ivan <ivanr@syncad.com>
+// pinskia@gcc.gnu.org
+// Bug 20505: ICE with -ggdb2
+
+struct b
+{
+ static const int d;
+ virtual bool IsEmpty() const=0;
+ int e,c;
+};
+const int b::d = ((__SIZE_TYPE__)(&((b*)1)->c) - 1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/const3.C
new file mode 100644
index 000000000..375c548a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/const3.C
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/const4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/const4.C
new file mode 100644
index 000000000..ec8133d77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/const4.C
@@ -0,0 +1,2 @@
+/* { dg-do compile } */
+const __complex__ int x = 2i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/const5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/const5.C
new file mode 100644
index 000000000..e5387ea20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/const5.C
@@ -0,0 +1,13 @@
+// PR c++/49092
+
+struct A
+{
+ A();
+};
+
+int i;
+
+A::A()
+{
+ const int j = i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/crash1.C
new file mode 100644
index 000000000..4fba256b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/crash1.C
@@ -0,0 +1,17 @@
+template <typename T>
+class foo
+{
+ T t;
+};
+
+class bar;
+typedef foo<bar> foobar;
+
+class obj
+{
+ virtual foobar* yeah() = 0;
+};
+
+class bar : virtual public obj
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug.exp b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug.exp
new file mode 100644
index 000000000..3840f02e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug.exp
@@ -0,0 +1,30 @@
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+gcc-dg-debug-runtest g++_target_compile trivial.C [list -O2 -O3] \
+ [lsort [glob -nocomplain $srcdir/$subdir/*.C]]
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug1.C
new file mode 100644
index 000000000..3efcbc98f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug1.C
@@ -0,0 +1,48 @@
+// Test whether dwarf2 debug info works with named return value optimization
+// { dg-do compile }
+
+struct S
+{
+ virtual ~S();
+ S (const char *str);
+ S& operator= (const char *str);
+ operator const char *() const;
+ S& operator+= (const char *str);
+};
+inline S operator+ (const char *s1, const S &s2)
+{
+ S x (s1);
+ x += s2;
+ return x;
+}
+struct U
+{
+ U ();
+ U& operator= (const char *);
+ const char *foo() const;
+ operator const char *() const { return foo(); }
+};
+template <class T> struct V
+{
+ T v;
+};
+template <class T> struct W
+{
+ V<T> *w;
+ W() : w (0) {}
+ const T& operator* () const { return w->v; }
+ T& operator* () { return w->v; }
+};
+struct X {
+ X();
+};
+struct Y {
+ Y (const U &u);
+};
+X::X()
+{
+ W<U> a;
+ U b;
+ b = (*a) + "xx";
+ Y c (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug2.C
new file mode 100644
index 000000000..e0164202d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug2.C
@@ -0,0 +1,42 @@
+/* Verify that sched re-inserts needed scopes properly. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ev5" { target alpha*-*-* } } */
+
+template <class T>
+inline void foo()
+{
+ void (T::*x)() __attribute__ ((__unused__)) = &T::bar;
+}
+
+template <class T>
+struct D
+{
+ void bar() {
+ }
+ T i;
+};
+
+template <class T>
+struct E
+{
+ void bar() {
+ foo <D<T> > ();
+ *i-- = *i;
+ }
+ T i;
+};
+
+struct A {};
+template<typename T> struct B { typedef typename T::t t; };
+template<typename T> struct B<T*> { typedef T& t; };
+template<typename T>
+struct C
+{
+ T b;
+ explicit C (const T& i) : b (i) { }
+ typename B<T>::t operator* () const { return *b; }
+ C operator-- (int) { return C (b--); }
+};
+
+template void foo <E<C<A**> > > ();
+template void foo <D<C<A**> > > ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug3.C
new file mode 100644
index 000000000..c7251429f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug3.C
@@ -0,0 +1,47 @@
+// PR optimization/5547
+// This testcase caused ICE on IA-32, since DWARF-2 was unable
+// to emit location expression for parameter a of operator+.
+// { dg-do compile { target fpic } }
+// { dg-options "-fpic" }
+
+struct A { char *s; };
+
+inline A operator+ (char a, const A &b)
+{
+ A s;
+ s.s = new char[12];
+ s.s[0] = a;
+ return s;
+}
+
+int b (const A &);
+
+void test1 (const A &x, int y)
+{
+ int j = b ("012345"[y] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test2 (const A &x, int y)
+{
+ int j = b ("012345678"[y + 2] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test3 (const A &x, int y)
+{
+ int j = b ("012345678"[y - 6] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test4 (const A &x, int y)
+{
+ int j = b ("012345678"[2 * y - 10] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test5 (const A &x, int y)
+{
+ int j = b ("012345678"[4 * y] + x);
+ for (int i = 0; i < y; i++);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug4.C
new file mode 100644
index 000000000..8dceb0875
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug4.C
@@ -0,0 +1,17 @@
+/* PR debug/5770
+ This testcase failed at -O -g because the following constants
+ were optimized away since they were never referenced, but
+ since they are variables with initializers, rtl_for_decl_location
+ run expand_expr on their initializers and returned it.
+ This lead to references to constants which were deferred and thus
+ never emitted. */
+/* { dg-do link } */
+
+static const char foo[] = "foo string";
+static const char bar[30] = "bar string";
+static const wchar_t baz[] = L"baz string";
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug5.C
new file mode 100644
index 000000000..8dffa9487
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug5.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+int foo()
+{
+ int a = 1;
+ int b = 1;
+ int e[a][b];
+ e[0][0] = 0;
+ return e[a-1][b-1];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug6.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug6.C
new file mode 100644
index 000000000..64f121b00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug6.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i=1, x[i];
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug7.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug7.C
new file mode 100644
index 000000000..8731cf81d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug7.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-prune-output "note" }
+
+void f (int);
+
+int
+main() {
+
+ int a = 4;
+ int b = 5;
+ int (*x)[b] = new int[a][b]; // { dg-error "" }
+
+ x[2][1] = 7;
+
+ for (int i = 0; i < a; ++i)
+ for (int j = 0; j < b; ++j)
+ f (x[i][j]);
+ delete [] x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug8.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug8.C
new file mode 100644
index 000000000..1f8a18ac8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug8.C
@@ -0,0 +1,2 @@
+struct t{};
+struct g : public t{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/debug9.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug9.C
new file mode 100644
index 000000000..aa328ee6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/debug9.C
@@ -0,0 +1,26 @@
+/* { dg-do assemble } */
+/* This testcase requires entries in the debug_range section in DWARF which
+ refer to a vague linkage function. */
+
+struct s
+{
+ ~s ();
+};
+
+bool f1 ();
+s f2 (s);
+
+template<int x> void
+f3(const s & a)
+{
+ while (f1 () && f1 ())
+ {
+ s c = f2(a);
+ }
+}
+
+int main()
+{
+ f3<0>(s ());
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C
new file mode 100644
index 000000000..5c72588e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C
@@ -0,0 +1,17 @@
+// { dg-options "-fno-dwarf2-cfi-asm" }
+
+extern void bar (void);
+int foo (void)
+{
+ try {
+ bar();
+ } catch (...) {
+ return 1;
+ }
+ return 0;
+}
+
+int foobar (void)
+{
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-1.C
new file mode 100644
index 000000000..e90d51030
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-1.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2006 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jan 2006 <nathan@codesourcery.com>
+
+// PR 24824
+// Origin: wanderer@rsu.ru
+
+// { dg-options "-feliminate-dwarf2-dups" }
+
+namespace N
+{
+ struct Base
+ {
+ int m;
+ };
+
+ struct Derived : Base
+ {
+ using Base::m;
+ };
+}
+
+N::Derived thing;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-2.C
new file mode 100644
index 000000000..9e6dbd216
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2-2.C
@@ -0,0 +1,17 @@
+// PR debug/27057
+// { dg-do compile }
+// { dg-options "-g -feliminate-dwarf2-dups" }
+
+namespace N
+{
+}
+
+struct A
+{
+ void foo ();
+};
+
+void A::foo ()
+{
+ using namespace N;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C
new file mode 100644
index 000000000..4992f4191
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C
@@ -0,0 +1,24 @@
+// PR debug/44668
+// { dg-do compile }
+// { dg-options "-g -dA" }
+
+struct C
+{
+private:
+ typedef int a;
+ a b;
+ enum g { g1, g2 } h;
+ struct D { int i; } i;
+protected:
+ typedef int c;
+ c d;
+public:
+ typedef int e;
+ e f;
+} c;
+
+// 3 private DW_TAG_member dies, 1 private DW_TAG_typedef,
+// 1 private DW_TAG_enumeration_type and 1 private DW_TAG_structure_type
+// { dg-final { scan-assembler-times "3\[^\\r\\n\]* DW_AT_accessibility" 6 } }
+// 1 private DW_TAG_member die, 1 private DW_TAG_typedef
+// { dg-final { scan-assembler-times "2\[^\\r\\n\]* DW_AT_accessibility" 2 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C
new file mode 100644
index 000000000..11352fd1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C
@@ -0,0 +1,18 @@
+// PR debug/41828
+// { dg-do compile { target c++11 } }
+// { dg-options "-gdwarf-2 -dA" }
+// { dg-final { scan-assembler-not "<anonymous" } }
+// { dg-final { scan-assembler-not "\\._\[0-9\]" } }
+// { dg-final { scan-assembler-not "\$_\[0-9\]" } }
+// { dg-final { scan-assembler-not "__anon_" } }
+
+struct
+{
+ union
+ {
+ struct
+ {
+ enum { a, b, c } x;
+ } s;
+ };
+} x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/auto1.C
new file mode 100644
index 000000000..aef29ee5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/auto1.C
@@ -0,0 +1,31 @@
+// PR c++/53756
+// { dg-do compile { target c++1y } }
+// { dg-options "-g -dA -fno-debug-types-section" }
+// We're looking for something like
+
+// .uleb128 0x3 # (DIE (0x33) DW_TAG_subprogram)
+// .ascii "a1\0" # DW_AT_name
+// .long 0x4c # DW_AT_type
+//...
+// .uleb128 0x5 # (DIE (0x4c) DW_TAG_unspecified_type)
+// .long .LASF6 # DW_AT_name: "auto"
+//...
+// .uleb128 0x7 # (DIE (0x57) DW_TAG_subprogram)
+// .long 0x33 # DW_AT_specification
+// .long 0x87 # DW_AT_type
+//...
+// .uleb128 0x9 # (DIE (0x87) DW_TAG_base_type)
+// .ascii "int\0" # DW_AT_name
+
+// { dg-final { scan-assembler "a1.*(0x\[0-9a-f]+)\[^\n\r]*DW_AT_type.*\\1. DW_TAG_unspecified_type.*DW_AT_specification\[\n\r]{1,2}\[^\n\r]*(0x\[0-9a-f]+)\[^\n\r]*DW_AT_type.*\\2. DW_TAG_base_type" } }
+
+struct A
+{
+ auto a1 () { return 42; }
+};
+
+int main()
+{
+ A a;
+ a.a1();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/block.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/block.C
new file mode 100644
index 000000000..176823f23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/block.C
@@ -0,0 +1,29 @@
+// Compiler should not generate too many lexical blocks for this function.
+// { dg-do compile { target { i?86-*-* x86_64-*-* } } }
+// { dg-options "-O0 -fno-exceptions -g -dA" }
+
+union UElement {
+ void* pointer;
+ int integer;
+};
+struct UColToken {
+ unsigned source;
+ unsigned char **rulesToParseHdl;
+};
+
+int uhash_hashTokens(const union UElement k)
+{
+ int hash = 0;
+ struct UColToken *key = (struct UColToken *)k.pointer;
+ if (key != 0) {
+ int len = (key->source & 0xFF000000)>>24;
+ int inc = ((len - 32) / 32) + 1;
+ const unsigned char *p = (key->source & 0x00FFFFFF)
+ + *(key->rulesToParseHdl);
+ const unsigned char *limit = p + len;
+ hash = *p + *limit;
+ }
+ return hash;
+}
+
+// { dg-final { scan-assembler-not "LBB10" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/cdtor-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/cdtor-1.C
new file mode 100644
index 000000000..e3bddab0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/cdtor-1.C
@@ -0,0 +1,17 @@
+// origin PR debug/49047
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-do compile }
+
+struct K
+{
+ K () { }
+ ~K () { }
+};
+
+int
+main()
+{
+ K k;
+}
+
+// { dg-final {scan-assembler-times " DW_AT_\[MIPS_\]*linkage_name" 2 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2.C
new file mode 100644
index 000000000..27f4c2658
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2.C
@@ -0,0 +1,6 @@
+/* { dg-do compile { target powerpc_altivec_ok } } */
+/* { dg-options "-O -gdwarf-2 -dA -maltivec" } */
+/* { dg-final { scan-assembler "DW_AT_const_value" } } */
+
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C
new file mode 100644
index 000000000..81360c243
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C
@@ -0,0 +1,7 @@
+/* { dg-do compile { target i386*-*-* } } */
+/* { dg-options "-O -gdwarf-2 -dA -msse" } */
+/* { dg-require-effective-target sse } */
+/* { dg-final { scan-assembler "DW_AT_const_value" } } */
+
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C
new file mode 100644
index 000000000..405739311
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C
@@ -0,0 +1,46 @@
+// Test that debug info generated for auto-inserted deallocator is
+// correctly attributed.
+// This patch scans for the lineno directly from assembly, which may
+// differ between different architectures. Because it mainly tests
+// FE generated debug info, without losing generality, only x86
+// assembly is scanned in this test.
+// { dg-do compile { target { i?86-*-* x86_64-*-* } } }
+// { dg-options "-O2 -fno-exceptions -g -dA" }
+
+struct t {
+ t ();
+ ~t ();
+ void foo();
+ void bar();
+};
+
+int bar();
+
+void foo(int i)
+{
+ t test_outside;
+ for (int j = 0; j < 10; j++)
+ {
+ t test;
+ test.foo();
+ if (i + j)
+ {
+ test.bar();
+ return;
+ }
+ }
+ if (i)
+ {
+ t test;
+ if (i == 10)
+ {
+ test.bar();
+ }
+ }
+ test_outside.foo();
+ return;
+}
+// { dg-final { scan-assembler "deallocator.C:29" } }
+// { dg-final { scan-assembler "deallocator.C:31" } }
+// { dg-final { scan-assembler "deallocator.C:38" } }
+// { dg-final { scan-assembler "deallocator.C:41" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp
new file mode 100644
index 000000000..d947a0eaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp
@@ -0,0 +1,43 @@
+# Copyright (C) 2007-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+ set DEFAULT_CFLAGS " -gdwarf-2"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+set comp_output [g++_target_compile \
+ "$srcdir/$subdir/../trivial.C" "trivial.S" assembly \
+ "additional_flags=-gdwarf-2"]
+if { ! [string match "*: target system does not support the * debug format*" \
+ $comp_output] } {
+ remove-build-file "trivial.S"
+ g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/dwarf2/*.c]] \
+ $DEFAULT_CFLAGS
+}
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C
new file mode 100644
index 000000000..c5520fa72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-gdwarf-4" } */
+
+/* Regression test for an ICE in output_die when using -gdwarf-4. */
+
+namespace {
+
+struct A {
+ virtual ~A();
+};
+
+struct B : public A {
+ template <typename A>
+ bool foo(A x[2]) { }
+};
+
+template <typename T>
+struct C {
+ T v[2];
+};
+
+template <typename T>
+bool X(T &b) {
+ typedef C<int> D;
+ D x[2];
+ return b.foo(x);
+}
+
+void f() {
+ B b;
+ X<B>(b);
+}
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C
new file mode 100644
index 000000000..ffc936108
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_enumeration_type" 3 } }
+// { dg-final { scan-assembler-times " DW_AT_enum_class" 2 } }
+
+enum A { a1, a2 } a;
+enum struct B { b1, b2 } b;
+enum class C { c1, c2 } c;
+
+void
+foo ()
+{
+ a = a1;
+ a = A::a2;
+ b = B::b1;
+ b = B::b2;
+ c = C::c1;
+ c = C::c2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C
new file mode 100644
index 000000000..782d71aea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C
@@ -0,0 +1,19 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++
+// { dg-do compile }
+// { dg-options "-O -g -dA -gno-strict-dwarf -fno-debug-types-section" }
+// { dg-final { scan-assembler-times "DW_AT_explicit" 2 } }
+
+struct Foo
+{
+ Foo () {}
+ explicit Foo (int) {}
+ Foo (char) {}
+ ~Foo () {};
+};
+
+void
+bar ()
+{
+ Foo foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C
new file mode 100644
index 000000000..a4a0b50ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=any" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-any.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-any.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-any.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-any.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C
new file mode 100644
index 000000000..4f580ebd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-baseonly" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-baseonly.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-baseonly.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-baseonly.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-baseonly.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C
new file mode 100644
index 000000000..0af0a83d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=none" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-none.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-none.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-none.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-none.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C
new file mode 100644
index 000000000..a93b90f05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-reduced" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-reduced.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-reduced.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-reduced.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-reduced.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C
new file mode 100644
index 000000000..95a9a31ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=sys" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-sys.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-sys.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-sys.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-sys.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h
new file mode 100644
index 000000000..83bb15a17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h
@@ -0,0 +1,67 @@
+/*
+where from: base = matching base; head = other header
+what kind: ordy = ordinary struct; tmpl = template struct
+definition: decl = incomplete declaration; defn = full definition
+how used: not = not used; ref = by ref; ptr = through pointer;
+ fld = as field; var = as variable
+from where: base = from base; head = other header
+*/
+
+struct gstruct_head_ordy_decl_not;
+struct gstruct_head_ordy_defn_not { int field_head_ordy_defn_not; };
+
+struct gstruct_head_ordy_decl_ref_head;
+struct gstruct_head_ordy_defn_ref_head { int field_head_ordy_defn_ref_head; };
+struct gstruct_head_ordy_defn_ptr_head { int field_head_ordy_defn_ptr_head; };
+struct gstruct_head_ordy_defn_fld_head { int field_head_ordy_defn_fld_head; };
+struct gstruct_head_ordy_defn_var_head {
+ gstruct_head_ordy_decl_ref_head *field_head_ordy_defn_var_head_inc;
+ gstruct_head_ordy_defn_ref_head *field_head_ordy_defn_var_head_ref;
+ gstruct_head_ordy_defn_ptr_head *field_head_ordy_defn_var_head_ptr;
+ gstruct_head_ordy_defn_fld_head field_head_ordy_defn_var_head_fld;
+};
+extern struct gstruct_head_ordy_defn_var_head head_var1;
+
+struct gstruct_head_ordy_decl_ref_base;
+struct gstruct_head_ordy_defn_ref_base { int field_head_ordy_defn_ref_base; };
+struct gstruct_head_ordy_defn_ptr_base { int field_head_ordy_defn_ptr_base; };
+struct gstruct_head_ordy_defn_fld_base { int field_head_ordy_defn_fld_base; };
+struct gstruct_head_ordy_defn_var_base { int field_head_ordy_defn_var_base; };
+
+template< typename T > struct gstruct_head_tmpl_decl_not;
+template< typename T > struct gstruct_head_tmpl_defn_not
+{ T field_head_tmpl_defn_not; };
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_head;
+template< typename T > struct gstruct_head_tmpl_defn_ref_head
+{ T field_head_tmpl_defn_ref_head; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_head
+{ T field_head_tmpl_defn_ptr_head; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_head
+{ T field_head_tmpl_defn_fld_head; };
+template< typename T > struct gstruct_head_tmpl_defn_var_head {
+ gstruct_head_tmpl_decl_ref_head< T > *field_head_tmpl_defn_var_head_inc;
+ gstruct_head_tmpl_defn_ref_head< T > *field_head_tmpl_defn_var_head_ref;
+ gstruct_head_tmpl_defn_ptr_head< T > *field_head_tmpl_defn_var_head_ptr;
+ gstruct_head_tmpl_defn_fld_head< T > field_head_tmpl_defn_var_head_fld;
+};
+extern gstruct_head_tmpl_defn_var_head< int > head_var5;
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_base;
+template< typename T > struct gstruct_head_tmpl_defn_ref_base
+{ T field_head_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_base
+{ T field_head_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_base
+{ T field_head_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_head_tmpl_defn_var_base
+{ T field_head_tmpl_defn_var_base; };
+
+inline int head_function() {
+ return 0
++ head_var1.field_head_ordy_defn_var_head_ptr->field_head_ordy_defn_ptr_head
++ head_var1.field_head_ordy_defn_var_head_fld.field_head_ordy_defn_fld_head
++ head_var5.field_head_tmpl_defn_var_head_ptr->field_head_tmpl_defn_ptr_head
++ head_var5.field_head_tmpl_defn_var_head_fld.field_head_tmpl_defn_fld_head
+;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
new file mode 100644
index 000000000..702a33f53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
@@ -0,0 +1,13 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
+// { dg-do compile }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumeration_type" 1 } }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumerator" 2 } }
+// { dg-final { scan-assembler-times "ascii \"a.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "ascii \"b.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+
+struct foo
+{
+ enum { a, b };
+};
+char s[foo::b];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/icf.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/icf.C
new file mode 100644
index 000000000..ca73ab724
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/icf.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-O1 -gdwarf-2 -gno-strict-dwarf -fno-inline -dA" }
+
+class A
+{
+ public:
+ A();
+ virtual void work();
+ virtual int p();
+ private:
+ int i;
+};
+
+class B
+{
+ public:
+ B();
+ ~B();
+ void work(const A* a);
+ private:
+ int j;
+};
+
+int
+test1(A* a)
+{
+ a->work();
+}
+
+int
+test2(A* a)
+{
+ if (a->p())
+ {
+ B b;
+ b.work(a);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C
new file mode 100644
index 000000000..bfdb4f8f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C
@@ -0,0 +1,17 @@
+// PR debug/39524
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" }
+
+namespace A
+{
+ static int var2 = 2;
+}
+
+int
+func ()
+{
+ using A::var2;
+ return var2;
+}
+
+// { dg-final { scan-assembler-times "var2\[^\n\r\]*DW_AT_name" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C
new file mode 100644
index 000000000..65141d74e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR debug/38390
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+f ()
+{
+ using namespace A;
+ return v;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C
new file mode 100644
index 000000000..6c563752a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C
@@ -0,0 +1,17 @@
+// PR debug/39379
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+main ()
+{
+ using namespace A;
+ v++;
+ return v - 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C
new file mode 100644
index 000000000..a325ce20f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C
@@ -0,0 +1,21 @@
+// PR debug/39379
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+f ()
+{
+ int i;
+ {
+ using namespace A;
+ v++;
+ i = v - 1;
+ }
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C
new file mode 100644
index 000000000..7b25233f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C
@@ -0,0 +1,35 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR debug/37410
+// { dg-do compile }
+
+namespace A1
+ {
+ int aaa = 1;
+ };
+namespace A2
+ {
+ int aaa = 2;
+ };
+
+int
+foo (void)
+{
+ int x;
+
+ {
+ int block_create;
+ using namespace A1;
+
+ block_create = aaa; /* break1 */
+ }
+
+ {
+ int block_create;
+ using namespace A2;
+
+ block_create = aaa; /* break2 */
+ }
+
+ return x = 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C
new file mode 100644
index 000000000..ea405f853
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C
@@ -0,0 +1,18 @@
+// This isn't really testing dwarf output, but rather that we can inline f
+// even though the call precedes the definition.
+
+// { dg-options "-gdwarf-2 -dA -O" }
+// { dg-final { scan-assembler "DW_TAG_inlined_subroutine" } }
+
+template <class T>
+inline T f(T);
+
+int main()
+{
+ f(1);
+}
+
+int i;
+
+template <class T>
+inline T f(T t) { ++i; return t; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C
new file mode 100644
index 000000000..f22fe28a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C
@@ -0,0 +1,28 @@
+// Origin: PR debug/49130
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
+
+typedef long unsigned int size_t;
+static const size_t foo = 2048;
+
+template<size_t size>
+struct S
+{
+ void f(size_t);
+};
+
+template<size_t size>
+inline void
+S<size>::f(size_t)
+{
+ size_t i = size;
+}
+
+int
+main()
+{
+ S<foo> s1;
+ s1.f(10);
+}
+
+// { dg-final {scan-assembler-times "\"S<2048ul>.0\"\[^\n\r\]* DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"_ZN1SILm2048EE1fEm.0\"\[^\n\r\]* DW_AT_\[MIPS_\]*linkage_name" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lambda1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lambda1.C
new file mode 100644
index 000000000..b315275e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lambda1.C
@@ -0,0 +1,36 @@
+// PR c++/43912
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA -fno-merge-debug-strings -gno-strict-dwarf" }
+
+// Check for the local alias variables that point to the members of the closure.
+// { dg-final { scan-assembler-times "DW_TAG_variable\[^.\]*\.ascii \"j.0\"" 4 } }
+// { dg-final { scan-assembler-times "DW_TAG_variable\[^.\]*\.ascii \"this.0\"" 2 } }
+
+struct A
+{
+ int i;
+ int f()
+ {
+ int j;
+ [&]() { j = i; }();
+ return j;
+ }
+};
+
+template <class T>
+struct B
+{
+ int i;
+ int f()
+ {
+ int j;
+ [&]() { j = i; }();
+ return j;
+ }
+};
+
+int main()
+{
+ A().f();
+ B<int>().f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C
new file mode 100644
index 000000000..3fcc4f235
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+struct C { // { dg-function-on-line {_ZN1CC[12]Ev} }
+ int i;
+ virtual void
+ foo() {} // { dg-function-on-line _ZN1C3fooEv }
+};
+static C dummy;
+
+int
+main (void)
+{ // { dg-function-on-line main }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C
new file mode 100644
index 000000000..d61d27fe7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C
@@ -0,0 +1,30 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR27574
+// { dg-do compile }
+// { dg-options "-O0 -g" }
+// { dg-final { scan-assembler "problem" } }
+
+void f (int *)
+{
+}
+
+class A
+{
+public:
+ A(int i);
+};
+
+A::A(int i)
+{
+ int *problem = new int(i);
+ f (problem);
+}
+
+int
+main (void)
+{
+ A a (0);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C
new file mode 100644
index 000000000..6eb87bb9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C
@@ -0,0 +1,76 @@
+// PR c++/27017
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -feliminate-unused-debug-types -fno-merge-debug-strings" }
+
+int
+foo (int arg1)
+{
+ struct localstruct1
+ {
+ static inline int staticfn1 (int arg2)
+ {
+ int var2 = arg2 << 2;
+ return arg2 + var2;
+ }
+ static int staticfn2 (int arg3)
+ {
+ int var3 = arg3 << 2;
+ return arg3 + var3;
+ }
+ static inline int staticfn3 (int arg4)
+ {
+ int var4 = arg4 << 2;
+ return arg4 + var4;
+ }
+ static int staticfn4 (int arg5)
+ {
+ int var5 = arg5 << 2;
+ return arg5 + var5;
+ }
+ int method1 (int arg6)
+ {
+ int var6 = arg6 << 2;
+ return arg6 + var6;
+ }
+ };
+ struct localstruct2
+ {
+ static inline int staticfn5 (int arg7)
+ {
+ int var7 = arg7 << 2;
+ return arg7 + var7;
+ }
+ static int staticfn6 (int arg8)
+ {
+ int var8 = arg8 << 2;
+ return arg8 + var8;
+ }
+ };
+ return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1);
+}
+
+int
+main ()
+{
+ return foo (1) - 10;
+}
+
+// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "method1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C
new file mode 100644
index 000000000..475f02b56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C
@@ -0,0 +1,76 @@
+// PR c++/27017
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O2 -feliminate-unused-debug-types -fno-merge-debug-strings" }
+
+int
+foo (int arg1)
+{
+ struct localstruct1
+ {
+ static inline int staticfn1 (int arg2)
+ {
+ int var2 = arg2 << 2;
+ return arg2 + var2;
+ }
+ static int staticfn2 (int arg3)
+ {
+ int var3 = arg3 << 2;
+ return arg3 + var3;
+ }
+ static inline int staticfn3 (int arg4)
+ {
+ int var4 = arg4 << 2;
+ return arg4 + var4;
+ }
+ static int staticfn4 (int arg5)
+ {
+ int var5 = arg5 << 2;
+ return arg5 + var5;
+ }
+ int method1 (int arg6)
+ {
+ int var6 = arg6 << 2;
+ return arg6 + var6;
+ }
+ };
+ struct localstruct2
+ {
+ static inline int staticfn5 (int arg7)
+ {
+ int var7 = arg7 << 2;
+ return arg7 + var7;
+ }
+ static int staticfn6 (int arg8)
+ {
+ int var8 = arg8 << 2;
+ return arg8 + var8;
+ }
+ };
+ return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1);
+}
+
+int
+main ()
+{
+ return foo (1) - 10;
+}
+
+// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "method1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
new file mode 100644
index 000000000..be28a1971
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
@@ -0,0 +1,11 @@
+// Test that the A* pointer_type is also within the debug info for f.
+// Currently GCC emits it immediately before A, which is simple to test for.
+// { dg-options "-g -dA" }
+
+void f()
+{
+ struct A { int i; } *ap;
+ ap->i = 42;
+}
+
+// { dg-final { scan-assembler "DW_TAG_pointer_type.\[^)\]*. DW_TAG_structure_type" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C
new file mode 100644
index 000000000..6137125ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C
@@ -0,0 +1,30 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/41170
+// { dg-options "-g -dA -fno-merge-debug-strings -gno-strict-dwarf" }
+//
+// We want to test that there is a DW_TAG_namespace DIE DW_AT_name is set
+// to "not_emitted". That namespace die has a child DW_TAG_typedef DIE
+// which DW_AT_name is the null terminated string "T".
+// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_namespace" 1 } }
+// { dg-final { scan-assembler-times "\"not_emitted.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_typedef" 1 } }
+// { dg-final { scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+
+struct strukt
+{
+ int m;
+};
+
+namespace not_emitted
+{
+ typedef strukt T;
+}
+
+int
+main()
+{
+ not_emitted::T t;
+ t.m = 0;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C
new file mode 100644
index 000000000..8715ca684
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C
@@ -0,0 +1,10 @@
+// Test that we define A inside the namespace rather than declaring it
+// there and then defining it at CU scope.
+// { dg-options "-g -dA -fno-debug-types-section" }
+// { dg-final { scan-assembler-not "DW_AT_declaration" } }
+
+namespace N {
+ struct A;
+}
+
+struct N::A { } a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C
new file mode 100644
index 000000000..336582c11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C
@@ -0,0 +1,29 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/40109
+// { dg-do compile }
+// { dg-options "-g -dA -O0" }
+
+namespace A
+{
+
+ class B
+ {
+ };
+ typedef A::B AB;
+};
+
+int
+main()
+{
+ A::AB ab;
+ return 0;
+}
+
+// { dg-final { scan-assembler "DW_TAG_typedef" } }
+//
+// What we want to do here is to be sure that the DIE of A::AB is generated
+// as a child of the DIE of the namespace A declaration.
+// So this test won't catch a regression on this fix yet. To write a proper
+// test for this fix, we would need a dwarf reader written in tcl,
+// or something along those lines.
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
new file mode 100644
index 000000000..b0c858c54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
@@ -0,0 +1,37 @@
+/*
+ Origin: PR debug/45024
+ { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
+ { dg-do compile }
+*/
+
+struct S {
+ template<typename Z> struct T { };
+};
+
+S::T<int> tval;
+
+/*
+We want to express that the DIE of S::T<int> must be a child of the DIE of S, like in assembly this output:
+
+ .uleb128 0x2 # (DIE (0x9e) DW_TAG_structure_type)
+ .ascii "S\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x1 # DW_AT_decl_line
+ .long 0xbc # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xa8) DW_TAG_structure_type)
+ .ascii "T<int>\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x2 # DW_AT_decl_line
+ .uleb128 0x4 # (DIE (0xb3) DW_TAG_template_type_param)
+ .ascii "Z\0" # DW_AT_name
+ .long 0xbc # DW_AT_type
+ .byte 0 # end of children of DIE 0xa8
+ .byte 0 # end of children of DIE 0x9e
+
+Hence the slightly odd regexp:
+
+ { dg-final { scan-assembler "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"S\\\\0\"\[ \t\]+\(\[@|#;!\]+|//?\)\[ \t\]+DW_AT_name\[\n\r\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"T<int>\\\\0\"\[ \t\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_template_type_param\\)\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\(\[@|#;!\]+|//?\)\[ \t\]+end of children of DIE\[^\n\r\]*\[\n\r\]+\[^\n\r\]*end of children of DIE\[^\n\r\]*" } }
+
+ */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C
new file mode 100644
index 000000000..de59637d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C
@@ -0,0 +1,62 @@
+// Origin: PR debug/45682
+// { dg-options "-g -fno-merge-debug-strings -gdwarf-4 -dA -fdebug-types-section" }
+
+namespace thread {
+
+class Executor {
+ public:
+ static Executor* CurrentExecutor();
+};
+
+}
+
+namespace thread {
+
+Executor* Executor::CurrentExecutor() {
+ return 0;
+}
+
+}
+
+thread::Executor *te;
+
+int
+main ()
+{
+ return 0;
+}
+
+// We want to express the fact that the DIE for the definition of
+// 'Executor::CurrentExecutor' is a grand-child of the DIE for the
+// namespace 'thread'. We must have something like this output:
+// .uleb128 0x8 # (DIE (0x29) DW_TAG_namespace)
+// .ascii "thread\0" # DW_AT_name
+// .byte 0x1 # DW_AT_decl_file (.../testsuite/g++.dg/debug/dwarf2/nested-3.C)
+// .byte 0x4 # DW_AT_decl_line
+// .long 0x4b # DW_AT_sibling
+// .uleb128 0x9 # (DIE (0x34) DW_TAG_class_type)
+// .long .LASF0 # DW_AT_name: "Executor"
+// # DW_AT_declaration
+// .byte 0xa0 # DW_AT_signature
+// .byte 0xfe
+// .byte 0xe6
+// .byte 0x7b
+// .byte 0x66
+// .byte 0xe9
+// .byte 0x38
+// .byte 0xf0
+// .uleb128 0x5 # (DIE (0x39) DW_TAG_subprogram)
+// # DW_AT_external
+// .long .LASF1 # DW_AT_name: "CurrentExecutor"
+// .byte 0x1 # DW_AT_decl_file (.../testsuite/g++.dg/debug/dwarf2/nested-3.C)
+// .byte 0x8 # DW_AT_decl_line
+// .long .LASF2 # DW_AT_linkage_name: "_ZN6thread8Executor15CurrentExecutorEv"
+// .long 0x4b # DW_AT_type
+// .byte 0x1 # DW_AT_accessibility
+// # DW_AT_declaration
+// .byte 0 # end of children of DIE 0x34
+// .byte 0 # end of children of DIE 0x29
+//
+// Hence the scary regexp:
+//
+// { dg-final { scan-assembler "\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_namespace\\)\[\n\r\]+\[^\n\r\]*\"thread\[\^\n\r]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_class_type\\)(\[\n\r\]+\[^\n\r\]*)+\"Executor\[^\n\r\]+\[\n\r\]+\[^\n\r\]*DW_AT_declaration\[\n\r\]+\[^\n\r\]*DW_AT_signature\[^#;/!|@\]*\[#;/!|@\]+ \[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_subprogram\\)\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\"CurrentExecutor\[^\n\r\]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*end of children of DIE 0x\\3\[\n\r]+\[^\n\r\]*end of children of DIE 0x\\1\[\n\r]+" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-4.C
new file mode 100644
index 000000000..784c7534f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/nested-4.C
@@ -0,0 +1,14 @@
+// PR debug/53235
+// { dg-options "-gdwarf-4 -fdebug-types-section" }
+// { dg-final { scan-assembler-times "debug_types" 2 { xfail *-*-darwin* } } }
+
+namespace E {
+ class O {};
+ void f (O o) {}
+}
+namespace F {
+ class O {};
+ void f (O fo) {}
+}
+E::O eo;
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/non-virtual-thunk.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/non-virtual-thunk.C
new file mode 100644
index 000000000..8ad347a7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/non-virtual-thunk.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-g2 -dA" }
+
+// Verify that line number info is output for the non-virtual
+// thunks for C::~C().
+// { dg-final { scan-assembler "thunk.C:30" } }
+
+class A
+{
+ public:
+ A();
+ virtual ~A();
+ private:
+ int i;
+};
+
+class B
+{
+ public:
+ B();
+ virtual ~B();
+ private:
+ int i;
+};
+
+class C : public A, public B
+{
+ public:
+ C();
+ virtual ~C(); // line 30
+};
+
+C::C()
+{
+}
+
+C::~C()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/omp-fesdr.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/omp-fesdr.C
new file mode 100644
index 000000000..b3b65e918
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/omp-fesdr.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target fopenmp } */
+/* { dg-options "-g -fopenmp -gdwarf-2 -femit-struct-debug-reduced" } */
+
+struct aa
+{
+ int a;
+};
+
+int
+f7 (void)
+{
+ int v7i = 6, v7j = 7, v7k = 9, v7l = 0, v7n = 0, v7o = 1;
+
+ #pragma omp parallel
+ {
+ #pragma omp master
+ v7o++;
+ #pragma omp for private (v7i) firstprivate (v7k) reduction (+:v7l)
+ for (v7n = 0; v7n < 3; v7n++)
+ {
+ int v7m = v7j + v7k;
+ v7i = 8;
+ v7l++;
+ }
+ }
+
+ return v7i + v7j + v7k + v7l + v7n;
+}
+
+int
+main (void)
+{
+ f7 ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
new file mode 100644
index 000000000..f23efef13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
@@ -0,0 +1,20 @@
+// Contributed by Cary Coutant <ccoutant@google.com>
+// Origin: PR debug/41063
+// { dg-do compile }
+
+struct A {
+ virtual void run();
+};
+
+void test() {
+ struct B : public A {
+ void run() {
+ struct C : public A {
+ C() { }
+ B *b_;
+ };
+ C c;
+ }
+ };
+ B b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C
new file mode 100644
index 000000000..7b061eb0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C
@@ -0,0 +1,42 @@
+// Origin: PR 44641
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+template <class A> struct MisplacedDbg;
+template<class T> struct MisplacedDbg<T*>;
+struct Full;
+template<> struct MisplacedDbg<Full>;
+
+struct Arg;
+typedef MisplacedDbg<Arg> Typedef1;
+typedef MisplacedDbg<Arg*> Typedef2;
+typedef MisplacedDbg<Full> Typedef3;
+
+template<typename T> struct Base {
+ int i;
+ virtual ~Base() {
+ }
+};
+
+template <>
+struct MisplacedDbg<Full> // { dg-function-on-line {_ZN12MisplacedDbgI4FullEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgI4FullED0Ev} { target *-*-* } 22 }
+
+ : public Base<int> {
+};
+
+template <class T>
+struct MisplacedDbg<T*> // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgED0Ev} { target *-*-* } 29 }
+ : public Base<int> {
+};
+
+template <class A>
+struct MisplacedDbg // { dg-function-on-line {_ZN12MisplacedDbgI3ArgEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgI3ArgED0Ev} { target *-*-* } 35 }
+ : public Base<int> {
+};
+
+static MisplacedDbg<Arg> static_var1;
+static MisplacedDbg<Arg*> static_var2;
+static MisplacedDbg<Full> static_var3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C
new file mode 100644
index 000000000..72f24ad4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C
@@ -0,0 +1,22 @@
+// PR debug/45997
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA" }
+
+typedef int my_int;
+typedef const my_int const_my_int;
+typedef volatile const_my_int volatile_const_my_int;
+
+my_int v_my_int = 0;
+const_my_int v_const_my_int = 1;
+volatile_const_my_int v_volatile_const_my_int = 4;
+
+int
+main ()
+{
+ asm volatile ("" : : "r" (&v_my_int));
+ asm volatile ("" : : "r" (&v_const_my_int));
+ asm volatile ("" : : "r" (&v_volatile_const_my_int));
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C
new file mode 100644
index 000000000..ade542804
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C
@@ -0,0 +1,22 @@
+// PR debug/45997
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA" }
+
+typedef int my_int;
+typedef volatile my_int volatile_my_int;
+typedef const volatile_my_int const_volatile_my_int;
+
+my_int v_my_int = 0;
+volatile_my_int v_volatile_my_int = 1;
+const_volatile_my_int v_const_volatile_my_int = 4;
+
+int
+main ()
+{
+ asm volatile ("" : : "r" (&v_my_int));
+ asm volatile ("" : : "r" (&v_volatile_my_int));
+ asm volatile ("" : : "r" (&v_const_volatile_my_int));
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C
new file mode 100644
index 000000000..eee192c26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-gdwarf-4" }
+
+struct foo
+{
+ static int bar ()
+ {
+ int i;
+ static int baz = 1;
+ {
+ static int baz = 2;
+ i = baz++;
+ }
+ {
+ struct baz
+ {
+ static int m ()
+ {
+ static int n;
+ return n += 10;
+ }
+ };
+ baz a;
+ i += a.m ();
+ }
+ {
+ static int baz = 3;
+ i += baz;
+ baz += 30;
+ }
+ i += baz;
+ baz += 60;
+ return i;
+ }
+};
+
+int main ()
+{
+ foo x;
+
+ if (x.bar () != 16)
+ return 1;
+ if (x.bar() != 117)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C
new file mode 100644
index 000000000..dfc983b17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C
@@ -0,0 +1,18 @@
+// Origin: PR 46527
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+template <typename T> struct Struct {
+ double defined_later();
+};
+struct WrapperStruct {
+ Struct<double> ClassInstantiated;
+};
+template <typename T> double
+Struct<T>::defined_later() // { dg-function-on-line {_ZN6StructIdE13defined_laterEv} }
+{
+ return 1;
+}
+void InstantiateMethod() {
+ Struct<double>().defined_later();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr52260.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr52260.C
new file mode 100644
index 000000000..07e80a83a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr52260.C
@@ -0,0 +1,133 @@
+// PR debug/52260
+// { dg-do compile { target c++11 } }
+// { dg-options "-gdwarf-4" }
+
+namespace { typedef decltype (nullptr) T1; }
+struct B {};
+namespace A
+{
+ template <typename T, T __v>
+ struct C { static constexpr T value = __v; };
+ typedef C <bool, false> D;
+ template <typename>
+ struct E : D {};
+ template <typename T>
+ struct F : C <bool, (E <T>::value)> {};
+ template <bool, typename T = void>
+ struct G { typedef T t; };
+}
+template <typename T>
+struct H {};
+namespace A
+{
+ template <typename T>
+ struct I : H <T> {};
+ template <typename ...> struct J {};
+ template <typename> struct K;
+ struct L
+ {
+ template <typename B2>
+ struct M
+ {
+ template <typename T> static bool m2 (T) { return false; }
+ };
+ };
+ template <typename, typename> struct N;
+ template <typename T, typename B2, typename ... B4>
+ struct N <T (B4 ...), B2> : L::M <B2> {};
+ template <typename T, typename ... B4>
+ struct K <T (B4 ...)> :J <>, L
+ {
+ typedef T O (B4 ...);
+ struct P {};
+ template <typename B2> K (B2, typename G <!F <B2>::value, P>::t = P ());
+ };
+ template <typename T, typename ... B1>
+ template <typename B2>
+ K <T (B1 ...)>::K (B2 __f, typename G <!F < B2>::value, P>::t)
+ {
+ typedef N <O, B2> Q;
+ Q::m2 (__f);
+ };
+}
+enum R { r1 };
+const R r2 = r1;
+namespace A
+{
+ template <typename>
+ struct S {};
+ template <typename T, typename _Dp = S <T>>
+ struct U {};
+ template <typename T, R _Lp = r2>
+ struct V { T *operator -> (); };
+ template <typename T>
+ struct W : V <T>
+ {
+ W (const W &);
+ W (T1) {}
+ W & operator= (W) {}
+ };
+ template <typename> struct Z;
+ struct AA
+ {
+ struct AB
+ {
+ struct AC { void operator () () {} };
+ };
+ template <typename T> using AD = U <T, AB::AC>;
+ struct AE
+ {
+ typedef AD <AB> AZ;
+ virtual ~AE ();
+ void o3 (K <AZ ()>, bool = false) {}
+ template <typename, typename _Arg> struct AY;
+ struct C1 {};
+ template <typename T> struct AY <T, C1>
+ {
+ AZ operator () () { return AZ (); }
+ Z <T> _M_Z;
+ };
+ template <typename T>
+ static AY <T, C1> _s1 (B, Z <T> *);
+ };
+ };
+ template <>
+ struct Z <void>
+ {
+ typedef AA::AE AF;
+ W <AF> o4;
+ void foo (B __p)
+ {
+ auto _s1 = AF::_s1 (__p, this);
+ o4->o3 (_s1);
+ }
+ };
+ template <typename T, typename _Alloc>
+ struct AG {};
+ template <typename T, typename D1 = A::I <T>>
+ struct AH : AG <T, D1>
+ {
+ void bar (T) { baz (); }
+ template <typename ... _Args>
+ void baz (_Args && ...);
+ };
+ template <typename T, typename D1>
+ template <typename ... _Args>
+ void AH <T, D1>::baz (_Args && ...) {}
+ namespace
+ {
+ typedef A::K <void ()> AI;
+ struct AF
+ {
+ int v2;
+ AI v1;
+ AF (int, unsigned, AI __t) : v2 (), v1 (__t) {}
+ };
+ struct D3 : A::AH <AF>
+ {
+ typedef AF AFT;
+ void v3 (AI __t) { bar (AFT (4, v4, __t)); }
+ int v4;
+ };
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C
new file mode 100644
index 000000000..f1c77c591
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C
@@ -0,0 +1,67 @@
+// PR debug/54508
+// { dg-do compile }
+// { dg-options "-g2 -dA -fno-merge-debug-strings" }
+
+// { dg-final { scan-assembler "\"cbase\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler "\"OPCODE\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler "\"bi\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler "\"si\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler "\"f1\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler "\"f2\\\\0\"\[ \t\]+\[#;/!|@\]+ +DW_AT_name" } }
+// { dg-final { scan-assembler-not "\"nc\\\\0\"\[ \t\]+\# +DW_AT_name" } }
+
+class cbase
+
+{
+public:
+ static int si;
+ int bi;
+};
+
+class c : public cbase
+
+{
+public:
+ enum
+ {
+ OPCODE = 251
+ };
+ int i ;
+ static const char *testc (void) { return "foo"; }
+};
+
+struct s
+{
+ int f1;
+ static const char *tests (void) { return "test"; }
+};
+
+union u
+{
+ int f2;
+ double d;
+ static const char *testu (void) { return "test union"; }
+};
+
+namespace n
+{
+ const char *ntest (void) { return "test n"; }
+
+ class nc
+ {
+ public:
+ int i;
+ static int sj;
+ };
+}
+
+extern void send (int, int, const void *, int);
+
+void test (int src)
+{
+ int cookie = 1;
+ send(src, c::OPCODE, c::testc (), cookie);
+ send(src, c::OPCODE, s::tests (), cookie);
+ send(src, c::OPCODE, u::testu (), cookie);
+ send(src, c::OPCODE, n::ntest (), cookie);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C
new file mode 100644
index 000000000..63e04e426
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C
@@ -0,0 +1,17 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/39706
+// { dg-do compile { target *-*-darwin* } }
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+//
+// There should be one debug_pubnames section generated.
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
+//
+// Then check of the presence of the names we are interested in.
+// { dg-final { scan-assembler-times "\"main.0\"\[^\n\]*external name" 1 } }
+// { dg-final { scan-assembler-times "\"ns::ns_x\[^\n\]*external name" 1 } }
+// { dg-final { scan-assembler-times "\"y::y_x\[^\n\]*external name" 1 } }
+
+namespace ns { int ns_x; }
+class y { public: static int y_x; };
+int y::y_x;
+int main() { return ns::ns_x; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C
new file mode 100644
index 000000000..f2c0f24c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C
@@ -0,0 +1,193 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-gpubnames -gdwarf-4 -fno-debug-types-section -dA" }
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"inline_func_1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::~c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check_enum\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"main\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<one::c1>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<int> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<double> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<int const\\\*> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"__static_initialization_and_destruction_0\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"anonymous_union_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::ci\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v3\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1v\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)::one_anonymous_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c1_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c2_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three::anonymous_three_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubtypes" 1 } }
+// { dg-final { scan-assembler "\"one::G\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"int\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"double\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"anonymous_union_container\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"bool\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+
+namespace
+{
+int c1_count;
+int c2_count;
+
+namespace three
+{
+int anonymous_three_var;
+}
+};
+
+namespace one
+{
+
+enum G
+{
+ G_A,
+ G_B,
+ G_C
+};
+
+namespace {
+int one_anonymous_var;
+}
+
+class c1
+{
+ public:
+ static int count;
+
+ c1()
+ { ++c1_count; }
+
+ ~c1()
+ {
+ --c1_count;
+ }
+
+ enum E
+ {
+ E_A,
+ E_B,
+ E_C,
+ };
+
+ int
+ val()
+ { return E_A; }
+};
+
+c1 c1v;
+};
+
+namespace two
+{
+const int ci = 3;
+
+template <typename T>
+class c2
+{
+ public:
+ c2(T t)
+ : t_(t)
+ {
+ ++c2_count;
+ }
+
+ ~c2()
+ { --c2_count; }
+
+ T
+ val()
+ { return this->t_; }
+
+ T t_;
+};
+
+c2<int> c2v1(1);
+c2<double> c2v2(2.0);
+c2<int const*> c2v3(&ci);
+};
+
+enum F
+{
+ F_A,
+ F_B,
+ F_C
+};
+
+template <class C>
+bool
+check(C* c)
+{ return c->val() == 0; }
+
+bool
+check_enum(int i)
+{ return i > 0; }
+
+struct anonymous_union_container {
+ union {
+ struct astruct {
+ int a;
+ };
+ int b;
+ } u;
+};
+
+anonymous_union_container anonymous_union_var;
+
+#ifdef __GNUC__
+#define ALWAYS_INLINE __attribute__((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+static inline ALWAYS_INLINE int
+inline_func_1(int i)
+{ return i * 17; }
+
+int
+main()
+{
+ F f = F_A;
+ one::G g = one::G_A;
+ check_enum(f);
+ check_enum(g);
+ check(&one::c1v);
+ check(&two::c2v1);
+ check(&two::c2v2);
+ check(&two::c2v3);
+ anonymous_union_var.u.b = inline_func_1(3) - 51;
+ return anonymous_union_var.u.b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C
new file mode 100644
index 000000000..62d6b0628
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C
@@ -0,0 +1,193 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-gpubnames -gdwarf-4 -fdebug-types-section -dA" }
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::G_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"inline_func_1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::~c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check_enum\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"main\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<one::c1>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<int> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<double> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"check<two::c2<int const\\\*> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"__static_initialization_and_destruction_0\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"anonymous_union_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::ci\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2v3\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1v\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)::one_anonymous_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c1_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c2_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three::anonymous_three_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubtypes" 1 } }
+// { dg-final { scan-assembler "\"one::G\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"int\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"double\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"F\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"anonymous_union_container\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+// { dg-final { scan-assembler "\"bool\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
+
+namespace
+{
+int c1_count;
+int c2_count;
+
+namespace three
+{
+int anonymous_three_var;
+}
+};
+
+namespace one
+{
+
+enum G
+{
+ G_A,
+ G_B,
+ G_C
+};
+
+namespace {
+int one_anonymous_var;
+}
+
+class c1
+{
+ public:
+ static int count;
+
+ c1()
+ { ++c1_count; }
+
+ ~c1()
+ {
+ --c1_count;
+ }
+
+ enum E
+ {
+ E_A,
+ E_B,
+ E_C,
+ };
+
+ int
+ val()
+ { return E_A; }
+};
+
+c1 c1v;
+};
+
+namespace two
+{
+const int ci = 3;
+
+template <typename T>
+class c2
+{
+ public:
+ c2(T t)
+ : t_(t)
+ {
+ ++c2_count;
+ }
+
+ ~c2()
+ { --c2_count; }
+
+ T
+ val()
+ { return this->t_; }
+
+ T t_;
+};
+
+c2<int> c2v1(1);
+c2<double> c2v2(2.0);
+c2<int const*> c2v3(&ci);
+};
+
+enum F
+{
+ F_A,
+ F_B,
+ F_C
+};
+
+template <class C>
+bool
+check(C* c)
+{ return c->val() == 0; }
+
+bool
+check_enum(int i)
+{ return i > 0; }
+
+struct anonymous_union_container {
+ union {
+ struct astruct {
+ int a;
+ };
+ int b;
+ } u;
+};
+
+anonymous_union_container anonymous_union_var;
+
+#ifdef __GNUC__
+#define ALWAYS_INLINE __attribute__((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+static inline ALWAYS_INLINE int
+inline_func_1(int i)
+{ return i * 17; }
+
+int
+main()
+{
+ F f = F_A;
+ one::G g = one::G_A;
+ check_enum(f);
+ check_enum(g);
+ check(&one::c1v);
+ check(&two::c2v1);
+ check(&two::c2v2);
+ check(&two::c2v3);
+ anonymous_union_var.u.b = inline_func_1(3) - 51;
+ return anonymous_union_var.u.b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
new file mode 100644
index 000000000..8aaff8ef2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
@@ -0,0 +1,18 @@
+// Origin: PR debug/43325
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_lexical_block\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_low_pc\[\n\r\]{1,2}\[^\n\r\]*DW_AT_high_pc\[\n\r\]{1,2}\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_variable\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name" 2 } }
+
+namespace S
+{
+ int
+ f()
+ {
+ int i = 42;
+ {
+ extern int i;
+ return i;
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C
new file mode 100644
index 000000000..56a6fbaeb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA -gdwarf-4" }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_reference_type" 1 } }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_rvalue_reference_type" 1 } }
+
+struct A { A (); ~A (); };
+struct B { B (); ~B (); };
+
+void
+foo ()
+{
+ A v;
+ A &a = v;
+ B &&b = B ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
new file mode 100644
index 000000000..89467adc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
@@ -0,0 +1,28 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA -fno-debug-types-section" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+struct A
+{
+ virtual ~A(){}
+};
+
+struct B : public A
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
new file mode 100644
index 000000000..c319c68a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
@@ -0,0 +1,29 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA -fno-debug-types-section" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+template<class T>
+struct A
+{
+ virtual ~A(){}
+};
+
+struct B : public A<int>
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A<int>* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C
new file mode 100644
index 000000000..b807e477c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
+
+struct A
+{
+ static int staticdatamember;
+};
+
+int A::staticdatamember = 6;
+
+// { dg-final { scan-assembler "DW_TAG_member\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticdatamember\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_TAG_variable\[^\n\r\]*\[\n\r\]*\[^\n\r\]*DW_AT_specification" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C
new file mode 100644
index 000000000..568144503
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C
@@ -0,0 +1,12 @@
+// PR debug/26965
+// { dg-options "-gdwarf-2 -dA" }
+// { dg-final { scan-assembler-not "DW_TAG_variable" } }
+// { dg-final { scan-assembler-not "DW_TAG_enumerator" } }
+// { dg-final { scan-assembler-not "DW_TAG_enumeration_type" } }
+
+enum x { i = 1 };
+class c {
+ static const x beg = i;
+ int foo () { return (int) beg; }
+};
+void bar () { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C
new file mode 100644
index 000000000..a1bf6b53c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C
@@ -0,0 +1,37 @@
+// PR debug/39372
+// { dg-do compile }
+// { dg-options "-O0 -g -dA" }
+// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar1" } }
+// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar2" } }
+
+extern void f (int *);
+
+struct A
+{
+ A(int i);
+ void foo(int i);
+};
+
+A::A(int i)
+{
+ static int *staticvar1 = new int(i);
+ f (staticvar1);
+}
+
+void A::foo(int i)
+{
+ static int *staticvar2 = new int(i);
+ f (staticvar2);
+}
+
+void f (int *)
+{
+}
+
+int
+main (void)
+{
+ A a(42);
+ a.foo(42);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C
new file mode 100644
index 000000000..3a43d9fa5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C
@@ -0,0 +1,16 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "U.*DW_AT_name" } }
+
+template <class U>
+U
+func(U m)
+{
+ return m;
+}
+
+int i = func<int>(2);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C
new file mode 100644
index 000000000..27c68d796
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "i.*DW_AT_name" } }
+// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
+
+
+template <int i>
+int
+func()
+{
+ int j = i;
+ return j;
+}
+
+const int foo = 1;
+const int bar = 2;
+
+int h = func<foo+bar>();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C
new file mode 100644
index 000000000..4c7249035
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C
@@ -0,0 +1,24 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "f.*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
+
+typedef void (*func_ptr)();
+
+template <func_ptr f>
+int
+func()
+{
+ f();
+ return 0;
+}
+
+void
+bleh()
+{
+}
+
+int c = func<bleh>();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C
new file mode 100644
index 000000000..c584e900d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C
@@ -0,0 +1,39 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA" }
+//
+// In theory the compiler instantiates count<int, char, long>,
+// count<char, long> and count<long>. In practice, only
+// count<int, char, long> is emitted, thanks to constant folding.
+// So in theory, each of the 3 instances of count yields a
+// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one
+// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long>
+// is emitted.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} }
+
+
+template <typename... Args> struct count;
+
+template <>
+struct count<>
+{
+ static const int value = 0;
+};
+
+template <typename T, typename... Args>
+struct count<T, Args...>
+{
+ static const int value = 1 + count<Args...>::value;
+};
+
+template<typename... P>
+int
+do_count()
+{
+ return count<P...>::value;
+}
+
+int c = do_count<int, char, long>();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C
new file mode 100644
index 000000000..c4fd8dc3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C
@@ -0,0 +1,28 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "T.*DW_AT_name" } }
+
+template <class T>
+struct vector
+{
+ int size;
+
+ vector () : size (0)
+ {
+ }
+};
+
+
+template<template <class T> class U>
+int
+bar()
+{
+ U<int> u;
+ return u.size;
+}
+
+vector<int> v;
+int j = bar<vector>();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C
new file mode 100644
index 000000000..99bbba3da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C
@@ -0,0 +1,38 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } }
+// { dg-final { scan-assembler-times "\"vector.0\".*?DW_AT_GNU_template_name" 1 } }
+// { dg-final { scan-assembler-times ".ascii \"U.0\".*?DW_AT_name" 1 } }
+
+template <class T>
+struct vector_base
+{
+
+ static int get_sizeof_t()
+ {
+ return 0;
+ }
+};
+
+template <class T>
+struct vector : public vector_base<T>
+{
+ static int get_sizeof_t()
+ {
+ return sizeof (T);
+ }
+ T member1;
+ T member2;
+};
+
+template <template <class T> class U>
+int
+bar()
+{
+ return U<int>::get_sizeof_t();
+}
+
+int i = bar<vector>();
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C
new file mode 100644
index 000000000..7bdcc4d46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C
@@ -0,0 +1,59 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-do compile { target c++11 } }
+
+// There must be 5 subprograms generated:
+// printf(const char*), printf<int, char, int>,
+// printf<char, int>, printf<int> and foo().
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_subprogram" 5 } }
+
+// That makes 6 template type parameters.
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 6 } }
+// { dg-final {scan-assembler-times "\"printf<int, char, int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf<char, int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf<int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf.0\"\[^\n\]*DW_AT_name" 1 } }
+
+// printf<int, char, int> and printf<char, int> have a pack expansion as
+// function parameters. There should then be 3
+// DW_TAG_GNU_template_parameter_pack and 3 DW_TAG_GNU_formal_parameter_pack DIEs
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 3 } }
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_formal_parameter_pack" 3 } }
+// These 3 function template instantiations has a total of 3 template
+// parameters named T.
+// { dg_final {scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 3 } }
+
+
+void
+printf(const char* s)
+{
+ /* Commented this to not pull std::cout into what should be
+ a simple test.
+ while (*s)
+ std::cout << *s++;
+ */
+}
+
+template<typename T, typename... PackTypes>
+void
+printf(const char* s,
+ T value,
+ PackTypes... args)
+{
+ while (*s)
+ {
+ if (*s == '%' && *++s != '%')
+ {
+ /* std::cout << value; */
+ return printf(++s, args...);
+ }
+ }
+}
+
+void
+foo ()
+{
+ int x;
+ printf("%c %d", x, 'x', 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C
new file mode 100644
index 000000000..e28297b55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C
@@ -0,0 +1,15 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "U.*DW_AT_name" } }
+
+template <class U>
+class A
+{
+ U m;
+};
+
+A<int> a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C
new file mode 100644
index 000000000..c12fe3990
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C
@@ -0,0 +1,22 @@
+// Origin PR c++/47291
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S;
+template< int S::* cst> struct D {};
+
+struct S
+{
+ int i;
+ D < &S::i > di; //<-- folding &S::i was failing
+ // because i has no offset as S is not laid out yet
+};
+
+int
+main()
+{
+ S s;
+ return s.i;
+}
+
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C
new file mode 100644
index 000000000..800029553
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C
@@ -0,0 +1,9 @@
+// PR c++/54410
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_template_type_param" 1 } }
+
+namespace N {
+ template <class T> struct A { };
+}
+
+N::A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C
new file mode 100644
index 000000000..ce5fbab74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "i.*DW_AT_name" } }
+// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
+
+template <int i>
+struct A
+{
+ int m;
+ A ()
+ {
+ m = i;
+ }
+};
+
+const int foo = 1;
+const int bar = 2;
+
+A<foo+bar> a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C
new file mode 100644
index 000000000..e69e1c9f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C
@@ -0,0 +1,25 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "f.*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
+
+typedef void (*func_ptr) ();
+
+template <func_ptr f>
+struct A
+{
+ A ()
+ {
+ f ();
+ }
+};
+
+void
+bleh ()
+{
+}
+
+A<bleh> a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C
new file mode 100644
index 000000000..0e63293ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C
@@ -0,0 +1,37 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA" }
+//
+// In theory the compiler instantiates count<int, char, long>,
+// count<char, long> and count<long>. In practice, only
+// count<int, char, long> is emitted, thanks to constant folding.
+// So in theory, each of the 3 instances of count yields a
+// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one
+// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long>
+// is emitted.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} }
+
+template <typename... Args> struct count;
+
+template <>
+struct count<>
+{
+ static const int value = 0;
+};
+
+template <typename T, typename... Args>
+struct count<T, Args...>
+{
+ static const int value = 1 + count<Args...>::value;
+};
+
+int
+foo ()
+{
+ count<int, char, long> c;
+ int nb = count<int, char, long>::value;
+ return nb;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C
new file mode 100644
index 000000000..f36eac5f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C
@@ -0,0 +1,29 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "T.*DW_AT_name" } }
+
+template <class T>
+struct vector
+{
+ int size;
+
+ vector () : size (0)
+ {
+ }
+};
+
+template<template <class T> class U>
+struct bar
+{
+ U<int> u;
+ int m;
+ bar () : m (u.size)
+ {
+ }
+};
+
+vector<int> v;
+bar<vector> b;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C
new file mode 100644
index 000000000..06cdef5b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C
@@ -0,0 +1,44 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } }
+// { dg-final { scan-assembler-times "\"vector.0\"\[^\n\]*DW_AT_GNU_template_name" 1 } }
+// { dg-final { scan-assembler-times ".ascii \"U.0\"\[^\n\]*DW_AT_name" 1 } }
+
+template <class T>
+struct vector_base
+{
+ T tab[3 + 1];
+ static int get_sizeof_t()
+ {
+ return sizeof (tab);
+ }
+};
+
+template <class T>
+struct vector : public vector_base<T>
+{
+ static int get_sizeof_t()
+ {
+ return sizeof (T);
+ }
+ T member1;
+ T member2;
+};
+
+template <template <class T> class U>
+struct bar
+{
+ int foo()
+ {
+ return U<int>::get_sizeof_t ();
+ }
+};
+
+
+int
+foo_func ()
+{
+ bar<vector> b;
+ return b.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C
new file mode 100644
index 000000000..c1eedd6a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+
+// The type M<> should have one DW_TAG_GNU_template_parameter_pack DIE,
+// with no DW_AT_name attribute. We don't test the fact that it has no
+// DW_AT_name though.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1 } }
+
+
+template <typename...>
+struct M
+{
+};
+
+struct R :
+ M<>
+{
+};
+
+R r;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C
new file mode 100644
index 000000000..db4e0580a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C
@@ -0,0 +1,15 @@
+// Origin PR debug/46955
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S { int f; };
+template<int S::*MP> struct T { };
+T<&S::f> v;
+
+// For the type of v, we should have this DWARF generated:
+// .uleb128 0x6 # (DIE (0x57) DW_TAG_template_value_param)
+// .ascii "MP\0" # DW_AT_name
+// .long 0x61 # DW_AT_type
+// .byte 0 # DW_AT_const_value
+// So let's look for that.
+// { dg-final { scan-assembler-times "\[^\n\r\]*DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*DW_AT_const_value\[\n\r\]{1,2}" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
new file mode 100644
index 000000000..7af1d9192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
@@ -0,0 +1,28 @@
+// Origin PR debug/PR46973
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S
+{
+ int f;
+};
+
+template<typename T, int I, int *P, int S::*MP>
+struct Base
+{
+ template<typename Z>
+ struct Inner
+ {
+ };
+};
+
+int a_global;
+
+int main ()
+{
+ Base<long, 47, &a_global, &S::f>::Inner<float> inner;
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_type_param" 2 } }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 3 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/thunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/thunk1.C
new file mode 100644
index 000000000..304cf4594
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/thunk1.C
@@ -0,0 +1,13 @@
+// Test that we don't add the x86 PC thunk to .debug_ranges
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-require-effective-target fpic }
+// { dg-skip-if "darwin doesn't use the thunk for PIC" { *-*-darwin* } }
+// { dg-options "-g -fpic -fno-dwarf2-cfi-asm" }
+// { dg-final { scan-assembler-times "LFB3" 5 } }
+
+template <class T> void f(T t) { }
+
+int main()
+{
+ f(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C
new file mode 100644
index 000000000..795dc7f40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C
@@ -0,0 +1,33 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40705
+// { dg-options "-g -dA -fno-debug-types-section" }
+// { dg-do compile }
+// { dg-final { scan-assembler-times "DW_TAG_structure_type" 2 } }
+// { dg-final { scan-assembler-times "DW_AT_name: \"foo<1u>\"|\"foo<1u>..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DW_TAG_enumeration_type" 2 } }
+// { dg-final { scan-assembler-times "DW_AT_name: \"typedef foo<1u>::type type\"|\"typedef foo<1u>::type type..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_enumeration_type" 1 } }
+// { dg-final { scan-assembler-times "\"e0..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "\"e1..\"\[^\n\]*DW_AT_name" 1 } }
+
+template <unsigned int n>
+struct foo
+{
+public:
+ typedef
+ unsigned char type;
+};
+
+template<>
+struct foo<1>
+{
+ typedef enum { e0, e1 } type;
+};
+
+int
+main()
+{
+ foo<1> f;
+ foo<1>::type t = foo<1>::e1;
+ return t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C
new file mode 100644
index 000000000..0bc27f264
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C
@@ -0,0 +1,11 @@
+// Origin: PR debug/43628
+// { dg-options "-g -dA -fno-debug-types-section" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_formal_parameter\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}" 1 } }
+class C
+{
+ public:
+ typedef void (*t) (C);
+};
+C::t f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C
new file mode 100644
index 000000000..ca70d9cac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C
@@ -0,0 +1,19 @@
+// Origin: PR debug/44188
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_typedef\\)" 1 } }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)" 1 } }
+
+typedef struct
+{
+ int i;
+} AAA;
+
+int
+main(void)
+{
+ AAA aa;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
new file mode 100644
index 000000000..6749e1bd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
@@ -0,0 +1,10 @@
+// Origin: PR debug/45171
+// { dg-options "-g -dA -fno-eliminate-unused-debug-types -fno-debug-types-section" }
+// { dg-do compile }
+
+// There should be 2 real instances of byte_size -- one for the
+// struct and one for "int". The other two instances are from
+// the comments in the .debug_abbrev section.
+// { dg-final { scan-assembler-times "DW_AT_byte_size" 4 } }
+
+typedef struct { int a, b; } x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C
new file mode 100644
index 000000000..d9d058c9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C
@@ -0,0 +1,10 @@
+// Origin: PR debug/46101
+// { dg-options "-g -feliminate-dwarf2-dups" }
+// { dg-do compile }
+
+typedef struct
+{
+ virtual void f () { }
+} A;
+
+A a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C
new file mode 100644
index 000000000..8896446a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C
@@ -0,0 +1,30 @@
+// Origin PR debug/
+// { dg-options "-g -dA" }
+
+class C {
+public:
+ C() {}
+ ~C() {}
+};
+typedef struct {
+ C m;
+} t;
+typedef t s;
+s v;
+
+/*
+ We want to check that we have a DIE describing the typedef t like this:
+
+ .uleb128 0xc # (DIE (0xb8) DW_TAG_typedef)
+ .ascii "t\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test.cc)
+ .byte 0xb # DW_AT_decl_line
+ .long 0x78 # DW_AT_type
+
+ e.g, it should not haven any child DIE -- the bug here was that this
+ DIE had children DIEs. So we check that the last line is immediately
+ followed by a line containing the pattern "(DIE (", instead of a
+ line containing a DW_AT_sibling attribute.
+ */
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]* DW_TAG_typedef\\)\[\n\r\]{1,2}\[^\n\r\].*\"t\\\\0\"\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*\\(DIE" 1 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-1.C
new file mode 100644
index 000000000..7681e9b52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-1.C
@@ -0,0 +1,16 @@
+/* Verify that used enums are output. */
+/* { dg-do compile } */
+/* { dg-final { scan-assembler "JTI_MAX" } } */
+
+int var;
+
+enum java_tree_index
+{
+ JTI_MAX
+};
+
+void function (void)
+{
+ var = JTI_MAX;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-2.C
new file mode 100644
index 000000000..d5501313d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/enum-2.C
@@ -0,0 +1,22 @@
+/* Verify that used enums are output. */
+/* { dg-do compile } */
+/* { dg-final { scan-assembler "JTI_MAX" } } */
+
+int var;
+
+enum java_tree_index
+{
+ JTI_MAX
+};
+
+template<int X>
+void tmpl (void)
+{
+ var = JTI_MAX + X;
+}
+
+void
+function (void)
+{
+ tmpl<2>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/localclass1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/localclass1.C
new file mode 100644
index 000000000..85adb3b19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/localclass1.C
@@ -0,0 +1,22 @@
+// PR c++/52637
+// { dg-do compile { target c++11 } }
+// { dg-options "-g" }
+
+template <typename T>
+struct C { };
+
+template <typename V>
+void f(V v) {
+ struct B {};
+ C<B> c;
+}
+
+template <typename T>
+void g(T t) {
+ struct A { } a;
+ f (a);
+}
+
+struct D {
+ void h() { g(0); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/minimal1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/minimal1.C
new file mode 100644
index 000000000..c2daa0ff2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/minimal1.C
@@ -0,0 +1,7 @@
+// PR debug/6387
+// Verify that -g1 works with local class member functions.
+
+void foo();
+void bar() {
+ struct A { A() { foo(); } } a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace1.C
new file mode 100644
index 000000000..6629efb9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace1.C
@@ -0,0 +1,258 @@
+/* Test DWARF namespace support.
+ This test case is based on GDB testsuite test case. */
+/* { dg-do compile } */
+
+namespace AAA {
+ char c;
+ int i;
+ int A_xyzq (int);
+ char xyzq (char);
+ class inA {
+ public:
+ int xx;
+ int fum (int);
+ };
+};
+
+int AAA::inA::fum (int i)
+{
+ return 10 + i;
+}
+
+namespace BBB {
+ char c;
+ int i;
+ int B_xyzq (int);
+ char xyzq (char);
+
+ namespace CCC {
+ char xyzq (char);
+ };
+
+ class Klasse {
+ public:
+ char xyzq (char);
+ int dummy;
+ };
+};
+
+int AAA::A_xyzq (int x)
+{
+ return 2 * x;
+}
+
+char AAA::xyzq (char c)
+{
+ return 'a';
+}
+
+
+int BBB::B_xyzq (int x)
+{
+ return 3 * x;
+}
+
+char BBB::xyzq (char c)
+{
+ return 'b';
+}
+
+char BBB::CCC::xyzq (char c)
+{
+ return 'z';
+}
+
+char BBB::Klasse::xyzq (char c)
+{
+ return 'o';
+}
+
+void marker1(void)
+{
+ return;
+}
+
+namespace
+{
+ int X = 9;
+
+ namespace G
+ {
+ int Xg = 10;
+
+ namespace
+ {
+ int XgX = 11;
+ }
+ }
+}
+
+namespace H
+{
+ int h = 14;
+}
+
+namespace I = H;
+
+namespace J
+{
+ int j = 15;
+}
+
+using namespace J;
+
+namespace K
+{
+ int k = 16;
+}
+
+namespace L
+{
+ using namespace K;
+}
+
+namespace O
+{
+ int o = 18;
+}
+
+namespace P
+{
+ using namespace O;
+}
+
+namespace Q
+{
+ using namespace P;
+}
+
+namespace R
+{
+ int r1 = 19;
+ int r2 = 20;
+}
+
+using R::r1;
+
+namespace C
+{
+ int c = 1;
+ int shadow = 12;
+
+ class CClass {
+ public:
+ int x;
+ class NestedClass {
+ public:
+ int y;
+ };
+ };
+
+ namespace
+ {
+ int cX = 6;
+
+ namespace F
+ {
+ int cXf = 7;
+
+ namespace
+ {
+ int cXfX = 8;
+ }
+ }
+ }
+
+ namespace C
+ {
+ int cc = 2;
+ }
+
+ namespace E
+ {
+ int ce = 4;
+ }
+
+ namespace D
+ {
+ int cd = 3;
+ int shadow = 13;
+
+ namespace E
+ {
+ int cde = 5;
+ }
+
+ namespace M
+ {
+ int cdm = 17;
+ }
+
+ using namespace M;
+
+ void marker2 (void)
+ {
+ // NOTE: carlton/2003-04-23: I'm listing the expressions that I
+ // plan to have GDB try to print out, just to make sure that the
+ // compiler and I agree which ones should be legal! It's easy
+ // to screw up when testing the boundaries of namespace stuff.
+ c;
+ //cc;
+ C::cc;
+ cd;
+ //C::D::cd;
+ E::cde;
+ shadow;
+ //E::ce;
+ cX;
+ F::cXf;
+ F::cXfX;
+ X;
+ G::Xg;
+ //cXOtherFile;
+ //XOtherFile;
+ G::XgX;
+ I::h;
+ j;
+ L::k;
+ //k;
+ cdm;
+ Q::o;
+ //o;
+ r1;
+ //r2;
+
+ return;
+ }
+
+ }
+}
+
+int main ()
+{
+ using AAA::inA;
+ char c1;
+
+ using namespace BBB;
+
+ c1 = xyzq ('x');
+ c1 = AAA::xyzq ('x');
+ c1 = BBB::CCC::xyzq ('m');
+
+ inA ina;
+
+ ina.xx = 33;
+
+ int y;
+
+ y = AAA::A_xyzq (33);
+ y += B_xyzq (44);
+
+ BBB::Klasse cl;
+
+ c1 = cl.xyzq('e');
+
+ marker1();
+
+ C::D::marker2 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace2.C
new file mode 100644
index 000000000..f70bc8fad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/namespace2.C
@@ -0,0 +1,8 @@
+// PR debug/36278
+// { dg-do compile }
+
+namespace N
+{
+ typedef void T;
+}
+using N::T;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/nullptr01.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/nullptr01.C
new file mode 100644
index 000000000..64e06e548
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/nullptr01.C
@@ -0,0 +1,16 @@
+// Test that debugging backends don't crash on NULLPTR_TYPE.
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0" }
+
+typedef decltype(nullptr) nullptr_t;
+
+nullptr_t np1;
+void f (nullptr_t) { }
+template <class T> struct A { };
+template <class T> nullptr_t g(T t);
+template <> nullptr_t g(A<nullptr_t>)
+{
+ nullptr_t local;
+}
+// { dg-final { scan-assembler "_Z1fDn" } }
+// { dg-final { scan-assembler "_Z1gI1AIDnEEDnT_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr15736.cc b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr15736.cc
new file mode 100644
index 000000000..6e83cd26c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr15736.cc
@@ -0,0 +1,12 @@
+// Test PR 15736 fix
+// Contributed by Devang Patel <dpatel@apple.com>
+// { dg-do compile }
+
+
+struct B {
+ int n;
+};
+
+struct A : B {
+ using B::n;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr16792.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr16792.C
new file mode 100644
index 000000000..39003cbe2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr16792.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+struct S { S(); };
+int foo (S b, double j) { };
+
+int main ()
+{
+ int foo (S, double);
+ S v;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr22514.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr22514.C
new file mode 100644
index 000000000..ed31cc7a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr22514.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+namespace s
+{
+ template <int> struct _List_base
+ {
+ int _M_impl;
+ };
+ template<int i> struct list : _List_base<i>
+ {
+ using _List_base<i>::_M_impl;
+ } // { dg-error "after struct definition" }
+}
+s::list<1> OutputModuleListType;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr27657.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr27657.C
new file mode 100644
index 000000000..8351625bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr27657.C
@@ -0,0 +1,9 @@
+/* { dg-do link } */
+
+const char s[] = "";
+const char *const p = s;
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr29906.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr29906.C
new file mode 100644
index 000000000..08bbe879b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr29906.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-g -fno-emit-class-debug-always" }
+
+struct A{
+ typedef int T;
+ virtual ~A();
+};
+struct B:public A{
+ using A::T;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr30898.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr30898.C
new file mode 100644
index 000000000..4c06ea608
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr30898.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+double foo()
+{
+ union
+ {
+ int i;
+ double d;
+ };
+
+ i = 0;
+ return d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr34895.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr34895.C
new file mode 100644
index 000000000..ca06336c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr34895.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+//
+// Copyright (C) 2008 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 20 Jan 2008 <Theodore.Papadopoulo@sophia.inria.fr>
+
+struct A {
+ A() { }
+ unsigned operator()() { return 1; }
+};
+struct B: public A {
+ typedef const A base;
+ using base::operator();
+ B() { }
+};
+int
+main() {
+ B b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr43010.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr43010.C
new file mode 100644
index 000000000..24b5b2713
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr43010.C
@@ -0,0 +1,8 @@
+// PR debug/43010
+// { dg-do compile }
+// { dg-options "-g -femit-struct-debug-baseonly" }
+# 1 "foo.C"
+# 1 "bar.h" 1
+typedef struct { int i; } S __attribute__((aligned));
+typedef struct { struct { int i; } j; } T __attribute__((aligned));
+# 1 "foo.C" 2
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44178.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44178.C
new file mode 100644
index 000000000..2df566926
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44178.C
@@ -0,0 +1,39 @@
+// PR debug/44178
+// { dg-do compile }
+// { dg-options "-funroll-loops -fcompare-debug" { target i?86-*-* x86_64-*-* } }
+// { dg-options "-fsched-pressure -funroll-loops -fschedule-insns -fcompare-debug" { target i?86-*-* x86_64-*-* } }
+
+struct A
+{
+ A ();
+ A (const A &) {}
+ A &operator = (const A &);
+};
+
+struct B
+{
+ int u1;
+ A u2;
+ int u3;
+ int i;
+};
+
+B f1 (int *);
+B f2 (int, int, int, int);
+B f3 (B *, B *);
+
+B
+f4 (int x, int y, int z)
+{
+ B b1, b2;
+ for (int i = x; i > 0; i--)
+ for (int j = y; j > 0; j--)
+ {
+ int k;
+ f1 (&k);
+ b2 = f2 (i, 0, 0, z);
+ if (b2.i) return b2;
+ f3 (&b1, &b2);
+ }
+ return b1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44182.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44182.C
new file mode 100644
index 000000000..3e062a3fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr44182.C
@@ -0,0 +1,26 @@
+// PR tree-optimization/44182
+// { dg-do compile }
+// { dg-options "-fcompare-debug" }
+
+struct S
+{
+ int i;
+ S ();
+ ~S ();
+ void f1 ();
+ void f2 (S s)
+ {
+ f3 (s.i);
+ for (int j = 0; j < s.i; j++) f1 ();
+ }
+ void f3 (int j)
+ {
+ if (j > i) f1 ();
+ }
+};
+
+void
+f (S *x)
+{
+ x->f2 (S ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr45660.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr45660.C
new file mode 100644
index 000000000..4f03fd5e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr45660.C
@@ -0,0 +1,16 @@
+// PR debug/45660
+// { dg-do compile }
+// { dg-options "-g -fno-inline" }
+
+void
+test ()
+{
+ struct S
+ {
+ typedef void (**T) (void);
+ static T i (void) { return 0; }
+ };
+ S s;
+ if (s.i ())
+ *s.i () = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46123.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46123.C
new file mode 100644
index 000000000..9e115cd06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46123.C
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-g -feliminate-dwarf2-dups" }
+
+struct foo
+{
+ static int bar ()
+ {
+ int i;
+ static int baz = 1;
+ {
+ static int baz = 2;
+ i = baz++;
+ }
+ {
+ struct baz
+ {
+ static int m ()
+ {
+ static int n;
+ return n += 10;
+ }
+ };
+ baz a;
+ i += a.m ();
+ }
+ {
+ static int baz = 3;
+ i += baz;
+ baz += 30;
+ }
+ i += baz;
+ baz += 60;
+ return i;
+ }
+};
+
+int main ()
+{
+ foo x;
+
+ if (x.bar () != 16)
+ return 1;
+ if (x.bar() != 117)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46240.cc b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46240.cc
new file mode 100644
index 000000000..c12a6988a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46240.cc
@@ -0,0 +1,172 @@
+// { dg-do compile }
+// { dg-options "-O3 -g" }
+
+template <typename T>
+T &max (T &a, T &b)
+{
+ if (a < b) return b; else return a;
+}
+int foo (double);
+struct S
+{
+ struct T
+ {
+ int dims, count;
+ T (int, int) : dims (), count () {}
+ };
+ T *rep;
+ S () {}
+ S (int r, int c) : rep (new T (r, c)) {}
+ ~S () { delete rep; }
+};
+template <typename T>
+struct U
+{
+ static T epsilon () throw ();
+};
+template <class T>
+struct V
+{
+ struct W
+ {
+ T * data;
+ int count;
+ W (int n) : data (new T[n]), count () {}
+ };
+ V::W *rep;
+ S dimensions;
+ int slice_len;
+ V (S s) : rep (new V <T>::W (get_size (s))) {}
+ int capacity () { return slice_len; }
+ int get_size (S);
+};
+template <class T>
+struct Z : public V <T>
+{
+ Z () : V <T> (S (0, 0)) {}
+ Z (int r, int c) : V <T> (S (r, c)) {}
+};
+template <class T>
+struct A : public Z <T>
+{
+ A () : Z <T> () {}
+ A (int n, int m) : Z <T> (n, m) {}
+};
+template <class T>
+struct B : public V <T>
+{
+};
+struct C : public A <double>
+{
+ C () : A <double> () {}
+ C (int r, int c) : A <double> (r, c) {}
+};
+struct D : public B <double>
+{
+};
+template <class T>
+struct E
+{
+};
+template <class T>
+struct G : public E <T>
+{
+};
+struct H : public G <double>
+{
+};
+template <class R>
+struct I
+{
+ R scl, sum;
+ void accum (R val)
+ {
+ R t = __builtin_fabs (val);
+ if (scl == t)
+ sum += 1;
+ }
+ operator R () { __builtin_sqrt (sum); return R (); }
+};
+template <class R>
+struct J
+{
+ template < class U > void accum (U val) {}
+ operator R () { return R (); }
+};
+template <class R>
+struct K
+{
+ R max;
+ template <class U> void accum (U val)
+ {
+ double z = __builtin_fabs (val);
+ max = ::max (max, z);
+ }
+ operator R () { return max; }
+};
+template <class R>
+struct L
+{
+ unsigned num;
+ template <class U> void accum (U) {}
+ operator R () { return num; }
+};
+template <class T, class R, class S>
+void bar (V <T> &v, R &res, S acc)
+{
+ for (int i = 0; i < v.capacity (); i++)
+ acc.accum ((i));
+ res = acc;
+}
+template <class T, class R>
+void bar (B <T> &v, R)
+{
+ R res;
+ bar (v, res, I <R> ());
+}
+template <class T, class R>
+R bar (A <T> &v, R p)
+{
+ R res;
+ if (p == 2)
+ bar (v, res, I <R> ());
+ else if (p == 1)
+ bar (v, res, J <R> ());
+ else if (p == sizeof (float) ? (p) : foo (p))
+ {
+ if (p > 0)
+ bar (v, res, K <R> ());
+ }
+ else if (p == 0)
+ bar (v, res, L <R> ());
+ return res;
+}
+template <class CT, class VectorT, class R>
+void
+baz (CT m, R p, R tol, int maxiter, VectorT)
+{
+ VectorT y (0, 0), z (0, 1);
+ R q = 0;
+ R gamma = 0, gamma1 = 0;
+ gamma = bar (y, p);
+ (void) (bar (z, q) <= (gamma1 <= gamma));
+}
+int a = 100;
+template <class CT, class VectorT, class R>
+void
+test (CT m, R p, VectorT)
+{
+ VectorT x;
+ R sqrteps (U <R>::epsilon ());
+ baz (m, p, sqrteps, a, x);
+}
+void
+fn (D x, double p)
+{
+ bar (x, p);
+}
+void
+fn (H x, double p)
+{
+ test (x, p, C ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46241.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46241.C
new file mode 100644
index 000000000..95c814d4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46241.C
@@ -0,0 +1,19 @@
+class btIDebugDraw;
+class btCollisionWorld {
+ virtual btIDebugDraw* getDebugDrawer() { };
+ static void rayTestSingle();
+};
+class btTriangleCallback {
+public:
+ virtual ~btTriangleCallback();
+};
+class btTriangleRaycastCallback: public btTriangleCallback {
+public:
+ btTriangleRaycastCallback();
+};
+void btCollisionWorld::rayTestSingle()
+{
+ struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback {
+ BridgeTriangleRaycastCallback() : btTriangleRaycastCallback() { }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46338.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46338.C
new file mode 100644
index 000000000..caf71170f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46338.C
@@ -0,0 +1,25 @@
+// PR debug/46338
+// { dg-do compile }
+// { dg-require-profiling "-fprofile-generate" }
+// { dg-options "-O -fprofile-generate -fcompare-debug" }
+
+void bar ();
+
+struct S
+{
+ int f ()
+ {
+ }
+};
+
+S *s;
+
+void
+foo (int x)
+{
+ if (x)
+ return;
+ bar ();
+ for (int j = 0; j < s->f (); j++)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46583.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46583.C
new file mode 100644
index 000000000..06160b111
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr46583.C
@@ -0,0 +1,41 @@
+// PR debug/46583
+// { dg-do compile }
+// { dg-options "-O -fno-inline -fipa-cp -fipa-cp-clone -fcompare-debug" }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+template < typename = unsigned long >struct A
+{
+ unsigned long elems[3];
+ unsigned long *begin ()
+ {
+ return 0;
+ }
+};
+
+void
+bar (unsigned long *a1, unsigned long, unsigned long *a3, unsigned const &)
+{
+ *a3 = *a1;
+}
+
+A < >operatorM (A < >a1, unsigned long a2)
+{
+ typedef A < >G;
+ G a3;
+ bar (a1.begin (), a2, a3.begin (), 0);
+ return a3;
+}
+
+struct B
+{
+ B (A < >m):n (operatorM (m, 1))
+ {
+ }
+ A < >n;
+};
+
+void
+foo ()
+{
+ B (A < >());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47106.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47106.C
new file mode 100644
index 000000000..9ef276ad0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47106.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-O -fpartial-inlining -flto -fconserve-stack -fcompare-debug" }
+// { dg-require-effective-target lto }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+void end (int, int) __attribute__ ((__noreturn__));
+
+struct S
+{
+ int i;
+ S *s;
+};
+
+inline bool f (S *s)
+{
+ if (!s->s)
+ end (0, 0);
+ return s->s == s;
+}
+
+inline bool
+baz (S s1, S)
+{
+ while (f (&s1));
+}
+
+inline bool
+bar (S s1, S s2, S)
+{
+ baz (s1, s2);
+}
+
+S getS ();
+
+bool
+foo ()
+{
+ bar (getS (), getS (), getS ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47209.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47209.C
new file mode 100644
index 000000000..c144c1639
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47209.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-femit-struct-debug-baseonly" }
+struct A
+{
+ void foo ();
+};
+
+struct B : A
+{
+ typedef const A base;
+ using base::foo;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47283.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47283.C
new file mode 100644
index 000000000..dadbeff3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr47283.C
@@ -0,0 +1,58 @@
+// PR debug/47283
+// { dg-do compile }
+
+template <typename T> inline const T &
+f1 (const T &a, const T &b)
+{
+ if (a < b)
+ return b;
+ return a;
+};
+
+struct A
+{
+ A (int w, int h) { a1 = w; }
+ A f2 (const A &) const;
+ int a1, a2;
+};
+
+inline A
+A::f2 (const A &x) const
+{
+ return A (f1 (a1, x.a1), f1 (a2, x.a2));
+};
+
+struct B
+{
+ A f3 () const;
+ void f4 (const A &) { b2 = 5 + b1; }
+ int b1, b2;
+};
+
+struct C
+{
+};
+
+struct D
+{
+ virtual C f5 (const C &) const;
+};
+
+struct E
+{
+ C f6 () const;
+ int f7 () const;
+ virtual B f8 (const C &) const;
+ A f9 () const;
+ virtual void f10 ();
+ struct F { D *h; } *d;
+};
+
+void
+E::f10 ()
+{
+ const C c = d->h->f5 (f6 ());
+ B b = f8 (c);
+ b.f4 (b.f3 ().f2 (f9 ()));
+ f7 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53466.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53466.C
new file mode 100644
index 000000000..ecd88bcd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53466.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-foptimize-sibling-calls -fcompare-debug" }
+
+typedef union gimple_statement_d *gimple;
+typedef gimple gimple_seq_node;
+typedef struct {
+ gimple_seq_node ptr;
+ void *seq;
+ void *bb;
+} gimple_stmt_iterator;
+struct gimple_statement_base {
+ gimple next;
+};
+union gimple_statement_d {
+ struct gimple_statement_base gsbase;
+};
+static inline gimple_stmt_iterator gsi_start_1 (gimple stmt)
+{
+ gimple_stmt_iterator i;
+ i.ptr = stmt;
+ return i;
+}
+bool gimple_may_fallthru (gimple);
+static bool gimple_try_catch_may_fallthru (gimple stmt)
+{
+ gimple_stmt_iterator i = gsi_start_1 (stmt);
+ for (; i.ptr; i.ptr = i.ptr->gsbase.next)
+ {
+ if (gimple_may_fallthru (i.ptr))
+ return true;
+ }
+}
+bool gimple_stmt_may_fallthru (gimple stmt, bool x)
+{
+ if (x)
+ return gimple_may_fallthru (stmt);
+ else
+ return gimple_try_catch_may_fallthru (stmt);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53860.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53860.C
new file mode 100644
index 000000000..31a854af4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr53860.C
@@ -0,0 +1,14 @@
+// PR debug/53860
+// { dg-do compile }
+// { dg-options "-fkeep-inline-functions -fdebug-types-section" }
+
+void
+foo ()
+{
+ struct S
+ {
+ S ()
+ {
+ }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54499.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54499.C
new file mode 100644
index 000000000..0f7ce3f2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54499.C
@@ -0,0 +1,22 @@
+// PR debug/54499
+// { dg-do assemble }
+
+struct S1
+{
+ virtual void f () = 0;
+};
+
+struct S2
+{
+ virtual ~S2 () { }
+};
+
+struct S3 : public S1, public S2
+{
+ void f ();
+};
+
+void
+S3::f ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54828.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54828.C
new file mode 100644
index 000000000..80b9a3ce0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54828.C
@@ -0,0 +1,14 @@
+// PR debug/54828
+// { dg-do compile }
+// { dg-options "-g" }
+
+struct T { T (); virtual ~T (); };
+struct S : public virtual T { S (); virtual ~S (); };
+int v;
+void foo (char *);
+
+S::S ()
+{
+ char s[v];
+ foo (s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54831.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54831.C
new file mode 100644
index 000000000..8e7312061
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr54831.C
@@ -0,0 +1,20 @@
+// PR debug/54831
+// { dg-do compile }
+// { dg-options "-O -fno-split-wide-types -g" }
+
+struct S
+{
+ int m1();
+ int m2();
+};
+
+typedef void (S::*mptr) ();
+
+mptr gmp;
+void bar (mptr f);
+
+void foo (mptr f)
+{
+ f = gmp;
+ bar (f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56294.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56294.C
new file mode 100644
index 000000000..a9ee80763
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56294.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-fno-ipa-sra -fcompare-debug" }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+struct comp_cost { int cost; unsigned complexity; };
+struct cost_pair { struct iv_cand *cand; };
+struct iv_use { unsigned n_map_members; cost_pair *cost_map; };
+struct iv_cand { unsigned id; };
+
+unsigned gu;
+
+void
+bar (comp_cost, comp_cost)
+{
+}
+
+void
+foo (iv_use *use, iv_cand *cand)
+{
+ unsigned i, s = cand->id & (use->n_map_members - 1);
+ for (i = 0; i < s; i++)
+ if (use->cost_map[i].cand)
+ goto found;
+found:
+ use->cost_map[i].cand = cand;
+ comp_cost elim_cost, express_cost, bound_cost;
+ bar (elim_cost, express_cost);
+ gu = express_cost.complexity;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56819.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56819.C
new file mode 100644
index 000000000..bc61cb760
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/pr56819.C
@@ -0,0 +1,28 @@
+// PR debug/56819
+// { dg-do compile }
+// { dg-options "-fcompare-debug" }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+template <typename>
+struct A
+{
+ template <typename>
+ struct B;
+};
+
+template <typename>
+struct C
+{
+ typedef int I;
+};
+
+template <typename T>
+class D
+{
+ typedef A <void> E;
+ typedef typename T::template B <E> F;
+ typedef typename C <F>::I I;
+ A <I> foo () { return A<I> (); }
+};
+
+template class D <A <void> >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/ra1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/ra1.C
new file mode 100644
index 000000000..5a6811388
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/ra1.C
@@ -0,0 +1,77 @@
+/* { dg-options "-fcompare-debug" } */
+
+enum signop { SIGNED, UNSIGNED };
+enum tree_code { FOO, BAR };
+enum tree_code_class { tcc_type, tcc_other };
+extern enum tree_code_class tree_code_type[];
+
+struct tree_base {
+ enum tree_code code : 8;
+ unsigned unsigned_flag : 1;
+};
+
+struct tree_def {
+ tree_base base;
+ struct {
+ int precision;
+ } type_common;
+};
+
+typedef tree_def *tree;
+
+struct storage_ref
+{
+ storage_ref (const long *, unsigned int, unsigned int);
+
+ const long *val;
+ unsigned int len;
+ unsigned int precision;
+};
+
+inline storage_ref::storage_ref (const long *val_in,
+ unsigned int len_in,
+ unsigned int precision_in)
+ : val (val_in), len (len_in), precision (precision_in)
+{
+}
+
+struct hwi_with_prec
+{
+ long val;
+ unsigned int precision;
+ signop sgn;
+};
+
+inline storage_ref
+decompose (long *scratch, unsigned int precision,
+ const hwi_with_prec &x)
+{
+ scratch[0] = x.val;
+ if (x.sgn == SIGNED || x.val >= 0 || precision <= sizeof (long) * 8)
+ return storage_ref (scratch, 1, precision);
+ scratch[1] = 0;
+ return storage_ref (scratch, 2, precision);
+}
+
+extern void tree_class_check_failed (int) __attribute__ ((__noreturn__));
+
+inline tree
+tree_class_check (tree t, const enum tree_code_class cls, int x)
+{
+ if (tree_code_type[t->base.code] != cls)
+ tree_class_check_failed (x);
+ return t;
+}
+
+tree wide_int_to_tree (tree, const storage_ref &);
+
+tree
+build_int_cstu (tree type, unsigned long val)
+{
+ hwi_with_prec x;
+ x.val = val;
+ x.precision = tree_class_check (type, tcc_type, 1)->type_common.precision;
+ x.sgn = (signop) tree_class_check (type, tcc_type, 2)->base.unsigned_flag;
+ long scratch[2];
+ return wide_int_to_tree (type, decompose (scratch, x.precision, x));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/static1.C
new file mode 100644
index 000000000..7419ce507
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/static1.C
@@ -0,0 +1,16 @@
+// PR c++/24569
+
+template <int dim>
+struct S
+{
+ static const int u = 2 * dim;
+ static const int p[u];
+ static int f();
+};
+
+template <>
+inline int S<3>::f () { return 1; }
+
+template <int dim> const int S<dim>::u;
+
+template class S<3>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/template1.C
new file mode 100644
index 000000000..279b4b173
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/template1.C
@@ -0,0 +1,15 @@
+// PR c++/5118
+
+template <int Count>
+class d
+{
+public:
+ d()
+ {
+ myInt = Count;
+ }
+ int myInt;
+ virtual ~d() {}
+};
+
+volatile d<5> instD;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/template2.C
new file mode 100644
index 000000000..9f5bcd9b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/template2.C
@@ -0,0 +1,14 @@
+// PR c++/57545
+
+template<typename T, long unsigned int N>
+struct array {
+ T data[N];
+};
+
+template<typename T>
+struct derived {
+ typedef long unsigned int size_type;
+ static const size_type n = 42;
+
+ array<int, n> a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/trivial.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/trivial.C
new file mode 100644
index 000000000..5b125eca9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/trivial.C
@@ -0,0 +1,6 @@
+/* { dg-do run } */
+
+int main(void)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef1.C
new file mode 100644
index 000000000..82455358b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef1.C
@@ -0,0 +1,17 @@
+// PR debug/6436
+// { dg-do compile }
+
+typedef struct
+{
+ unsigned int a0, a1;
+} A __attribute__ ((aligned(8)));
+
+typedef struct
+{
+ A a;
+} B;
+
+struct C
+{
+ B *bp;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef2.C
new file mode 100644
index 000000000..a216242c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef2.C
@@ -0,0 +1,12 @@
+// PR c++/17695
+
+template<typename T> struct A
+{
+ T t;
+ A();
+};
+
+struct B
+{
+ B() { typedef int C; A<C> a; }
+} b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef3.C
new file mode 100644
index 000000000..366c69a68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/typedef3.C
@@ -0,0 +1,19 @@
+// PR debug/16261
+// { dg-do compile }
+
+namespace N
+{
+ struct A {};
+ typedef A B;
+}
+
+void foo()
+{
+ struct C
+ {
+ C(N::B) {}
+ };
+
+ N::B b;
+ C c(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using1.C
new file mode 100644
index 000000000..7b13e53bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using1.C
@@ -0,0 +1,15 @@
+// PR c++/19406
+// { dg-do compile }
+
+struct A
+{
+ virtual int foo();
+ double d;
+};
+
+struct B : public A
+{
+ A::d; // { dg-warning "deprecated" }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using2.C
new file mode 100644
index 000000000..94f0deae7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using2.C
@@ -0,0 +1,21 @@
+// PR c++/22489
+
+namespace N { }
+
+struct T
+{
+ T () { }
+};
+
+void
+bar ()
+{
+ struct U : public T
+ {
+ void baz ()
+ {
+ using namespace N;
+ }
+ } u;
+ u.baz();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using3.C
new file mode 100644
index 000000000..df3e3dfa3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using3.C
@@ -0,0 +1,8 @@
+// PR debug/31899
+
+namespace NS {
+ int x = 0;
+ int &ref = x;
+}
+
+using NS::ref;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using4.C
new file mode 100644
index 000000000..8a6162606
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using4.C
@@ -0,0 +1,24 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A
+{
+ typedef char type;
+};
+
+struct B
+{
+ typedef int type;
+};
+
+struct C : A, B
+{
+ using A::type;
+ type f (type);
+};
+
+C::type C::f( type )
+{
+ type c = 'e';
+ return c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using5.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using5.C
new file mode 100644
index 000000000..3f2de9bfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using5.C
@@ -0,0 +1,23 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+struct B
+{
+ int i;
+};
+
+struct C : A, B
+{
+ using B::i;
+ int f ();
+};
+
+int C::f()
+{
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/using6.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/using6.C
new file mode 100644
index 000000000..8f73d37ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/using6.C
@@ -0,0 +1,22 @@
+// PR c++/51189
+// { dg-do compile }
+
+struct A
+{
+ int i1, i2, i3, i4, i5, i6;
+};
+
+struct B : A
+{
+ using A::i1;
+ using A::i2;
+ using A::i3;
+ using A::i4;
+ using A::i5;
+ using A::i6;
+};
+
+struct C : B
+{
+ using B::i1;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/debug/vartrack1.C b/gcc-4.9/gcc/testsuite/g++.dg/debug/vartrack1.C
new file mode 100644
index 000000000..d72cb6f35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/debug/vartrack1.C
@@ -0,0 +1,99 @@
+// This testcase used to hang the compiler in vt_find_locations.
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+
+struct S
+{
+ int a;
+ S *b, *c, *d;
+};
+
+struct T
+{
+ void f1 (S *x);
+ void f2 (S *x);
+ void f3 (S *x, S *y);
+ S *e;
+};
+
+void
+T::f3 (S *x, S *y)
+{
+ while (x != this->e && (!x || x->a == 1))
+ {
+ if (x == y->c)
+ {
+ S *w = y->d;
+ if (w && w->a == 0)
+ {
+ w->a = 1;
+ y->a = 0;
+ f2 (y);
+ w = y->d;
+ }
+ if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
+ {
+ w->a = 0;
+ x = y;
+ y = x->b;
+ }
+ else
+ {
+ if (w && (!w->d || w->d->a == 1))
+ {
+ if (w->c)
+ w->c->a = 1;
+ w->a = 0;
+ f1 (w);
+ w = y->d;
+ }
+ if (w)
+ {
+ w->a = y->a;
+ if (w->d)
+ w->d->a = 1;
+ }
+ y->a = 1;
+ f2 (y);
+ x = e;
+ }
+ }
+ else
+ {
+ S *w = y->c;
+ if (w && w->a == 0)
+ {
+ w->a = 1;
+ y->a = 0;
+ f1 (y);
+ w = y->c;
+ }
+ if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
+ {
+ w->a = 0;
+ x = y;
+ y = x->b;
+ }
+ else
+ {
+ if (w && (!w->c || w->c->a == 1))
+ {
+ w->a = 0;
+ if (w->d)
+ w->d->a = 1;
+ f2 (w);
+ w = y->c;
+ }
+ if (w)
+ {
+ w->a = y->a;
+ if (w->c)
+ w->c->a = 1;
+ }
+ y->a = 1;
+ f1 (y);
+ x = e;
+ }
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-1.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-1.C
new file mode 100644
index 000000000..38689fa16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-1.C
@@ -0,0 +1,122 @@
+/* { dg-do assemble } */
+
+/* Minimized from the testcase in PR c++/44473; mangling of decimal types
+ did not include CV qualifiers. */
+
+namespace std
+{
+ namespace decimal
+ {
+ class decimal32
+ {
+ public:
+ typedef float __decfloat32 __attribute__ ((mode (SD)));
+ explicit decimal32 (float __r):__val (__r) {}
+ private:
+ __decfloat32 __val;
+ };
+ };
+
+ template <typename _BI1, typename _BI2>
+ _BI2 copy_backward (_BI1 __first, _BI2 __result);
+}
+
+namespace __gnu_cxx
+{
+ template <typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ public:
+ explicit __normal_iterator (const _Iterator & __i) {}
+ const _Iterator & base () const {}
+ };
+
+ template <typename _IteratorL, typename _IteratorR, typename _Container>
+ bool operator== (const __normal_iterator <_IteratorL, _Container> &__lhs,
+ const __normal_iterator <_IteratorR, _Container> &__rhs)
+ {
+ return __lhs.base () == __rhs.base ();
+ }
+
+ template <typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef _Tp *pointer;
+ typedef const _Tp *const_pointer;
+ template <typename _Tp1>
+ struct rebind
+ {
+ typedef new_allocator <_Tp1> other;
+ };
+ };
+}
+
+namespace std
+{
+ template <typename _Tp>
+ class allocator:public __gnu_cxx::new_allocator <_Tp> {};
+
+ template <typename _Tp, typename _Alloc>
+ struct _Vector_base
+ {
+ typedef typename _Alloc::template rebind <_Tp>::other _Tp_alloc_type;
+ struct _Vector_impl:public _Tp_alloc_type
+ {
+ typename _Tp_alloc_type::pointer _M_finish;
+ };
+ public: _Vector_impl _M_impl;
+ };
+
+ template <typename _Tp, typename _Alloc = std::allocator <_Tp> >
+ class vector:protected _Vector_base <_Tp, _Alloc>
+ {
+ typedef _Vector_base <_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:
+ typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef __gnu_cxx::__normal_iterator <pointer, vector> iterator;
+ typedef __gnu_cxx::__normal_iterator <const_pointer, vector>
+ const_iterator;
+ const_iterator begin () const;
+ iterator end ()
+ {
+ return iterator (this->_M_impl._M_finish);
+ }
+ const_iterator end () const
+ {
+ return const_iterator (this->_M_impl._M_finish);
+ }
+ bool empty () const
+ {
+ return begin () == end ();
+ }
+ void push_back (const value_type & __x)
+ {
+ _M_insert_aux (end ());
+ }
+ void _M_insert_aux (iterator __position);
+ };
+
+ template <typename _Tp, typename _Alloc>
+ void vector <_Tp, _Alloc>::_M_insert_aux (iterator __position)
+ {
+ std::copy_backward (__position.base (), this->_M_impl._M_finish - 1);
+ }
+}
+
+std::vector <std::decimal::decimal32> vec;
+
+int
+foo ()
+{
+ return (vec.empty ()) ? 1 : 0;
+}
+
+bool
+bar ()
+{
+ vec.push_back (std::decimal::decimal32 (0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-2.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-2.C
new file mode 100644
index 000000000..311f62299
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/44473-2.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+
+namespace std {
+ namespace decimal {
+ class decimal64 {
+ public:
+ typedef float __decfloat64 __attribute__ ((mode (DD)));
+ explicit decimal64 (int __r):__val (__r) {}
+ private:
+ __decfloat64 __val;
+ };
+ }
+}
+
+int bar (const std::decimal::decimal64 & x) { }
+
+int foo ()
+{
+ std::decimal::decimal64 x(0);
+ bar (x);
+}
+
+// { dg-final { scan-assembler "_Z3barRKDd:" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/base.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/base.C
new file mode 100644
index 000000000..3e5dc50ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/base.C
@@ -0,0 +1,23 @@
+// PR c++/50207
+// { dg-do compile }
+
+namespace std
+{
+ namespace decimal
+ {
+ template <class _Fmt> struct _FmtTraits;
+ class decimal32;
+ template <> struct _FmtTraits <decimal32>
+ {
+ static const long _NumBytes = 4UL;
+ };
+ template <class _Tr> class _DecBase
+ {
+ unsigned char _Bytes[_Tr::_NumBytes];
+ };
+ class decimal32 : public _DecBase <_FmtTraits <decimal32> > // { dg-error "has base" }
+ {
+ decimal32 () { }
+ };
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/dfp.exp b/gcc-4.9/gcc/testsuite/g++.dg/dfp/dfp.exp
new file mode 100644
index 000000000..fceb12605
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/dfp.exp
@@ -0,0 +1,67 @@
+# Copyright (C) 2005-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Skip these tests for targets that don't support this extension.
+if { ![check_effective_target_dfp] } {
+ return;
+}
+
+# If the decimal float is supported in the compiler but not yet in the
+# runtime, treat all tests as compile-only.
+global dg-do-what-default
+set save-dg-do-what-default ${dg-do-what-default}
+if { ![check_effective_target_dfprt] } {
+ verbose "dfp.exp: runtime support for decimal float does not exist" 2
+ set dg-do-what-default compile
+} else {
+ verbose "dfp.exp: runtime support for decimal float exists, use it" 2
+ set dg-do-what-default run
+}
+verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2
+
+global DEFAULT_CXXFLAGS
+if [info exists DEFAULT_CXXFLAGS] then {
+ set save_default_cxxflags $DEFAULT_CXXFLAGS
+}
+
+# If a testcase doesn't have special options, use these.
+set DEFAULT_CXXFLAGS ""
+
+# Initialize `dg'.
+dg-init
+
+# Main loop. Run the tests that are specific to C++.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[C]] \
+ $DEFAULT_CXXFLAGS
+# Run tests that are shared with C testing.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/dfp/*.c]] \
+ $DEFAULT_CXXFLAGS
+
+# All done.
+dg-finish
+
+set dg-do-what-default ${save-dg-do-what-default}
+verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2
+if [info exists save_default_cxxflags] {
+ set DEFAULT_CXXFLAGS $save_default_cxxflags
+} else {
+ unset DEFAULT_CXXFLAGS
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-1.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-1.C
new file mode 100644
index 000000000..455d3e4c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-1.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+// Derived from g++.dg/abi/mangle13.C.
+
+namespace std {
+ namespace decimal {
+ class decimal64 {
+ public:
+ typedef float __decfloat64 __attribute__ ((mode (DD)));
+ explicit decimal64 (float __r):__val (__r) {}
+ private:
+ __decfloat64 __val;
+ };
+ }
+}
+
+struct A {
+ template <typename T> std::decimal::decimal64 f ();
+ std::decimal::decimal64 operator+();
+ operator std::decimal::decimal64 ();
+ template <typename T>
+ std::decimal::decimal64 operator-();
+};
+
+typedef std::decimal::decimal64 (A::*P)();
+
+template <P> struct S {};
+
+template <typename T> void g (S<&T::template f<std::decimal::decimal64> >) {}
+template <typename T> void g (S<&T::operator+ >) {}
+template <typename T> void g (S<&T::operator std::decimal::decimal64>) {}
+template <typename T> void g (S<&T::template operator- <std::decimal::decimal64> >) {}
+
+template void g<A> (S<&A::f<std::decimal::decimal64> >);
+template void g<A> (S<&A::operator+>);
+template void g<A> (S<&A::operator std::decimal::decimal64>);
+
+// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_1fIDdEEE\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_plEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-2.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-2.C
new file mode 100644
index 000000000..1af9aa1a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-2.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+// Derived from g++.dg/abi/mangle15.C.
+
+namespace std {
+ namespace decimal {
+ class decimal64 {
+ public:
+ typedef float __decfloat64 __attribute__ ((mode (DD)));
+ explicit decimal64 (float __r):__val (__r) {}
+ private:
+ __decfloat64 __val;
+ };
+ }
+}
+
+struct A {
+ template <typename T> std::decimal::decimal64 f ();
+};
+
+typedef std::decimal::decimal64 (A::*P)();
+
+template <P> struct S {};
+
+void g (S<&A::f<std::decimal::decimal64> >) {}
+
+// { dg-final { scan-assembler "\n?_Z1g1SIXadL_ZN1A1fIDdEEDdvEEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-3.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-3.C
new file mode 100644
index 000000000..c716ed0e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-3.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+// Derived from g++.dg/abi/mangle20-1.C.
+
+namespace std {
+ namespace decimal {
+ class decimal64 {
+ public:
+ typedef float __decfloat64 __attribute__ ((mode (DD)));
+ explicit decimal64 (int __r):__val (__r) {}
+ private:
+ __decfloat64 __val;
+ };
+ }
+}
+
+template <int I> void f(std::decimal::decimal64 (*)[2]) {}
+template <int I> void g(std::decimal::decimal64 (*)[I+2]) {}
+
+static const std::decimal::decimal64 I(1);
+static const std::decimal::decimal64 J(2);
+
+template void f<1>(std::decimal::decimal64 (*)[2]);
+template void g<1>(std::decimal::decimal64 (*)[3]);
+
+// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_Dd\[: \t\n\]" } }
+// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_Dd\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-4.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-4.C
new file mode 100644
index 000000000..899d5661c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-4.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+// Derived from g++.dg/abi/mangle30.C.
+
+namespace std {
+ namespace decimal {
+ class decimal64 {
+ public:
+ typedef float __decfloat64 __attribute__ ((mode (DD)));
+ explicit decimal64 (int __r):__val (__r) {}
+ private:
+ __decfloat64 __val;
+ };
+ }
+}
+
+struct A
+{
+ template <class T>
+ struct B
+ {
+ typedef T myT;
+ };
+};
+
+template <class T>
+void f (T t, typename T::template B<std::decimal::decimal64>::myT u, typename T::template B<int>::myT v);
+
+void foo ()
+{
+ f (A(), std::decimal::decimal64(0), 1);
+}
+
+// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BIDdE3myTENS2_IiE3myTE" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-5.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-5.C
new file mode 100644
index 000000000..794577f86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-5.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Mangling of classes from std::decimal are special-cased.
+// Derived from g++.dg/abi/mangle35.C.
+
+namespace std {
+ namespace decimal {
+ class decimal128 {
+ public:
+ typedef float __decfloat128 __attribute__ ((mode (TD)));
+ explicit decimal128 (int __r):__val (__r) {}
+ private:
+ __decfloat128 __val;
+ };
+ }
+}
+
+template<void (*)()> struct A {};
+
+template<typename> void foo();
+
+template<typename T> A<foo<T> > bar();
+
+void baz()
+{
+ bar<std::decimal::decimal128>();
+}
+
+// { dg-final { scan-assembler "_Z3barIDeE1AIX3fooIT_EEEv" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-mode.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-mode.C
new file mode 100644
index 000000000..ac30cb323
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/mangle-mode.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+
+// Check that the compiler mangles types defined with decimal float
+// modes according to the vendor-neutral C++ ABI.
+
+typedef float _Decimal32 __attribute__((mode(SD)));
+typedef float _Decimal64 __attribute__((mode(DD)));
+typedef float _Decimal128 __attribute__((mode(TD)));
+
+extern void foo32 (_Decimal32 a, _Decimal32 &b, _Decimal32 *c);
+extern void foo64 (_Decimal64 *a, _Decimal64 b, _Decimal64 &c);
+extern void foo128 (_Decimal128 &a, _Decimal128 *b, _Decimal128 c);
+
+void
+bar32 (void)
+{
+ _Decimal32 x, y, z;
+ foo32 (x, y, &z);
+}
+
+void
+bar64 (void)
+{
+ _Decimal64 x, y, z;
+ foo64 (&x, y, z);
+}
+
+void
+bar128 (void)
+{
+ _Decimal128 x, y, z;
+ foo128 (x, &y, z);
+}
+
+// { dg-final { scan-assembler "Z5foo32DfRDfPDf" } }
+// { dg-final { scan-assembler "Z5foo64PDdDdRDd" } }
+// { dg-final { scan-assembler "Z6foo128RDePDeDe" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/nofields.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/nofields.C
new file mode 100644
index 000000000..7234672d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/nofields.C
@@ -0,0 +1,19 @@
+// PR c++/46862
+// { dg-do compile }
+
+namespace std
+{
+ namespace decimal
+ {
+ class decimal32 { }; // { dg-error "does not have any fields" }
+ class decimal64 { }; // { dg-error "does not have any fields" }
+ class decimal128 { }; // { dg-error "does not have any fields" }
+ }
+}
+
+void
+foo (std::decimal::decimal32 x,
+ std::decimal::decimal64 y,
+ std::decimal::decimal128 z)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dfp/typeid1.C b/gcc-4.9/gcc/testsuite/g++.dg/dfp/typeid1.C
new file mode 100644
index 000000000..cdc33a774
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dfp/typeid1.C
@@ -0,0 +1,8 @@
+// PR c++/39131
+// { dg-do link }
+
+#include <typeinfo>
+
+const std::type_info &r = typeid(0.dd);
+
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/dg.exp b/gcc-4.9/gcc/testsuite/g++.dg/dg.exp
new file mode 100644
index 000000000..aeae8f373
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/dg.exp
@@ -0,0 +1,71 @@
+# Copyright (C) 2000-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CXXFLAGS
+if ![info exists DEFAULT_CXXFLAGS] then {
+ set DEFAULT_CXXFLAGS " -pedantic-errors -Wno-long-long"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Gather a list of all tests, with the exception of those in directories
+# that are handled specially.
+set tests [lsort [find $srcdir/$subdir *.C]]
+set tests [prune $tests $srcdir/$subdir/bprob/*]
+set tests [prune $tests $srcdir/$subdir/charset/*]
+set tests [prune $tests $srcdir/$subdir/cilk-plus/AN/*]
+set tests [prune $tests $srcdir/$subdir/compat/*]
+set tests [prune $tests $srcdir/$subdir/debug/*]
+set tests [prune $tests $srcdir/$subdir/dfp/*]
+set tests [prune $tests $srcdir/$subdir/gcov/*]
+set tests [prune $tests $srcdir/$subdir/lto/*]
+set tests [prune $tests $srcdir/$subdir/pch/*]
+set tests [prune $tests $srcdir/$subdir/plugin/*]
+set tests [prune $tests $srcdir/$subdir/special/*]
+set tests [prune $tests $srcdir/$subdir/tls/*]
+set tests [prune $tests $srcdir/$subdir/vect/*]
+set tests [prune $tests $srcdir/$subdir/gomp/*]
+set tests [prune $tests $srcdir/$subdir/tree-prof/*]
+set tests [prune $tests $srcdir/$subdir/torture/*]
+set tests [prune $tests $srcdir/$subdir/graphite/*]
+set tests [prune $tests $srcdir/$subdir/tm/*]
+set tests [prune $tests $srcdir/$subdir/cilk-plus/*]
+set tests [prune $tests $srcdir/$subdir/guality/*]
+set tests [prune $tests $srcdir/$subdir/simulate-thread/*]
+set tests [prune $tests $srcdir/$subdir/asan/*]
+set tests [prune $tests $srcdir/$subdir/ubsan/*]
+set tests [prune $tests $srcdir/$subdir/tsan/*]
+
+# Main loop.
+g++-dg-runtest $tests $DEFAULT_CXXFLAGS
+
+# C/C++ common tests.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/*.\[cSi\]]] \
+ ""
+
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cpp/*.\[cS\]]] \
+ ""
+
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/aka1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/aka1.C
new file mode 100644
index 000000000..37f8df939
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/aka1.C
@@ -0,0 +1,15 @@
+// Basic test for typedef stripping in diagnostics.
+
+struct A {
+ void f();
+};
+
+void A::f() {
+ // We don't want an aka for the injected-class-name.
+ A a = 0; // { dg-error "type .A. requested" }
+}
+
+typedef A B;
+
+// We do want an aka for a real typedef.
+B b = 0; // { dg-error "B .aka A." }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bindings1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bindings1.C
new file mode 100644
index 000000000..4972377a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bindings1.C
@@ -0,0 +1,18 @@
+// PR c++/45487
+// { dg-do run }
+
+extern "C" int strcmp(const char*, const char*);
+
+template <typename T>
+const char* foo(T, typename T::type c) { return __PRETTY_FUNCTION__; }
+
+struct x {typedef int type;};
+
+int main()
+{
+ if (strcmp (foo(x(), 3), "const char* foo(T, typename T::type) "
+ "[with T = x; typename T::type = int]") == 0)
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld1.C
new file mode 100644
index 000000000..f75df38a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld1.C
@@ -0,0 +1,13 @@
+// PR c++/46001
+// { dg-do compile }
+
+struct S
+{
+ char *p;
+ unsigned char f : 1;
+};
+
+struct S s;
+void *a = s.p | s.f; // { dg-error "unsigned char:1" }
+
+// { dg-bogus "__java_boolean" "" { target *-*-* } 11 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld2.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld2.C
new file mode 100644
index 000000000..46d5ee2ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/bitfld2.C
@@ -0,0 +1,9 @@
+// PR c++/33840
+// { dg-do compile }
+
+template<int> struct A
+{
+ struct {} : 2; // { dg-error "expected ';' after struct" "expected" }
+};
+// { dg-error "ISO C.. forbids declaration" "declaration" { target *-*-* } 6 }
+// { dg-error "ISO C.. prohibits anonymous" "anonymous" { target *-*-* } 6 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/expr1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/expr1.C
new file mode 100644
index 000000000..5651030d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/expr1.C
@@ -0,0 +1,9 @@
+// PR c++/50059
+
+int i;
+struct A { };
+void f(A);
+void g()
+{
+ f(i = 0); // { dg-error "i = 0" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/method1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/method1.C
new file mode 100644
index 000000000..0e7c58092
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/method1.C
@@ -0,0 +1,20 @@
+// PR c++/44627
+// { dg-do compile }
+
+struct A
+{
+ A *foo ();
+};
+
+template <class T>
+void
+bar ()
+{
+ A::foo ().anything; // { dg-error "without object" }
+}
+
+void
+baz ()
+{
+ bar <int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/parm1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/parm1.C
new file mode 100644
index 000000000..2e553e2d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/parm1.C
@@ -0,0 +1,11 @@
+// PR c++/44366
+// While printing the operand of sizeof We were trying to print f as the
+// scope of t, causing infinite recursion.
+
+template <typename T>
+void f(T t, int(*)[sizeof(t)])
+{
+ struct A { void g() {
+ foo; // { dg-error "foo" }
+ } };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr58979.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr58979.C
new file mode 100644
index 000000000..6be3f1436
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr58979.C
@@ -0,0 +1,4 @@
+// PR c++/58979
+// { dg-do compile }
+
+int i = 0->*0; // { dg-error "invalid type argument of" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr59838.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr59838.C
new file mode 100644
index 000000000..d1cf2c7fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/pr59838.C
@@ -0,0 +1,4 @@
+// PR c++/59838
+// { dg-do compile }
+
+enum E { a, b = (E) a }; // { dg-error "conversion to incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/variadic1.C
new file mode 100644
index 000000000..69f1f988f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/variadic1.C
@@ -0,0 +1,9 @@
+// PR c++/55241
+// { dg-do compile { target c++11 } }
+
+template<int N> struct B { };
+template<typename... T> struct A
+{
+ B<sizeof...(T)> f(); // { dg-error "sizeof\\.\\.\\." }
+ B<42> f(); // { dg-error "cannot be overloaded" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C
new file mode 100644
index 000000000..2cf75f8bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C
@@ -0,0 +1,4 @@
+// Origin PR c++/51427
+
+typedef struct _GMutex GMutex; // { dg-message "previously declared here"}
+typedef union _GMutex GMutex; // { dg-error "tag used in naming" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/080514-1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/080514-1.C
new file mode 100644
index 000000000..dafa32503
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/080514-1.C
@@ -0,0 +1,16 @@
+// This used to fail on s390 due to cse removing an insn with a
+// REG_EH_REGION without deleting the EH edge.
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+void
+run (int m, double d)
+{
+ int stack[m];
+ int *sp = stack;
+
+ if (d == 1.0)
+ *(sp++) = (0);
+ else if (d < 1.0)
+ *(sp++) = (-1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/alias1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/alias1.C
new file mode 100644
index 000000000..e6af38317
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/alias1.C
@@ -0,0 +1,42 @@
+// { dg-do run }
+// { dg-options "-O3" }
+/* PR c++/28139: disjoint alias sets for the store from
+ expand_start_catch_block than for loading P result in P being loaded
+ before it is initialized for sh-elf. */
+
+extern "C" {
+void exit (int) __attribute__ ((noreturn));
+}
+
+int i_glob = 42;
+int *p0 = &i_glob;
+typedef int **ipp;
+
+void
+g (int i)
+{
+ if (!i_glob)
+ exit ((__SIZE_TYPE__) & i);
+}
+
+static void
+h ()
+{
+ throw &p0;
+}
+
+int
+main()
+{
+ g (42);
+ try
+ {
+ h ();
+ }
+ catch (const ipp &p)
+ {
+ if (**p != 42)
+ exit (1);
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1.C
new file mode 100644
index 000000000..2a5ef4bc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1.C
@@ -0,0 +1,26 @@
+// Test that the anonymous namespace isn't mangled with random characters,
+// but also doesn't get mixed up with an anonymous namespace in another
+// translation unit.
+
+// { dg-do run }
+// { dg-additional-sources "anon1a.cc" }
+
+namespace {
+ struct A
+ {
+ virtual void f();
+ };
+
+ void A::f() { }
+}
+
+extern void g();
+
+int main()
+{
+ try {
+ try {
+ g();
+ } catch (A) { __builtin_abort(); }
+ } catch (...) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1a.cc b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1a.cc
new file mode 100644
index 000000000..ba161ac2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon1a.cc
@@ -0,0 +1,10 @@
+namespace {
+ struct A
+ {
+ virtual void f();
+ };
+
+ void A::f() { }
+}
+
+void g() { throw A(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon2.C
new file mode 100644
index 000000000..9ff9ee3ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/anon2.C
@@ -0,0 +1,24 @@
+// Test that the anonymous namespace isn't mangled with random characters,
+// but also doesn't get mixed up with an anonymous namespace in another
+// translation unit.
+// { dg-final { scan-assembler "\\*N12_GLOBAL__N_11AE" } }
+
+namespace {
+ struct A
+ {
+ virtual void f();
+ };
+
+ void A::f() { }
+}
+
+extern void g();
+
+int main()
+{
+ try {
+ try {
+ g();
+ } catch (A) { __builtin_abort(); }
+ } catch (...) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C
new file mode 100644
index 000000000..109837cd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C
@@ -0,0 +1,47 @@
+/* Test unwinding of iWMMXt register saves. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm32 } */
+
+#ifdef __IWMMXT__
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+void
+foo (void)
+{
+ register long long wr10 asm("wr10") = 0;
+ register long long wr11 asm("wr11") = 1;
+ register long long wr12 asm("wr12") = 2;
+ register long long wr14 asm("wr14") = 4;
+ register long long wr15 asm("wr15") = 5;
+ asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr14), "+y" (wr15));
+ throw "";
+}
+
+int
+main (void)
+{
+ register long long wr10 asm("wr10") = 10;
+ register long long wr11 asm("wr11") = 11;
+ register long long wr12 asm("wr12") = 12;
+ register long long wr13 asm("wr13") = 13;
+ register long long wr14 asm("wr14") = 14;
+ register long long wr15 asm("wr15") = 15;
+ asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15));
+ try {
+ foo ();
+ } catch (...) {
+ asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15));
+ if (wr10 != 10 || wr11 != 11 || wr12 != 12 || wr13 != 13 || wr14 != 14 || wr15 != 15)
+ abort ();
+ }
+ exit (0);
+}
+#else
+int
+main (void)
+{
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C
new file mode 100644
index 000000000..62263c0c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-require-effective-target arm32 } */
+
+/* Test to catch off-by-one errors in arm/pr-support.c. */
+
+#if defined (__VFP_FP__) && !defined (__SOFTFP__)
+
+#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+
+static void donkey ()
+{
+ asm volatile ("fcpyd d9, %P0" : : "w" (1.2345) : "d9");
+ throw 1;
+}
+
+int main()
+{
+ try
+ {
+ donkey ();
+ }
+ catch (int foo)
+ {
+ return 0;
+ }
+ return 1;
+}
+
+#else
+
+int main()
+{
+ return 0;
+}
+
+#endif
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/array1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/array1.C
new file mode 100644
index 000000000..43e5bc024
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/array1.C
@@ -0,0 +1,17 @@
+// Test that we have one EH cleanup region for the whole array
+// rather than one for each element.
+// { dg-options "-fdump-tree-gimple" }
+
+struct A
+{
+ A();
+ ~A();
+};
+
+void f()
+{
+ A a[10] = { };
+}
+
+// { dg-final { scan-tree-dump-times "catch" 1 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind1.C
new file mode 100644
index 000000000..69b2c345e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind1.C
@@ -0,0 +1,61 @@
+// PR rtl-optimization/36419
+// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// { dg-options "-Os -fasynchronous-unwind-tables -mpreferred-stack-boundary=4" }
+
+extern "C" void abort ();
+
+int v = -1;
+unsigned int n;
+
+__attribute__((noinline, used))
+void foo (int a, int)
+{
+ if (v < 0)
+ v = ((unsigned long) &a) & 15;
+ else if ((((unsigned long) &a) & 15) != v)
+ abort ();
+ if (n++ == 0)
+ throw 1;
+}
+
+__attribute__((noinline, used))
+void baz (int a, int, int, int, int, int, int)
+{
+ if (v < 0)
+ v = ((unsigned long) &a) & 15;
+ else if ((((unsigned long) &a) & 15) != v)
+ abort ();
+ if (n++ == 0)
+ throw 1;
+}
+
+struct A { A () { }; ~A (); char c[24]; };
+
+__attribute__((noinline))
+A::~A ()
+{
+ asm volatile ("" : : : "memory");
+}
+
+__attribute__((noinline))
+void bar ()
+{
+ A a;
+ try
+ {
+ foo (1, 2);
+ baz (3, 4, 5, 6, 7, 8, 9);
+ }
+ catch (...)
+ {
+ }
+ foo (1, 2);
+ baz (3, 4, 5, 6, 7, 8, 9);
+}
+
+int
+main ()
+{
+ bar ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind2.C
new file mode 100644
index 000000000..0c31f80e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/async-unwind2.C
@@ -0,0 +1,255 @@
+// PR rtl-optimization/36419
+// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// { dg-require-effective-target fpic }
+// { dg-options "-Os -fasynchronous-unwind-tables -fpic -fno-inline" }
+
+#include <stdarg.h>
+
+extern "C" void abort ();
+
+extern "C"
+{
+ struct R { int r1; unsigned short r2[1]; };
+ int bar1 (unsigned short *, int, short) throw ();
+ void bar2 (R *) throw ();
+ void bar3 (R **, const unsigned short *, int) throw ();
+ void bar4 (R **, const char *) throw ();
+ void bar5 (void *, const char *, ...);
+}
+
+struct S
+{
+ R *s;
+ struct T { };
+ S (R *x, T *) { s = x; }
+ ~S () { bar2 (s); }
+ S &operator= (const S &x);
+ S &operator+= (const S &x);
+ S sfn1 (const S &x) const;
+ friend S operator+ (const S &x1, const S &x2);
+ static S sfn2 (int i)
+ {
+ unsigned short q[33];
+ R *p = 0;
+ bar3 (&p, q, bar1 (q, i, 10));
+ return S (p, (T *) 0);
+ }
+ static S sfn3 (const char *x)
+ {
+ R *p = 0;
+ bar4 (&p, x);
+ return S (p, (T *) 0);
+ }
+};
+
+struct U { };
+template <class C> unsigned char operator >>= (const U &, C &);
+
+struct V;
+struct W
+{
+ V *w;
+ unsigned char is () const;
+};
+
+template <class T> struct X : public W
+{
+ inline ~X ();
+ X ();
+ X (const W &);
+ T *operator -> () const;
+};
+
+struct E
+{
+ E ();
+ E (const S &, const X <V> &);
+ E (E const &);
+ ~E ();
+ E &operator = (E const &);
+};
+
+struct V
+{
+ virtual void release () throw ();
+};
+
+template <class T> X <T>::~X ()
+{
+ if (w)
+ w->release ();
+}
+
+struct Y
+{
+ virtual U yfn1 (const S &);
+};
+
+struct Z;
+
+X <V> baz1 (const S &) throw (E);
+X <Z> baz2 (const X <Z> &) throw (E);
+
+template <typename T> X<T>::X ()
+{
+ w = __null;
+}
+
+template <typename T> X<T>::X (W const &)
+{
+ w = __null;
+}
+
+U Y::yfn1 (const S &)
+{
+ throw 12;
+}
+
+Y y;
+
+template <typename T> T *X<T>::operator -> () const
+{
+ return &y;
+}
+
+X <V> baz1 (const S &) throw (E)
+{
+ return X<V> ();
+}
+
+E::E ()
+{
+}
+
+E::~E ()
+{
+}
+
+X <Z> baz2 (const X <Z> &) throw (E)
+{
+ throw E ();
+}
+
+int bar1 (unsigned short *, int, short) throw ()
+{
+ asm volatile ("" : : : "memory");
+ return 0;
+}
+
+void bar2 (R *) throw ()
+{
+ asm volatile ("" : : : "memory");
+}
+
+void bar3 (R **, const unsigned short *, int) throw ()
+{
+ asm volatile ("" : : : "memory");
+}
+
+void bar4 (R **, const char *) throw ()
+{
+ asm volatile ("" : : : "memory");
+}
+
+int events[2];
+void *sp;
+
+void bar5 (void *p, const char *s, ...)
+{
+ va_list ap;
+ va_start (ap, s);
+ if (p)
+ throw 19;
+ switch (*s)
+ {
+ case 't':
+ if (events[0] != va_arg (ap, int))
+ abort ();
+ events[0]++;
+ break;
+ case 'f':
+ abort ();
+ case 'c':
+ if (events[1] != va_arg (ap, int))
+ abort ();
+ events[1]++;
+ if (events[1] == 1)
+ sp = va_arg (ap, void *);
+ else if (sp != va_arg (ap, void *))
+ abort ();
+ break;
+ }
+}
+
+unsigned char W::is () const
+{
+ return 1;
+}
+
+S &S::operator += (const S &)
+{
+ return *this;
+}
+
+template <class C> unsigned char operator >>= (const U &, C &)
+{
+ throw 1;
+}
+
+template X<Y>::X ();
+template X<Z>::X ();
+template unsigned char operator >>= (const U &, X<Z> &);
+template X<Y>::X (W const &);
+
+template Y *X<Y>::operator-> () const;
+
+X <Z> foo () throw ()
+{
+ X <Z> a;
+ X <Y> b;
+ try
+ {
+ b = X <Y> (baz1 (S::sfn3 ("defg")));
+ }
+ catch (E &)
+ {
+ }
+ if (b.is ())
+ {
+ for (int n = 0; n < 10; n++)
+ {
+ S c = S::sfn3 ("abcd");
+ c += S::sfn2 (n);
+ X <Z> d;
+ try
+ {
+ bar5 ((void *) 0, "trying %d\n", n);
+ if ((b->yfn1 (c) >>= d))
+ if (d.is ())
+ {
+ bar5 ((void *) 0, "failure1 on %d\n", n);
+ a = baz2 (d);
+ if (a.is ())
+ break;
+ }
+ bar5 ((void *) 0, "failure2 on %d\n", n);
+ }
+ catch (...)
+ {
+ void *p;
+ asm volatile ("movl %%esp, %0" : "=r" (p));
+ bar5 ((void *) 0, "caught %d %p\n", n, p);
+ }
+ }
+ }
+ return a;
+}
+
+int
+main ()
+{
+ foo ();
+ if (events[0] != 10 || events[1] != 10)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin1.C
new file mode 100644
index 000000000..c0516eb60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin1.C
@@ -0,0 +1,32 @@
+// Verify that if explicit prototype for builtin is present without throw(),
+// both the normal builtin and __builtin_* variant are expected to be
+// able to throw exceptions.
+// { dg-do compile }
+// { dg-options "-fdump-tree-eh" }
+
+extern "C" int printf (const char *, ...);
+
+extern void callme (void) throw();
+
+int
+foo (int i)
+{
+ try {
+ printf ("foo %d\n", i);
+ } catch (...) {
+ callme();
+ }
+}
+
+int
+bar (int i)
+{
+ try {
+ __builtin_printf ("foo %d\n", i);
+ } catch (...) {
+ callme();
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "resx" 2 "eh" } } */
+/* { dg-final { cleanup-tree-dump "eh" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin2.C
new file mode 100644
index 000000000..661044952
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin2.C
@@ -0,0 +1,31 @@
+// Verify that if explicit prototype for builtin is present with throw(),
+// neither the normal builtin nor __builtin_* variant can throw exceptions.
+// { dg-do compile }
+// { dg-options "-fdump-tree-eh" }
+
+extern "C" int printf (const char *, ...) throw();
+
+extern void callme (void) throw();
+
+int
+foo (int i)
+{
+ try {
+ printf ("foo %d\n", i);
+ } catch (...) {
+ callme();
+ }
+}
+
+int
+bar (int i)
+{
+ try {
+ __builtin_printf ("foo %d\n", i);
+ } catch (...) {
+ callme();
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "resx" 0 "eh" } } */
+/* { dg-final { cleanup-tree-dump "eh" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin3.C
new file mode 100644
index 000000000..4b382d982
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin3.C
@@ -0,0 +1,19 @@
+// Without explicit prototype, we need to assume the builtin can
+// throw for builtins that at least on one platform can throw.
+// { dg-do compile }
+// { dg-options "-fdump-tree-eh" }
+
+extern void callme (void) throw();
+
+int
+bar (int i)
+{
+ try {
+ __builtin_printf ("foo %d\n", i);
+ } catch (...) {
+ callme();
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "resx" 1 "eh" } } */
+/* { dg-final { cleanup-tree-dump "eh" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin4.C
new file mode 100644
index 000000000..32348174a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/builtin4.C
@@ -0,0 +1,6 @@
+// PR c++/33289
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw ();
+extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cast1.C
new file mode 100644
index 000000000..964dd698d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cast1.C
@@ -0,0 +1,10 @@
+// PR c++/28523
+
+class A {};
+class B : public A {};
+
+int main()
+{
+ throw (A) B();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/catch1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch1.C
new file mode 100644
index 000000000..730218011
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch1.C
@@ -0,0 +1,8 @@
+// PR c++/28250
+// { dg-do compile }
+
+template<int> void foo()
+{
+ try {}
+ catch (int(0)) {} // { dg-error "before" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/catch2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch2.C
new file mode 100644
index 000000000..33db94649
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch2.C
@@ -0,0 +1,9 @@
+// PR c++/28250
+// { dg-do compile }
+
+void foo()
+{
+ try {}
+ catch () {} // { dg-error "before" }
+ catch (...) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/catch3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch3.C
new file mode 100644
index 000000000..884829288
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch3.C
@@ -0,0 +1,10 @@
+// PR c++/28250
+// { dg-do compile }
+
+template<int> void foo()
+{
+ try {}
+ catch () {} // { dg-error "type-specifier" }
+}
+
+template void foo<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/catch4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch4.C
new file mode 100644
index 000000000..34cf71212
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch4.C
@@ -0,0 +1,8 @@
+// PR c++/28250
+// { dg-do compile }
+
+void foo()
+{
+ try { throw; }
+ catch () {} // { dg-error "type-specifier" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/catch5.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch5.C
new file mode 100644
index 000000000..6001b566e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/catch5.C
@@ -0,0 +1,13 @@
+// PR c++/31411
+
+struct allocator{
+ ~allocator() throw();
+};
+struct string
+{
+ string(const string& str, const allocator& al = allocator());
+};
+int main() {
+ try {}
+ catch (string smess) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/check-vect.h b/gcc-4.9/gcc/testsuite/g++.dg/eh/check-vect.h
new file mode 100644
index 000000000..b46a88275
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/check-vect.h
@@ -0,0 +1,23 @@
+/* Check if system supports SIMD. Copied from gcc.dg/vect/tree-vect.h. */
+#include <signal.h>
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+void
+sig_ill_handler (int sig)
+{
+ exit(0);
+}
+
+void check_vect (void)
+{
+ signal(SIGILL, sig_ill_handler);
+#if defined(__i386__) || defined(__x86_64__)
+ /* SSE2 instruction: movsd %xmm0,%xmm0 */
+ asm volatile (".byte 0xf2,0x0f,0x10,0xc0");
+#elif defined(__sparc__)
+ asm volatile (".word\t0x81b007c0");
+#endif
+ signal (SIGILL, SIG_DFL);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup1.C
new file mode 100644
index 000000000..981b3e8d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup1.C
@@ -0,0 +1,417 @@
+struct vector { ~vector(); };
+struct C { C();
+ vector x; };
+
+struct A {
+ A();
+
+ typedef C T;
+
+ T a0000; T a0001; T a0002; T a0003; T a0004; T a0005; T a0006; T a0007; T a0008; T a0009;
+ T a0010; T a0011; T a0012; T a0013; T a0014; T a0015; T a0016; T a0017; T a0018; T a0019;
+ T a0020; T a0021; T a0022; T a0023; T a0024; T a0025; T a0026; T a0027; T a0028; T a0029;
+ T a0030; T a0031; T a0032; T a0033; T a0034; T a0035; T a0036; T a0037; T a0038; T a0039;
+ T a0040; T a0041; T a0042; T a0043; T a0044; T a0045; T a0046; T a0047; T a0048; T a0049;
+ T a0050; T a0051; T a0052; T a0053; T a0054; T a0055; T a0056; T a0057; T a0058; T a0059;
+ T a0060; T a0061; T a0062; T a0063; T a0064; T a0065; T a0066; T a0067; T a0068; T a0069;
+ T a0070; T a0071; T a0072; T a0073; T a0074; T a0075; T a0076; T a0077; T a0078; T a0079;
+ T a0080; T a0081; T a0082; T a0083; T a0084; T a0085; T a0086; T a0087; T a0088; T a0089;
+ T a0090; T a0091; T a0092; T a0093; T a0094; T a0095; T a0096; T a0097; T a0098; T a0099;
+ T a0100; T a0101; T a0102; T a0103; T a0104; T a0105; T a0106; T a0107; T a0108; T a0109;
+ T a0110; T a0111; T a0112; T a0113; T a0114; T a0115; T a0116; T a0117; T a0118; T a0119;
+ T a0120; T a0121; T a0122; T a0123; T a0124; T a0125; T a0126; T a0127; T a0128; T a0129;
+ T a0130; T a0131; T a0132; T a0133; T a0134; T a0135; T a0136; T a0137; T a0138; T a0139;
+ T a0140; T a0141; T a0142; T a0143; T a0144; T a0145; T a0146; T a0147; T a0148; T a0149;
+ T a0150; T a0151; T a0152; T a0153; T a0154; T a0155; T a0156; T a0157; T a0158; T a0159;
+ T a0160; T a0161; T a0162; T a0163; T a0164; T a0165; T a0166; T a0167; T a0168; T a0169;
+ T a0170; T a0171; T a0172; T a0173; T a0174; T a0175; T a0176; T a0177; T a0178; T a0179;
+ T a0180; T a0181; T a0182; T a0183; T a0184; T a0185; T a0186; T a0187; T a0188; T a0189;
+ T a0190; T a0191; T a0192; T a0193; T a0194; T a0195; T a0196; T a0197; T a0198; T a0199;
+ T a0200; T a0201; T a0202; T a0203; T a0204; T a0205; T a0206; T a0207; T a0208; T a0209;
+ T a0210; T a0211; T a0212; T a0213; T a0214; T a0215; T a0216; T a0217; T a0218; T a0219;
+ T a0220; T a0221; T a0222; T a0223; T a0224; T a0225; T a0226; T a0227; T a0228; T a0229;
+ T a0230; T a0231; T a0232; T a0233; T a0234; T a0235; T a0236; T a0237; T a0238; T a0239;
+ T a0240; T a0241; T a0242; T a0243; T a0244; T a0245; T a0246; T a0247; T a0248; T a0249;
+ T a0250; T a0251; T a0252; T a0253; T a0254; T a0255; T a0256; T a0257; T a0258; T a0259;
+ T a0260; T a0261; T a0262; T a0263; T a0264; T a0265; T a0266; T a0267; T a0268; T a0269;
+ T a0270; T a0271; T a0272; T a0273; T a0274; T a0275; T a0276; T a0277; T a0278; T a0279;
+ T a0280; T a0281; T a0282; T a0283; T a0284; T a0285; T a0286; T a0287; T a0288; T a0289;
+ T a0290; T a0291; T a0292; T a0293; T a0294; T a0295; T a0296; T a0297; T a0298; T a0299;
+ T a0300; T a0301; T a0302; T a0303; T a0304; T a0305; T a0306; T a0307; T a0308; T a0309;
+ T a0310; T a0311; T a0312; T a0313; T a0314; T a0315; T a0316; T a0317; T a0318; T a0319;
+ T a0320; T a0321; T a0322; T a0323; T a0324; T a0325; T a0326; T a0327; T a0328; T a0329;
+ T a0330; T a0331; T a0332; T a0333; T a0334; T a0335; T a0336; T a0337; T a0338; T a0339;
+ T a0340; T a0341; T a0342; T a0343; T a0344; T a0345; T a0346; T a0347; T a0348; T a0349;
+ T a0350; T a0351; T a0352; T a0353; T a0354; T a0355; T a0356; T a0357; T a0358; T a0359;
+ T a0360; T a0361; T a0362; T a0363; T a0364; T a0365; T a0366; T a0367; T a0368; T a0369;
+ T a0370; T a0371; T a0372; T a0373; T a0374; T a0375; T a0376; T a0377; T a0378; T a0379;
+ T a0380; T a0381; T a0382; T a0383; T a0384; T a0385; T a0386; T a0387; T a0388; T a0389;
+ T a0390; T a0391; T a0392; T a0393; T a0394; T a0395; T a0396; T a0397; T a0398; T a0399;
+ T a0400; T a0401; T a0402; T a0403; T a0404; T a0405; T a0406; T a0407; T a0408; T a0409;
+ T a0410; T a0411; T a0412; T a0413; T a0414; T a0415; T a0416; T a0417; T a0418; T a0419;
+ T a0420; T a0421; T a0422; T a0423; T a0424; T a0425; T a0426; T a0427; T a0428; T a0429;
+ T a0430; T a0431; T a0432; T a0433; T a0434; T a0435; T a0436; T a0437; T a0438; T a0439;
+ T a0440; T a0441; T a0442; T a0443; T a0444; T a0445; T a0446; T a0447; T a0448; T a0449;
+ T a0450; T a0451; T a0452; T a0453; T a0454; T a0455; T a0456; T a0457; T a0458; T a0459;
+ T a0460; T a0461; T a0462; T a0463; T a0464; T a0465; T a0466; T a0467; T a0468; T a0469;
+ T a0470; T a0471; T a0472; T a0473; T a0474; T a0475; T a0476; T a0477; T a0478; T a0479;
+ T a0480; T a0481; T a0482; T a0483; T a0484; T a0485; T a0486; T a0487; T a0488; T a0489;
+ T a0490; T a0491; T a0492; T a0493; T a0494; T a0495; T a0496; T a0497; T a0498; T a0499;
+
+ T a0500; T a0501; T a0502; T a0503; T a0504; T a0505; T a0506; T a0507; T a0508; T a0509;
+ T a0510; T a0511; T a0512; T a0513; T a0514; T a0515; T a0516; T a0517; T a0518; T a0519;
+ T a0520; T a0521; T a0522; T a0523; T a0524; T a0525; T a0526; T a0527; T a0528; T a0529;
+ T a0530; T a0531; T a0532; T a0533; T a0534; T a0535; T a0536; T a0537; T a0538; T a0539;
+ T a0540; T a0541; T a0542; T a0543; T a0544; T a0545; T a0546; T a0547; T a0548; T a0549;
+ T a0550; T a0551; T a0552; T a0553; T a0554; T a0555; T a0556; T a0557; T a0558; T a0559;
+ T a0560; T a0561; T a0562; T a0563; T a0564; T a0565; T a0566; T a0567; T a0568; T a0569;
+ T a0570; T a0571; T a0572; T a0573; T a0574; T a0575; T a0576; T a0577; T a0578; T a0579;
+ T a0580; T a0581; T a0582; T a0583; T a0584; T a0585; T a0586; T a0587; T a0588; T a0589;
+ T a0590; T a0591; T a0592; T a0593; T a0594; T a0595; T a0596; T a0597; T a0598; T a0599;
+ T a0600; T a0601; T a0602; T a0603; T a0604; T a0605; T a0606; T a0607; T a0608; T a0609;
+ T a0610; T a0611; T a0612; T a0613; T a0614; T a0615; T a0616; T a0617; T a0618; T a0619;
+ T a0620; T a0621; T a0622; T a0623; T a0624; T a0625; T a0626; T a0627; T a0628; T a0629;
+ T a0630; T a0631; T a0632; T a0633; T a0634; T a0635; T a0636; T a0637; T a0638; T a0639;
+ T a0640; T a0641; T a0642; T a0643; T a0644; T a0645; T a0646; T a0647; T a0648; T a0649;
+ T a0650; T a0651; T a0652; T a0653; T a0654; T a0655; T a0656; T a0657; T a0658; T a0659;
+ T a0660; T a0661; T a0662; T a0663; T a0664; T a0665; T a0666; T a0667; T a0668; T a0669;
+ T a0670; T a0671; T a0672; T a0673; T a0674; T a0675; T a0676; T a0677; T a0678; T a0679;
+ T a0680; T a0681; T a0682; T a0683; T a0684; T a0685; T a0686; T a0687; T a0688; T a0689;
+ T a0690; T a0691; T a0692; T a0693; T a0694; T a0695; T a0696; T a0697; T a0698; T a0699;
+ T a0700; T a0701; T a0702; T a0703; T a0704; T a0705; T a0706; T a0707; T a0708; T a0709;
+ T a0710; T a0711; T a0712; T a0713; T a0714; T a0715; T a0716; T a0717; T a0718; T a0719;
+ T a0720; T a0721; T a0722; T a0723; T a0724; T a0725; T a0726; T a0727; T a0728; T a0729;
+ T a0730; T a0731; T a0732; T a0733; T a0734; T a0735; T a0736; T a0737; T a0738; T a0739;
+ T a0740; T a0741; T a0742; T a0743; T a0744; T a0745; T a0746; T a0747; T a0748; T a0749;
+ T a0750; T a0751; T a0752; T a0753; T a0754; T a0755; T a0756; T a0757; T a0758; T a0759;
+ T a0760; T a0761; T a0762; T a0763; T a0764; T a0765; T a0766; T a0767; T a0768; T a0769;
+ T a0770; T a0771; T a0772; T a0773; T a0774; T a0775; T a0776; T a0777; T a0778; T a0779;
+ T a0780; T a0781; T a0782; T a0783; T a0784; T a0785; T a0786; T a0787; T a0788; T a0789;
+ T a0790; T a0791; T a0792; T a0793; T a0794; T a0795; T a0796; T a0797; T a0798; T a0799;
+ T a0800; T a0801; T a0802; T a0803; T a0804; T a0805; T a0806; T a0807; T a0808; T a0809;
+ T a0810; T a0811; T a0812; T a0813; T a0814; T a0815; T a0816; T a0817; T a0818; T a0819;
+ T a0820; T a0821; T a0822; T a0823; T a0824; T a0825; T a0826; T a0827; T a0828; T a0829;
+ T a0830; T a0831; T a0832; T a0833; T a0834; T a0835; T a0836; T a0837; T a0838; T a0839;
+ T a0840; T a0841; T a0842; T a0843; T a0844; T a0845; T a0846; T a0847; T a0848; T a0849;
+ T a0850; T a0851; T a0852; T a0853; T a0854; T a0855; T a0856; T a0857; T a0858; T a0859;
+ T a0860; T a0861; T a0862; T a0863; T a0864; T a0865; T a0866; T a0867; T a0868; T a0869;
+ T a0870; T a0871; T a0872; T a0873; T a0874; T a0875; T a0876; T a0877; T a0878; T a0879;
+ T a0880; T a0881; T a0882; T a0883; T a0884; T a0885; T a0886; T a0887; T a0888; T a0889;
+ T a0890; T a0891; T a0892; T a0893; T a0894; T a0895; T a0896; T a0897; T a0898; T a0899;
+ T a0900; T a0901; T a0902; T a0903; T a0904; T a0905; T a0906; T a0907; T a0908; T a0909;
+ T a0910; T a0911; T a0912; T a0913; T a0914; T a0915; T a0916; T a0917; T a0918; T a0919;
+ T a0920; T a0921; T a0922; T a0923; T a0924; T a0925; T a0926; T a0927; T a0928; T a0929;
+ T a0930; T a0931; T a0932; T a0933; T a0934; T a0935; T a0936; T a0937; T a0938; T a0939;
+ T a0940; T a0941; T a0942; T a0943; T a0944; T a0945; T a0946; T a0947; T a0948; T a0949;
+ T a0950; T a0951; T a0952; T a0953; T a0954; T a0955; T a0956; T a0957; T a0958; T a0959;
+ T a0960; T a0961; T a0962; T a0963; T a0964; T a0965; T a0966; T a0967; T a0968; T a0969;
+ T a0970; T a0971; T a0972; T a0973; T a0974; T a0975; T a0976; T a0977; T a0978; T a0979;
+ T a0980; T a0981; T a0982; T a0983; T a0984; T a0985; T a0986; T a0987; T a0988; T a0989;
+ T a0990; T a0991; T a0992; T a0993; T a0994; T a0995; T a0996; T a0997; T a0998; T a0999;
+ T a1000; T a1001; T a1002; T a1003; T a1004; T a1005; T a1006; T a1007; T a1008; T a1009;
+ T a1010; T a1011; T a1012; T a1013; T a1014; T a1015; T a1016; T a1017; T a1018; T a1019;
+ T a1020; T a1021; T a1022; T a1023; T a1024; T a1025; T a1026; T a1027; T a1028; T a1029;
+ T a1030; T a1031; T a1032; T a1033; T a1034; T a1035; T a1036; T a1037; T a1038; T a1039;
+ T a1040; T a1041; T a1042; T a1043; T a1044; T a1045; T a1046; T a1047; T a1048; T a1049;
+ T a1050; T a1051; T a1052; T a1053; T a1054; T a1055; T a1056; T a1057; T a1058; T a1059;
+ T a1060; T a1061; T a1062; T a1063; T a1064; T a1065; T a1066; T a1067; T a1068; T a1069;
+ T a1070; T a1071; T a1072; T a1073; T a1074; T a1075; T a1076; T a1077; T a1078; T a1079;
+ T a1080; T a1081; T a1082; T a1083; T a1084; T a1085; T a1086; T a1087; T a1088; T a1089;
+ T a1090; T a1091; T a1092; T a1093; T a1094; T a1095; T a1096; T a1097; T a1098; T a1099;
+ T a1100; T a1101; T a1102; T a1103; T a1104; T a1105; T a1106; T a1107; T a1108; T a1109;
+ T a1110; T a1111; T a1112; T a1113; T a1114; T a1115; T a1116; T a1117; T a1118; T a1119;
+ T a1120; T a1121; T a1122; T a1123; T a1124; T a1125; T a1126; T a1127; T a1128; T a1129;
+ T a1130; T a1131; T a1132; T a1133; T a1134; T a1135; T a1136; T a1137; T a1138; T a1139;
+ T a1140; T a1141; T a1142; T a1143; T a1144; T a1145; T a1146; T a1147; T a1148; T a1149;
+ T a1150; T a1151; T a1152; T a1153; T a1154; T a1155; T a1156; T a1157; T a1158; T a1159;
+ T a1160; T a1161; T a1162; T a1163; T a1164; T a1165; T a1166; T a1167; T a1168; T a1169;
+ T a1170; T a1171; T a1172; T a1173; T a1174; T a1175; T a1176; T a1177; T a1178; T a1179;
+ T a1180; T a1181; T a1182; T a1183; T a1184; T a1185; T a1186; T a1187; T a1188; T a1189;
+ T a1190; T a1191; T a1192; T a1193; T a1194; T a1195; T a1196; T a1197; T a1198; T a1199;
+ T a1200; T a1201; T a1202; T a1203; T a1204; T a1205; T a1206; T a1207; T a1208; T a1209;
+ T a1210; T a1211; T a1212; T a1213; T a1214; T a1215; T a1216; T a1217; T a1218; T a1219;
+ T a1220; T a1221; T a1222; T a1223; T a1224; T a1225; T a1226; T a1227; T a1228; T a1229;
+ T a1230; T a1231; T a1232; T a1233; T a1234; T a1235; T a1236; T a1237; T a1238; T a1239;
+ T a1240; T a1241; T a1242; T a1243; T a1244; T a1245; T a1246; T a1247; T a1248; T a1249;
+ T a1250; T a1251; T a1252; T a1253; T a1254; T a1255; T a1256; T a1257; T a1258; T a1259;
+ T a1260; T a1261; T a1262; T a1263; T a1264; T a1265; T a1266; T a1267; T a1268; T a1269;
+ T a1270; T a1271; T a1272; T a1273; T a1274; T a1275; T a1276; T a1277; T a1278; T a1279;
+ T a1280; T a1281; T a1282; T a1283; T a1284; T a1285; T a1286; T a1287; T a1288; T a1289;
+ T a1290; T a1291; T a1292; T a1293; T a1294; T a1295; T a1296; T a1297; T a1298; T a1299;
+ T a1300; T a1301; T a1302; T a1303; T a1304; T a1305; T a1306; T a1307; T a1308; T a1309;
+ T a1310; T a1311; T a1312; T a1313; T a1314; T a1315; T a1316; T a1317; T a1318; T a1319;
+ T a1320; T a1321; T a1322; T a1323; T a1324; T a1325; T a1326; T a1327; T a1328; T a1329;
+ T a1330; T a1331; T a1332; T a1333; T a1334; T a1335; T a1336; T a1337; T a1338; T a1339;
+ T a1340; T a1341; T a1342; T a1343; T a1344; T a1345; T a1346; T a1347; T a1348; T a1349;
+ T a1350; T a1351; T a1352; T a1353; T a1354; T a1355; T a1356; T a1357; T a1358; T a1359;
+ T a1360; T a1361; T a1362; T a1363; T a1364; T a1365; T a1366; T a1367; T a1368; T a1369;
+ T a1370; T a1371; T a1372; T a1373; T a1374; T a1375; T a1376; T a1377; T a1378; T a1379;
+ T a1380; T a1381; T a1382; T a1383; T a1384; T a1385; T a1386; T a1387; T a1388; T a1389;
+ T a1390; T a1391; T a1392; T a1393; T a1394; T a1395; T a1396; T a1397; T a1398; T a1399;
+ T a1400; T a1401; T a1402; T a1403; T a1404; T a1405; T a1406; T a1407; T a1408; T a1409;
+ T a1410; T a1411; T a1412; T a1413; T a1414; T a1415; T a1416; T a1417; T a1418; T a1419;
+ T a1420; T a1421; T a1422; T a1423; T a1424; T a1425; T a1426; T a1427; T a1428; T a1429;
+ T a1430; T a1431; T a1432; T a1433; T a1434; T a1435; T a1436; T a1437; T a1438; T a1439;
+ T a1440; T a1441; T a1442; T a1443; T a1444; T a1445; T a1446; T a1447; T a1448; T a1449;
+ T a1450; T a1451; T a1452; T a1453; T a1454; T a1455; T a1456; T a1457; T a1458; T a1459;
+ T a1460; T a1461; T a1462; T a1463; T a1464; T a1465; T a1466; T a1467; T a1468; T a1469;
+ T a1470; T a1471; T a1472; T a1473; T a1474; T a1475; T a1476; T a1477; T a1478; T a1479;
+ T a1480; T a1481; T a1482; T a1483; T a1484; T a1485; T a1486; T a1487; T a1488; T a1489;
+ T a1490; T a1491; T a1492; T a1493; T a1494; T a1495; T a1496; T a1497; T a1498; T a1499;
+ T a1500; T a1501; T a1502; T a1503; T a1504; T a1505; T a1506; T a1507; T a1508; T a1509;
+ T a1510; T a1511; T a1512; T a1513; T a1514; T a1515; T a1516; T a1517; T a1518; T a1519;
+ T a1520; T a1521; T a1522; T a1523; T a1524; T a1525; T a1526; T a1527; T a1528; T a1529;
+ T a1530; T a1531; T a1532; T a1533; T a1534; T a1535; T a1536; T a1537; T a1538; T a1539;
+ T a1540; T a1541; T a1542; T a1543; T a1544; T a1545; T a1546; T a1547; T a1548; T a1549;
+ T a1550; T a1551; T a1552; T a1553; T a1554; T a1555; T a1556; T a1557; T a1558; T a1559;
+ T a1560; T a1561; T a1562; T a1563; T a1564; T a1565; T a1566; T a1567; T a1568; T a1569;
+ T a1570; T a1571; T a1572; T a1573; T a1574; T a1575; T a1576; T a1577; T a1578; T a1579;
+ T a1580; T a1581; T a1582; T a1583; T a1584; T a1585; T a1586; T a1587; T a1588; T a1589;
+ T a1590; T a1591; T a1592; T a1593; T a1594; T a1595; T a1596; T a1597; T a1598; T a1599;
+ T a1600; T a1601; T a1602; T a1603; T a1604; T a1605; T a1606; T a1607; T a1608; T a1609;
+ T a1610; T a1611; T a1612; T a1613; T a1614; T a1615; T a1616; T a1617; T a1618; T a1619;
+ T a1620; T a1621; T a1622; T a1623; T a1624; T a1625; T a1626; T a1627; T a1628; T a1629;
+ T a1630; T a1631; T a1632; T a1633; T a1634; T a1635; T a1636; T a1637; T a1638; T a1639;
+ T a1640; T a1641; T a1642; T a1643; T a1644; T a1645; T a1646; T a1647; T a1648; T a1649;
+ T a1650; T a1651; T a1652; T a1653; T a1654; T a1655; T a1656; T a1657; T a1658; T a1659;
+ T a1660; T a1661; T a1662; T a1663; T a1664; T a1665; T a1666; T a1667; T a1668; T a1669;
+ T a1670; T a1671; T a1672; T a1673; T a1674; T a1675; T a1676; T a1677; T a1678; T a1679;
+ T a1680; T a1681; T a1682; T a1683; T a1684; T a1685; T a1686; T a1687; T a1688; T a1689;
+ T a1690; T a1691; T a1692; T a1693; T a1694; T a1695; T a1696; T a1697; T a1698; T a1699;
+ T a1700; T a1701; T a1702; T a1703; T a1704; T a1705; T a1706; T a1707; T a1708; T a1709;
+ T a1710; T a1711; T a1712; T a1713; T a1714; T a1715; T a1716; T a1717; T a1718; T a1719;
+ T a1720; T a1721; T a1722; T a1723; T a1724; T a1725; T a1726; T a1727; T a1728; T a1729;
+ T a1730; T a1731; T a1732; T a1733; T a1734; T a1735; T a1736; T a1737; T a1738; T a1739;
+ T a1740; T a1741; T a1742; T a1743; T a1744; T a1745; T a1746; T a1747; T a1748; T a1749;
+ T a1750; T a1751; T a1752; T a1753; T a1754; T a1755; T a1756; T a1757; T a1758; T a1759;
+ T a1760; T a1761; T a1762; T a1763; T a1764; T a1765; T a1766; T a1767; T a1768; T a1769;
+ T a1770; T a1771; T a1772; T a1773; T a1774; T a1775; T a1776; T a1777; T a1778; T a1779;
+ T a1780; T a1781; T a1782; T a1783; T a1784; T a1785; T a1786; T a1787; T a1788; T a1789;
+ T a1790; T a1791; T a1792; T a1793; T a1794; T a1795; T a1796; T a1797; T a1798; T a1799;
+ T a1800; T a1801; T a1802; T a1803; T a1804; T a1805; T a1806; T a1807; T a1808; T a1809;
+ T a1810; T a1811; T a1812; T a1813; T a1814; T a1815; T a1816; T a1817; T a1818; T a1819;
+ T a1820; T a1821; T a1822; T a1823; T a1824; T a1825; T a1826; T a1827; T a1828; T a1829;
+ T a1830; T a1831; T a1832; T a1833; T a1834; T a1835; T a1836; T a1837; T a1838; T a1839;
+ T a1840; T a1841; T a1842; T a1843; T a1844; T a1845; T a1846; T a1847; T a1848; T a1849;
+ T a1850; T a1851; T a1852; T a1853; T a1854; T a1855; T a1856; T a1857; T a1858; T a1859;
+ T a1860; T a1861; T a1862; T a1863; T a1864; T a1865; T a1866; T a1867; T a1868; T a1869;
+ T a1870; T a1871; T a1872; T a1873; T a1874; T a1875; T a1876; T a1877; T a1878; T a1879;
+ T a1880; T a1881; T a1882; T a1883; T a1884; T a1885; T a1886; T a1887; T a1888; T a1889;
+ T a1890; T a1891; T a1892; T a1893; T a1894; T a1895; T a1896; T a1897; T a1898; T a1899;
+ T a1900; T a1901; T a1902; T a1903; T a1904; T a1905; T a1906; T a1907; T a1908; T a1909;
+ T a1910; T a1911; T a1912; T a1913; T a1914; T a1915; T a1916; T a1917; T a1918; T a1919;
+ T a1920; T a1921; T a1922; T a1923; T a1924; T a1925; T a1926; T a1927; T a1928; T a1929;
+ T a1930; T a1931; T a1932; T a1933; T a1934; T a1935; T a1936; T a1937; T a1938; T a1939;
+ T a1940; T a1941; T a1942; T a1943; T a1944; T a1945; T a1946; T a1947; T a1948; T a1949;
+ T a1950; T a1951; T a1952; T a1953; T a1954; T a1955; T a1956; T a1957; T a1958; T a1959;
+ T a1960; T a1961; T a1962; T a1963; T a1964; T a1965; T a1966; T a1967; T a1968; T a1969;
+ T a1970; T a1971; T a1972; T a1973; T a1974; T a1975; T a1976; T a1977; T a1978; T a1979;
+ T a1980; T a1981; T a1982; T a1983; T a1984; T a1985; T a1986; T a1987; T a1988; T a1989;
+ T a1990; T a1991; T a1992; T a1993; T a1994; T a1995; T a1996; T a1997; T a1998; T a1999;
+
+
+ T a2000; T a2001; T a2002; T a2003; T a2004; T a2005; T a2006; T a2007; T a2008; T a2009;
+ T a2010; T a2011; T a2012; T a2013; T a2014; T a2015; T a2016; T a2017; T a2018; T a2019;
+ T a2020; T a2021; T a2022; T a2023; T a2024; T a2025; T a2026; T a2027; T a2028; T a2029;
+ T a2030; T a2031; T a2032; T a2033; T a2034; T a2035; T a2036; T a2037; T a2038; T a2039;
+ T a2040; T a2041; T a2042; T a2043; T a2044; T a2045; T a2046; T a2047; T a2048; T a2049;
+ T a2050; T a2051; T a2052; T a2053; T a2054; T a2055; T a2056; T a2057; T a2058; T a2059;
+ T a2060; T a2061; T a2062; T a2063; T a2064; T a2065; T a2066; T a2067; T a2068; T a2069;
+ T a2070; T a2071; T a2072; T a2073; T a2074; T a2075; T a2076; T a2077; T a2078; T a2079;
+ T a2080; T a2081; T a2082; T a2083; T a2084; T a2085; T a2086; T a2087; T a2088; T a2089;
+ T a2090; T a2091; T a2092; T a2093; T a2094; T a2095; T a2096; T a2097; T a2098; T a2099;
+ T a2100; T a2101; T a2102; T a2103; T a2104; T a2105; T a2106; T a2107; T a2108; T a2109;
+ T a2110; T a2111; T a2112; T a2113; T a2114; T a2115; T a2116; T a2117; T a2118; T a2119;
+ T a2120; T a2121; T a2122; T a2123; T a2124; T a2125; T a2126; T a2127; T a2128; T a2129;
+ T a2130; T a2131; T a2132; T a2133; T a2134; T a2135; T a2136; T a2137; T a2138; T a2139;
+ T a2140; T a2141; T a2142; T a2143; T a2144; T a2145; T a2146; T a2147; T a2148; T a2149;
+ T a2150; T a2151; T a2152; T a2153; T a2154; T a2155; T a2156; T a2157; T a2158; T a2159;
+ T a2160; T a2161; T a2162; T a2163; T a2164; T a2165; T a2166; T a2167; T a2168; T a2169;
+ T a2170; T a2171; T a2172; T a2173; T a2174; T a2175; T a2176; T a2177; T a2178; T a2179;
+ T a2180; T a2181; T a2182; T a2183; T a2184; T a2185; T a2186; T a2187; T a2188; T a2189;
+ T a2190; T a2191; T a2192; T a2193; T a2194; T a2195; T a2196; T a2197; T a2198; T a2199;
+ T a2200; T a2201; T a2202; T a2203; T a2204; T a2205; T a2206; T a2207; T a2208; T a2209;
+ T a2210; T a2211; T a2212; T a2213; T a2214; T a2215; T a2216; T a2217; T a2218; T a2219;
+ T a2220; T a2221; T a2222; T a2223; T a2224; T a2225; T a2226; T a2227; T a2228; T a2229;
+ T a2230; T a2231; T a2232; T a2233; T a2234; T a2235; T a2236; T a2237; T a2238; T a2239;
+ T a2240; T a2241; T a2242; T a2243; T a2244; T a2245; T a2246; T a2247; T a2248; T a2249;
+ T a2250; T a2251; T a2252; T a2253; T a2254; T a2255; T a2256; T a2257; T a2258; T a2259;
+ T a2260; T a2261; T a2262; T a2263; T a2264; T a2265; T a2266; T a2267; T a2268; T a2269;
+ T a2270; T a2271; T a2272; T a2273; T a2274; T a2275; T a2276; T a2277; T a2278; T a2279;
+ T a2280; T a2281; T a2282; T a2283; T a2284; T a2285; T a2286; T a2287; T a2288; T a2289;
+ T a2290; T a2291; T a2292; T a2293; T a2294; T a2295; T a2296; T a2297; T a2298; T a2299;
+ T a2300; T a2301; T a2302; T a2303; T a2304; T a2305; T a2306; T a2307; T a2308; T a2309;
+ T a2310; T a2311; T a2312; T a2313; T a2314; T a2315; T a2316; T a2317; T a2318; T a2319;
+ T a2320; T a2321; T a2322; T a2323; T a2324; T a2325; T a2326; T a2327; T a2328; T a2329;
+ T a2330; T a2331; T a2332; T a2333; T a2334; T a2335; T a2336; T a2337; T a2338; T a2339;
+ T a2340; T a2341; T a2342; T a2343; T a2344; T a2345; T a2346; T a2347; T a2348; T a2349;
+ T a2350; T a2351; T a2352; T a2353; T a2354; T a2355; T a2356; T a2357; T a2358; T a2359;
+ T a2360; T a2361; T a2362; T a2363; T a2364; T a2365; T a2366; T a2367; T a2368; T a2369;
+ T a2370; T a2371; T a2372; T a2373; T a2374; T a2375; T a2376; T a2377; T a2378; T a2379;
+ T a2380; T a2381; T a2382; T a2383; T a2384; T a2385; T a2386; T a2387; T a2388; T a2389;
+ T a2390; T a2391; T a2392; T a2393; T a2394; T a2395; T a2396; T a2397; T a2398; T a2399;
+ T a2400; T a2401; T a2402; T a2403; T a2404; T a2405; T a2406; T a2407; T a2408; T a2409;
+ T a2410; T a2411; T a2412; T a2413; T a2414; T a2415; T a2416; T a2417; T a2418; T a2419;
+ T a2420; T a2421; T a2422; T a2423; T a2424; T a2425; T a2426; T a2427; T a2428; T a2429;
+ T a2430; T a2431; T a2432; T a2433; T a2434; T a2435; T a2436; T a2437; T a2438; T a2439;
+ T a2440; T a2441; T a2442; T a2443; T a2444; T a2445; T a2446; T a2447; T a2448; T a2449;
+ T a2450; T a2451; T a2452; T a2453; T a2454; T a2455; T a2456; T a2457; T a2458; T a2459;
+ T a2460; T a2461; T a2462; T a2463; T a2464; T a2465; T a2466; T a2467; T a2468; T a2469;
+ T a2470; T a2471; T a2472; T a2473; T a2474; T a2475; T a2476; T a2477; T a2478; T a2479;
+ T a2480; T a2481; T a2482; T a2483; T a2484; T a2485; T a2486; T a2487; T a2488; T a2489;
+ T a2490; T a2491; T a2492; T a2493; T a2494; T a2495; T a2496; T a2497; T a2498; T a2499;
+ T a2500; T a2501; T a2502; T a2503; T a2504; T a2505; T a2506; T a2507; T a2508; T a2509;
+ T a2510; T a2511; T a2512; T a2513; T a2514; T a2515; T a2516; T a2517; T a2518; T a2519;
+ T a2520; T a2521; T a2522; T a2523; T a2524; T a2525; T a2526; T a2527; T a2528; T a2529;
+ T a2530; T a2531; T a2532; T a2533; T a2534; T a2535; T a2536; T a2537; T a2538; T a2539;
+ T a2540; T a2541; T a2542; T a2543; T a2544; T a2545; T a2546; T a2547; T a2548; T a2549;
+ T a2550; T a2551; T a2552; T a2553; T a2554; T a2555; T a2556; T a2557; T a2558; T a2559;
+ T a2560; T a2561; T a2562; T a2563; T a2564; T a2565; T a2566; T a2567; T a2568; T a2569;
+ T a2570; T a2571; T a2572; T a2573; T a2574; T a2575; T a2576; T a2577; T a2578; T a2579;
+ T a2580; T a2581; T a2582; T a2583; T a2584; T a2585; T a2586; T a2587; T a2588; T a2589;
+ T a2590; T a2591; T a2592; T a2593; T a2594; T a2595; T a2596; T a2597; T a2598; T a2599;
+ T a2600; T a2601; T a2602; T a2603; T a2604; T a2605; T a2606; T a2607; T a2608; T a2609;
+ T a2610; T a2611; T a2612; T a2613; T a2614; T a2615; T a2616; T a2617; T a2618; T a2619;
+ T a2620; T a2621; T a2622; T a2623; T a2624; T a2625; T a2626; T a2627; T a2628; T a2629;
+ T a2630; T a2631; T a2632; T a2633; T a2634; T a2635; T a2636; T a2637; T a2638; T a2639;
+ T a2640; T a2641; T a2642; T a2643; T a2644; T a2645; T a2646; T a2647; T a2648; T a2649;
+ T a2650; T a2651; T a2652; T a2653; T a2654; T a2655; T a2656; T a2657; T a2658; T a2659;
+ T a2660; T a2661; T a2662; T a2663; T a2664; T a2665; T a2666; T a2667; T a2668; T a2669;
+ T a2670; T a2671; T a2672; T a2673; T a2674; T a2675; T a2676; T a2677; T a2678; T a2679;
+ T a2680; T a2681; T a2682; T a2683; T a2684; T a2685; T a2686; T a2687; T a2688; T a2689;
+ T a2690; T a2691; T a2692; T a2693; T a2694; T a2695; T a2696; T a2697; T a2698; T a2699;
+ T a2700; T a2701; T a2702; T a2703; T a2704; T a2705; T a2706; T a2707; T a2708; T a2709;
+ T a2710; T a2711; T a2712; T a2713; T a2714; T a2715; T a2716; T a2717; T a2718; T a2719;
+ T a2720; T a2721; T a2722; T a2723; T a2724; T a2725; T a2726; T a2727; T a2728; T a2729;
+ T a2730; T a2731; T a2732; T a2733; T a2734; T a2735; T a2736; T a2737; T a2738; T a2739;
+ T a2740; T a2741; T a2742; T a2743; T a2744; T a2745; T a2746; T a2747; T a2748; T a2749;
+ T a2750; T a2751; T a2752; T a2753; T a2754; T a2755; T a2756; T a2757; T a2758; T a2759;
+ T a2760; T a2761; T a2762; T a2763; T a2764; T a2765; T a2766; T a2767; T a2768; T a2769;
+ T a2770; T a2771; T a2772; T a2773; T a2774; T a2775; T a2776; T a2777; T a2778; T a2779;
+ T a2780; T a2781; T a2782; T a2783; T a2784; T a2785; T a2786; T a2787; T a2788; T a2789;
+ T a2790; T a2791; T a2792; T a2793; T a2794; T a2795; T a2796; T a2797; T a2798; T a2799;
+ T a2800; T a2801; T a2802; T a2803; T a2804; T a2805; T a2806; T a2807; T a2808; T a2809;
+ T a2810; T a2811; T a2812; T a2813; T a2814; T a2815; T a2816; T a2817; T a2818; T a2819;
+ T a2820; T a2821; T a2822; T a2823; T a2824; T a2825; T a2826; T a2827; T a2828; T a2829;
+ T a2830; T a2831; T a2832; T a2833; T a2834; T a2835; T a2836; T a2837; T a2838; T a2839;
+ T a2840; T a2841; T a2842; T a2843; T a2844; T a2845; T a2846; T a2847; T a2848; T a2849;
+ T a2850; T a2851; T a2852; T a2853; T a2854; T a2855; T a2856; T a2857; T a2858; T a2859;
+ T a2860; T a2861; T a2862; T a2863; T a2864; T a2865; T a2866; T a2867; T a2868; T a2869;
+ T a2870; T a2871; T a2872; T a2873; T a2874; T a2875; T a2876; T a2877; T a2878; T a2879;
+ T a2880; T a2881; T a2882; T a2883; T a2884; T a2885; T a2886; T a2887; T a2888; T a2889;
+ T a2890; T a2891; T a2892; T a2893; T a2894; T a2895; T a2896; T a2897; T a2898; T a2899;
+ T a2900; T a2901; T a2902; T a2903; T a2904; T a2905; T a2906; T a2907; T a2908; T a2909;
+ T a2910; T a2911; T a2912; T a2913; T a2914; T a2915; T a2916; T a2917; T a2918; T a2919;
+ T a2920; T a2921; T a2922; T a2923; T a2924; T a2925; T a2926; T a2927; T a2928; T a2929;
+ T a2930; T a2931; T a2932; T a2933; T a2934; T a2935; T a2936; T a2937; T a2938; T a2939;
+ T a2940; T a2941; T a2942; T a2943; T a2944; T a2945; T a2946; T a2947; T a2948; T a2949;
+ T a2950; T a2951; T a2952; T a2953; T a2954; T a2955; T a2956; T a2957; T a2958; T a2959;
+ T a2960; T a2961; T a2962; T a2963; T a2964; T a2965; T a2966; T a2967; T a2968; T a2969;
+ T a2970; T a2971; T a2972; T a2973; T a2974; T a2975; T a2976; T a2977; T a2978; T a2979;
+ T a2980; T a2981; T a2982; T a2983; T a2984; T a2985; T a2986; T a2987; T a2988; T a2989;
+ T a2990; T a2991; T a2992; T a2993; T a2994; T a2995; T a2996; T a2997; T a2998; T a2999;
+
+
+ T a3000; T a3001; T a3002; T a3003; T a3004; T a3005; T a3006; T a3007; T a3008; T a3009;
+ T a3010; T a3011; T a3012; T a3013; T a3014; T a3015; T a3016; T a3017; T a3018; T a3019;
+ T a3020; T a3021; T a3022; T a3023; T a3024; T a3025; T a3026; T a3027; T a3028; T a3029;
+ T a3030; T a3031; T a3032; T a3033; T a3034; T a3035; T a3036; T a3037; T a3038; T a3039;
+ T a3040; T a3041; T a3042; T a3043; T a3044; T a3045; T a3046; T a3047; T a3048; T a3049;
+ T a3050; T a3051; T a3052; T a3053; T a3054; T a3055; T a3056; T a3057; T a3058; T a3059;
+ T a3060; T a3061; T a3062; T a3063; T a3064; T a3065; T a3066; T a3067; T a3068; T a3069;
+ T a3070; T a3071; T a3072; T a3073; T a3074; T a3075; T a3076; T a3077; T a3078; T a3079;
+ T a3080; T a3081; T a3082; T a3083; T a3084; T a3085; T a3086; T a3087; T a3088; T a3089;
+ T a3090; T a3091; T a3092; T a3093; T a3094; T a3095; T a3096; T a3097; T a3098; T a3099;
+ T a3100; T a3101; T a3102; T a3103; T a3104; T a3105; T a3106; T a3107; T a3108; T a3109;
+ T a3110; T a3111; T a3112; T a3113; T a3114; T a3115; T a3116; T a3117; T a3118; T a3119;
+ T a3120; T a3121; T a3122; T a3123; T a3124; T a3125; T a3126; T a3127; T a3128; T a3129;
+ T a3130; T a3131; T a3132; T a3133; T a3134; T a3135; T a3136; T a3137; T a3138; T a3139;
+ T a3140; T a3141; T a3142; T a3143; T a3144; T a3145; T a3146; T a3147; T a3148; T a3149;
+ T a3150; T a3151; T a3152; T a3153; T a3154; T a3155; T a3156; T a3157; T a3158; T a3159;
+ T a3160; T a3161; T a3162; T a3163; T a3164; T a3165; T a3166; T a3167; T a3168; T a3169;
+ T a3170; T a3171; T a3172; T a3173; T a3174; T a3175; T a3176; T a3177; T a3178; T a3179;
+ T a3180; T a3181; T a3182; T a3183; T a3184; T a3185; T a3186; T a3187; T a3188; T a3189;
+ T a3190; T a3191; T a3192; T a3193; T a3194; T a3195; T a3196; T a3197; T a3198; T a3199;
+ T a3200; T a3201; T a3202; T a3203; T a3204; T a3205; T a3206; T a3207; T a3208; T a3209;
+ T a3210; T a3211; T a3212; T a3213; T a3214; T a3215; T a3216; T a3217; T a3218; T a3219;
+ T a3220; T a3221; T a3222; T a3223; T a3224; T a3225; T a3226; T a3227; T a3228; T a3229;
+ T a3230; T a3231; T a3232; T a3233; T a3234; T a3235; T a3236; T a3237; T a3238; T a3239;
+ T a3240; T a3241; T a3242; T a3243; T a3244; T a3245; T a3246; T a3247; T a3248; T a3249;
+ T a3250; T a3251; T a3252; T a3253; T a3254; T a3255; T a3256; T a3257; T a3258; T a3259;
+ T a3260; T a3261; T a3262; T a3263; T a3264; T a3265; T a3266; T a3267; T a3268; T a3269;
+ T a3270; T a3271; T a3272; T a3273; T a3274; T a3275; T a3276; T a3277; T a3278; T a3279;
+ T a3280; T a3281; T a3282; T a3283; T a3284; T a3285; T a3286; T a3287; T a3288; T a3289;
+ T a3290; T a3291; T a3292; T a3293; T a3294; T a3295; T a3296; T a3297; T a3298; T a3299;
+ T a3300; T a3301; T a3302; T a3303; T a3304; T a3305; T a3306; T a3307; T a3308; T a3309;
+ T a3310; T a3311; T a3312; T a3313; T a3314; T a3315; T a3316; T a3317; T a3318; T a3319;
+ T a3320; T a3321; T a3322; T a3323; T a3324; T a3325; T a3326; T a3327; T a3328; T a3329;
+ T a3330; T a3331; T a3332; T a3333; T a3334; T a3335; T a3336; T a3337; T a3338; T a3339;
+ T a3340; T a3341; T a3342; T a3343; T a3344; T a3345; T a3346; T a3347; T a3348; T a3349;
+ T a3350; T a3351; T a3352; T a3353; T a3354; T a3355; T a3356; T a3357; T a3358; T a3359;
+ T a3360; T a3361; T a3362; T a3363; T a3364; T a3365; T a3366; T a3367; T a3368; T a3369;
+ T a3370; T a3371; T a3372; T a3373; T a3374; T a3375; T a3376; T a3377; T a3378; T a3379;
+ T a3380; T a3381; T a3382; T a3383; T a3384; T a3385; T a3386; T a3387; T a3388; T a3389;
+ T a3390; T a3391; T a3392; T a3393; T a3394; T a3395; T a3396; T a3397; T a3398; T a3399;
+ T a3400; T a3401; T a3402; T a3403; T a3404; T a3405; T a3406; T a3407; T a3408; T a3409;
+ T a3410; T a3411; T a3412; T a3413; T a3414; T a3415; T a3416; T a3417; T a3418; T a3419;
+ T a3420; T a3421; T a3422; T a3423; T a3424; T a3425; T a3426; T a3427; T a3428; T a3429;
+ T a3430; T a3431; T a3432; T a3433; T a3434; T a3435; T a3436; T a3437; T a3438; T a3439;
+ T a3440; T a3441; T a3442; T a3443; T a3444; T a3445; T a3446; T a3447; T a3448; T a3449;
+ T a3450; T a3451; T a3452; T a3453; T a3454; T a3455; T a3456; T a3457; T a3458; T a3459;
+ T a3460; T a3461; T a3462; T a3463; T a3464; T a3465; T a3466; T a3467; T a3468; T a3469;
+ T a3470; T a3471; T a3472; T a3473; T a3474; T a3475; T a3476; T a3477; T a3478; T a3479;
+ T a3480; T a3481; T a3482; T a3483; T a3484; T a3485; T a3486; T a3487; T a3488; T a3489;
+ T a3490; T a3491; T a3492; T a3493; T a3494; T a3495; T a3496; T a3497; T a3498; T a3499;
+ T a3500; T a3501; T a3502; T a3503; T a3504; T a3505; T a3506; T a3507; T a3508; T a3509;
+ T a3510; T a3511; T a3512; T a3513; T a3514; T a3515; T a3516; T a3517; T a3518; T a3519;
+ T a3520; T a3521; T a3522; T a3523; T a3524; T a3525; T a3526; T a3527; T a3528; T a3529;
+ T a3530; T a3531; T a3532; T a3533; T a3534; T a3535; T a3536; T a3537; T a3538; T a3539;
+ T a3540; T a3541; T a3542; T a3543; T a3544; T a3545; T a3546; T a3547; T a3548; T a3549;
+ T a3550; T a3551; T a3552; T a3553; T a3554; T a3555; T a3556; T a3557; T a3558; T a3559;
+ T a3560; T a3561; T a3562; T a3563; T a3564; T a3565; T a3566; T a3567; T a3568; T a3569;
+ T a3570; T a3571; T a3572; T a3573; T a3574; T a3575; T a3576; T a3577; T a3578; T a3579;
+ T a3580; T a3581; T a3582; T a3583; T a3584; T a3585; T a3586; T a3587; T a3588; T a3589;
+ T a3590; T a3591; T a3592; T a3593; T a3594; T a3595; T a3596; T a3597; T a3598; T a3599;
+ T a3600; T a3601; T a3602; T a3603; T a3604; T a3605; T a3606; T a3607; T a3608; T a3609;
+ T a3610; T a3611; T a3612; T a3613; T a3614; T a3615; T a3616; T a3617; T a3618; T a3619;
+ T a3620; T a3621; T a3622; T a3623; T a3624; T a3625; T a3626; T a3627; T a3628; T a3629;
+ T a3630; T a3631; T a3632; T a3633; T a3634; T a3635; T a3636; T a3637; T a3638; T a3639;
+ T a3640; T a3641; T a3642; T a3643; T a3644; T a3645; T a3646; T a3647; T a3648; T a3649;
+ T a3650; T a3651; T a3652; T a3653; T a3654; T a3655; T a3656; T a3657; T a3658; T a3659;
+ T a3660; T a3661; T a3662; T a3663; T a3664; T a3665; T a3666; T a3667; T a3668; T a3669;
+ T a3670; T a3671; T a3672; T a3673; T a3674; T a3675; T a3676; T a3677; T a3678; T a3679;
+ T a3680; T a3681; T a3682; T a3683; T a3684; T a3685; T a3686; T a3687; T a3688; T a3689;
+ T a3690; T a3691; T a3692; T a3693; T a3694; T a3695; T a3696; T a3697; T a3698; T a3699;
+ T a3700; T a3701; T a3702; T a3703; T a3704; T a3705; T a3706; T a3707; T a3708; T a3709;
+ T a3710; T a3711; T a3712; T a3713; T a3714; T a3715; T a3716; T a3717; T a3718; T a3719;
+ T a3720; T a3721; T a3722; T a3723; T a3724; T a3725; T a3726; T a3727; T a3728; T a3729;
+ T a3730; T a3731; T a3732; T a3733; T a3734; T a3735; T a3736; T a3737; T a3738; T a3739;
+ T a3740; T a3741; T a3742; T a3743; T a3744; T a3745; T a3746; T a3747; T a3748; T a3749;
+ T a3750; T a3751; T a3752; T a3753; T a3754; T a3755; T a3756; T a3757; T a3758; T a3759;
+ T a3760; T a3761; T a3762; T a3763; T a3764; T a3765; T a3766; T a3767; T a3768; T a3769;
+ T a3770; T a3771; T a3772; T a3773; T a3774; T a3775; T a3776; T a3777; T a3778; T a3779;
+ T a3780; T a3781; T a3782; T a3783; T a3784; T a3785; T a3786; T a3787; T a3788; T a3789;
+ T a3790; T a3791; T a3792; T a3793; T a3794; T a3795; T a3796; T a3797; T a3798; T a3799;
+ T a3800; T a3801; T a3802; T a3803; T a3804; T a3805; T a3806; T a3807; T a3808; T a3809;
+ T a3810; T a3811; T a3812; T a3813; T a3814; T a3815; T a3816; T a3817; T a3818; T a3819;
+ T a3820; T a3821; T a3822; T a3823; T a3824; T a3825; T a3826; T a3827; T a3828; T a3829;
+ T a3830; T a3831; T a3832; T a3833; T a3834; T a3835; T a3836; T a3837; T a3838; T a3839;
+ T a3840; T a3841; T a3842; T a3843; T a3844; T a3845; T a3846; T a3847; T a3848; T a3849;
+ T a3850; T a3851; T a3852; T a3853; T a3854; T a3855; T a3856; T a3857; T a3858; T a3859;
+ T a3860; T a3861; T a3862; T a3863; T a3864; T a3865; T a3866; T a3867; T a3868; T a3869;
+ T a3870; T a3871; T a3872; T a3873; T a3874; T a3875; T a3876; T a3877; T a3878; T a3879;
+ T a3880; T a3881; T a3882; T a3883; T a3884; T a3885; T a3886; T a3887; T a3888; T a3889;
+ T a3890; T a3891; T a3892; T a3893; T a3894; T a3895; T a3896; T a3897; T a3898; T a3899;
+ T a3900; T a3901; T a3902; T a3903; T a3904; T a3905; T a3906; T a3907; T a3908; T a3909;
+ T a3910; T a3911; T a3912; T a3913; T a3914; T a3915; T a3916; T a3917; T a3918; T a3919;
+ T a3920; T a3921; T a3922; T a3923; T a3924; T a3925; T a3926; T a3927; T a3928; T a3929;
+ T a3930; T a3931; T a3932; T a3933; T a3934; T a3935; T a3936; T a3937; T a3938; T a3939;
+ T a3940; T a3941; T a3942; T a3943; T a3944; T a3945; T a3946; T a3947; T a3948; T a3949;
+ T a3950; T a3951; T a3952; T a3953; T a3954; T a3955; T a3956; T a3957; T a3958; T a3959;
+ T a3960; T a3961; T a3962; T a3963; T a3964; T a3965; T a3966; T a3967; T a3968; T a3969;
+ T a3970; T a3971; T a3972; T a3973; T a3974; T a3975; T a3976; T a3977; T a3978; T a3979;
+ T a3980; T a3981; T a3982; T a3983; T a3984; T a3985; T a3986; T a3987; T a3988; T a3989;
+ T a3990; T a3991; T a3992; T a3993; T a3994; T a3995; T a3996; T a3997; T a3998; T a3999;
+};
+
+A::A() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup2.C
new file mode 100644
index 000000000..9c9c5ad2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup2.C
@@ -0,0 +1,46 @@
+// PR c++/12491
+// { dg-do compile }
+// { dg-options "-O2" }
+
+// The return statements are necessary to trigger this bug.
+
+class Object
+{
+public:
+ virtual ~Object (void) { return; }
+};
+
+class AutoPtr
+{
+public:
+ ~AutoPtr (void) { delete m_rep; return; }
+private:
+ const Object *m_rep;
+};
+
+class Handle
+{
+public:
+ ~Handle (void) { return; }
+private:
+ AutoPtr m_rep;
+};
+
+class HandleOf:public Handle
+{
+public:
+ ~HandleOf (void) { return; }
+};
+
+class Error
+{
+public:
+ ~Error (void);
+private:
+ HandleOf m_hndl;
+};
+
+Error::~Error (void)
+{
+ return;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup3.C
new file mode 100644
index 000000000..79935dede
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup3.C
@@ -0,0 +1,20 @@
+// C++/4794
+// This test used to hang in has_cleanups
+// Contributed by: <fritz@intrinsity.com>
+/* { dg-do compile } */
+
+void foo (int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,
+ int l,int m,int n,int o,int p,int q,int r,int s,int t,int u,int v,int w,
+ int x,int y,int z,int aa,int ab,int ac)
+{
+if (!((((ac != 0) + (d != 0) + (c != 0) + (f != 0) + (x != 0) + (y != 0) +
+ (z != 0) + (aa != 0) + (ab != 0) + (g != 0) + (b != 0) + (a != 0) +
+ (h != 0) + (e != 0) + (p != 0) + (q != 0) + (n != 0) + (r != 0) +
+ (o != 0) + (v != 0) + (w != 0) + (t != 0) + (u != 0) + (s != 0) +
+ (k != 0) + (l != 0) + (m != 0) + (i != 0) + (j != 0)) <= 1)))
+ {
+ return;
+ }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup4.C
new file mode 100644
index 000000000..ba2d891c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup4.C
@@ -0,0 +1,17 @@
+// PR 16254
+// { dg-do compile }
+// We lost a CLEANUP_POINT_EXPR, leading to a crash destroying temp of A.
+
+struct A
+{
+ ~A ();
+ A (int);
+};
+
+int bar (const A &);
+
+void
+foo (int i)
+{
+ int format[1] = { bar (A (i)) };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup5.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup5.C
new file mode 100644
index 000000000..e74d06793
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cleanup5.C
@@ -0,0 +1,17 @@
+// PR 17907
+// { dg-do compile }
+// { dg-options "" }
+// We lost a CLEANUP_POINT_EXPR, leading to a crash destroying temp of A.
+
+
+struct String {
+ ~String();
+ int size() const;
+};
+struct CodingSystem {
+ String convertOut() const;
+};
+void inputOpened(CodingSystem *outputCodingSystem)
+{
+ char filePath[outputCodingSystem->convertOut().size()];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/comdat1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/comdat1.C
new file mode 100644
index 000000000..4a1180511
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/comdat1.C
@@ -0,0 +1,42 @@
+// PR target/29487
+// { dg-do link }
+// { dg-options "-O2" }
+
+/* This function is not defined. The compiler should optimize away
+ all calls to it. */
+extern void undefined () throw ();
+
+extern void f1();
+
+inline void f2() {
+ f1();
+}
+
+/* This function will be COMDAT if not inlined. */
+inline void f1() {}
+
+/* This function will be COMDAT. */
+template <typename T>
+void f3() {
+ if (false)
+ throw 3;
+}
+
+inline void f4() {
+ if (false)
+ throw 7;
+}
+
+int main () {
+ try {
+ f1();
+ f2();
+ f3<int>();
+ f4();
+ } catch (...) {
+ /* The compiler should recognize that none of the functions above
+ can throw exceptions, and therefore remove this code as
+ unreachable. */
+ undefined ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond1.C
new file mode 100644
index 000000000..4f494267e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond1.C
@@ -0,0 +1,64 @@
+// PR c++/7050
+// { dg-do run }
+
+extern "C" void abort(void);
+
+#define CI(stmt) try { stmt; abort(); } catch (int) { }
+
+struct has_destructor
+{
+ ~has_destructor() { }
+};
+
+struct no_destructor
+{
+};
+
+int PI(int& i) { return i++; }
+
+int main(int argc, char *argv[])
+{
+ (argc+1 ? has_destructor() : throw 0);
+ CI((argc+1 ? throw 0 : has_destructor()));
+ CI((0 ? has_destructor() : throw 0));
+ CI((1 ? throw 0 : has_destructor()));
+ (0 ? throw 0 : has_destructor());
+ (1 ? has_destructor() : throw 0);
+
+ (argc+1 ? no_destructor() : throw 0);
+ CI((argc+1 ? throw 0 : no_destructor()));
+ CI((0 ? no_destructor() : throw 0));
+ CI((1 ? throw 0 : no_destructor()));
+ (0 ? throw 0 : no_destructor());
+ (1 ? no_destructor() : throw 0);
+
+ int i = 1;
+ CI(throw PI(i));
+ if (i != 2) abort();
+
+ (1 ? 0 : throw PI(i));
+ if (i != 2) abort();
+
+ CI(0 ? 0 : throw PI(i));
+ if (i != 3) abort();
+
+ CI(0 ? has_destructor() : throw PI(i));
+ if (i != 4) abort();
+ (argc+1 ? has_destructor() : throw PI(i));
+ if (i != 4) abort();
+
+ i = 1;
+ CI(throw i++);
+ if (i != 2) abort();
+
+ (1 ? 0 : throw i++);
+ if (i != 2) abort();
+
+ CI(0 ? 0 : throw i++);
+ if (i != 3) abort();
+
+ CI(0 ? has_destructor() : throw i++);
+ if (i != 4) abort();
+ (argc+1 ? has_destructor() : throw i++);
+ if (i != 4) abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond2.C
new file mode 100644
index 000000000..e4b45f7a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond2.C
@@ -0,0 +1,19 @@
+// PR c++/14083
+
+struct A {
+ A() throw() { }
+ A(const A&) throw() { }
+};
+
+struct X {
+ A a;
+ X();
+ X& operator=(const X& __str);
+};
+
+bool operator==(const X& __lhs, const char* __rhs);
+
+int main() {
+ X x;
+ x=="" ? x : throw 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond3.C
new file mode 100644
index 000000000..0af4ecdad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond3.C
@@ -0,0 +1,10 @@
+// PR c++/24996
+// Bug: the cleanup for the A temporary was confusing the gimplifier
+// because of the TRY_CATCH_EXPR for the exception object.
+
+struct A { A(int); ~A(); };
+struct B { B(A); ~B(); };
+void foo(bool b)
+{
+ throw b ? B(1) : B(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond4.C
new file mode 100644
index 000000000..a8d1cfbf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond4.C
@@ -0,0 +1,32 @@
+// Runtime version of cond3.C. We call terminate when the A cleanup throws
+// because we've already initialized the exception object.
+// { dg-do run }
+
+#include <exception>
+#include <cstdlib>
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+struct A {
+ A(int) { }
+ ~A() { throw 1; };
+};
+struct B {
+ B(A) { }
+ ~B() { }
+};
+bool b;
+
+int main()
+{
+ std::set_terminate (my_terminate);
+ try
+ {
+ throw b ? B(1) : B(1);
+ }
+ catch (...) { }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond5.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond5.C
new file mode 100644
index 000000000..3f0c59964
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond5.C
@@ -0,0 +1,43 @@
+// PR c++/49165
+// { dg-do run }
+
+extern "C" void abort ();
+
+int
+foo (bool x, int y)
+{
+ if (y < 10 && (x ? true : throw 1))
+ y++;
+ if (y > 20 || (x ? true : throw 2))
+ y++;
+ return y;
+}
+
+int
+main ()
+{
+ if (foo (true, 0) != 2
+ || foo (true, 10) != 11
+ || foo (false, 30) != 31)
+ abort ();
+ try
+ {
+ foo (false, 0);
+ abort ();
+ }
+ catch (int i)
+ {
+ if (i != 1)
+ abort ();
+ }
+ try
+ {
+ foo (false, 10);
+ abort ();
+ }
+ catch (int i)
+ {
+ if (i != 2)
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/cond6.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond6.C
new file mode 100644
index 000000000..1eed63ec8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/cond6.C
@@ -0,0 +1,43 @@
+// PR c++/49165
+// { dg-do run }
+
+extern "C" void abort ();
+
+int
+foo (bool x, int y)
+{
+ if (y < 10 && (x ? 1 : throw 1))
+ y++;
+ if (y > 20 || (x ? 1 : throw 2))
+ y++;
+ return y;
+}
+
+int
+main ()
+{
+ if (foo (true, 0) != 2
+ || foo (true, 10) != 11
+ || foo (false, 30) != 31)
+ abort ();
+ try
+ {
+ foo (false, 0);
+ abort ();
+ }
+ catch (int i)
+ {
+ if (i != 1)
+ abort ();
+ }
+ try
+ {
+ foo (false, 10);
+ abort ();
+ }
+ catch (int i)
+ {
+ if (i != 2)
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/crash1.C
new file mode 100644
index 000000000..4cbcbd3ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/crash1.C
@@ -0,0 +1,5 @@
+extern "C" void __cxa_throw (void *, void *, void (*) (void *) );
+
+void foo(){
+ throw 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/crossjump1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/crossjump1.C
new file mode 100644
index 000000000..ccb0ffb21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/crossjump1.C
@@ -0,0 +1,31 @@
+// This testcase failed on s390, because cross-jumping merged 2 calls,
+// one with REG_EH_REGION note with no handlers (ie. termination)
+// and one without REG_EH_REGION note.
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <exception>
+#include <string>
+
+struct E : public std::exception
+{
+ std::string m;
+ E () : m ("test") { }
+ ~E () throw() { }
+};
+
+struct C : public E { };
+
+void foo ()
+{
+ throw C ();
+}
+
+int main ()
+{
+ try
+ {
+ foo ();
+ }
+ catch (...) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor1.C
new file mode 100644
index 000000000..b959d1c56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor1.C
@@ -0,0 +1,48 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 411
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#define NOEXCEPT_FALSE noexcept (false)
+#else
+#define NOEXCEPT_FALSE
+#endif
+
+bool was_f_in_Bar_destroyed=false;
+
+struct Foo
+{
+ ~Foo()
+ {
+ was_f_in_Bar_destroyed=true;
+ }
+};
+
+struct Bar
+{
+ ~Bar() NOEXCEPT_FALSE
+ {
+ throw 1;
+ }
+
+ Foo f;
+};
+
+int main()
+{
+ try
+ {
+ Bar f;
+ }
+ catch(int i)
+ {
+ if(was_f_in_Bar_destroyed)
+ {
+ return 0;
+ }
+ }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor2.C
new file mode 100644
index 000000000..e2ebad7ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor2.C
@@ -0,0 +1,42 @@
+// PR c++/4460
+// Test that the cleanup for fully-constructed subobjects when a
+// constructor throws gets the right address for a virtual base.
+
+// { dg-do run }
+
+int r;
+void *p;
+
+struct VBase
+{
+ virtual void f () {}
+ VBase() { p = this; }
+ ~VBase() { if (p != this) r = 1; }
+};
+
+struct StreamBase
+{
+ virtual ~StreamBase() {}
+};
+
+struct Stream : public virtual VBase, public StreamBase
+{
+ Stream() {}
+ virtual ~Stream() {}
+};
+
+struct DerivedStream : public Stream
+{
+ DerivedStream() { throw 1; }
+};
+
+int main() {
+
+ try
+ {
+ DerivedStream str;
+ }
+ catch (...) { }
+
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor3.C
new file mode 100644
index 000000000..378c07edf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ctor3.C
@@ -0,0 +1,18 @@
+// PR C++/18984
+// We just to ICE as we did not add a
+// deference to invisible by reference
+// variable
+
+// { dg-do compile }
+
+
+struct Str
+{
+ Str(const char *chars);
+ Str& operator=(const char *chars);
+ virtual operator char*() const;
+};
+Str _localName(Str fullname)
+{
+ return (char*)fullname;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/dead1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/dead1.C
new file mode 100644
index 000000000..88ae92264
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/dead1.C
@@ -0,0 +1,20 @@
+// PR 6320
+// Rechained the MUST_NOT_THROW region in the wrong order wrt the
+// TRY/CATCH while removing them and got confused.
+// { dg-do compile }
+
+struct S {
+ ~S();
+};
+
+void foo()
+{
+ try {
+ return;
+ }
+ catch (int) {
+ }
+ catch (...) {
+ S s;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/defarg1.C
new file mode 100644
index 000000000..5c6e4df49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/defarg1.C
@@ -0,0 +1,10 @@
+// PR c++/50424
+// { dg-do run }
+
+int f() { throw 1; }
+void g( int = f() ) { }
+void h() { g(); }
+int main()
+{
+ try { h(); } catch (int) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/delayslot1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/delayslot1.C
new file mode 100644
index 000000000..ddc960e6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/delayslot1.C
@@ -0,0 +1,47 @@
+// PR target/12301
+// Origin: Colin Hirsch <gcc@cohi.at>
+// Testcase by Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+
+// This used to fail on SPARC because the reorg pass moved an insn
+// across a function call that can throw internally, in order to put
+// it in a delay slot.
+
+// { dg-do run }
+// { dg-options "-O" }
+
+struct S{
+ char *c;
+ char data[100];
+ S () : c (data) {};
+ S (const S& s) {
+ c = data;
+ data[0] = s.c[0];
+ }
+};
+
+S real_cast ()
+{
+ throw 3;
+}
+
+S cast_helper(S& debug)
+{
+ try {
+ return real_cast();
+ }
+ catch (int e) {
+ throw debug;
+ }
+}
+
+int main()
+{
+ S tmp;
+
+ try {
+ cast_helper (tmp);
+ }
+ catch (S& e) {}
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/div.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/div.C
new file mode 100644
index 000000000..14d7536ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/div.C
@@ -0,0 +1,13 @@
+// { dg-do link }
+// { dg-options "-Os" }
+/* PR target/28014: main references unsigned divide, and the unwinder
+ references signed divide.
+ If libgcc contains an object which defines both, and linking is done with
+ a space-optimized library that defines these functions in separate objects,
+ you end up with the function for unsigned divide defined twice. */
+int
+main (int c, char **argv)
+
+{
+ return 0xffffU/c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor1.C
new file mode 100644
index 000000000..4fafdde24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor1.C
@@ -0,0 +1,35 @@
+// PR c++/411
+
+// Test that a fully-constructed base is destroyed before transferring
+// control to the handler of a function-try-block.
+
+// { dg-do run }
+
+int ad;
+int r;
+
+struct A {
+ ~A() { ++ad; }
+};
+
+struct B: public A {
+ ~B();
+};
+
+B::~B ()
+try
+ {
+ throw 1;
+ }
+catch (...)
+ {
+ if (!ad)
+ r = 1;
+ return;
+ }
+
+int main ()
+{
+ { B b; }
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor2.C
new file mode 100644
index 000000000..9555b3789
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor2.C
@@ -0,0 +1,30 @@
+// PR c++/12751
+// tree-ssa eh lowering bug ran a destructor twice for one object
+// { dg-do run }
+
+static int check;
+
+struct Y {
+ Y();
+ ~Y();
+};
+
+void foo() {
+ Y y1;
+ Y y2;
+ switch(0) {
+ case 1: {
+ Y y3;
+ return;
+ }
+ }
+}
+
+Y::Y() { ++check; }
+Y::~Y() { --check; }
+
+int main()
+{
+ foo ();
+ return check;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor3.C
new file mode 100644
index 000000000..3ce42d9f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/dtor3.C
@@ -0,0 +1,36 @@
+// Red Hat bug 750545
+// { dg-do run { target { ! c++11 } } }
+
+class excep {};
+class A
+{
+public:
+ ~A() { throw excep(); }
+};
+
+class B
+{
+ A a;
+};
+
+class C
+{
+ B b;
+};
+
+void f()
+{
+ C* c = new C();
+
+ try
+ {
+ delete c;
+ }
+ catch(...)
+ {}
+}
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ehopt1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ehopt1.C
new file mode 100644
index 000000000..163d76e81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ehopt1.C
@@ -0,0 +1,44 @@
+// ehopt was only copying one statement from the cleanup of the B temporary
+// into the following try block, so we lost its destructor call.
+
+// { dg-do run }
+
+template <class T, class U>
+class A;
+
+bool b;
+int count;
+
+template <>
+class A<int, int>
+{
+public:
+ A(int) { ++count; if (b) throw 1; }
+ A(const A&) { ++count; if (b) throw 1; }
+ ~A() { --count; if (b) throw 1; }
+};
+
+typedef A<int, int> B;
+
+template <>
+class A<void *, void *>
+{
+public:
+ A() { if (b) throw 1; }
+ A(const B&) { if (b) throw 1; }
+ ~A() { if (b) throw 1; }
+};
+
+typedef A<void *, void *> C;
+
+void f() { if (b) throw 1; }
+
+int
+main (void)
+{
+ {
+ C a(1);
+ f();
+ }
+ return count;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/elide1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/elide1.C
new file mode 100644
index 000000000..94d2a6982
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/elide1.C
@@ -0,0 +1,30 @@
+// PR c++/13944
+
+// Bug: When eliding the copy from the A temporary into the exception
+// object, we extended the throw prohibition to the constructor for the
+// temporary. This is wrong; the throw from A() should propagate normally
+// regardless of the elision of the temporary.
+
+// { dg-do run }
+
+struct A
+{
+ A() { throw 0; }
+};
+
+int main()
+{
+ try
+ {
+ throw A();
+ }
+ catch(int i)
+ {
+ return i;
+ }
+ catch (...)
+ {
+ return 2;
+ }
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/elide2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/elide2.C
new file mode 100644
index 000000000..7d65d9ee6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/elide2.C
@@ -0,0 +1,31 @@
+// PR c++/13944
+
+// Verify that we don't call terminate() if initializing the exception
+// object throws.
+
+// { dg-do run }
+
+struct A
+{
+ A() { }
+ A(const A&) { throw 1; }
+};
+
+A a;
+
+int main()
+{
+ try
+ {
+ throw a;
+ }
+ catch (int)
+ {
+ return 0;
+ }
+ catch (A&)
+ {
+ return 2;
+ }
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/filter1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/filter1.C
new file mode 100644
index 000000000..6ff0574c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/filter1.C
@@ -0,0 +1,43 @@
+// Test that cleanups get run when a catch filter fails to match.
+// { dg-do run }
+
+extern "C" void exit(int);
+extern "C" void abort();
+
+struct a
+{
+ a();
+ ~a();
+};
+
+struct e1 {};
+struct e2 {};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
+
+int
+main ()
+{
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
+
+a::a() { }
+a::~a() { exit (0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/filter2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/filter2.C
new file mode 100644
index 000000000..fe87cc9a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/filter2.C
@@ -0,0 +1,59 @@
+// Test that terminate gets run when a catch filter fails to match while
+// running destructors. Original bug depended on a::~a being inlined.
+// { dg-do run }
+// { dg-options -O }
+
+#include <exception>
+#include <cstdlib>
+
+struct e1 {};
+struct e2 {};
+
+struct a
+{
+ a () { }
+
+ ~a ()
+ {
+ try
+ {
+ throw e1();
+ }
+ catch (e2 &)
+ {
+ }
+ }
+};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+int
+main ()
+{
+ std::set_terminate (my_terminate);
+
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/forced1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced1.C
new file mode 100644
index 000000000..b0200813e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced1.C
@@ -0,0 +1,82 @@
+// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK.
+// { dg-do run { xfail "ia64-hp-hpux11.*" } }
+
+// Test that forced unwinding runs all cleanups. Also tests that
+// rethrowing doesn't call the exception object destructor.
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int test = 0;
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ {
+ if (test != 15)
+ abort ();
+ exit (0);
+ }
+
+ return _URC_NO_REASON;
+}
+
+static void
+force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *)
+{
+ abort ();
+}
+
+static void force_unwind ()
+{
+ _Unwind_Exception *exc = new _Unwind_Exception;
+ // exception_class might not be a scalar.
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = force_unwind_cleanup;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+struct S
+{
+ int bit;
+ S(int b) : bit(b) { }
+ ~S() { test |= bit; }
+};
+
+static __attribute__ ((noinline)) void doit ()
+{
+ try {
+ S four(4);
+
+ try {
+ S one(1);
+ force_unwind ();
+ } catch(...) {
+ test |= 2;
+ throw;
+ }
+
+ } catch(...) {
+ test |= 8;
+ throw;
+ }
+}
+
+int main()
+{
+ doit ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/forced2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced2.C
new file mode 100644
index 000000000..54586a006
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced2.C
@@ -0,0 +1,53 @@
+// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK.
+// { dg-do run { xfail "ia64-hp-hpux11.*" } }
+
+// Test that leaving the catch block without rethrowing
+// does call the exception object destructor.
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void
+force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *)
+{
+ exit (0);
+}
+
+static void
+force_unwind ()
+{
+ _Unwind_Exception *exc = new _Unwind_Exception;
+ // exception_class might not be a scalar.
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = force_unwind_cleanup;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+int main()
+{
+ try {
+ force_unwind ();
+ } catch (...) {
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/forced3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced3.C
new file mode 100644
index 000000000..b8f47df4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced3.C
@@ -0,0 +1,58 @@
+// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK.
+// { dg-do run { xfail "ia64-hp-hpux11.*" } }
+
+// Test that forced unwinding calls std::unexpected going
+// through a nothrow function.
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <exception>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void __attribute__((noreturn))
+force_unwind ()
+{
+ _Unwind_Exception *exc = new _Unwind_Exception;
+ // exception_class might not be a scalar.
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+static void
+handle_unexpected ()
+{
+ exit (0);
+}
+
+static void
+doit () throw()
+{
+ force_unwind ();
+}
+
+int main()
+{
+ std::set_unexpected (handle_unexpected);
+ doit ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/forced4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced4.C
new file mode 100644
index 000000000..17fd94a40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/forced4.C
@@ -0,0 +1,52 @@
+// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK.
+// { dg-do run { xfail "ia64-hp-hpux11.*" } }
+
+// Test that forced unwinding does not call std::unexpected going
+// throw a function with a non-empty exception spec.
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void __attribute__((noreturn))
+force_unwind ()
+{
+ _Unwind_Exception *exc = new _Unwind_Exception;
+ // exception_class might not be a scalar.
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+static void
+doit () throw(int)
+{
+ force_unwind ();
+}
+
+int main()
+{
+ try {
+ doit ();
+ } catch (...) {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/fp-regs.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/fp-regs.C
new file mode 100644
index 000000000..b91c0f9a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/fp-regs.C
@@ -0,0 +1,94 @@
+// PR 20670: f29 corrupted when unwind stack. This tries to test that FP
+// registers are properly saved and restored by defining 20 different FP
+// local variables.
+// { dg-do run }
+// { dg-options "-O" }
+#include <stdlib.h>
+
+double zero = 0.0;
+double another_zero = 0.0;
+
+int
+sub (void)
+{
+ throw (0);
+}
+
+int
+main (void)
+{
+ double a, b, c, d, e, f, g, h, i, j;
+ double a1, b1, c1, d1, e1, f1, g1, h1, i1, j1;
+
+ a = zero;
+ b = a + 1;
+ c = b + 1;
+ d = c + 1;
+ e = d + 1;
+ f = e + 1;
+ g = f + 1;
+ h = g + 1;
+ i = h + 1;
+ j = i + 1;
+
+ a1 = another_zero;
+ b1 = a1 + 1;
+ c1 = b1 + 1;
+ d1 = c1 + 1;
+ e1 = d1 + 1;
+ f1 = e1 + 1;
+ g1 = f1 + 1;
+ h1 = g1 + 1;
+ i1 = h1 + 1;
+ j1 = i1 + 1;
+
+ try
+ {
+ sub ();
+ }
+ catch (...)
+ {
+ if (a != 0.0)
+ abort ();
+ if (b != 1.0)
+ abort ();
+ if (c != 2.0)
+ abort ();
+ if (d != 3.0)
+ abort ();
+ if (e != 4.0)
+ abort ();
+ if (f != 5.0)
+ abort ();
+ if (g != 6.0)
+ abort ();
+ if (h != 7.0)
+ abort ();
+ if (i != 8.0)
+ abort ();
+ if (j != 9.0)
+ abort ();
+
+ if (a1 != 0.0)
+ abort ();
+ if (b1 != 1.0)
+ abort ();
+ if (c1 != 2.0)
+ abort ();
+ if (d1 != 3.0)
+ abort ();
+ if (e1 != 4.0)
+ abort ();
+ if (f1 != 5.0)
+ abort ();
+ if (g1 != 6.0)
+ abort ();
+ if (h1 != 7.0)
+ abort ();
+ if (i1 != 8.0)
+ abort ();
+ if (j1 != 9.0)
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/gcsec1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/gcsec1.C
new file mode 100644
index 000000000..5dfe02a6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/gcsec1.C
@@ -0,0 +1,45 @@
+/* PR other/29639 */
+/* AIX gld supports garbage collection. But AIX gcc does not support
+ -ffunction-sections or -fdata-sections. */
+/* { dg-do run { xfail rs6000-*-aix* powerpc*-*-aix* } } */
+/* { dg-require-gc-sections "" } */
+/* { dg-options "-ffunction-sections -Wl,--gc-sections" } */
+
+extern "C" void abort (void);
+
+int g = 0;
+
+void raise_exception()
+{
+ throw 1;
+}
+
+void used()
+{
+ try {
+ raise_exception ();
+ }
+ catch (int) {
+ g = 1;
+ }
+}
+
+void unused()
+{
+ try {
+ raise_exception ();
+ }
+ catch (int) {
+ g = 1;
+ }
+}
+
+int main()
+{
+ used ();
+
+ if (g != 1)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/goto1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/goto1.C
new file mode 100644
index 000000000..f3e3e4216
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/goto1.C
@@ -0,0 +1,34 @@
+extern "C" void abort ();
+
+static int count;
+
+struct S {
+ S() { ++count; }
+ ~S() { --count; }
+};
+
+int foo(int p)
+{
+ S s1;
+ {
+ S s2;
+ if (p)
+ goto L;
+ else
+ return 1;
+ }
+ foo (p);
+ L:
+ return 0;
+}
+
+int main()
+{
+ foo(0);
+ if (count != 0)
+ abort ();
+ foo(1);
+ if (count != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/goto2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/goto2.C
new file mode 100644
index 000000000..de06d50b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/goto2.C
@@ -0,0 +1,12 @@
+// PR c++/32080
+
+void f()
+try
+ {
+ goto l2; // { dg-error "from here" }
+ l1: ; // { dg-error "jump to label 'l1'" }
+ } catch (...)
+ {
+ l2: ; // { dg-error "jump to label 'l2'|enters catch block" }
+ goto l1; // { dg-error "from here|enters try block" }
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-1.C
new file mode 100644
index 000000000..17ef7f8b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-1.C
@@ -0,0 +1,59 @@
+// Test whether call saved float and branch regs are restored properly
+// We can't do this test for branch regs in ILP32 mode.
+// { dg-do run { target ia64-*-* } }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+#ifdef __LP64__
+char buf[128];
+#endif
+
+void __attribute__((noinline))
+bar (void)
+{
+ throw 1;
+}
+
+void __attribute__((noinline))
+foo (void)
+{
+ bar ();
+ bar ();
+}
+
+int
+main (void)
+{
+ register double f2 __asm ("f2");
+ register double f3 __asm ("f3");
+ register double f4 __asm ("f4");
+ register double f5 __asm ("f5");
+ register double f16 __asm ("f16");
+ register double f17 __asm ("f17");
+#ifdef __LP64__
+ register void *b1 __asm ("b1");
+ register void *b2 __asm ("b2");
+ register void *b3 __asm ("b3");
+ register void *b4 __asm ("b4");
+ register void *b5 __asm ("b5");
+#endif
+ f2 = 12.0; f3 = 13.0; f4 = 14.0; f5 = 15.0; f16 = 16.0; f17 = 17.0;
+#ifdef __LP64__
+ b1 = &buf[1]; b2 = &buf[2]; b3 = &buf[3]; b4 = &buf[4]; b5 = &buf[5];
+#endif
+ try
+ {
+ foo ();
+ }
+ catch (...) {}
+ if (f2 != 12.0 || f3 != 13.0 || f4 != 14.0
+ || f5 != 15.0 || f16 != 16.0 || f17 != 17.0)
+ abort ();
+#ifdef __LP64__
+ if (b1 != &buf[1] || b2 != &buf[2] || b3 != &buf[3]
+ || b4 != &buf[4] || b5 != &buf[5])
+ abort ();
+#endif
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-2.C
new file mode 100644
index 000000000..aa005d8ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ia64-2.C
@@ -0,0 +1,58 @@
+// PR target/30230
+// This testcase failed on IA-64, where end of an EH region ended
+// in the middle of a bundle (with br.call insn in first or second
+// slot of .bbb/.mbb bundles and EH region end right after it).
+// But br.call returns to the start of the next bundlem so during
+// unwinding the call was considered to be outside of the EH region
+// while it should have been inside.
+// { dg-do run }
+// { dg-require-weak "" }
+// { dg-options "-O2" }
+
+struct A {};
+struct B { virtual ~B(); };
+B::~B () {}
+struct C { void foo (short &, B &); };
+struct D { void *d1; C *d2; virtual void virt (void) {} };
+struct E { D *e1; B *e2; };
+struct F { void bar (void *, B &); };
+F *p __attribute__((weak));
+volatile int r;
+
+void C::foo (short &x, B &)
+{
+ if (r)
+ throw A ();
+ x = 1;
+}
+
+void F::bar (void *, B &)
+{
+ throw A ();
+}
+
+void baz (E &x)
+{
+ short g = 0;
+ B b = *x.e2;
+ x.e1->d2->foo (g, b);
+ if (g)
+ p->bar(x.e1->d1, b);
+}
+
+int main ()
+{
+ F g;
+ D s;
+ E h;
+ p = &g;
+ h.e1 = &s;
+ try
+ {
+ baz (h);
+ }
+ catch (A &)
+ {
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp1.C
new file mode 100644
index 000000000..4996cea23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp1.C
@@ -0,0 +1,60 @@
+// PR c++/15764
+// { dg-do run }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#define NOEXCEPT_FALSE noexcept (false)
+#else
+#define NOEXCEPT_FALSE
+#endif
+
+extern "C" void abort ();
+
+int thrown;
+
+int as;
+struct a {
+ a () { ++as; }
+ ~a () NOEXCEPT_FALSE { --as; if (thrown++ == 0) throw 42; }
+};
+
+int f (a const&) { return 1; }
+int f (a const&, a const&) { return 1; }
+
+int bs;
+int as_sav;
+struct b {
+ b (...) { ++bs; }
+ ~b () { --bs; as_sav = as; }
+};
+
+bool p;
+void g()
+{
+ if (p) throw 42;
+}
+
+int main () {
+ thrown = 0;
+ try {
+ b tmp(f (a(), a()));
+
+ g();
+ }
+ catch (...) {}
+
+ // We throw when the first a is destroyed, which should destroy b before
+ // the other a.
+ if (as_sav != 1)
+ abort ();
+
+ thrown = 0;
+ try {
+ b tmp(f (a()));
+
+ g();
+ }
+ catch (...) {}
+
+ if (bs != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp2.C
new file mode 100644
index 000000000..6a58dda1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/init-temp2.C
@@ -0,0 +1,31 @@
+// PR c++/34196
+// { dg-options "-O -Wuninitialized" }
+
+template <class _Tp> class AutoPtr
+{
+ _Tp* _M_ptr;
+
+public:
+ explicit AutoPtr(_Tp* __p = 0) : _M_ptr(__p) {}
+
+ ~AutoPtr() { delete _M_ptr; }
+};
+
+struct A
+{
+ A() { }
+ ~A() { throw 1.0; }
+};
+
+struct B
+{
+ virtual ~B();
+};
+
+B* f (const A &s) { throw 1; }
+
+int
+main()
+{
+ AutoPtr<B> wt(f(A()));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/loop1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/loop1.C
new file mode 100644
index 000000000..b9b230e0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/loop1.C
@@ -0,0 +1,30 @@
+// Verify that loop optimization takes into account the exception edge
+// and does not increment I before the call.
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+static void bar(char *);
+
+static void foo(unsigned long element_count, char *ptr)
+{
+ unsigned long i;
+ try {
+ for (i = 0; i != element_count; i++, ptr += 8)
+ bar (ptr);
+ }
+ catch (...) {
+ if (i)
+ abort ();
+ }
+}
+
+static void bar(char *)
+{
+ throw 1;
+}
+
+int main()
+{
+ foo(2, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/loop2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/loop2.C
new file mode 100644
index 000000000..1e85fa1af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/loop2.C
@@ -0,0 +1,11 @@
+// Test that breaking out of a handler works.
+// { dg-do run }
+
+int main ()
+{
+ while (1)
+ {
+ try { throw 1; }
+ catch (...) { break; }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/nested-try.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/nested-try.C
new file mode 100644
index 000000000..5796f9a28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/nested-try.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+// Nested try statements shadowing each other was crashing in EH edge redirection.
+// PR middle-end/40043
+struct A
+{
+ ~A();
+ void foo();
+};
+
+void bar()
+{
+ A a;
+
+ try
+ {
+ A b;
+
+ try
+ {
+ b.foo();
+ }
+ catch (int) {}
+ }
+ catch (int) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/new1.C
new file mode 100644
index 000000000..3126f192e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/new1.C
@@ -0,0 +1,43 @@
+// PR c++/5757
+// Test that when a constructor throws in a new-expression, we pass the
+// right pointer to operator delete.
+
+// { dg-do run }
+
+#include <new>
+
+int ret = 1;
+
+void *ptr;
+void * operator new[] (std::size_t s)
+#if __cplusplus <= 199711L
+ throw (std::bad_alloc)
+#endif
+{
+ ptr = operator new (s);
+ return ptr;
+}
+
+void operator delete[] (void *p) throw ()
+{
+ if (p == ptr)
+ ret = 0;
+ operator delete (p);
+}
+
+struct A
+{
+ A() { throw 1; }
+ ~A() {}
+};
+
+int
+main ()
+{
+ try
+ {
+ A *p = new A[4];
+ }
+ catch (...) {}
+ return ret;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/nrv1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/nrv1.C
new file mode 100644
index 000000000..e2457e87e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/nrv1.C
@@ -0,0 +1,25 @@
+// PR c++/5636
+// Bug: the named return value optimization interfered with EH cleanups.
+
+int c, d;
+
+struct A
+{
+ A() { ++c; }
+ ~A() { ++d; }
+};
+
+A f()
+{
+ A nrv;
+ throw 42;
+ return nrv;
+}
+
+int main()
+{
+ try
+ { A a = f(); }
+ catch (...) { }
+ return (d < c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C
new file mode 100644
index 000000000..3792e11fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+// { dg-options -fomit-frame-pointer }
+
+#include <iostream>
+
+class Bug
+{
+};
+
+int throw_bug()
+{
+ throw Bug();
+
+ return 0;
+}
+
+int main()
+{
+ try {
+ std::cout << throw_bug();
+ } catch (Bug bug) {
+ };
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C
new file mode 100644
index 000000000..78026b518
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C
@@ -0,0 +1,34 @@
+// Reduced from PR c++/5246, PR c++/2447
+// { dg-options "-O -fomit-frame-pointer" }
+// { dg-do run }
+
+void step (int)
+{
+ void *sp = __builtin_alloca (0);
+}
+
+void f2 (void)
+{
+ step (2);
+ throw int();
+}
+
+void f1 (void)
+{
+ try
+ {
+ step (1);
+ f2 ();
+ step (-1);
+ }
+ catch (int)
+ {
+ step (3);
+ }
+}
+
+int main ()
+{
+ f1 ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/partial1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/partial1.C
new file mode 100644
index 000000000..db731770c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/partial1.C
@@ -0,0 +1,37 @@
+// PR c++/41449
+// { dg-do run }
+
+struct A
+{
+ A() {}
+ A(const A&) { throw 1; }
+};
+
+int bs;
+struct B
+{
+ B() { ++bs; }
+ B(const B&) { ++bs; }
+ ~B() { --bs; }
+};
+
+struct C
+{
+ B b1;
+ A a;
+ B b2;
+};
+
+int main()
+{
+ {
+ B b1, b2;
+ A a;
+
+ try {
+ C c = { b1, a, b2 };
+ } catch (...) {}
+ }
+ if (bs != 0)
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/ppc64-sighandle-cr.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/ppc64-sighandle-cr.C
new file mode 100644
index 000000000..325617360
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/ppc64-sighandle-cr.C
@@ -0,0 +1,54 @@
+// { dg-do run { target { powerpc64*-*-linux* } } }
+// { dg-options "-fexceptions -fnon-call-exceptions" }
+
+#include <signal.h>
+#include <stdlib.h>
+#include <fenv.h>
+
+#define SET_CR(R,V) __asm__ __volatile__ ("mtcrf %0,%1" : : "n" (1<<(7-R)), "r" (V<<(4*(7-R))) : "cr" #R)
+#define GET_CR(R) ({ int tmp; __asm__ __volatile__ ("mfcr %0" : "=r" (tmp)); (tmp >> 4*(7-R)) & 15; })
+
+void sighandler (int signo, siginfo_t * si, void * uc)
+{
+ SET_CR(2, 3);
+ SET_CR(3, 2);
+ SET_CR(4, 1);
+
+ throw 0;
+}
+
+float test (float a, float b) __attribute__ ((__noinline__));
+float test (float a, float b)
+{
+ float x;
+ asm ("mtcrf %1,%2" : "=f" (x) : "n" (1 << (7-3)), "r" (0), "0" (b) : "cr3");
+ return a / x;
+}
+
+int main ()
+{
+ struct sigaction sa;
+ int status;
+
+ sa.sa_sigaction = sighandler;
+ sa.sa_flags = SA_SIGINFO;
+
+ status = sigaction (SIGFPE, & sa, NULL);
+
+ feenableexcept (FE_DIVBYZERO);
+
+ SET_CR(2, 6);
+ SET_CR(3, 9);
+ SET_CR(4, 12);
+
+ try {
+ test (1, 0);
+ }
+ catch (...) {
+ return GET_CR(2) != 6 || GET_CR(3) != 9 || GET_CR(4) != 12;
+ }
+
+ return 1;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr29166.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr29166.C
new file mode 100644
index 000000000..432b64e98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr29166.C
@@ -0,0 +1,197 @@
+// PR 29166: r4-r7 corrupted when unwinding.
+// { dg-do run }
+
+class Ex
+{
+public:
+ int val;
+
+ Ex( int v )
+ : val( v )
+ { }
+
+};
+
+void doIt()
+{
+ int OFF( 1000 );
+ register int v1=OFF+1,v2=OFF+2,v3=OFF+3,v4=OFF+4,v5=OFF+5,v6=OFF+6,v7=OFF+7,v8=OFF+8,v9=OFF+9,v10=OFF+10;
+ register int v11=OFF+11,v12=OFF+12,v13=OFF+13,v14=OFF+14,v15=OFF+15,v16=OFF+16,v17=OFF+17,v18=OFF+18,v19=OFF+19,v20=OFF+20;
+ register int v21=OFF+21,v22=OFF+22,v23=OFF+23,v24=OFF+24,v25=OFF+25,v26=OFF+26,v27=OFF+27,v28=OFF+28,v29=OFF+29,v30=OFF+30;
+ register int v31=OFF+31,v32=OFF+32,v33=OFF+33,v34=OFF+34,v35=OFF+35,v36=OFF+36,v37=OFF+37,v38=OFF+38,v39=OFF+39,v40=OFF+40;
+ register int v41=OFF+41,v42=OFF+42,v43=OFF+43,v44=OFF+44,v45=OFF+45,v46=OFF+46,v47=OFF+47,v48=OFF+48,v49=OFF+49,v50=OFF+50;
+ register int v51=OFF+51,v52=OFF+52,v53=OFF+53,v54=OFF+54,v55=OFF+55,v56=OFF+56,v57=OFF+57,v58=OFF+58,v59=OFF+59,v60=OFF+60;
+ register int v61=OFF+61,v62=OFF+62,v63=OFF+63,v64=OFF+64,v65=OFF+65,v66=OFF+66,v67=OFF+67,v68=OFF+68,v69=OFF+69,v70=OFF+70;
+ register int v71=OFF+71,v72=OFF+72,v73=OFF+73,v74=OFF+74,v75=OFF+75,v76=OFF+76,v77=OFF+77,v78=OFF+78,v79=OFF+79,v80=OFF+80;
+ register int v81=OFF+81,v82=OFF+82,v83=OFF+83,v84=OFF+84,v85=OFF+85,v86=OFF+86,v87=OFF+87,v88=OFF+88,v89=OFF+89,v90=OFF+90;
+ register int v91=OFF+91,v92=OFF+92,v93=OFF+93,v94=OFF+94,v95=OFF+95,v96=OFF+96,v97=OFF+97,v98=OFF+98,v99=OFF+99,v100=OFF+100;
+ register int v101=OFF+101,v102=OFF+102,v103=OFF+103,v104=OFF+104,v105=OFF+105,v106=OFF+106,v107=OFF+107,v108=OFF+108,v109=OFF+109,v110=OFF+110;
+ register int v111=OFF+111,v112=OFF+112,v113=OFF+113,v114=OFF+114,v115=OFF+115,v116=OFF+116,v117=OFF+117,v118=OFF+118,v119=OFF+119,v120=OFF+120;
+ register int v121=OFF+121,v122=OFF+122,v123=OFF+123,v124=OFF+124,v125=OFF+125,v126=OFF+126,v127=OFF+127,v128=OFF+128,v129=OFF+129,v130=OFF+130;
+ register int v131=OFF+131,v132=OFF+132,v133=OFF+133,v134=OFF+134,v135=OFF+135,v136=OFF+136,v137=OFF+137,v138=OFF+138,v139=OFF+139,v140=OFF+140;
+ register int v141=OFF+141,v142=OFF+142,v143=OFF+143,v144=OFF+144,v145=OFF+145,v146=OFF+146,v147=OFF+147,v148=OFF+148,v149=OFF+149,v150=OFF+150;
+ register int v151=OFF+151,v152=OFF+152,v153=OFF+153,v154=OFF+154,v155=OFF+155,v156=OFF+156,v157=OFF+157,v158=OFF+158,v159=OFF+159,v160=OFF+160;
+ register int v161=OFF+161,v162=OFF+162,v163=OFF+163,v164=OFF+164,v165=OFF+165,v166=OFF+166,v167=OFF+167,v168=OFF+168,v169=OFF+169,v170=OFF+170;
+ register int v171=OFF+171,v172=OFF+172,v173=OFF+173,v174=OFF+174,v175=OFF+175,v176=OFF+176,v177=OFF+177,v178=OFF+178,v179=OFF+179,v180=OFF+180;
+ register int v181=OFF+181,v182=OFF+182,v183=OFF+183,v184=OFF+184,v185=OFF+185,v186=OFF+186,v187=OFF+187,v188=OFF+188,v189=OFF+189,v190=OFF+190;
+ register int v191=OFF+191,v192=OFF+192,v193=OFF+193,v194=OFF+194,v195=OFF+195,v196=OFF+196,v197=OFF+197,v198=OFF+198,v199=OFF+199,v200=OFF+200;
+ register int v201=OFF+201,v202=OFF+202,v203=OFF+203,v204=OFF+204,v205=OFF+205,v206=OFF+206,v207=OFF+207,v208=OFF+208,v209=OFF+209,v210=OFF+210;
+ register int v211=OFF+211,v212=OFF+212,v213=OFF+213,v214=OFF+214,v215=OFF+215,v216=OFF+216,v217=OFF+217,v218=OFF+218,v219=OFF+219,v220=OFF+220;
+ register int v231=OFF+231,v232=OFF+232,v233=OFF+233,v234=OFF+234,v235=OFF+235,v236=OFF+236,v237=OFF+237,v238=OFF+238,v239=OFF+239,v240=OFF+240;
+ register int v241=OFF+241,v242=OFF+242,v243=OFF+243,v244=OFF+244,v245=OFF+245,v246=OFF+246,v247=OFF+247,v248=OFF+248,v249=OFF+249,v250=OFF+250;
+ register int v251=OFF+251,v252=OFF+252,v253=OFF+253,v254=OFF+254,v255=OFF+255,v256=OFF+256,v257=OFF+257,v258=OFF+258,v259=OFF+259,v260=OFF+260;
+ register int v261=OFF+261,v262=OFF+262,v263=OFF+263,v264=OFF+264,v265=OFF+265,v266=OFF+266,v267=OFF+267,v268=OFF+268,v269=OFF+269,v270=OFF+270;
+ register int v271=OFF+271,v272=OFF+272,v273=OFF+273,v274=OFF+274,v275=OFF+275,v276=OFF+276,v277=OFF+277,v278=OFF+278,v279=OFF+279,v280=OFF+280;
+ register int v281=OFF+281,v282=OFF+282,v283=OFF+283,v284=OFF+284,v285=OFF+285,v286=OFF+286,v287=OFF+287,v288=OFF+288,v289=OFF+289,v290=OFF+290;
+ register int v291=OFF+291,v292=OFF+292,v293=OFF+293,v294=OFF+294,v295=OFF+295,v296=OFF+296,v297=OFF+297,v298=OFF+298,v299=OFF+299,v300=OFF+300;
+
+ register int sum = 0;
+ sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10;
+ sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20;
+ sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30;
+ sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40;
+ sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50;
+ sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60;
+ sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70;
+ sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80;
+ sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90;
+ sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100;
+ sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110;
+ sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120;
+ sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130;
+ sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140;
+ sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150;
+ sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160;
+ sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170;
+ sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180;
+ sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190;
+ sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200;
+ sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210;
+ sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220;
+ sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240;
+ sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250;
+ sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260;
+ sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270;
+ sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280;
+ sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290;
+ sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300;
+
+ throw Ex( sum );
+}
+
+void test()
+{
+ try {
+ doIt();
+ } catch( Ex& ) { }
+}
+
+int main(int argc, char** argv)
+{
+ int OFF(0);
+ register int v1=OFF+1,v2=OFF+2,v3=OFF+3,v4=OFF+4,v5=OFF+5,v6=OFF+6,v7=OFF+7,v8=OFF+8,v9=OFF+9,v10=OFF+10;
+ register int v11=OFF+11,v12=OFF+12,v13=OFF+13,v14=OFF+14,v15=OFF+15,v16=OFF+16,v17=OFF+17,v18=OFF+18,v19=OFF+19,v20=OFF+20;
+ register int v21=OFF+21,v22=OFF+22,v23=OFF+23,v24=OFF+24,v25=OFF+25,v26=OFF+26,v27=OFF+27,v28=OFF+28,v29=OFF+29,v30=OFF+30;
+ register int v31=OFF+31,v32=OFF+32,v33=OFF+33,v34=OFF+34,v35=OFF+35,v36=OFF+36,v37=OFF+37,v38=OFF+38,v39=OFF+39,v40=OFF+40;
+ register int v41=OFF+41,v42=OFF+42,v43=OFF+43,v44=OFF+44,v45=OFF+45,v46=OFF+46,v47=OFF+47,v48=OFF+48,v49=OFF+49,v50=OFF+50;
+ register int v51=OFF+51,v52=OFF+52,v53=OFF+53,v54=OFF+54,v55=OFF+55,v56=OFF+56,v57=OFF+57,v58=OFF+58,v59=OFF+59,v60=OFF+60;
+ register int v61=OFF+61,v62=OFF+62,v63=OFF+63,v64=OFF+64,v65=OFF+65,v66=OFF+66,v67=OFF+67,v68=OFF+68,v69=OFF+69,v70=OFF+70;
+ register int v71=OFF+71,v72=OFF+72,v73=OFF+73,v74=OFF+74,v75=OFF+75,v76=OFF+76,v77=OFF+77,v78=OFF+78,v79=OFF+79,v80=OFF+80;
+ register int v81=OFF+81,v82=OFF+82,v83=OFF+83,v84=OFF+84,v85=OFF+85,v86=OFF+86,v87=OFF+87,v88=OFF+88,v89=OFF+89,v90=OFF+90;
+ register int v91=OFF+91,v92=OFF+92,v93=OFF+93,v94=OFF+94,v95=OFF+95,v96=OFF+96,v97=OFF+97,v98=OFF+98,v99=OFF+99,v100=OFF+100;
+ register int v101=OFF+101,v102=OFF+102,v103=OFF+103,v104=OFF+104,v105=OFF+105,v106=OFF+106,v107=OFF+107,v108=OFF+108,v109=OFF+109,v110=OFF+110;
+ register int v111=OFF+111,v112=OFF+112,v113=OFF+113,v114=OFF+114,v115=OFF+115,v116=OFF+116,v117=OFF+117,v118=OFF+118,v119=OFF+119,v120=OFF+120;
+ register int v121=OFF+121,v122=OFF+122,v123=OFF+123,v124=OFF+124,v125=OFF+125,v126=OFF+126,v127=OFF+127,v128=OFF+128,v129=OFF+129,v130=OFF+130;
+ register int v131=OFF+131,v132=OFF+132,v133=OFF+133,v134=OFF+134,v135=OFF+135,v136=OFF+136,v137=OFF+137,v138=OFF+138,v139=OFF+139,v140=OFF+140;
+ register int v141=OFF+141,v142=OFF+142,v143=OFF+143,v144=OFF+144,v145=OFF+145,v146=OFF+146,v147=OFF+147,v148=OFF+148,v149=OFF+149,v150=OFF+150;
+ register int v151=OFF+151,v152=OFF+152,v153=OFF+153,v154=OFF+154,v155=OFF+155,v156=OFF+156,v157=OFF+157,v158=OFF+158,v159=OFF+159,v160=OFF+160;
+ register int v161=OFF+161,v162=OFF+162,v163=OFF+163,v164=OFF+164,v165=OFF+165,v166=OFF+166,v167=OFF+167,v168=OFF+168,v169=OFF+169,v170=OFF+170;
+ register int v171=OFF+171,v172=OFF+172,v173=OFF+173,v174=OFF+174,v175=OFF+175,v176=OFF+176,v177=OFF+177,v178=OFF+178,v179=OFF+179,v180=OFF+180;
+ register int v181=OFF+181,v182=OFF+182,v183=OFF+183,v184=OFF+184,v185=OFF+185,v186=OFF+186,v187=OFF+187,v188=OFF+188,v189=OFF+189,v190=OFF+190;
+ register int v191=OFF+191,v192=OFF+192,v193=OFF+193,v194=OFF+194,v195=OFF+195,v196=OFF+196,v197=OFF+197,v198=OFF+198,v199=OFF+199,v200=OFF+200;
+ register int v201=OFF+201,v202=OFF+202,v203=OFF+203,v204=OFF+204,v205=OFF+205,v206=OFF+206,v207=OFF+207,v208=OFF+208,v209=OFF+209,v210=OFF+210;
+ register int v211=OFF+211,v212=OFF+212,v213=OFF+213,v214=OFF+214,v215=OFF+215,v216=OFF+216,v217=OFF+217,v218=OFF+218,v219=OFF+219,v220=OFF+220;
+ register int v231=OFF+231,v232=OFF+232,v233=OFF+233,v234=OFF+234,v235=OFF+235,v236=OFF+236,v237=OFF+237,v238=OFF+238,v239=OFF+239,v240=OFF+240;
+ register int v241=OFF+241,v242=OFF+242,v243=OFF+243,v244=OFF+244,v245=OFF+245,v246=OFF+246,v247=OFF+247,v248=OFF+248,v249=OFF+249,v250=OFF+250;
+ register int v251=OFF+251,v252=OFF+252,v253=OFF+253,v254=OFF+254,v255=OFF+255,v256=OFF+256,v257=OFF+257,v258=OFF+258,v259=OFF+259,v260=OFF+260;
+ register int v261=OFF+261,v262=OFF+262,v263=OFF+263,v264=OFF+264,v265=OFF+265,v266=OFF+266,v267=OFF+267,v268=OFF+268,v269=OFF+269,v270=OFF+270;
+ register int v271=OFF+271,v272=OFF+272,v273=OFF+273,v274=OFF+274,v275=OFF+275,v276=OFF+276,v277=OFF+277,v278=OFF+278,v279=OFF+279,v280=OFF+280;
+ register int v281=OFF+281,v282=OFF+282,v283=OFF+283,v284=OFF+284,v285=OFF+285,v286=OFF+286,v287=OFF+287,v288=OFF+288,v289=OFF+289,v290=OFF+290;
+ register int v291=OFF+291,v292=OFF+292,v293=OFF+293,v294=OFF+294,v295=OFF+295,v296=OFF+296,v297=OFF+297,v298=OFF+298,v299=OFF+299,v300=OFF+300;
+
+ int sum_before, sum_after;
+
+ {
+ int sum( 0 );
+ sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10;
+ sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20;
+ sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30;
+ sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40;
+ sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50;
+ sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60;
+ sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70;
+ sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80;
+ sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90;
+ sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100;
+ sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110;
+ sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120;
+ sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130;
+ sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140;
+ sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150;
+ sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160;
+ sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170;
+ sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180;
+ sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190;
+ sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200;
+ sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210;
+ sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220;
+ sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240;
+ sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250;
+ sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260;
+ sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270;
+ sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280;
+ sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290;
+ sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300;
+
+ sum_before = sum;
+ }
+
+ test();
+
+ {
+ int sum( 0 );
+ sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10;
+ sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20;
+ sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30;
+ sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40;
+ sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50;
+ sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60;
+ sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70;
+ sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80;
+ sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90;
+ sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100;
+ sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110;
+ sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120;
+ sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130;
+ sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140;
+ sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150;
+ sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160;
+ sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170;
+ sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180;
+ sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190;
+ sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200;
+ sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210;
+ sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220;
+ sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240;
+ sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250;
+ sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260;
+ sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270;
+ sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280;
+ sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290;
+ sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300;
+
+ sum_after = sum;
+ }
+
+ return sum_before != sum_after;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr38662.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr38662.C
new file mode 100644
index 000000000..294a12941
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr38662.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+class E { };
+
+class T {
+ int foo(bool a) throw (E) __attribute__((regparm(1)));
+ int bar(bool b) __attribute__((regparm(1)));
+};
+
+int T::bar(bool b)
+{
+ return (b ? 1 : 2);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr41819.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr41819.C
new file mode 100644
index 000000000..07894a299
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr41819.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "-fno-exceptions" }
+
+struct S { ~S(); };
+extern void bar();
+
+void f0()
+{
+ S s;
+ bar();
+}
+
+void f1()
+{
+ try {} catch (...) {} // { dg-error "" }
+}
+
+void f2() throw(int)
+{
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr42859.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr42859.C
new file mode 100644
index 000000000..a9f1473bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr42859.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+void start (void);
+void
+ptw32_terminate (void)
+{
+ try
+ {
+ try
+ {
+ start ();
+ }
+ catch (int)
+ {
+ }
+ catch (int)
+ {
+ }
+ }
+ catch (int)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr43365.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr43365.C
new file mode 100644
index 000000000..32346d501
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr43365.C
@@ -0,0 +1,30 @@
+extern "C" void abort();
+
+class Counter
+{
+public:
+ static int count;
+ ~Counter() { count += 1; }
+};
+
+int Counter::count = 0;
+
+void func()
+{
+ Counter c;
+
+ try {
+ throw 1;
+ }
+ catch (const int&) {
+ return;
+ }
+}
+
+int main()
+{
+ func();
+ if (Counter::count != 1)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/pr45569.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr45569.C
new file mode 100644
index 000000000..2c100d2b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/pr45569.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions" }
+
+float f ();
+_Complex float g ();
+
+void
+i (_Complex float);
+
+float j ()
+{
+ _Complex float x = 0;
+ try
+ {
+ x = f ();
+ }
+ catch ( ...)
+ {
+ x += g ();
+ }
+ i (x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
new file mode 100644
index 000000000..6633e834d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/registers1.C
@@ -0,0 +1,138 @@
+// Try to check that registers are preserved when the stack is unwound.
+// { dg-do run }
+// { dg-options -O2 }
+
+extern "C" void exit(int);
+extern "C" void abort();
+
+// This test case triggers up to DEPTH recursive calls to function
+// foo(), These calls are numbered so that 0 is the innermost, 1 the
+// second innermost, and so on. Each call caches NUM_VARS elements of
+// both DOUBLE_SRC and INT_SRC and applies a trivial operation to each
+// cached value. The innermost foo() call will throw an integer call
+// number. The specified call should store its cached values in
+// DOUBLE_DEST and INT_DEST, which main() will check.
+const int num_vars = 16;
+const int depth = 3;
+
+float float_src[num_vars * depth];
+float float_dest[num_vars];
+
+int int_src[num_vars * depth];
+int int_dest[num_vars];
+
+void foo (int level, int throw_to)
+{
+ float *fsrc = &float_src[level * num_vars];
+ float f00 = *fsrc++ + 1.0f;
+ float f01 = *fsrc++ + 1.0f;
+ float f02 = *fsrc++ + 1.0f;
+ float f03 = *fsrc++ + 1.0f;
+ float f04 = *fsrc++ + 1.0f;
+ float f05 = *fsrc++ + 1.0f;
+ float f06 = *fsrc++ + 1.0f;
+ float f07 = *fsrc++ + 1.0f;
+ float f08 = *fsrc++ + 1.0f;
+ float f09 = *fsrc++ + 1.0f;
+ float f10 = *fsrc++ + 1.0f;
+ float f11 = *fsrc++ + 1.0f;
+ float f12 = *fsrc++ + 1.0f;
+ float f13 = *fsrc++ + 1.0f;
+ float f14 = *fsrc++ + 1.0f;
+ float f15 = *fsrc++ + 1.0f;
+
+ int *isrc = &int_src[level * num_vars];
+ int i00 = *isrc++ + 1;
+ int i01 = *isrc++ + 1;
+ int i02 = *isrc++ + 1;
+ int i03 = *isrc++ + 1;
+ int i04 = *isrc++ + 1;
+ int i05 = *isrc++ + 1;
+ int i06 = *isrc++ + 1;
+ int i07 = *isrc++ + 1;
+ int i08 = *isrc++ + 1;
+ int i09 = *isrc++ + 1;
+ int i10 = *isrc++ + 1;
+ int i11 = *isrc++ + 1;
+ int i12 = *isrc++ + 1;
+ int i13 = *isrc++ + 1;
+ int i14 = *isrc++ + 1;
+ int i15 = *isrc++ + 1;
+
+ try
+ {
+ if (level == 0)
+ throw throw_to;
+ else
+ foo (level - 1, throw_to);
+ }
+ catch (int i)
+ {
+ if (i == level)
+ {
+ float *fdest = float_dest;
+ *fdest++ = f00;
+ *fdest++ = f01;
+ *fdest++ = f02;
+ *fdest++ = f03;
+ *fdest++ = f04;
+ *fdest++ = f05;
+ *fdest++ = f06;
+ *fdest++ = f07;
+ *fdest++ = f08;
+ *fdest++ = f09;
+ *fdest++ = f10;
+ *fdest++ = f11;
+ *fdest++ = f12;
+ *fdest++ = f13;
+ *fdest++ = f14;
+ *fdest++ = f15;
+
+ int *idest = int_dest;
+ *idest++ = i00;
+ *idest++ = i01;
+ *idest++ = i02;
+ *idest++ = i03;
+ *idest++ = i04;
+ *idest++ = i05;
+ *idest++ = i06;
+ *idest++ = i07;
+ *idest++ = i08;
+ *idest++ = i09;
+ *idest++ = i10;
+ *idest++ = i11;
+ *idest++ = i12;
+ *idest++ = i13;
+ *idest++ = i14;
+ *idest++ = i15;
+ }
+ else
+ {
+ throw;
+ }
+ }
+}
+
+int main ()
+{
+ for (int i = 0; i < depth * num_vars; i++)
+ {
+ int_src[i] = i * i;
+ float_src[i] = i * 2.0f;
+ }
+ for (int level = 0; level < depth; level++)
+ for (int throw_to = 0; throw_to <= level; throw_to++)
+ {
+ foo (level, throw_to);
+ float *fsrc = &float_src[throw_to * num_vars];
+ int *isrc = &int_src[throw_to * num_vars];
+ for (int i = 0; i < num_vars; i++)
+ {
+ if (int_dest[i] != isrc[i] + 1)
+ abort ();
+ if (float_dest[i] != fsrc[i] + 1.0f)
+ abort ();
+ }
+ }
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/scope1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/scope1.C
new file mode 100644
index 000000000..276e0d6e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/scope1.C
@@ -0,0 +1,71 @@
+// Test that we've scoped the destructor properly for variables declared
+// in a conditional.
+// { dg-do run }
+
+extern "C" void abort ();
+
+class C
+{
+ bool live;
+ public:
+ C();
+ C(const C &);
+ ~C ();
+ operator bool() const;
+};
+
+void f1 ()
+{
+ while (C br = C()) abort ();
+}
+
+void f2 ()
+{
+ for (; C br = C(); ) abort ();
+}
+
+void f3 ()
+{
+ if (C br = C()) abort ();
+}
+
+void f4 ()
+{
+ switch (C br = C())
+ {
+ default:
+ abort ();
+ case false:
+ break;
+ }
+}
+
+int main()
+{
+ f1(); f2(); f3(); f4();
+ return 0;
+}
+
+C::C()
+{
+ live = true;
+}
+
+C::C(const C &o)
+{
+ if (!o.live)
+ abort ();
+ live = true;
+}
+
+C::~C()
+{
+ live = false;
+}
+
+C::operator bool() const
+{
+ if (!live)
+ abort ();
+ return false;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/shadow1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/shadow1.C
new file mode 100644
index 000000000..15f666a2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/shadow1.C
@@ -0,0 +1,32 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Oct 2004 <nathan@codesourcery.com>
+
+// We forgot to ignore current context and friends when determing
+// which exceptions shadowed eachother.
+
+struct E;
+
+struct B {};
+
+struct D : private B
+{
+ friend class E;
+
+ static B *baz (D *);
+ virtual void V () throw (B); // { dg-error "overriding" "" }
+};
+
+struct E : public D
+{
+ virtual void V () throw (D); // { dg-error "looser throw" "" }
+};
+
+B* foo (D *);
+
+B *D::baz (D *p)
+{
+ try {foo (p);}
+ catch (B const &b) {}
+ catch (D const &d) {}
+ return p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/sighandle.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/sighandle.C
new file mode 100644
index 000000000..5c4995e76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/sighandle.C
@@ -0,0 +1,38 @@
+// { dg-do run { target { *-*-aix5* i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } } }
+// { dg-options "-fexceptions -fnon-call-exceptions" }
+
+#include <signal.h>
+#include <stdlib.h>
+
+void sighandler (int signo, siginfo_t * si, void * uc)
+{
+ throw (5);
+}
+
+char * dosegv ()
+{
+ * ((volatile int *)0) = 12;
+}
+
+int main ()
+{
+ struct sigaction sa;
+ int status;
+
+ sa.sa_sigaction = sighandler;
+ sa.sa_flags = SA_SIGINFO;
+
+ status = sigaction (SIGSEGV, & sa, NULL);
+ status = sigaction (SIGBUS, & sa, NULL);
+
+ try {
+ dosegv ();
+ }
+ catch (int x) {
+ return (x != 5);
+ }
+
+ return 1;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-1.C
new file mode 100644
index 000000000..5029ded24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-1.C
@@ -0,0 +1,50 @@
+// Test EH when V2SI SIMD registers are involved.
+// Contributed by Aldy Hernandez (aldy@quesejoda.com).
+// { dg-options "-O -Wno-abi" }
+// { dg-options "-O -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// { dg-do run }
+
+typedef int __attribute__((vector_size (8))) vecint;
+
+vecint vecfunc (vecint beachbum)
+{
+ return beachbum;
+}
+
+void f3 (void)
+{
+ /* Force a use of a V2SI register if available. On the PPC/E500,
+ this will cause the compiler to save the registers in this
+ function in 64-bits. */
+ vecint foobar = (vecint) {0, 0};
+ foobar = vecfunc (foobar);
+
+ throw int();
+}
+
+void f2 (void)
+{
+ vecint foobar = (vecint) {0, 0};
+ foobar = vecfunc (foobar);
+
+ f3 ();
+}
+
+void f1 (void)
+{
+ int i;
+ try
+ {
+ f2 ();
+ }
+ catch (int)
+ {
+ i = 9;
+ }
+}
+
+int main ()
+{
+ f1 ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-2.C
new file mode 100644
index 000000000..2761061c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-2.C
@@ -0,0 +1,54 @@
+// Test EH when V4SI SIMD registers are involved.
+// Contributed by Aldy Hernandez (aldy@quesejoda.com).
+// { dg-options "-O -Wno-abi" }
+// { dg-options "-O -w -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// { dg-options "-O -w" { target powerpc*-*-* } }
+// { dg-options "-O -w -maltivec" { target { powerpc*-*-* && vmx_hw } } }
+// { dg-do run }
+// { dg-require-effective-target sse_runtime { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+
+#include "check-vect.h"
+
+typedef int __attribute__((vector_size (16))) vecint;
+
+vecint vecfunc (vecint beachbum)
+{
+ return beachbum;
+}
+
+void f3 (void)
+{
+ vecint foobar = (vecint) {0, 0};
+ foobar = vecfunc (foobar);
+
+ throw int();
+}
+
+void f2 (void)
+{
+ vecint foobar = (vecint) {0, 0};
+ foobar = vecfunc (foobar);
+
+ f3 ();
+}
+
+void f1 (void)
+{
+ int i;
+ try
+ {
+ f2 ();
+ }
+ catch (int)
+ {
+ i = 9;
+ }
+}
+
+int main ()
+{
+ /* Exit with zero if the hardware does not support AltiVec instructions. */
+ check_vect ();
+ f1 ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-3.C
new file mode 100644
index 000000000..5ac75c932
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-3.C
@@ -0,0 +1,65 @@
+// { dg-options "-O" }
+// { dg-options "-O -maltivec" { target { powerpc*-*-darwin* && powerpc_altivec_ok } } }
+// { dg-do run }
+
+#include <cstdlib>
+#include <cstring>
+
+typedef int __attribute__((vector_size(16))) v;
+
+v vv[32];
+volatile v vt = { 1, 2, 3, 4 };
+
+void clobber_vrs(void) { };
+
+void (*volatile fp)() = clobber_vrs;
+
+void thrower(void)
+{
+ v v00 = vv[ 0];
+ v v01 = vv[ 1];
+ v v02 = vv[ 2];
+ v v03 = vv[ 3];
+ v v04 = vv[ 4];
+ v v05 = vv[ 5];
+ v v06 = vv[ 6];
+ v v07 = vv[ 7];
+ v v08 = vv[ 8];
+ v v09 = vv[ 9];
+ v v10 = vv[10];
+ v v11 = vv[11];
+ v v12 = vv[12];
+
+ fp();
+
+ vv[ 0] = v00;
+ vv[ 1] = v01;
+ vv[ 2] = v02;
+ vv[ 3] = v03;
+ vv[ 4] = v04;
+ vv[ 5] = v05;
+ vv[ 6] = v06;
+ vv[ 7] = v07;
+ vv[ 8] = v08;
+ vv[ 9] = v09;
+ vv[10] = v10;
+ vv[11] = v11;
+ vv[12] = v12;
+
+ throw 3;
+}
+
+v v2;
+
+int main(void)
+{
+ v v1 = vt;
+ try {
+ thrower();
+ } catch (int x) {
+ }
+ v2 = v1;
+ if (memcmp (&v2, (v *)&vt, sizeof (v2)) != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-4.C
new file mode 100644
index 000000000..8c9b58bf8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-4.C
@@ -0,0 +1,70 @@
+/* { dg-do run { target powerpc*-*-darwin* } } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O -maltivec" } */
+
+#include <cstdlib>
+#include <cstring>
+#include <signal.h>
+
+typedef int __attribute__((vector_size(16))) v;
+
+v vv[32];
+volatile v vt = { 1, 2, 3, 4 };
+
+void clobber_vrs(void) { };
+
+void (*volatile fp)() = clobber_vrs;
+
+void thrower(int sig)
+{
+ v v00 = vv[ 0];
+ v v01 = vv[ 1];
+ v v02 = vv[ 2];
+ v v03 = vv[ 3];
+ v v04 = vv[ 4];
+ v v05 = vv[ 5];
+ v v06 = vv[ 6];
+ v v07 = vv[ 7];
+ v v08 = vv[ 8];
+ v v09 = vv[ 9];
+ v v10 = vv[10];
+ v v11 = vv[11];
+ v v12 = vv[12];
+
+ fp();
+
+ vv[ 0] = v00;
+ vv[ 1] = v01;
+ vv[ 2] = v02;
+ vv[ 3] = v03;
+ vv[ 4] = v04;
+ vv[ 5] = v05;
+ vv[ 6] = v06;
+ vv[ 7] = v07;
+ vv[ 8] = v08;
+ vv[ 9] = v09;
+ vv[10] = v10;
+ vv[11] = v11;
+ vv[12] = v12;
+
+ throw 3;
+}
+
+v v2;
+
+int main(void)
+{
+ v v1 = vt;
+ if (signal (SIGBUS, thrower) == SIG_ERR)
+ abort ();
+ if (signal (SIGSEGV, thrower) == SIG_ERR)
+ abort ();
+ try {
+ *(volatile int *)0 = 0;
+ abort ();
+ } catch (int x) {
+ }
+ v2 = v1;
+ if (memcmp (&v2, (v *)&vt, sizeof (v2)) != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-5.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-5.C
new file mode 100644
index 000000000..71e117ead
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/simd-5.C
@@ -0,0 +1,44 @@
+// Test EH with V2SI SIMD registers actually restores correct values.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-options "-O" }
+// { dg-do run { target { powerpc_spe && { ! *-*-vxworks* } } } }
+
+extern "C" void abort (void);
+extern "C" int memcmp (const void *, const void *, __SIZE_TYPE__);
+typedef int __attribute__((vector_size (8))) v2si;
+
+v2si a = { 1, 2 };
+v2si b = { 3, 4 };
+v2si c = { 4, 6 };
+volatile v2si r;
+v2si r2;
+
+void
+f ()
+{
+ register v2si v asm("r15");
+ v = __builtin_spe_evaddw (b, c);
+ asm volatile ("" : "+r" (v));
+ r = v;
+ throw 1;
+}
+
+int
+main ()
+{
+ register v2si v asm("r15");
+ v = __builtin_spe_evaddw (a, b);
+ asm volatile ("" : "+r" (v));
+ try
+ {
+ f ();
+ }
+ catch (int)
+ {
+ r = v;
+ r2 = r;
+ if (memcmp (&r2, &c, sizeof (v2si)))
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spbp.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spbp.C
new file mode 100644
index 000000000..181e65d21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spbp.C
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-gdwarf-2" } */
+/* { dg-skip-if "No Dwarf" { { *-*-aix* hppa*-*-hpux* } && { ! hppa*64*-*-* } } { "*" } { "" } } */
+
+/* This was a bug on x86-darwin, where the register numbering for SP
+ and BP was swapped (it's easy to do because on that port it's
+ different for eh_frame and debug_frame). */
+
+#include <stdlib.h>
+
+void f1(int t)
+{
+ char u[t];
+ throw 1;
+}
+
+int main()
+{
+ bool b = true;
+ try {
+ f1(100);
+ } catch (int x) {
+ if (b)
+ exit (0);
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec1.C
new file mode 100644
index 000000000..0bd0cbc03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec1.C
@@ -0,0 +1,5 @@
+// Check that we allow an exception specification on a reference-to-function.
+// { dg-do compile }
+
+void f () throw ();
+void (&fp)() throw () = f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec10.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec10.C
new file mode 100644
index 000000000..a62d24e66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec10.C
@@ -0,0 +1,31 @@
+// Make sure that we call terminate when a throw() spec is violated even
+// with -fnothrow-opt. The function pointers are there to make sure that
+// the compiler doesn't get clever about optimizing the calls based on
+// knowledge about the called functions.
+
+// { dg-options "-fnothrow-opt" }
+// { dg-do run }
+
+#include <exception>
+#include <cstdlib>
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void g() { throw 1; }
+void (*p1)() = g;
+void f() throw() { p1(); }
+void (*p2)() = f;
+void h() { p2(); }
+
+int main()
+{
+ std::set_terminate (my_terminate);
+
+ try { h(); }
+ catch (int) { }
+
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec11.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec11.C
new file mode 100644
index 000000000..4615a6405
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec11.C
@@ -0,0 +1,19 @@
+// Make sure that we force an LSDA for a throw() spec with -fnothrow-opt so
+// that the personality routine will call terminate. Also check that we
+// optimize away the EH cleanup for var because the personality routine
+// will call terminate before unwinding: there should not be an EH region
+// (i.e. LEHB/LEHE labels) around the call to g().
+
+// { dg-final { scan-assembler-not "_ZSt9terminatev" } }
+// { dg-final { scan-assembler-not "EHB" } }
+// { dg-final { scan-assembler "LSDA" } }
+
+// { dg-options "-fnothrow-opt" }
+
+struct A { ~A(); };
+void g();
+void f() throw()
+{
+ A var;
+ g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec2.C
new file mode 100644
index 000000000..64807dd26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec2.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+struct S { void f (void); };
+
+typedef void f1 (void) throw (int); // { dg-error "exception" }
+typedef void (*f2) (void) throw (int); // { dg-error "exception" }
+typedef void (S::*f3) (void) throw (int); // { dg-error "exception" }
+
+void (*f4) (void) throw (int);
+void (S::*f5) (void) throw (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec3.C
new file mode 100644
index 000000000..20bcfc33e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec3.C
@@ -0,0 +1,24 @@
+// PR c++/4381
+// Test that exception-specs work properly for classes with virtual bases.
+
+// { dg-do run }
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void func() throw (B,A)
+{
+ throw A();
+}
+
+int main(void)
+{
+ try { func(); }
+ catch (A& a) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec4.C
new file mode 100644
index 000000000..8edd3a1c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec4.C
@@ -0,0 +1,17 @@
+// PR c++/5104
+// Test that a function with a throw spec is a valid template argument.
+
+#include <exception>
+
+typedef void (*HandlerFunction)();
+typedef HandlerFunction (*SetHandlerFunction)(HandlerFunction);
+
+template <SetHandlerFunction set_function>
+class HandlerStack {
+public:
+ static void defaultHandler();
+};
+
+typedef HandlerStack<std::set_terminate> Terminate;
+
+template<> void Terminate::defaultHandler() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec5.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec5.C
new file mode 100644
index 000000000..be8f327c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec5.C
@@ -0,0 +1,22 @@
+// Test for extension to allow incomplete types in an
+// exception-specification for a declaration.
+
+// { dg-do run }
+// { dg-options "-fpermissive -w" }
+
+struct A;
+
+struct B
+{
+ void f () throw (A);
+};
+
+struct A {};
+
+void B::f () throw (A) {}
+
+int main ()
+{
+ B b;
+ b.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec6.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec6.C
new file mode 100644
index 000000000..eb1177b07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec6.C
@@ -0,0 +1,19 @@
+// Test that we don't allow incomplete types in an exception-specification
+// for a definition, or at a call site.
+
+// { dg-options "-fpermissive -w" }
+
+struct A; // { dg-error "" }
+
+struct B
+{
+ void f () throw (A);
+};
+
+void B::f () throw (A) {} // { dg-error "A" }
+
+int main ()
+{
+ B b;
+ b.f(); // { dg-error "A" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec7.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec7.C
new file mode 100644
index 000000000..08586a2af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec7.C
@@ -0,0 +1,35 @@
+// PR 14535
+// { dg-do run }
+// { dg-options "-O -finline" }
+//
+// Original test case failure required that Raiser constructor be inlined.
+
+extern "C" void abort();
+bool destructor_called = false;
+
+struct B {
+ virtual void Run(){};
+};
+
+struct D : public B {
+ virtual void Run()
+ {
+ struct O {
+ ~O() { destructor_called = true; };
+ } o;
+
+ struct Raiser {
+ Raiser() throw( int ) {throw 1;};
+ } raiser;
+ };
+};
+
+int main() {
+ try {
+ D d;
+ static_cast<B&>(d).Run();
+ } catch (...) {}
+
+ if (!destructor_called)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec8.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec8.C
new file mode 100644
index 000000000..72dadff22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec8.C
@@ -0,0 +1,11 @@
+// PR c++/24817
+
+struct exception {};
+
+template <typename T> void foo() throw(exception); // { dg-error "declaration" }
+template <typename T> void foo(); // { dg-error "exception" }
+
+struct bar
+{
+ template <typename T> friend void foo(); // { dg-error "exception" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/spec9.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec9.C
new file mode 100644
index 000000000..9e00d1c75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/spec9.C
@@ -0,0 +1,19 @@
+// PR c++/15745
+// { dg-do run }
+
+typedef int IntArray[10];
+IntArray i;
+
+void test_array() throw (IntArray)
+{
+ throw i;
+}
+
+int main ()
+{
+ try
+ {
+ test_array();
+ }
+ catch (IntArray) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/stabilize.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/stabilize.C
new file mode 100644
index 000000000..df47cab0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/stabilize.C
@@ -0,0 +1,26 @@
+// PR c++/8186
+
+// Bug: In f, convert_for_arg_passing wrapped the A TARGET_EXPR in an
+// ADDR_EXPR for passing by invisible ref. stabilize_throw_expr copied the
+// resulting pointer into a temporary. cp_convert_parm_for_inlining then
+// dereferences it and tries to initialize B::am with the INDIRECT_REF,
+// which calls for a bitwise copy. Which is broken.
+
+// { dg-options "-O" }
+
+struct A
+{
+ A();
+ A(const A&);
+ A& operator=(const A&);
+};
+
+struct B {
+ A am;
+ B(A a) { am = a; }
+};
+
+void f ()
+{
+ throw B(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/subreg-1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/subreg-1.C
new file mode 100644
index 000000000..1ac976dae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/subreg-1.C
@@ -0,0 +1,41 @@
+/* The lower-subreg pass would ICE on this test case with
+ TODO_verify_flow on 32-bit PowerPC. It didn't handle REG_EH_REGION
+ notes correctly. This is reduced from interpret.cc in libjava. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions" } */
+
+union _Jv_word
+{
+ double *o;
+ int i;
+ int ia[1];
+};
+union _Jv_word2
+{
+ int ia[2];
+ double d;
+};
+
+class _Jv_InterpMethod
+{
+ static void run_debug (_Jv_word *);
+};
+
+void
+_Jv_InterpMethod::run_debug (_Jv_word *sp)
+{
+ try
+ {
+ {
+ int index = ((int) (--sp)->i);
+ double *arr = (double *) ((--sp)->o);
+ _Jv_word2 w2;
+ w2.d = arr[index];
+ (sp++)->ia[0] = w2.ia[0];
+ }
+ }
+ catch (int * ex)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/synth1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/synth1.C
new file mode 100644
index 000000000..ac3cab8b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/synth1.C
@@ -0,0 +1,27 @@
+// PR c++/6179
+
+// Bug: we tried to look at the fields of 'const A' to determine the proper
+// exception specification for the synthesized copy constructor, but
+// TYPE_FIELDS hadn't been set yet, so we incorrectly got a throw() spec.
+
+struct B
+{
+ B () {}
+ B (const B&) { throw 1; }
+};
+
+struct A;
+void f (const A &) {}
+struct A
+{
+ B b;
+};
+
+int main ()
+{
+ A a;
+ try
+ { A a2 (a); }
+ catch (...)
+ { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/synth2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/synth2.C
new file mode 100644
index 000000000..2da814db9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/synth2.C
@@ -0,0 +1,24 @@
+// PR c++/24580
+// { dg-do run }
+
+struct vbase {};
+
+struct foo : virtual vbase
+{
+ foo()
+ {
+ throw "exception in foo ctor";
+ }
+};
+
+struct bar : public foo {};
+
+int main()
+{
+ try
+ {
+ bar a;
+ }
+ catch ( ... ) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/table.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/table.C
new file mode 100644
index 000000000..6f36bc6cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/table.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target *-*-darwin* } }
+// { dg-final { scan-assembler "GCC_except_table0" } }
+void needed();
+void unneeded();
+
+class Bar
+{
+public:
+ Bar() {}
+ virtual ~Bar() {}
+
+ void unneeded();
+};
+
+void needed()
+{
+ Bar b;
+}
+
+//#if 0
+void unneeded()
+{
+ Bar b;
+ b.unneeded();
+}
+//#endif
+
+int main()
+{
+ needed();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/template1.C
new file mode 100644
index 000000000..2cbf9c698
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/template1.C
@@ -0,0 +1,38 @@
+// Test whether exception specifier dependent on template parameter
+// is accepted during template decl processing.
+// { dg-do run }
+
+extern "C" void abort();
+
+class A {};
+
+template <class T>
+struct B
+{
+ typedef A E;
+};
+
+template <class T>
+struct C
+{
+ typedef B<T> D;
+ typedef typename D::E E;
+ void f() throw(E) { throw E(); }
+};
+
+int main()
+{
+ int caught = 0;
+ try
+ {
+ C<int> x;
+ x.f();
+ }
+ catch (A)
+ {
+ ++caught;
+ }
+ if (caught != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/template2.C
new file mode 100644
index 000000000..ed3893286
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/template2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options -O2 }
+
+template<class T> struct O {
+ O(T *p) : q(p) { }
+ T *q;
+};
+struct W {
+ virtual ~W();
+};
+struct S : public W {
+ S (int *);
+};
+W *bar(int);
+S::S (int *x)
+{
+ for (int *p = x; *p; p++)
+ O<W> i (bar (*p));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/terminate1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/terminate1.C
new file mode 100644
index 000000000..43cc19eaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/terminate1.C
@@ -0,0 +1,29 @@
+// PR c++/44127
+
+// This is basically the same test as g++.eh/terminate1.C, but that one
+// tests runtime behavior and this tests the assembly output. The test
+// should call terminate (because initializing the catch parm throws), but
+// from the personality routine, not directly.
+
+// { dg-final { scan-assembler-not "_ZSt9terminatev" } }
+
+// Also there should only be two EH call sites: #0 for throw A() and #1 for
+// _Unwind_Resume. We don't want call site info for __cxa_end_catch, since
+// ~A is trivial.
+
+// { dg-final { scan-assembler-not "LEHB2" } }
+
+struct A
+{
+ A() { }
+ A (const A&) { throw 1; }
+};
+
+int main()
+{
+ try
+ {
+ throw A();
+ }
+ catch (A) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/throw1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw1.C
new file mode 100644
index 000000000..6a3cb2c35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw1.C
@@ -0,0 +1,9 @@
+class S
+{
+public:
+ S(){}
+};
+
+int foo(char* m1) {
+ throw (m1 ? S() : S());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/throw2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw2.C
new file mode 100644
index 000000000..f9da8d7f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw2.C
@@ -0,0 +1,8 @@
+// PR c++/16851
+
+struct A { A(int); };
+
+void f(int t)
+{
+ throw (3,A(t));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/throw3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw3.C
new file mode 100644
index 000000000..3417eeb3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/throw3.C
@@ -0,0 +1,8 @@
+// PR c++/19312
+
+struct A {};
+
+void foo(A a)
+{
+ throw (A)a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught1.C
new file mode 100644
index 000000000..e96af334a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught1.C
@@ -0,0 +1,84 @@
+// PR libstdc++/10606
+// { dg-do run }
+// { dg-options "-fuse-cxa-get-exception-ptr" { target powerpc*-*-darwin* } }
+
+#include <exception>
+#include <cstdlib>
+
+
+struct Check {
+ int obj1, obj2;
+ bool state;
+};
+
+static Check const data[] = {
+ { 0, 0, false }, // construct [0]
+ { 1, 0, false }, // [1] = [0]
+ { 0, 0, true }, // destruct [0]
+ { 2, 1, true }, // [2] = [1]
+ { 2, 2, true }, // destruct [2]
+ { 3, 1, true }, // [3] = [1]
+ { 3, 3, false }, // destruct [3]
+ { 1, 1, false }, // destruct [1]
+ { 9, 9, false } // end-of-data
+};
+
+static int pos = 0;
+
+static void test(int obj1, int obj2, bool state)
+{
+ if (obj1 != data[pos].obj1) abort ();
+ if (obj2 != data[pos].obj2) abort ();
+ if (state != data[pos].state) abort ();
+ pos++;
+}
+
+
+struct S {
+ int id;
+ S ();
+ S (const S &);
+ ~S ();
+};
+
+static int next_id = 0;
+
+S::S()
+ : id (next_id++)
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+S::S(const S &x)
+ : id (next_id++)
+{
+ test (id, x.id, std::uncaught_exception ());
+}
+
+S::~S()
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+extern void foo (S *);
+
+int main()
+{
+ try
+ {
+ try
+ {
+ S s0;
+ throw s0; // s1 is the exception object
+ }
+ catch (S s2)
+ {
+ throw;
+ }
+ }
+ catch (S s3)
+ {
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught2.C
new file mode 100644
index 000000000..a99b2d7f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught2.C
@@ -0,0 +1,84 @@
+// { dg-do compile }
+// { dg-final { scan-assembler-not "__cxa_get_exception" } }
+// { dg-options "-fno-use-cxa-get-exception-ptr" }
+
+#include <exception>
+#include <cstdlib>
+
+
+struct Check {
+ int obj1, obj2;
+ bool state;
+};
+
+static Check const data[] = {
+ { 0, 0, false }, // construct [0]
+ { 1, 0, true }, // [1] = [0]
+ { 0, 0, true }, // destruct [0]
+ { 2, 1, true }, // [2] = [1]
+ { 2, 2, true }, // destruct [2]
+ { 3, 1, true }, // [3] = [1]
+ { 3, 3, false }, // destruct [3]
+ { 1, 1, false }, // destruct [1]
+ { 9, 9, false } // end-of-data
+};
+
+static int pos = 0;
+
+static void test(int obj1, int obj2, bool state)
+{
+ if (obj1 != data[pos].obj1) abort ();
+ if (obj2 != data[pos].obj2) abort ();
+ if (state != data[pos].state) abort ();
+ pos++;
+}
+
+
+struct S {
+ int id;
+ S ();
+ S (const S &);
+ ~S ();
+};
+
+static int next_id = 0;
+
+S::S()
+ : id (next_id++)
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+S::S(const S &x)
+ : id (next_id++)
+{
+ test (id, x.id, std::uncaught_exception ());
+}
+
+S::~S()
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+extern void foo (S *);
+
+int main()
+{
+ try
+ {
+ try
+ {
+ S s0;
+ throw s0; // s1 is the exception object
+ }
+ catch (S s2)
+ {
+ throw;
+ }
+ }
+ catch (S s3)
+ {
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught3.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught3.C
new file mode 100644
index 000000000..4ce4a5337
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught3.C
@@ -0,0 +1,84 @@
+// { dg-do compile { target powerpc*-*-darwin* } }
+// { dg-final { scan-assembler-not "__cxa_get_exception" } }
+// { dg-options "-mmacosx-version-min=10.4" }
+
+#include <exception>
+#include <cstdlib>
+
+
+struct Check {
+ int obj1, obj2;
+ bool state;
+};
+
+static Check const data[] = {
+ { 0, 0, false }, // construct [0]
+ { 1, 0, true }, // [1] = [0]
+ { 0, 0, true }, // destruct [0]
+ { 2, 1, true }, // [2] = [1]
+ { 2, 2, true }, // destruct [2]
+ { 3, 1, true }, // [3] = [1]
+ { 3, 3, false }, // destruct [3]
+ { 1, 1, false }, // destruct [1]
+ { 9, 9, false } // end-of-data
+};
+
+static int pos = 0;
+
+static void test(int obj1, int obj2, bool state)
+{
+ if (obj1 != data[pos].obj1) abort ();
+ if (obj2 != data[pos].obj2) abort ();
+ if (state != data[pos].state) abort ();
+ pos++;
+}
+
+
+struct S {
+ int id;
+ S ();
+ S (const S &);
+ ~S ();
+};
+
+static int next_id = 0;
+
+S::S()
+ : id (next_id++)
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+S::S(const S &x)
+ : id (next_id++)
+{
+ test (id, x.id, std::uncaught_exception ());
+}
+
+S::~S()
+{
+ test (id, id, std::uncaught_exception ());
+}
+
+extern void foo (S *);
+
+int main()
+{
+ try
+ {
+ try
+ {
+ S s0;
+ throw s0; // s1 is the exception object
+ }
+ catch (S s2)
+ {
+ throw;
+ }
+ }
+ catch (S s3)
+ {
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught4.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught4.C
new file mode 100644
index 000000000..227d11b33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/uncaught4.C
@@ -0,0 +1,29 @@
+// PR c++/41174
+// { dg-do run }
+
+#include <exception>
+
+#define assert(E) if (!(E)) __builtin_abort();
+
+struct e {
+ e()
+ {
+ assert( !std::uncaught_exception() );
+ try {
+ throw 1;
+ } catch (int i) {
+ assert( !std::uncaught_exception() );
+ throw;
+ }
+ }
+};
+
+int main()
+{
+ try {
+ throw e();
+ } catch (int i) {
+ assert( !std::uncaught_exception() );
+ }
+ assert( !std::uncaught_exception() );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/unexpected1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/unexpected1.C
new file mode 100644
index 000000000..e5982ffac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/unexpected1.C
@@ -0,0 +1,46 @@
+// PR 3719
+// Test that an unexpected handler can rethrow to categorize.
+// { dg-do run }
+
+#include <exception>
+
+extern "C" void abort ();
+
+struct One { };
+struct Two { };
+
+static void
+handle_unexpected ()
+{
+ try
+ {
+ throw;
+ }
+ catch (One &)
+ {
+ throw Two ();
+ }
+}
+
+static void
+doit () throw (Two)
+{
+ throw One ();
+}
+
+int main ()
+{
+ std::set_unexpected (handle_unexpected);
+
+ try
+ {
+ doit ();
+ }
+ catch (Two &)
+ {
+ }
+ catch (...)
+ {
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind-direct.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind-direct.C
new file mode 100644
index 000000000..8d2cd7729
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind-direct.C
@@ -0,0 +1,15 @@
+// PR target/59788
+// { dg-do run { target { *-*-solaris2* && { ! gld } } } }
+// { dg-options "-Wl,-Bdirect" }
+
+#include <stdexcept>
+
+int
+main(void)
+{
+ try
+ { throw std::runtime_error( "Catch me if you can!"); }
+ catch(...)
+ { return 0; }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind1.C
new file mode 100644
index 000000000..da7aa98fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind1.C
@@ -0,0 +1,25 @@
+// PR middle-end/28493
+
+extern "C" void abort ();
+
+struct Command *ptr;
+
+struct Command {
+ Command() { ptr = this; }
+ virtual ~Command() { if (ptr != this) abort(); }
+};
+
+void tryfunc()
+{
+ Command cmd;
+ throw 1;
+}
+
+int main()
+{
+ try
+ {
+ tryfunc();
+ }
+ catch (int) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind2.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind2.C
new file mode 100644
index 000000000..d6181c8c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/unwind2.C
@@ -0,0 +1,94 @@
+// PR debug/43290
+// { dg-do compile }
+// { dg-options "-O2" }
+// { dg-options "-O3 -mavx -fPIC -mtune=core2" { target { { i?86-*-* x86_64-*-* } && { ilp32 && fpic } } } }
+
+namespace std
+{
+ template <class> struct char_traits;
+}
+typedef struct { union { char __wchb[4]; }; } mbstate_t;
+namespace std
+{
+ template <typename _StateT> struct fpos
+ {
+ long long _M_off;
+ _StateT _M_state;
+ fpos (long long):_M_off (), _M_state () { }
+ _StateT state () { return _M_state; }
+ };
+ typedef fpos <mbstate_t> streampos;
+}
+namespace std
+{
+ template <> struct char_traits <char>
+ {
+ typedef streampos pos_type;
+ typedef long long off_type;
+ typedef mbstate_t state_type;
+ };
+}
+struct pthread_mutex_t;
+namespace
+{
+ enum _Ios_Openmode { _S_in = 3, _S_out };
+ enum _Ios_Seekdir { _S_beg };
+ struct ios_base
+ {
+ typedef _Ios_Openmode openmode;
+ static const openmode in = _S_in;
+ static const openmode out = _S_out;
+ typedef _Ios_Seekdir seekdir;
+ static const seekdir beg = _S_beg;
+ };
+ template < typename _CharT, typename > struct basic_streambuf
+ {
+ typedef _CharT char_type;
+ char_type * _M_in_beg;
+ char_type *eback () { return _M_in_beg; }
+ char_type *gptr () {}
+ };
+}
+namespace std
+{
+ typedef struct pthread_mutex_t __c_lock;
+ template <typename> class __basic_file;
+ template <> struct __basic_file <char>
+ {
+ __basic_file (__c_lock * = 0);
+ bool is_open ();
+ };
+ template <typename _CharT, typename _Traits> struct basic_filebuf : public basic_streambuf <_CharT, _Traits>
+ {
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename traits_type::pos_type pos_type;
+ typedef typename traits_type::off_type off_type;
+ typedef __basic_file < char >__file_type;
+ typedef typename traits_type::state_type __state_type;
+ __file_type _M_file;
+ char_type *_M_pback_cur_save;
+ bool _M_pback_init;
+ void _M_destroy_pback () throw ()
+ {
+ _M_pback_cur_save += this->gptr () != this->eback ();
+ _M_pback_init = false;
+ }
+ bool is_open () throw () { return _M_file.is_open (); }
+ pos_type seekpos (pos_type, ios_base::openmode = ios_base::in | ios_base::out);
+ pos_type _M_seek (off_type, ios_base::seekdir, __state_type);
+ };
+ template <typename _CharT, typename _Traits>
+ typename basic_filebuf <_CharT, _Traits>::pos_type
+ basic_filebuf <_CharT, _Traits>::seekpos (pos_type __pos, ios_base::openmode)
+ {
+ pos_type __ret = (off_type ());
+ if (this->is_open ())
+ {
+ _M_destroy_pback ();
+ __ret = _M_seek (off_type (), ios_base::beg, __pos.state ());
+ }
+ return __ret;
+ }
+ template class basic_filebuf <char, char_traits <char> >;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1-a.cc b/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1-a.cc
new file mode 100644
index 000000000..1885fae4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1-a.cc
@@ -0,0 +1,3 @@
+extern void f() {
+ throw 7;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1.C b/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1.C
new file mode 100644
index 000000000..f78d1955b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/eh/weak1.C
@@ -0,0 +1,23 @@
+// PR target/29487
+// { dg-do run { xfail { hppa*-*-hpux* && { ! hppa*64*-*-* } } } }
+// { dg-require-weak-override "" }
+// { dg-additional-sources "weak1-a.cc" }
+// { dg-options "-O2" }
+
+extern __attribute__((weak))
+void f() {
+}
+
+int main () {
+ try {
+ f();
+ return 1;
+ } catch (int i) {
+ /* Although the implementation of f in this file does not throw
+ any exceptions, it is weak, and may therefore be replaced at
+ link time. Therefore, the compiler must not optimize away this
+ catch clause. */
+ if (i != 7)
+ return 2;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/anew1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew1.C
new file mode 100644
index 000000000..d7a428880
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew1.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// PR 11228: array operator new, with zero-initialization and a variable sized array.
+// Regression test for PR
+// Author: Matt Austern <austern@apple.com>
+
+
+#include <new>
+#include <stdlib.h>
+#include <string.h>
+
+int* allocate(int n)
+{
+ void *p;
+ p = malloc(n * sizeof (int));
+ memset (p, 0xff, n * sizeof(int));
+ return new (p) int[n]();
+}
+
+int main()
+{
+ const int n = 17;
+ int* p = allocate(n);
+ for (int i = 0; i < n; ++i)
+ if (p[i] != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/anew2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew2.C
new file mode 100644
index 000000000..fbf2152d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew2.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// PR 11228: array operator new, with zero-initialization and a variable sized array.
+// Regression test for PR
+// Author: Matt Austern <austern@apple.com>
+
+
+#include <new>
+#include <stdlib.h>
+#include <string.h>
+
+double* allocate(int n)
+{
+ void *p;
+ p = malloc(n * sizeof (double));
+ memset (p, 0xff, n * sizeof(double));
+ return new (p) double[n]();
+}
+
+int main()
+{
+ const int n = 17;
+ double* p = allocate(n);
+ for (int i = 0; i < n; ++i)
+ if (p[i] != 0.0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/anew3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew3.C
new file mode 100644
index 000000000..9bb64ea4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew3.C
@@ -0,0 +1,32 @@
+// { dg-do run }
+// PR 11228: array operator new, with zero-initialization and a variable sized array.
+// Regression test for PR
+// Author: Matt Austern <austern@apple.com>
+
+#include <new>
+#include <stdlib.h>
+#include <string.h>
+
+struct X
+{
+ int a;
+ double b;
+};
+
+X* allocate(int n)
+{
+ void *p;
+ p = malloc(n * sizeof (X));
+ memset (p, 0xff, n * sizeof(X));
+ return new (p) X[n]();
+}
+
+int main()
+{
+ const int n = 17;
+ X* p = allocate(n);
+ for (int i = 0; i < n; ++i)
+ if (p[i].a != 0 || p[i].b != 0.0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/anew4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew4.C
new file mode 100644
index 000000000..4ce1d8899
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/anew4.C
@@ -0,0 +1,44 @@
+// { dg-do run }
+// PR 11228: array operator new, with zero-initialization and a variable sized array.
+// Regression test for PR
+// Author: Matt Austern <austern@apple.com>
+
+#include <new>
+#include <stdlib.h>
+#include <string.h>
+
+struct B
+{
+ B();
+ int n;
+};
+
+B::B()
+{
+ n = 137;
+}
+
+
+struct D : public B
+{
+ double x;
+};
+
+
+D* allocate(int n)
+{
+ void *p;
+ p = malloc(n * sizeof (D));
+ memset (p, 0xff, n * sizeof(D));
+ return new (p) D[n]();
+}
+
+int main()
+{
+ const int n = 17;
+ D* p = allocate(n);
+ for (int i = 0; i < n; ++i)
+ if (p[i].n != 137 || p[i].x != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/assign1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/assign1.C
new file mode 100644
index 000000000..7eb37e523
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/assign1.C
@@ -0,0 +1,34 @@
+// { dg-do run }
+
+// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com>
+// Origin: Tasso Karkanis <Tasso.Karkanis@rogers.com>
+// PR c++/13387. Clobbered tail padding of base
+
+inline void *operator new (__SIZE_TYPE__, void *ptr)
+{
+ return ptr;
+}
+
+struct Base {
+ Base() : i(0), c(0) {}
+ int i;
+ char c;
+};
+
+struct Sub : Base {
+ Sub () : d(0) {}
+ char d;
+};
+
+int main() {
+ Sub sub;
+ char base_alias[sizeof (Base)];
+ Base *base;
+
+ for (unsigned ix = sizeof base_alias; ix--;)
+ base_alias[ix] = 0x55;
+ base = new (&base_alias) Base ();
+
+ static_cast <Base &> (sub) = *base;
+ return sub.d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield1.C
new file mode 100644
index 000000000..f3d47417b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield1.C
@@ -0,0 +1,12 @@
+// PR c++/27505
+
+struct s {
+ bool field:8;
+};
+
+void
+foo (struct s *p)
+{
+ if (!p->field)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield10.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield10.C
new file mode 100644
index 000000000..0a6581e32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield10.C
@@ -0,0 +1,16 @@
+// PR c++/37146
+// { dg-do compile }
+
+enum E { E0 = 0, E1 = 'E' };
+
+struct S
+{
+ E s0 : 8;
+ enum E foo (bool, E);
+};
+
+E
+S::foo (bool a, E b)
+{
+ return a ? s0 : b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield11.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield11.C
new file mode 100644
index 000000000..bab303ef3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield11.C
@@ -0,0 +1,13 @@
+// PR c++/37819
+// { dg-do compile }
+
+struct A
+{
+ unsigned int a : 1;
+};
+
+bool
+foo (A *x, A *y)
+{
+ x->a = y ? y->a : true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield12.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield12.C
new file mode 100644
index 000000000..3ae88ca19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield12.C
@@ -0,0 +1,19 @@
+// PR c++/19618
+
+struct bset1 {
+ bool bit : sizeof(bool) * __CHAR_BIT__ + 1; // { dg-warning "exceeds" }
+};
+
+enum E {};
+
+struct bset2 {
+ E bit : sizeof(E) * __CHAR_BIT__ + 1; // { dg-warning "exceeds" }
+};
+
+struct bset3 {
+ bool bit : sizeof(bool) * __CHAR_BIT__;
+};
+
+struct bset4 {
+ E bit : sizeof(E) * __CHAR_BIT__;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield2.C
new file mode 100644
index 000000000..659931530
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield2.C
@@ -0,0 +1,9 @@
+// PR c++/27979
+
+class Ast
+{
+ enum AstKind { };
+ const AstKind kind : 8;
+ void foo(AstKind k) { }
+ void bar(void) { foo(kind); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield3.C
new file mode 100644
index 000000000..3221263a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield3.C
@@ -0,0 +1,12 @@
+// PR c++/30274
+
+struct S {
+ bool x : 4;
+};
+
+S s;
+
+void f() {
+ s.x--; // { dg-error "Boolean expression" }
+ --s.x; // { dg-error "Boolean expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield4.C
new file mode 100644
index 000000000..d824964e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield4.C
@@ -0,0 +1,19 @@
+// PR c++/30274
+// { dg-do link }
+
+struct S {
+ bool x : 4;
+};
+
+S s;
+
+template <typename T>
+void f(T);
+
+template <>
+void f(bool) {}
+
+int main() {
+ f(s.x++);
+ f(++s.x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield5.C
new file mode 100644
index 000000000..3d18e159c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield5.C
@@ -0,0 +1,17 @@
+// PR c++/30274
+// { dg-do run }
+
+struct S {
+ bool x : 4;
+};
+
+S s;
+
+int main() {
+ s.x++;
+ if (s.x != 1)
+ return 1;
+ ++s.x;
+ if (s.x != 1)
+ return 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield6.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield6.C
new file mode 100644
index 000000000..6f6d559a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield6.C
@@ -0,0 +1,11 @@
+// PR c++/30274
+
+struct S {
+ bool x : 4;
+};
+
+S s;
+
+void f() {
+ ++s.x = false;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield7.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield7.C
new file mode 100644
index 000000000..d274e3e98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield7.C
@@ -0,0 +1,8 @@
+// PR c++/31273
+
+enum E { e };
+struct S {
+ E v:5;
+};
+S s;
+int main() { if (!s.v) return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield8.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield8.C
new file mode 100644
index 000000000..566109cdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield8.C
@@ -0,0 +1,24 @@
+// PR c++/31513
+// { dg-do run }
+
+extern "C" void abort();
+
+struct tree_type {
+ unsigned int precision : 9;
+};
+
+void bork(unsigned int i) {
+ if (i != 7)
+ abort();
+}
+
+void foo(struct tree_type *t)
+{
+ bork(t->precision);
+}
+
+int main() {
+ tree_type t;
+ t.precision = 7;
+ foo(&t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield9.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield9.C
new file mode 100644
index 000000000..177f65b88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bitfield9.C
@@ -0,0 +1,26 @@
+// PR c++/32346
+// { dg-do run }
+// { dg-options "-Wno-overflow" }
+
+extern "C" void abort();
+
+struct S {
+ long long i : 32;
+};
+
+void f(int i, int j) {
+ if (i != 0xabcdef01)
+ abort();
+ if (j != 0)
+ abort();
+}
+
+void g(S s) {
+ f(s.i, 0);
+}
+
+int main() {
+ S s;
+ s.i = 0xabcdef01;
+ g(s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bool1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool1.C
new file mode 100644
index 000000000..bfb40e330
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool1.C
@@ -0,0 +1,21 @@
+// { dg-do run }
+// PR C++/29295
+// make sure that a typedef for a bool will have the
+// the same results as a bool itself.
+
+extern "C" void abort();
+typedef bool my_bool;
+int main()
+{
+ my_bool b = false;
+ int i;
+
+ b++;
+ b++;
+ i = b;
+ if (i != 1)
+ abort ();
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bool2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool2.C
new file mode 100644
index 000000000..39d93c0af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// make sure that a typedef for a bool will have the
+// the same results as a bool itself.
+
+
+typedef bool my_bool;
+int main()
+{
+ my_bool b = false;
+ b--; // { dg-error "" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bool3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool3.C
new file mode 100644
index 000000000..61669e27b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool3.C
@@ -0,0 +1,21 @@
+// { dg-do run }
+// PR C++/29295
+// make sure that a typedef for a bool will have the
+// the same results as a bool itself.
+
+extern "C" void abort();
+typedef volatile bool my_bool;
+int main()
+{
+ my_bool b = false;
+ int i;
+
+ b++;
+ b++;
+ i = b;
+ if (i != 1)
+ abort ();
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bool4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool4.C
new file mode 100644
index 000000000..dce51ec33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bool4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// make sure that a typedef for a bool will have the
+// the same results as a bool itself.
+
+
+typedef volatile bool my_bool;
+int main()
+{
+ my_bool b = false;
+ b--; // { dg-error "" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/bound-mem-fun.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/bound-mem-fun.C
new file mode 100644
index 000000000..b31bba13c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/bound-mem-fun.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/38228
+// { dg-do compile }
+
+struct A
+{
+ A ();
+ template<typename T> A(T);
+};
+
+struct B
+{
+ int foo();
+};
+
+A a = B().*(&B::foo); // { dg-error "invalid use of non-static member function" }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/call1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/call1.C
new file mode 100644
index 000000000..42d18db56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/call1.C
@@ -0,0 +1,16 @@
+namespace NS_1 {
+ struct A {};
+ struct foo {};
+}
+
+namespace NS_2 {
+ template <typename T> void foo(T);
+
+ template <typename T>
+ void bar() {
+ NS_1::A a;
+ NS_2::foo(a);
+ }
+
+ template void bar<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/call2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/call2.C
new file mode 100644
index 000000000..3b7398a8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/call2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 11 Sep 2003 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// PR c++/12184. ICE
+
+class C;
+class D;
+bool mm(D);
+
+void g(C& f) {
+ mm(f); // { dg-error "parameter" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/call3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/call3.C
new file mode 100644
index 000000000..13bca7170
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/call3.C
@@ -0,0 +1,12 @@
+// PR c++/26036
+// Origin: <ben@pc-doctor.com>
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+A foo(int); /* { dg-message "note: declared here" } */
+
+int j = foo().i; // { dg-error "too few arguments" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/call4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/call4.C
new file mode 100644
index 000000000..b4f2d60be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/call4.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com>
+
+// Origin: Danny Boelens <danny.boelens@artwork-systems.com>
+// PR 32839. Default arguments propagated through the type system to
+// an indirect call.
+
+template<typename T>
+struct TPL
+{
+ enum Whatever {e1, e2};
+
+ static void Quux (int i = e1 | e2);
+};
+
+template <typename F>
+void DoIt (F fun)
+{
+ fun (); // { dg-error "too few arguments" }
+}
+
+void Foo ()
+{
+ DoIt (&TPL<int>::Quux);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/call5.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/call5.C
new file mode 100644
index 000000000..023ad81f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/call5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com>
+
+// PR 32839. Default arguments propagated through the type system to
+// an indirect call.
+
+void Quux (int i = 0);
+void Baz (int i);
+
+void Foo ()
+{
+ __typeof (Quux) *q = Baz;
+
+ q (); // { dg-error "too few arguments" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast1.C
new file mode 100644
index 000000000..ee1adcc3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast1.C
@@ -0,0 +1,3 @@
+struct S; // { dg-error "forward" }
+
+void f(S* p) { ((S) (*p)); } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast10.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast10.C
new file mode 100644
index 000000000..cd3e0fc3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast10.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// This used to error out because we would try to convert m to a short.
+
+
+struct a {};
+void b() {
+ int a::*m;
+ a *c;
+ short p = reinterpret_cast<char*>(&(c->*m)) - reinterpret_cast<char*>(c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast2.C
new file mode 100644
index 000000000..f3c18d5fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast2.C
@@ -0,0 +1,5 @@
+void (*p)();
+
+void f() {
+ (void *)p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast3.C
new file mode 100644
index 000000000..2ca56c269
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+enum MyState
+{
+ QUIT = 0,
+ START,
+ STOP,
+ PAUSE
+};
+
+double GetDouble()
+{
+ return 1.0;
+}
+
+int main()
+{
+ MyState the_state;
+
+ the_state = (MyState)GetDouble(); // { dg-bogus "invalid cast" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast4.C
new file mode 100644
index 000000000..e9f529b11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast4.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+// PR c++/22132
+
+extern "C" void abort ();
+
+struct foo {
+ int a;
+ int b;
+};
+
+class Foobar : public foo {
+public:
+ Foobar() { a = 1; b = 2; }
+ virtual ~Foobar() {}
+};
+
+Foobar obj;
+const Foobar* objPtr = &obj;
+foo* f = (foo*)objPtr;
+
+int main () {
+ if (f->a != 1 || f->b != 2)
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast6.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast6.C
new file mode 100644
index 000000000..434a04669
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast6.C
@@ -0,0 +1,6 @@
+void f(int &);
+void f(const int &);
+int main() {
+ volatile int x = 2;
+ f((int)x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast7.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast7.C
new file mode 100644
index 000000000..c948919e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast7.C
@@ -0,0 +1,13 @@
+// PR c++/27177
+
+struct X {};
+
+struct Y : virtual X {};
+struct Z : virtual X {};
+
+struct A : Y, Z {};
+
+struct B : A
+{
+ static const int i = sizeof((Z*)(B*)0);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast8.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast8.C
new file mode 100644
index 000000000..9f1ce36f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast8.C
@@ -0,0 +1,11 @@
+// PR c++/29886
+
+struct A {
+ static int x[1];
+};
+
+void foo(int i)
+{
+ if (int(A::x[i])) {}
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cast9.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast9.C
new file mode 100644
index 000000000..150183a38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cast9.C
@@ -0,0 +1,12 @@
+// PR c++/27177
+
+struct Z {};
+struct A : Z {};
+
+Z* implicitToZ (Z*);
+
+struct B : A
+{
+ static const int i = sizeof(implicitToZ((B*)0));
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/comma1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/comma1.C
new file mode 100644
index 000000000..5424ce1a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/comma1.C
@@ -0,0 +1,21 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct gtst
+{
+ unsigned char data[2];
+};
+
+static struct gtst s;
+
+int main(int argc, char *argv[])
+{
+ unsigned char * pc;
+ struct gtst * ps;
+ ps = &s;
+ pc = (ps->data[0]='A', ps->data);
+ if (&s.data[0] != pc)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/compound-asn1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/compound-asn1.C
new file mode 100644
index 000000000..194235c64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/compound-asn1.C
@@ -0,0 +1,15 @@
+// PR c++/45437
+// { dg-options -Wsequence-point }
+// { dg-do run }
+
+bool f(bool& b) {
+ b = true;
+ return false;
+}
+
+int main() {
+ bool b = false;
+ b |= f(b);
+ if (!b)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond1.C
new file mode 100644
index 000000000..8fb3c0f4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond1.C
@@ -0,0 +1,28 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com>
+
+// PR 7209. We didn't SAVE_EXPR in the right place
+
+char a[2][1][16]={
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}};
+
+int f() {return 0;}
+
+char * Foo (int d)
+{
+ char *c1;
+
+ c1=a[d==0 ? 0 : 1][f()];
+
+ return c1;
+}
+
+int main ()
+{
+ if (Foo (0) != (void *)a)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond2.C
new file mode 100644
index 000000000..68a26a22f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond2.C
@@ -0,0 +1,12 @@
+struct Term { };
+struct Boolean : Term {
+ explicit Boolean(bool);
+};
+struct IsZero : Term {
+ Term *eval();
+};
+Term*
+IsZero::eval()
+{
+ return true ? new Boolean(false) : this; // { dg-error "conditional expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond3.C
new file mode 100644
index 000000000..50a4d9a13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond3.C
@@ -0,0 +1,6 @@
+const int i = 7;
+const int j = 3;
+
+void f(bool b) {
+ &(b ? i : j);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond4.C
new file mode 100644
index 000000000..fff5c8b18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond4.C
@@ -0,0 +1,16 @@
+// PR c++/13971
+
+struct QChar {
+ static const QChar null;
+};
+struct QCharRef {
+ operator QChar() const;
+};
+struct QString {
+ QCharRef operator[](int i);
+};
+
+QChar fillParagraph(QString s, int psi) {
+ return psi ? QChar::null : s[psi];
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond6.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond6.C
new file mode 100644
index 000000000..943aa85a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond6.C
@@ -0,0 +1,24 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct B {
+ B() {}
+ B(const B& b) { abort (); }
+};
+
+struct D : public B {
+ D() {}
+ D(const D& d) : B() {}
+};
+
+D d;
+B b;
+
+D f() {
+ return d;
+}
+
+int main () {
+ b = (true ? f() : b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond7.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond7.C
new file mode 100644
index 000000000..05e8eab44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond7.C
@@ -0,0 +1,12 @@
+// PR c++/19148
+
+struct QChar {
+ QChar (char c);
+ QChar (const QChar &);
+ unsigned short ucs;
+};
+
+void f(QChar *uc, unsigned short ch, QChar replacement)
+{
+ *uc++ = ((ch) ? QChar((1)) : replacement);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond8.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond8.C
new file mode 100644
index 000000000..3e089537f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond8.C
@@ -0,0 +1,13 @@
+// PR c++/22434
+// { dg-options "" }
+
+struct A
+{
+ A(void*); // { dg-message "initializing" }
+ ~A();
+};
+
+void foo(const int i, bool b)
+{
+ b ? A(0) : i; // { dg-error "conversion" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/cond9.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond9.C
new file mode 100644
index 000000000..e8e1397c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/cond9.C
@@ -0,0 +1,12 @@
+// PR c++/27666
+
+struct A { // { dg-message "A" }
+ A(int); // { dg-message "A" }
+};
+
+void foo(volatile A a) {
+ 1 ? a : 0; // { dg-error "match|temporary" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+ 1 ? 0 : a; // { dg-error "match|temporary" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 10 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/const1.C
new file mode 100644
index 000000000..9371b27b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/const1.C
@@ -0,0 +1,9 @@
+// PR c++/57551
+
+extern unsigned long ADDR;
+
+unsigned long f(){
+ const unsigned long* const var=&ADDR;
+ const unsigned long retval=var[1];
+ return retval;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/copy1.C
new file mode 100644
index 000000000..57036d3f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/copy1.C
@@ -0,0 +1,28 @@
+// PR c++/14035
+// { dg-do run }
+
+extern "C" void abort();
+
+struct Blob {
+ int x, y;
+ Blob() { }
+ Blob(const Blob &b) { abort (); }
+};
+struct Blobby : public Blob { };
+
+struct Wooly {
+ operator const Blobby & ()
+ {
+ return myBlobby;
+ }
+ Blobby myBlobby;
+};
+
+void catcher(const Blob &blo)
+{ }
+
+int main()
+{
+ Wooly wooly;
+ catcher((const Blob &)wooly);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/crash-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/crash-1.C
new file mode 100644
index 000000000..d8d689fd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/crash-1.C
@@ -0,0 +1,15 @@
+// C++ PR/10476
+// Origin: larsbj@gullik.net and bangerth@dealii.org
+
+
+struct X {
+ X();
+ X(const X& __str);
+};
+X const bar();
+void foo()
+{
+ X y;
+ (true ? y : bar());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/crash2.C
new file mode 100644
index 000000000..5379bb159
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/crash2.C
@@ -0,0 +1,14 @@
+// PR c++/14267
+
+class foo {
+public: static int& x;
+};
+int temp;
+int& foo::x=temp;
+
+int main() {
+ int x = 3;
+ &foo::x = x; // { dg-error "" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor1.C
new file mode 100644
index 000000000..0775a93c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor1.C
@@ -0,0 +1,7 @@
+class Foo; // { dg-error "" }
+
+void
+bar(void* p)
+{
+ static_cast<Foo*>(p)->~Foo(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor2.C
new file mode 100644
index 000000000..5f372424e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor2.C
@@ -0,0 +1,6 @@
+typedef const int I;
+int i;
+
+void f() {
+ i.I::~I();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor3.C
new file mode 100644
index 000000000..036e9f2a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor3.C
@@ -0,0 +1,10 @@
+struct B {
+ ~B();
+};
+struct D : public B {
+ ~D();
+};
+
+void f(D d) {
+ d.B::~B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor4.C
new file mode 100644
index 000000000..7aed80a69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/dtor4.C
@@ -0,0 +1,10 @@
+typedef int C;
+typedef double D;
+
+void
+f ()
+{
+ C o;
+
+ o.D::~C (); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/enum1.C
new file mode 100644
index 000000000..40dc5faf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/enum1.C
@@ -0,0 +1,10 @@
+// { dg-do run }
+
+extern "C" void abort();
+int main()
+{
+ enum { shelf = 4 } t = shelf;
+ if (!(t & shelf))
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/for1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/for1.C
new file mode 100644
index 000000000..baffd424a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/for1.C
@@ -0,0 +1,14 @@
+// PR c++/13663
+
+struct S {
+ void f();
+};
+
+void g(int);
+void g(double);
+
+void h () {
+ S s;
+ for (;;s.f); // { dg-error "" }
+ for (;;g); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/for2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/for2.C
new file mode 100644
index 000000000..52f769641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/for2.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// PR c++/17661
+// We used to try to create a temprary for the condition
+// expression in the for which was wrong.
+
+
+struct C
+{
+ C (const C &x);
+};
+C &f();
+void breakme (C j, bool k)
+{
+ for (;; k ? j : f()) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/incomplete1.C
new file mode 100644
index 000000000..03e363a3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/incomplete1.C
@@ -0,0 +1,14 @@
+// PR 10202
+// { dg-do compile }
+// { dg-options -O0 }
+
+extern struct _smtp_account smtp_accounts[];
+typedef struct _smtp_account {
+ int flags;
+} Smtp_Account;
+
+void get_smtp_host_info ()
+{
+ if (smtp_accounts[0].flags & 0x01)
+ get_smtp_host_info();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/lval1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval1.C
new file mode 100644
index 000000000..bed47d8e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval1.C
@@ -0,0 +1,7 @@
+// Contributed by Matt Austern <austern@apple.com>
+
+void f ()
+{
+ int n;
+ (char) n = 1; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/lval2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval2.C
new file mode 100644
index 000000000..5d062f1c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval2.C
@@ -0,0 +1,27 @@
+// PR c++/19199
+
+// { dg-do run }
+
+// We used to turn the COND_EXPR lvalue into a MIN_EXPR rvalue, and
+// then return a reference to a temporary in qMin.
+
+#include <assert.h>
+
+enum Foo { A, B };
+
+template<typename T> T &qMin(T &a, T &b)
+{
+ return a < b ? a : b;
+}
+
+int main (int, char **)
+{
+ Foo f = A;
+ Foo g = B;
+ Foo &h = qMin(f, g);
+ assert (&h == &f || &h == &g);
+ const Foo &i = qMin((const Foo&)f, (const Foo&)g);
+ assert (&i == &f || &i == &g);
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/lval3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval3.C
new file mode 100644
index 000000000..f106e6961
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval3.C
@@ -0,0 +1,9 @@
+// i++ is never an lvalue
+void
+f()
+{
+ bool i = 0;
+ i++ = 3; // { dg-error "" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/lval4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval4.C
new file mode 100644
index 000000000..c66e2f6af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/lval4.C
@@ -0,0 +1,9 @@
+// ++i is always an lvalue
+void
+f()
+{
+ bool i = 0;
+ ++i = 3;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C
new file mode 100644
index 000000000..9fe65bc97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: jmr@fulcrummicro.com
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+
+struct A;
+
+int main()
+{
+ A::g(); // { dg-error "incomplete" "" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/minmax.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/minmax.C
new file mode 100644
index 000000000..407a92bb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/minmax.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+void f(void)
+{
+ int a, b;
+ (a >? b) = 1; // { dg-error "" }
+}
+
+
+void g(void)
+{
+ int a, b;
+ (a <? b) = 1; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/overflow1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/overflow1.C
new file mode 100644
index 000000000..b67b4e42e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/overflow1.C
@@ -0,0 +1,8 @@
+#include <limits.h>
+
+enum E {
+ A = (unsigned char)-1, /* OK */
+ B = (signed char)UCHAR_MAX, /* implementation-defined */
+ C = INT_MAX+1, /* undefined (C)/ill-formed (C++) { dg-message "" } */
+ D = UINT_MAX+1 /* OK */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/pmf-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/pmf-1.C
new file mode 100644
index 000000000..3dd01c6b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/pmf-1.C
@@ -0,0 +1,20 @@
+// C++ PR/2521
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+// { dg-do compile }
+
+struct A
+{
+ void f();
+ void foo(void (A::*)(int)); // { dg-message "void A::foo|no known conversion" "" }
+ template<typename T>
+ void g(T);
+ void h()
+ {
+ void (A::*p)() = &A::f;
+ void (A::*q)() = &(A::f); // { dg-error "parenthesized" "" }
+ foo(&g<int>); // { dg-error "no matching" "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 17 }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/pr19355-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/pr19355-1.C
new file mode 100644
index 000000000..ce11b8188
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/pr19355-1.C
@@ -0,0 +1,11 @@
+// PR c++/19355
+// { dg-do compile }
+
+typedef bool Boolean;
+extern Boolean is_nil ();
+void f(void)
+{
+ unsigned int ilen;
+ if(!((ilen > 0 ? !is_nil () : 1))) {}
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/pr29066.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/pr29066.C
new file mode 100644
index 000000000..8bf6bb0a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/pr29066.C
@@ -0,0 +1,42 @@
+// PR c++/29066
+// Test pointer to member function comparison
+// { dg-do run }
+
+extern "C" void abort (void);
+
+struct X
+{
+ virtual void a(void)=0;
+};
+
+struct Z : public X
+{
+ void a(void) {}
+};
+
+
+void f(X *obj)
+{
+ void (X::*xp)(void) = 0;
+ void (X::*xp2)(void) = 0;
+
+ xp = &X::a;
+
+ if (xp == xp2)
+ {
+ abort();
+ }
+
+ if (xp == 0)
+ {
+ abort();
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ Z myobj;
+
+ f(&myobj);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem1.C
new file mode 100644
index 000000000..146143a1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Aug 2003 <nathan@codesourcery.com>
+
+// PR 11766. ICE
+
+template<typename T>
+struct normal_iterator
+{
+ normal_iterator(const T& __i);
+};
+
+
+template<typename _Tp>
+struct vector
+{
+ void end() const { normal_iterator<const _Tp*> (this->pt); }
+ void size() const { end(); }
+ _Tp* pt;
+};
+
+
+
+struct MuonTag {
+ typedef void (MuonTag::*Selector)();
+};
+
+void foo()
+{
+ vector<MuonTag::Selector> _selectors;
+ _selectors.size();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem4.C
new file mode 100644
index 000000000..0803c9e63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem4.C
@@ -0,0 +1,16 @@
+// PR c++/15471
+// { dg-do run }
+
+struct myclass {
+ unsigned a;
+ union {
+ unsigned x;
+ };
+};
+
+int main () {
+ myclass foo;
+ unsigned myclass::* member = &myclass::x;
+ if (&(foo.*member) != &foo.x)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem5.C
new file mode 100644
index 000000000..e36983d02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem5.C
@@ -0,0 +1,7 @@
+// PR c++/15696
+
+struct A {};
+
+typedef void (A::*ftype)();
+
+void foo() { A().*ftype(); } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6.C
new file mode 100644
index 000000000..0c75385fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6.C
@@ -0,0 +1,12 @@
+// PR C++/21614
+// { dg-additional-sources "ptrmem6a.C" }
+// { dg-do run }
+
+extern struct Z *p;
+extern int (Z::*m) ();
+
+int main () {
+ if ((p->*m)() == 7)
+ return 0;
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6a.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6a.C
new file mode 100644
index 000000000..8dad81c58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem6a.C
@@ -0,0 +1,9 @@
+struct Z {
+ int f();
+};
+
+int Z::f() { return 7; }
+
+struct Z z;
+int (Z::*m)() = &Z::f;
+struct Z*p = &z;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem7.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem7.C
new file mode 100644
index 000000000..a94990e54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/ptrmem7.C
@@ -0,0 +1,21 @@
+// PR c++/22545
+
+struct A {
+ int member;
+ A() : member(13) {}
+};
+
+A a;
+
+struct B {
+ operator A*() { return &a; }
+};
+
+B b;
+
+int A::* member_pntr = &A::member;
+
+int main()
+{
+ return b ->* member_pntr;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/return1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/return1.C
new file mode 100644
index 000000000..7a64988e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/return1.C
@@ -0,0 +1,9 @@
+// PR c++/18545
+
+struct A;
+
+A foo() // { dg-error "" }
+{
+ A a; // { dg-error "" }
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof1.C
new file mode 100644
index 000000000..fa84481fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof1.C
@@ -0,0 +1,7 @@
+// PR c++/12989
+
+struct A
+{
+ int foo() { return sizeof(bar); } // { dg-error "" }
+ int bar();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof2.C
new file mode 100644
index 000000000..ca14ff79f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof2.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// Contributed by Wolfgang Bangerth <bangerth at ticam dot utexas dot edu>
+// PR c++/9259: Allow non-qualified member calls in sizeof expressions.
+
+template <bool> struct StaticAssert;
+template <> struct StaticAssert<true> {};
+
+struct S
+{
+ static int check ();
+ static double check2 ();
+ static const int value = sizeof(check());
+ static const int value2 = sizeof(check2());
+};
+
+template <class>
+struct T
+{
+ static int check ();
+ static double check2 ();
+ static const int value = sizeof(check());
+ static const int value2 = sizeof(check2());
+};
+
+StaticAssert<(S::value == sizeof(int))> s;
+StaticAssert<(S::value2 == sizeof(double))> s2;
+
+StaticAssert<(T<void>::value == sizeof(int))> t;
+StaticAssert<(T<void>::value2 == sizeof(double))> t2;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof3.C
new file mode 100644
index 000000000..31338b0b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/sizeof3.C
@@ -0,0 +1,4 @@
+// PR c++/15337
+
+class CCC;
+int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast1.C
new file mode 100644
index 000000000..f1d88bff3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast1.C
@@ -0,0 +1,5 @@
+void foo(int x)
+{
+ static_cast<const unsigned int&>(x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast2.C
new file mode 100644
index 000000000..7b5d46ded
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast2.C
@@ -0,0 +1,7 @@
+struct B {};
+
+int main () {
+ B a;
+ (1 ? static_cast<B&>(a) :
+ *static_cast<B*>(&a));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast3.C
new file mode 100644
index 000000000..744648c3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast3.C
@@ -0,0 +1,24 @@
+template <class T> struct static_abort {};
+
+template <class E>
+struct any
+{
+ const E& self() const { return static_cast<const E&>(*this); }
+};
+
+struct range : public any<range>
+{
+ range() {}
+
+ template <class U>
+ range(const U&)
+ {
+ typedef typename static_abort<U>::ret t;
+ }
+};
+
+int main()
+{
+ const any<range>& r = *new range();
+ r.self();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast4.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast4.C
new file mode 100644
index 000000000..cea7f4873
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast4.C
@@ -0,0 +1,11 @@
+class C {
+public:
+ explicit C(int) {}
+};
+
+int main()
+{
+ int i = 0;
+ static_cast<C>(i);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast5.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast5.C
new file mode 100644
index 000000000..1a51f1516
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast5.C
@@ -0,0 +1,17 @@
+void ambig()
+{
+ struct A {};
+ struct B : A {};
+ struct C : A {};
+ struct D : B, C {};
+
+ D d;
+ A* ap = static_cast<B*> (&d);
+ D* db = static_cast<D*> (ap); // { dg-error "" }
+
+ D& dr1 = static_cast<D&> (*ap); // { dg-error "" }
+
+ A& ar = static_cast<C&> (d);
+ D& dr = static_cast<D&> (ar); // { dg-error "" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast6.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast6.C
new file mode 100644
index 000000000..90f32f1d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast6.C
@@ -0,0 +1,15 @@
+// PR c++/21853
+
+struct blah {
+ int a;
+};
+
+int main( int argc, char ** argv ) {
+ int blah::* ptdma = &blah::a;
+
+ const void *ptdmv = static_cast< void * >( &ptdma );
+
+ int blah::* const ptdmb = * static_cast< int blah::* const * >( ptdmv );
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast7.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast7.C
new file mode 100644
index 000000000..bced805bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/static_cast7.C
@@ -0,0 +1,10 @@
+// Regression test for bug 39415 (and its duplicate 44916).
+struct S {};
+struct T : S {};
+int f(const T*) {}
+void f(T*);
+int main() {
+ S* s(0);
+ int a = f(static_cast<const T*>(s));
+ int b = f(static_cast<const T*>(0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg1.C
new file mode 100644
index 000000000..85b6f7460
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg1.C
@@ -0,0 +1,13 @@
+// PR c++/23840
+
+#include <stdarg.h>
+struct S
+{
+ int f(int);
+};
+void f(int i, ...)
+{
+ va_list ap;
+ va_start (ap, i);
+ va_arg (ap, S).f(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg2.C
new file mode 100644
index 000000000..cf2eabcb1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/stdarg2.C
@@ -0,0 +1,30 @@
+// PR target/26141
+
+#include <stdarg.h>
+
+struct S
+{
+ double a;
+};
+
+void
+foo (int z, ...)
+{
+ struct S arg;
+ va_list ap;
+ arg = va_arg (ap, struct S);
+}
+
+
+struct T
+{
+ __complex__ float a;
+};
+
+void
+bar (int z, ...)
+{
+ struct T arg;
+ va_list ap;
+ arg = va_arg (ap, struct T);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/stmt-expr-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/stmt-expr-1.C
new file mode 100644
index 000000000..c4db5157f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/stmt-expr-1.C
@@ -0,0 +1,36 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40866
+// { dg-options "-std=gnu++98" }
+// { dg-do compile }
+
+template <typename T> class QForeachContainer {
+public:
+ QForeachContainer();
+ int brk;
+ typename T::const_iterator i;
+};
+
+template <typename T> class QList {
+public:
+ class const_iterator {
+ public:
+ const_iterator(const const_iterator &o);
+ const_iterator &operator++();
+ };
+};
+
+class QAction;
+class QWidget {
+public:
+ QList<QAction*> actions() const;
+};
+class myDialog : public QWidget {
+ myDialog();
+};
+
+myDialog::myDialog()
+{
+ QForeachContainer<__typeof__(actions())> _container_;
+ ({++_container_.brk; ++_container_.i;});
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/string-1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/string-1.C
new file mode 100644
index 000000000..9a0a5ff7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/string-1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// This testcase used to seg fault (PR c++/38648)
+
+// { dg-prune-output "initializer lists" }
+
+char a[1];
+
+int foo(
+{
+ a = ""; // { dg-error "" }
+ return 0; // { dg-error "" }
+} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/string-2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/string-2.C
new file mode 100644
index 000000000..252fa7036
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/string-2.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// This testcase used to seg fault (PR c++/38648)
+
+char a[1];
+
+int foo(a = "") // { dg-error "invalid array assignment" }
+{ // { dg-error "" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/unary1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary1.C
new file mode 100644
index 000000000..4ea230f01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Unary plus (but not unary minus) can be applied to pointer types
+
+void *p;
+
+void f(void)
+{
+ -p; // { dg-error "wrong type argument" }
+ +p;
+}
+
+template <int>
+void g(void)
+{
+ -p; // { dg-error "wrong type argument" }
+ +p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/unary2.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary2.C
new file mode 100644
index 000000000..841881591
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary2.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Unary plus/minus are not lvalues.
+
+// In templates we require an instantiation to emit the diagnostic. This
+// is wrong and it is PR 18474.
+
+int n;
+
+void f(void)
+{
+ -n = 0; // { dg-error "lvalue" }
+ +n = 0; // { dg-error "lvalue" }
+}
+
+template <int>
+void g(void)
+{
+ -n = 0; // { dg-error "lvalue" "" { xfail *-*-* } }
+ +n = 0; // { dg-error "lvalue" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/unary3.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary3.C
new file mode 100644
index 000000000..abca0322d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/unary3.C
@@ -0,0 +1,11 @@
+// PR c++/41131
+// { dg-do compile }
+
+struct X { enum E { a = 100 }; };
+
+int
+main ()
+{
+ X x;
+ (void) &x.a; // { dg-error "lvalue required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/expr/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/expr/volatile1.C
new file mode 100644
index 000000000..712c9e0fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/expr/volatile1.C
@@ -0,0 +1,9 @@
+// PR c++/23167
+
+struct dom
+{
+ static int tostr();
+ void eval_old() volatile{tostr();}
+ ~dom() throw();
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon.C
new file mode 100644
index 000000000..843dec00c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon.C
@@ -0,0 +1,41 @@
+// PR c++/34935
+/* { dg-do compile } */
+/* { dg-final { scan-assembler "_Z1fi" } } */
+/* { dg-final { scan-assembler "_Z1fb" } } */
+/* { dg-final { scan-assembler "_Z1fd" } } */
+/* { dg-final { scan-assembler "_Z1ff" } } */
+/* { dg-final { scan-assembler "_Z1fw" } } */
+
+typedef int INT __attribute((may_alias));
+
+void f(int);
+void f(INT) { }
+
+typedef bool BOOL __attribute((may_alias));
+
+void f(bool);
+void f(BOOL) { }
+
+typedef float FLOAT __attribute((may_alias));
+
+void f(float);
+void f(FLOAT) { }
+
+typedef double DOUBLE __attribute((may_alias));
+
+void f(double);
+void f(DOUBLE) {}
+
+typedef wchar_t WCHAR_T __attribute((may_alias));
+
+void f(wchar_t);
+void f(WCHAR_T) {}
+
+void test()
+{
+ f(0);
+ f(true);
+ f(1.0f);
+ f(1.0);
+ f(L'f');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon2.C
new file mode 100644
index 000000000..4833db852
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-canon2.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// PR c++/37553
+typedef unsigned int ui32;
+__extension__ typedef unsigned long long int ui64;
+
+typedef ui32 __attribute__ ((__may_alias__)) ui32a;
+typedef ui64 __attribute__ ((__may_alias__)) ui64a;
+
+union u_u32
+{
+ ui32a v;
+} __attribute__ ((__may_alias__));
+
+union u_u64
+{
+ ui64a v;
+ struct
+ {
+ union u_u32 lo32, hi32;
+ } u;
+} __attribute__ ((__may_alias__));
+
+void
+out_long (ui64 longVal)
+{
+ if ((*(union u_u64 *) &longVal).u.lo32.v < 0x10000000ul)
+ {
+ if ((ui32) ((*(union u_u64 *) &longVal).u.lo32.v) < 0x4000u)
+ {
+ /* do something useful */
+ }
+ }
+}
+
+void f(ui32 *) { }
+void f(ui32a *) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C
new file mode 100644
index 000000000..06e93416f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+
+template <unsigned Len, unsigned Align>
+struct aligned_storage
+{
+ using type __attribute__((aligned((Align)))) =
+ char[Len];
+};
+
+template<typename T>
+struct X
+{
+ typename aligned_storage<sizeof(T),__alignof(T)>::type data;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof (X<double>) == __alignof (double)> dummy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C
new file mode 100644
index 000000000..6437212fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct X {
+ using layout_type __attribute ((aligned(__alignof(double)))) =
+ char[sizeof(T)];
+ layout_type data;
+};
+
+template<typename T>
+struct Y {
+ using layout_type __attribute ((aligned(__alignof(T)))) =
+ char[sizeof(T)];
+ layout_type data;
+};
+
+template<typename T>
+struct Z {
+ using layout_type __attribute ((aligned(__alignof(T)))) =
+ char[sizeof(T)];
+ struct Z2 {
+ layout_type data;
+ } in;
+};
+
+template<typename T>
+struct A;
+
+template <typename T>
+struct A<T*> {
+ using layout_type __attribute ((aligned(__alignof(T)))) =
+ char[sizeof(T)];
+ layout_type data;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof(X<double>) == __alignof(double)> d1;
+StaticAssert<__alignof(Y<double>) == __alignof(double)> d2;
+StaticAssert<__alignof(Z<double>) == __alignof(double)> d3;
+StaticAssert<__alignof(A<double*>) == __alignof(double)> d4;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C
new file mode 100644
index 000000000..e11178ab8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C
@@ -0,0 +1,20 @@
+// { dg-do run { target c++11 } }
+
+template <class T>
+int
+align_of_type_wide_array()
+{
+ using type_wide_array __attribute((aligned(__alignof(T))))
+ = unsigned char[sizeof (T)];
+
+ return __alignof(type_wide_array);
+}
+
+int
+main ()
+{
+ if (align_of_type_wide_array<int>() == __alignof(int))
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C
new file mode 100644
index 000000000..9bafc4234
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C
@@ -0,0 +1,33 @@
+// { dg-do run { target c++11 } }
+
+using global_vector_type __attribute__((vector_size(16))) = float;
+
+template <class T> struct A
+{
+ using type = T;
+};
+
+template < typename Val > struct S
+{
+ using vector_type __attribute__((vector_size(16))) =
+ typename A<Val>::type;
+ typedef Val vector_type2 __attribute__((vector_size(16)));
+ int pr_size() { return sizeof(vector_type); }
+ int pr_size2() { return sizeof(vector_type2); }
+};
+
+int main()
+{
+ if (sizeof (S<float>::vector_type) != sizeof (global_vector_type))
+ return 1;
+ if (sizeof (S<float>::vector_type2) != sizeof (global_vector_type))
+ return 2;
+
+ S<float> x;
+ if (x.pr_size() != sizeof (global_vector_type))
+ return 3;
+ if (x.pr_size2() != sizeof (global_vector_type))
+ return 4;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-mangle.C
new file mode 100644
index 000000000..a7706e996
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alias-mangle.C
@@ -0,0 +1,11 @@
+// PR c++/34936
+// { dg-do compile }
+/* { dg-final { scan-assembler "_ZN1AIdEC1Ev" } } */
+typedef double X __attribute((may_alias)) ;
+
+template<typename> struct A
+{
+ A();
+};
+
+A<X> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/align1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/align1.C
new file mode 100644
index 000000000..6c960c396
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/align1.C
@@ -0,0 +1,21 @@
+// Test that __attribute__ ((aligned)) is preserved.
+// The alignment used to be 64 but Cygwin does not
+// support an alignment greater than 16 and COFF
+// not support an alignment greater than 4.
+
+extern "C" int printf (const char *, ...);
+
+typedef float at[4][4] __attribute__ ((aligned));
+
+float dummy[4][4][15];
+
+static volatile at a1[15];
+
+float f1 __attribute__ ((aligned));
+
+int
+main (void)
+{
+ printf ("%d %d\n", __alignof (a1), __alignof (f1));
+ return (__alignof (a1) < __alignof (f1));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/align2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/align2.C
new file mode 100644
index 000000000..da54bd938
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/align2.C
@@ -0,0 +1,14 @@
+// PR c++/10179
+
+struct __attribute((aligned(__alignof(double)))) A
+{ /* empty */ };
+
+struct T : public A
+{
+ char c;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof(T) == __alignof(double)> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof1.C
new file mode 100644
index 000000000..36661c1f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof1.C
@@ -0,0 +1,19 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>, 2002-07-20
+// Bug PR/7363.
+
+template<typename T>
+int my_alignof()
+{
+ return __alignof__ (T);
+}
+
+template<typename>
+ struct X { };
+
+int main()
+{
+ return !my_alignof<X<void> >();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof2.C
new file mode 100644
index 000000000..8bc8a9c01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/alignof2.C
@@ -0,0 +1,25 @@
+// PRs 16387 and 16389
+// We were treating alignof (sa.a) as alignof (typeof (sa.a)), which is
+// wrong for some fields.
+
+// { dg-do run }
+
+extern "C" void abort();
+
+struct A
+{
+ double a;
+} sa;
+
+struct B
+{
+ char c;
+ double b;
+} sb;
+
+int main()
+{
+ if (__alignof (sa) != __alignof (sa.a)
+ || __alignof (sb) != __alignof (sb.b))
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-1.C
new file mode 100644
index 000000000..cd7c3aad2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-1.C
@@ -0,0 +1,16 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+int main()
+{
+ return 0;
+}
+
+class F32vec4 {
+public:
+ vector float val;
+ vector float operator++(void) { return val;}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-10.C
new file mode 100644
index 000000000..7f7d2b013
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-10.C
@@ -0,0 +1,22 @@
+/* This is a compile-only test for interaction of "-maltivec" and "-save-temps". */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-save-temps -maltivec" } */
+
+#include <altivec.h>
+
+#define vector_float vector float
+#define vector_float_foo vector float foo
+#define vector_float_bar_eq vector float bar =
+
+/* NB: Keep the following split across three lines. */
+vector
+int
+a1 = { 100, 200, 300, 400 };
+
+vector_float f1 = { 1.0, 2.0, 3.0, 4.0 };
+vector_float_foo = { 3.0, 4.0, 5.0, 6.0 };
+vector_float_bar_eq { 8.0, 7.0, 6.0, 5.0 };
+
+/* { dg-final { cleanup-saved-temps } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-11.C
new file mode 100644
index 000000000..ff3016953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-11.C
@@ -0,0 +1,12 @@
+/* Test handling of literal constant for dss operation. */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+void
+foo ()
+{
+ vec_dss (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-12.C
new file mode 100644
index 000000000..6f21da961
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-12.C
@@ -0,0 +1,19 @@
+/* Test vec_dst* functions with float pointer as first argument. */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+extern int i;
+extern float *fp;
+extern vector float vf;
+
+void
+foo ()
+{
+ vec_dst (fp, i, 1);
+ vec_dstst (fp, i, 1);
+ vec_dststt (fp, i, 1);
+ vec_dstt (fp, i, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-13.C
new file mode 100644
index 000000000..abc05af62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-13.C
@@ -0,0 +1,59 @@
+/* Check that vec_step can be used with const vector types. This
+ test is derived from parts of gcc.dg/vmx/8-02.c from Motorola's
+ AltiVec testsuite. */
+
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+extern vector unsigned char vuc;
+extern vector signed char vsc;
+extern vector bool char vbc;
+extern vector unsigned short vus;
+extern vector signed short vss;
+extern vector bool short vbs;
+extern vector unsigned int vui;
+extern vector signed int vsi;
+extern vector bool int vbi;
+extern vector pixel vp;
+extern vector float vf;
+extern const vector unsigned char cvuc;
+extern const vector signed char cvsc;
+extern const vector bool char cvbc;
+extern const vector unsigned short cvus;
+extern const vector signed short cvss;
+extern const vector bool short cvbs;
+extern const vector unsigned int cvui;
+extern const vector signed int cvsi;
+extern const vector bool int cvbi;
+extern const vector pixel cvp;
+extern const vector float cvf;
+
+void
+foo (void)
+{
+ int i_vuc = vec_step (vuc);
+ int i_vsc = vec_step (vsc);
+ int i_vbc = vec_step (vbc);
+ int i_vus = vec_step (vus);
+ int i_vss = vec_step (vss);
+ int i_vbs = vec_step (vbs);
+ int i_vui = vec_step (vui);
+ int i_vsi = vec_step (vsi);
+ int i_vbi = vec_step (vbi);
+ int i_vp = vec_step (vp);
+ int i_vf = vec_step (vf);
+ int i_cvuc = vec_step (cvuc);
+ int i_cvsc = vec_step (cvsc);
+ int i_cvbc = vec_step (cvbc);
+ int i_cvus = vec_step (cvus);
+ int i_cvss = vec_step (cvss);
+ int i_cvbs = vec_step (cvbs);
+ int i_cvui = vec_step (cvui);
+ int i_cvsi = vec_step (cvsi);
+ int i_cvbi = vec_step (cvbi);
+ int i_cvp = vec_step (cvp);
+ int i_cvf = vec_step (cvf);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-14.C
new file mode 100644
index 000000000..e5dd81c75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-14.C
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+void f (__attribute__((altivec (vector__))) signed int * a,
+ __attribute__((altivec (vector__))) signed int * const b);
+
+int
+foo (void)
+{
+ __attribute__((altivec (vector__))) signed int a[1], b[1];
+ f (a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-15.C
new file mode 100644
index 000000000..d8e982db4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-15.C
@@ -0,0 +1,16 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -mno-vsx" } */
+
+/* This test was added for an internal compiler error. The number and
+ content of error messages is irrelevant. */
+
+struct SubData
+{
+ inline const Float Clamp(Float f, Float f0, Float f1) // { dg-error "" }
+ }
+ inline const void SinCos(Float angle, Float& sine, Float& cosine) // { dg-error "" }
+ {
+ C0 = __builtin_vec_splat(_simdCosEstCoefficients, 0);
+ C1 = __builtin_vec_splat(_simdCosEstCoefficients, 1);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-16.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-16.C
new file mode 100644
index 000000000..91230d261
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-16.C
@@ -0,0 +1,19 @@
+// PR c++/36662
+// { dg-do compile { target powerpc*-*-* } }
+// { dg-require-effective-target powerpc_altivec_ok }
+// { dg-options "-maltivec" }
+
+#define vector __attribute__((altivec (vector__)))
+
+template <typename c> struct S {};
+
+template <> struct S<vector float>
+{
+ static vector float zero;
+};
+
+template <int>
+void g (void)
+{
+ vector float t = S<vector float>::zero;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-17.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-17.C
new file mode 100644
index 000000000..099f8742e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-17.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target powerpc*-*-* } }
+// { dg-require-effective-target powerpc_altivec_ok }
+// { dg-options "-maltivec" }
+
+// Make sure that bool vectors have distinct names to int vectors
+
+#define vector__ __attribute__((altivec (vector__)))
+#define bool__ __attribute__((altivec(bool__)))
+
+typedef vector__ unsigned int simd_type;
+typedef vector__ bool__ int bool_simd_type;
+
+void Foo (bool_simd_type const &a)
+{
+ simd_type const &v = a; // { dg-error "invalid initialization of reference of type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C
new file mode 100644
index 000000000..eb8a92942
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C
@@ -0,0 +1,25 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */
+
+/* This test checks if AltiVec builtins accept const-qualified
+ arguments. */
+
+#include <altivec.h>
+
+vector unsigned char use_lvsl;
+
+int main (int argc, const char * argv[])
+{
+ int i = 0;
+ const float cf = 1.0;
+ vector float v;
+ const vector float cv = (vector float){1.0, 2.0, 3.0, 4.0};
+
+ vec_dst(&cv, i, 0);
+ v = vec_ld(0, &cv);
+ v = vec_lde(0, &cf);
+ use_lvsl = vec_lvsl(0, &cf);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-3.C
new file mode 100644
index 000000000..151132059
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-3.C
@@ -0,0 +1,137 @@
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* Test for correct handling of AltiVec constants passed
+ through '...' (va_arg). */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <altivec.h>
+
+#define CHECK_INVARIANT(expr) \
+ if (!(expr)) { \
+ printf ("ASSERT FAILED: %d: %s\n", __LINE__, #expr); \
+ abort (); \
+ }
+
+struct foo { int x; int y; };
+struct vfoo { int x; __vector signed int v; int y; };
+union u { __vector signed int v; signed int i[4]; };
+
+struct foo x_g = { 3, 4};
+struct vfoo vx_g = { 10, {11, 12, 13, 14}, 15 };
+__vector signed int v_g = {22, 23, 24, 25};
+struct vfoo vx2_g = { 30, {31, 32, 33, 34}, 35 };
+__vector signed int v2_g = {40, 41, 42, 43};
+int i_1 = 99, i_2 = 33;
+double d_2 = 1.5, d_3 = 1.75;
+double ld_1 = 1.25;
+
+void bar (int i, ... )
+{
+ struct foo xi;
+ double d;
+ double ld;
+ float f;
+ char c;
+ short s;
+ va_list ap;
+ va_start(ap, i);
+ xi = va_arg(ap, struct foo);
+ s = (short)va_arg(ap, int);
+ f = (float)va_arg(ap, double);
+ ld = va_arg(ap, double);
+ c = (char)va_arg(ap, int);
+ d = va_arg(ap, double);
+ va_end(ap);
+
+ CHECK_INVARIANT (xi.x == x_g.x && xi.y == x_g.y);
+ CHECK_INVARIANT (s == (short)i_2);
+ CHECK_INVARIANT (f == (float)d_2);
+ CHECK_INVARIANT (ld == ld_1);
+ CHECK_INVARIANT (c == (char)i_1);
+ CHECK_INVARIANT (d == d_3);
+}
+
+void baz (int i, ... )
+{
+ struct vfoo vx, vx2;
+ __vector signed int v_i, v2_i;
+ int j, k, l;
+ va_list ap;
+ va_start(ap, i);
+ v_i = va_arg(ap, __vector signed int);
+ j = va_arg(ap, int);
+ vx = va_arg(ap, struct vfoo);
+ k = va_arg(ap, int);
+ v2_i = va_arg(ap, __vector signed int);
+ l = va_arg(ap, int);
+ vx2 = va_arg(ap, struct vfoo);
+ va_end(ap);
+
+ CHECK_INVARIANT (vec_all_eq (v_i, v_g));
+ CHECK_INVARIANT (j == i_1);
+ CHECK_INVARIANT (vx.x == vx_g.x);
+ CHECK_INVARIANT (vec_all_eq (vx.v, vx_g.v));
+ CHECK_INVARIANT (vx.y == vx_g.y);
+ CHECK_INVARIANT (k == i_1);
+ CHECK_INVARIANT (vec_all_eq (v2_i, v2_g));
+ CHECK_INVARIANT (l == i_1);
+ CHECK_INVARIANT (vx2.x == vx2_g.x);
+ CHECK_INVARIANT (vec_all_eq (vx2.v, vx2_g.v));
+ CHECK_INVARIANT (vx2.y == vx2_g.y);
+}
+
+void quux (int i, ... )
+{
+ __vector signed int v_i, v2_i;
+ union u vi, v2i;
+ va_list ap;
+ va_start(ap, i);
+ v_i = va_arg(ap, __vector signed int);
+ v2_i = va_arg(ap, __vector signed int);
+ va_end(ap);
+ vi.v = v_i;
+ v2i.v = v2_i;
+
+ CHECK_INVARIANT (vec_all_eq (v_i, v_g));
+ CHECK_INVARIANT (vec_all_eq (v2_i, v_g));
+ CHECK_INVARIANT (vec_all_eq (vi.v, v_g));
+ CHECK_INVARIANT (vec_all_eq (v2i.v, v_g));
+}
+
+void baz2 (int i, ... )
+{
+ struct vfoo vx;
+ union u vxi;
+ va_list ap;
+ va_start(ap, i);
+ vx = va_arg(ap, struct vfoo);
+ va_end(ap);
+ vxi.v = vx.v;
+
+ CHECK_INVARIANT (vx.x == vx_g.x);
+ CHECK_INVARIANT (vec_all_eq (vx.v, vx_g.v));
+ CHECK_INVARIANT (vx.y == vx_g.y);
+ CHECK_INVARIANT (vec_all_eq (vxi.v, vx_g.v));
+}
+
+void main1(void)
+{
+ CHECK_INVARIANT (sizeof(struct foo) == 8 && sizeof(struct vfoo) == 48);
+
+ bar(i_1, x_g, (short)i_2, (float)d_2, ld_1, (char)i_1, d_3);
+ baz(i_1, v_g, i_1, vx_g, i_1, v2_g, i_1, vx2_g);
+ quux(i_1, v_g, v_g);
+ baz2(i_1, vx_g);
+}
+
+int main(void)
+{
+ main1();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-4.C
new file mode 100644
index 000000000..86a2615dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-4.C
@@ -0,0 +1,12 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* PR c++/14425 */
+
+#include <altivec.h>
+
+vector unsigned int splat0(vector unsigned int x)
+{
+ return vec_splat(x, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-5.C
new file mode 100644
index 000000000..04c26e80f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-5.C
@@ -0,0 +1,16 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* PR c++/14426 */
+
+#include <altivec.h>
+
+vector unsigned int splat0u()
+{
+ return vec_splat_u32(0);
+}
+vector int splat0s()
+{
+ return vec_splat_s32(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-6.C
new file mode 100644
index 000000000..63ae0b0b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-6.C
@@ -0,0 +1,28 @@
+/* Test for correct handling of literal arguments. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+void foo(void) {
+ const unsigned char *buf;
+ vector pixel vp = { 3, 4, 5, 6 };
+ vector bool int vbi = { 1, 0, 1, 0 };
+ vector bool short vbs = { 1, 0, 1, 0, 1, 0, 1, 0 };
+ vector bool char vbc = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
+ vector signed char vsc;
+ int a = 3;
+
+ vec_dst(buf, a, 1);
+ vec_dstst(buf, a, 2);
+ vec_dststt(buf, a, 3);
+ vec_dststt(buf, a, 2);
+
+ vp = vec_sld(vp, vp, 5);
+ vbc = vec_splat(vbc, 7);
+ vbs = vec_splat(vbs, 12);
+ vp = vec_splat(vp, 17);
+ vbi = vec_splat(vbi, 31);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-7.C
new file mode 100644
index 000000000..038335433
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-7.C
@@ -0,0 +1,36 @@
+/* Test for AltiVec type overloading and name mangling. */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+void foo(vector unsigned char) { }
+void foo(vector signed char) { }
+void foo(vector bool char) { }
+void foo(vector unsigned short) { }
+void foo(vector signed short) { }
+void foo(vector bool short) { }
+void foo(vector unsigned int) { }
+void foo(vector signed int) { }
+void foo(vector bool int) { }
+void foo(vector float) { }
+void foo(vector pixel) { }
+void foo(int) { }
+void foo(unsigned int) { }
+void foo(float) { }
+
+/* { dg-final { scan-assembler "_Z3fooDv16_h" } } */
+/* { dg-final { scan-assembler "_Z3fooDv16_a" } } */
+/* { dg-final { scan-assembler "_Z3fooDv16_U6__boolc" } } */
+/* { dg-final { scan-assembler "_Z3fooDv8_t" } } */
+/* { dg-final { scan-assembler "_Z3fooDv8_s" } } */
+/* { dg-final { scan-assembler "_Z3fooDv8_U6__bools" } } */
+/* { dg-final { scan-assembler "_Z3fooDv4_j" } } */
+/* { dg-final { scan-assembler "_Z3fooDv4_i" } } */
+/* { dg-final { scan-assembler "_Z3fooDv4_U6__booli" } } */
+/* { dg-final { scan-assembler "_Z3fooDv4_f" } } */
+/* { dg-final { scan-assembler "_Z3fooDv8_u7__pixel" } } */
+/* { dg-final { scan-assembler "_Z3fooi" } } */
+/* { dg-final { scan-assembler "_Z3fooj" } } */
+/* { dg-final { scan-assembler "_Z3foof" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-8.C
new file mode 100644
index 000000000..3c5a76e06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-8.C
@@ -0,0 +1,21 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* This test case exercises intrinsic/argument combinations that,
+ while not in the Motorola AltiVec PIM, have nevertheless crept
+ into the AltiVec vernacular over the years. */
+
+#include <altivec.h>
+
+void foo (void)
+{
+ vector bool int boolVec1 = (vector bool int) vec_splat_u32(3);
+ vector bool short boolVec2 = (vector bool short) vec_splat_u16(3);
+ vector bool char boolVec3 = (vector bool char) vec_splat_u8(3);
+
+ boolVec1 = vec_sld( boolVec1, boolVec1, 4 );
+ boolVec2 = vec_sld( boolVec2, boolVec2, 2 );
+ boolVec3 = vec_sld( boolVec3, boolVec3, 1 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-9.C
new file mode 100644
index 000000000..174ae63ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-9.C
@@ -0,0 +1,14 @@
+/* Test for AltiVec function vec_ld, passing a pointer to const vector */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+
+typedef vector unsigned char vuc_t;
+const vuc_t* p;
+vector unsigned char test_vec_ld()
+{
+ return vec_ld(0,p);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-1.C
new file mode 100644
index 000000000..16d311c3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-1.C
@@ -0,0 +1,94 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* Basic test for the new VMX intrinsics. */
+#include <altivec.h>
+
+int f(vector int a, int b)
+{
+ return vec_extract (a, b);
+}
+short f1(vector short a, int b)
+{
+ return vec_extract (a, b);
+}
+vector short f2(vector short a, int b)
+{
+ return vec_insert (b, a, b);
+}
+vector float f3(vector float a, int b)
+{
+ return vec_insert (b, a, b);
+}
+
+float g(void);
+
+vector float f4(float b, int t)
+{
+ return vec_promote (g(), t);
+}
+vector float f5(float b)
+{
+ return vec_splats (g());
+}
+
+
+
+
+template <int>
+int tf(vector int a, int b)
+{
+ return vec_extract (a, b);
+}
+template <int>
+short tf1(vector short a, int b)
+{
+ return vec_extract (a, b);
+}
+template <int>
+vector short tf2(vector short a, int b)
+{
+ return vec_insert (b, a, b);
+}
+template <int>
+vector float tf3(vector float a, int b)
+{
+ return vec_insert (b, a, b);
+}
+
+template <int>
+vector float tf4(float b, int t)
+{
+ return vec_promote (g(), t);
+}
+template <int>
+vector float tf5(float b)
+{
+ return vec_splats (g());
+}
+
+int t(vector int a, int b)
+{
+ return tf<1>(a, b);
+}
+short t1(vector short a, int b)
+{
+ return tf1<1>(a, b);
+}
+vector short t2(vector short a, int b)
+{
+ return tf2<1>(a, b);
+}
+vector float t3(vector float a, int b)
+{
+ return tf3<1>(a, b);
+}
+vector float t4(float b, int t)
+{
+ return tf4<1>(b, t);
+}
+vector float t5(float b)
+{
+ return tf5<1>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-2.C
new file mode 100644
index 000000000..f0d3433cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-2.C
@@ -0,0 +1,141 @@
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+/* Test the vec_extract VMX intrinsics. */
+#include <altivec.h>
+
+extern "C" void abort (void);
+
+vector int a = {0, 1, 2, 3};
+vector short b = {0, 1, 2, 3, 4, 5, 6, 7};
+
+int f(vector int a, int b)
+{
+ return vec_extract (a, b);
+}
+
+int f0 (vector int a)
+{
+ return vec_extract (a, 0);
+}
+int f1 (vector int a)
+{
+ return vec_extract (a, 1);
+}
+int f2 (vector int a)
+{
+ return vec_extract (a, 2);
+}
+int f3 (vector int a)
+{
+ return vec_extract (a, 3);
+}
+int f4 (vector int a)
+{
+ return vec_extract (a, 4);
+}
+
+int g(vector short a, int b)
+{
+ return vec_extract (a, b);
+}
+
+int g0 (vector short a)
+{
+ return vec_extract (a, 0);
+}
+int g1 (vector short a)
+{
+ return vec_extract (a, 1);
+}
+int g2 (vector short a)
+{
+ return vec_extract (a, 2);
+}
+int g3 (vector short a)
+{
+ return vec_extract (a, 3);
+}
+
+int g4 (vector short a)
+{
+ return vec_extract (a, 4);
+}
+int g5 (vector short a)
+{
+ return vec_extract (a, 5);
+}
+int g6 (vector short a)
+{
+ return vec_extract (a, 6);
+}
+int g7 (vector short a)
+{
+ return vec_extract (a, 7);
+}
+int g8 (vector short a)
+{
+ return vec_extract (a, 8);
+}
+int main1(void) __attribute__((noinline));
+int main1(void)
+{
+ int i;
+ /* Check vec_extract with a non constant element numbering */
+ for(i=0;i<10;i++)
+ {
+ if (f(a, i) != (i&0x3))
+ abort ();
+ }
+
+ /* Check vec_extract with a constant element numbering */
+ if (f0(a) != 0)
+ abort ();
+ if (f1(a) != 1)
+ abort ();
+ if (f2(a) != 2)
+ abort ();
+ if (f3(a) != 3)
+ abort ();
+ /* Check that vec_extract works with a constant element higher than
+ the number of elements. */
+ if (f4(a) != 0)
+ abort ();
+
+ /* Check vec_extract with a non constant element numbering */
+ for(i=0;i<10;i++)
+ {
+ if (g(b, i) != (i&0x7))
+ abort ();
+ }
+
+ /* Check vec_extract with a constant element numbering */
+ if (g0(b) != 0)
+ abort ();
+ if (g1(b) != 1)
+ abort ();
+ if (g2(b) != 2)
+ abort ();
+ if (g3(b) != 3)
+ abort ();
+ if (g4(b) != 4)
+ abort ();
+ if (g5(b) != 5)
+ abort ();
+ if (g6(b) != 6)
+ abort ();
+ if (g7(b) != 7)
+ abort ();
+ /* Check that vec_extract works with a constant element higher than
+ the number of elements. */
+ if (g8(b) != 0)
+ abort ();
+
+ return 0;
+}
+
+int main(void)
+{
+ return main1 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-3.C
new file mode 100644
index 000000000..bd7e774e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-3.C
@@ -0,0 +1,37 @@
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+/* Test the vec_splats and vec_promote VMX intrinsics. */
+#include <altivec.h>
+
+extern "C" void abort (void);
+
+vector int a = {0, 0, 0, 0};
+int main1(int t) __attribute__((noinline));
+int main1(int t)
+{
+ int i;
+ vector int b = vec_splats(0);
+ if (__builtin_memcmp (&a, &b, sizeof(vector int)))
+ abort ();
+
+ b = vec_splats(t);
+ if (__builtin_memcmp (&a, &b, sizeof(vector int)))
+ abort ();
+
+ b = vec_promote(0, 1);
+ if (vec_extract (b, 1) != 0)
+ abort ();
+
+ b = vec_promote(t, t);
+ if (vec_extract (b, t) != 0)
+ abort ();
+
+ return 0;
+}
+
+int main(void)
+{
+ return main1 (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-4.C
new file mode 100644
index 000000000..7d91adbb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-4.C
@@ -0,0 +1,42 @@
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* Test the vec_splats and vec_promote VMX intrinsics. */
+#include <altivec.h>
+
+extern "C" void abort (void);
+
+vector int a[] = {{0, 0, 0, 0}, {1,0,0,0}, {1,2,0,0},{1,2,3,0},{1,2,3,4},{5,2,3,4},{5,6,3,4}};
+vector int c = {0,6,3,4};
+vector int d = {0,0,3,4};
+int main1(int t) __attribute__((noinline));
+int main1(int t)
+{
+ int i;
+ vector int b = vec_splats(0);
+ for(i = 0;i<sizeof(a)/sizeof(a[0])-1;i++)
+ {
+ if (__builtin_memcmp (&b, &a[i], sizeof(vector int)))
+ abort ();
+ b = vec_insert(i+1, b, i);
+ }
+ if (__builtin_memcmp (&b, &a[i], sizeof(vector int)))
+ abort ();
+
+ b = vec_insert(0, b, 0);
+ if (__builtin_memcmp (&b, &c, sizeof(vector int)))
+ abort ();
+
+ b = vec_insert(0, b, 1);
+ if (__builtin_memcmp (&b, &d, sizeof(vector int)))
+ abort ();
+
+ return 0;
+}
+
+int main(void)
+{
+ return main1 (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-5.C
new file mode 100644
index 000000000..95f109d1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-cell-5.C
@@ -0,0 +1,25 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec" } */
+
+/* Basic test for the new VMX intrinsics and error messages. */
+#include <altivec.h>
+
+int main(int argc, char **argv)
+{
+vector float t;
+ vec_promote(); /* { dg-error "vec_promote only accepts 2" } */
+ vec_promote(1.0f); /* { dg-error "vec_promote only accepts 2" } */
+ vec_promote(1.0f, 2, 3); /* { dg-error "vec_promote only accepts 2" } */
+ vec_extract (); /* { dg-error "vec_extract only accepts 2" } */
+ vec_extract (t); /* { dg-error "vec_extract only accepts 2" } */
+ vec_extract (t, 2);
+ vec_extract (t, 2, 5, 6); /* { dg-error "vec_extract only accepts 2" } */
+ vec_splats (); /* { dg-error "vec_splats only accepts 1" } */
+ vec_splats (t, 3); /* { dg-error "vec_splats only accepts 1" } */
+ vec_insert (); /* { dg-error "vec_insert only accepts 3" } */
+ vec_insert (t); /* { dg-error "vec_insert only accepts 3" } */
+ vec_insert (t, 3); /* { dg-error "vec_insert only accepts 3" } */
+ vec_insert (t, 3, 2, 4, 6, 6); /* { dg-error "vec_insert only accepts 3" } */
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-1.C
new file mode 100644
index 000000000..f54aeec46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-1.C
@@ -0,0 +1,88 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -mno-vsx -std=c++98" } */
+
+/* Valid AltiVec vector types should be accepted with no warnings. */
+
+__vector char vc;
+__vector unsigned char vuc;
+__vector signed char vsc;
+__vector __bool char vbc;
+__vector short vh;
+__vector signed short vsh;
+__vector unsigned short vuh;
+__vector short int vhi;
+__vector signed short int vshi;
+__vector unsigned short int vuhi;
+__vector __bool short vbh;
+__vector __bool short int vbhi;
+__vector int vi;
+__vector unsigned int vui;
+__vector signed int vsi;
+__vector __bool int vbi;
+__vector unsigned vuj;
+__vector signed vsj;
+__vector __bool vbj;
+__vector float vf;
+
+/* These should be rejected as invalid AltiVec types. */
+
+__vector bool vb; /* { dg-error "AltiVec types" "" } */
+__vector long long vll; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long vull; /* { dg-error "AltiVec types" "" } */
+__vector signed long long vsll; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long vbll; /* { dg-error "AltiVec types" "" } */
+__vector long long int vlli; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long int vulli; /* { dg-error "AltiVec types" "" } */
+__vector signed long long int vslli; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long int vblli; /* { dg-error "AltiVec types" "" } */
+__vector double vd1; /* { dg-error "AltiVec types" "" } */
+__vector long double vld; /* { dg-error "AltiVec types" "" } */
+__vector _Complex float vcf; /* { dg-error "AltiVec types" "" } */
+__vector _Complex double vcd; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long double vcld; /* { dg-error "AltiVec types" "" } */
+__vector _Complex signed char vcsc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned char vcuc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex short vcss; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned short vcus; /* { dg-error "AltiVec types" "" } */
+__vector _Complex int vcsi; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned int vcui; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long vcsl; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long vcul; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long long vcsll; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long long vcull; /* { dg-error "AltiVec types" "" } */
+__vector __complex float v_cf; /* { dg-error "AltiVec types" "" } */
+__vector __complex double v_cd; /* { dg-error "AltiVec types" "" } */
+__vector __complex long double v_cld; /* { dg-error "AltiVec types" "" } */
+__vector __complex signed char v_csc; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned char v_cuc; /* { dg-error "AltiVec types" "" } */
+__vector __complex short v_css; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned short v_cus; /* { dg-error "AltiVec types" "" } */
+__vector __complex int v_csi; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned int v_cui; /* { dg-error "AltiVec types" "" } */
+__vector __complex long v_csl; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long v_cul; /* { dg-error "AltiVec types" "" } */
+__vector __complex long long v_csll; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long long v_cull; /* { dg-error "AltiVec types" "" } */
+
+/* These should be rejected because the component types are invalid. We
+ don't care about the actual error messages here. */
+
+__vector __bool unsigned char vbuc; /* { dg-error "" "" } */
+__vector __bool signed char vbsc; /* { dg-error "" "" } */
+__vector __bool unsigned short vbuh; /* { dg-error "" "" } */
+__vector __bool signed short vbsh; /* { dg-error "" "" } */
+__vector __bool unsigned int vbui; /* { dg-error "" "" } */
+__vector __bool signed int vbsi; /* { dg-error "" "" } */
+__vector __bool unsigned vbuj; /* { dg-error "" "" } */
+__vector __bool signed vbsj; /* { dg-error "" "" } */
+__vector signed float vsf; /* { dg-error "" "" } */
+__vector unsigned float vuf; /* { dg-error "" "" } */
+__vector short float vsf; /* { dg-error "" "" } */
+__vector signed double vsd; /* { dg-error "" "" } */
+__vector unsigned double vud; /* { dg-error "" "" } */
+__vector short double vsd; /* { dg-error "" "" } */
+__vector __bool float vbf; /* { dg-error "" "" } */
+__vector __bool double vbd; /* { dg-error "" "" } */
+__vector __bool short float blf; /* { dg-error "" "" } */
+__vector __bool short double vlbd; /* { dg-error "" "" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-2.C
new file mode 100644
index 000000000..cee6c8f26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-2.C
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -mno-vsx" } */
+
+/* These should get warnings for 32-bit code. */
+
+__vector long vl; /* { dg-warning "deprecated" "" } */
+__vector unsigned long vul; /* { dg-warning "deprecated" "" } */
+__vector signed long vsl; /* { dg-warning "deprecated" "" } */
+__vector __bool long int vbli; /* { dg-warning "deprecated" "" } */
+__vector long int vli; /* { dg-warning "deprecated" "" } */
+__vector unsigned long int vuli; /* { dg-warning "deprecated" "" } */
+__vector signed long int vsli; /* { dg-warning "deprecated" "" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-3.C
new file mode 100644
index 000000000..6bea9a145
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-3.C
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-maltivec -mno-vsx" } */
+
+/* These should be rejected for 64-bit code. */
+
+__vector long vl; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long vul; /* { dg-error "invalid for 64" "" } */
+__vector signed long vsl; /* { dg-error "invalid for 64" "" } */
+__vector __bool long int vbli; /* { dg-error "invalid for 64" "" } */
+__vector long int vli; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long int vuli; /* { dg-error "invalid for 64" "" } */
+__vector signed long int vsli; /* { dg-error "invalid for 64" "" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-4.C
new file mode 100644
index 000000000..b937f3cf1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-types-4.C
@@ -0,0 +1,15 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -mno-vsx -mno-warn-altivec-long" } */
+
+/* These should not get warnings for 32-bit code when the warning is
+ disabled. */
+
+__vector long vl;
+__vector unsigned long vul;
+__vector signed long vsl;
+__vector __bool long int vbli;
+__vector long int vli;
+__vector unsigned long int vuli;
+__vector signed long int vsli;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-1.C
new file mode 100644
index 000000000..284fd17a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-1.C
@@ -0,0 +1,26 @@
+// { dg-options "-O0" }
+// { dg-do compile }
+// PR C++/34715
+
+
+namespace X
+{
+ template <class T>
+ const T& min(const T& a, const T& b);
+
+ template <class T>
+ inline __attribute__ ((always_inline)) const T& min(const T& a, const T& b)
+ {
+ return a < b ? a : b;
+ }
+}
+template <class T>
+inline __attribute__ ((always_inline)) T y(const T& a, const T& b)
+{
+ return X::min(a, b);
+}
+int main()
+{
+ int a = 0, b = 0;
+ return y(a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-2.C
new file mode 100644
index 000000000..31123c192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-2.C
@@ -0,0 +1,26 @@
+// { dg-options "-O0" }
+// { dg-do compile }
+// PR C++/34715
+
+
+namespace X
+{
+ template <class T>
+ const T& min123(const T& a, const T& b);
+}
+
+
+template <class T>
+inline __attribute__ ((always_inline)) const T& X::min123(const T& a, const T& b)
+{
+ return a < b ? a : b;
+}
+int main()
+{
+ int a, b;
+ return X::min123(a, b);
+}
+
+
+
+// { dg-final { scan-assembler-not "min123" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-3.C
new file mode 100644
index 000000000..e008932bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-3.C
@@ -0,0 +1,26 @@
+// { dg-options "-O0" }
+// { dg-do compile }
+// PR C++/34715
+
+
+namespace X
+{
+ template <class T>
+ inline __attribute__ ((always_inline)) const T& min123(const T& a, const T& b);
+}
+
+
+template <class T>
+inline __attribute__ ((always_inline)) const T& X::min123(const T& a, const T& b)
+{
+ return a < b ? a : b;
+}
+int main()
+{
+ int a, b;
+ return X::min123(a, b);
+}
+
+
+
+// { dg-final { scan-assembler-not "min123" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-4.C
new file mode 100644
index 000000000..e95076193
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-4.C
@@ -0,0 +1,20 @@
+// { dg-options "-O0" }
+// { dg-do compile }
+// PR C++/34715
+
+ template <class T>
+ const T& min123(const T& a, const T& b);
+template <class T>
+inline __attribute__ ((always_inline)) const T&
+min123(const T& a, const T& b)
+{
+ return a < b ? a : b;
+}
+int main()
+{
+ int a, b;
+ return min123(a, b);
+}
+
+
+// { dg-final { scan-assembler-not "min123" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-5.C
new file mode 100644
index 000000000..73caa094f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/always_inline-5.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+struct f
+{
+ inline f(void);
+ inline void f1(void);
+ int a;
+};
+
+inline __attribute__((always_inline)) f::f(void)
+{
+ a++;
+}
+
+inline __attribute__((always_inline)) void f::f1(void)
+{
+ a++;
+}
+
+void g(void)
+{
+ f a, b, c, d;
+ a.f1();
+}
+
+// f::f() should be inlined even at -O0
+// { dg-final { scan-assembler-not "_ZN1fC1Ev" } }
+// Likewise for f::f1()
+// { dg-final { scan-assembler-not "_ZN1f2f1Ev" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct1.C
new file mode 100644
index 000000000..0a682db1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct1.C
@@ -0,0 +1,50 @@
+/* { dg-options "-ansi -pedantic -pedantic-errors" } */
+/* In strict ISO C++ mode, we don't recognize the anonymous struct
+ extension or any Microsoft C extensions. */
+
+struct A { char a; };
+
+struct B {
+ struct A; /* forward decl of B::A. */
+ char b;
+};
+char testB[sizeof(B) == sizeof(A) ? 1 : -1];
+
+struct C {
+ struct D { char d; }; /* decl of C::D. */
+ char c;
+};
+char testC[sizeof(C) == sizeof(A) ? 1 : -1];
+char testD[sizeof(C::D) == sizeof(A) ? 1 : -1];
+
+/* GNU extension. */
+struct E {
+ struct { char z; }; /* { dg-error "prohibits anonymous structs" } */
+ char e;
+};
+
+typedef struct A typedef_A;
+struct F {
+ typedef_A; /* { dg-error "does not declare anything" } */
+ char f;
+};
+char testF[sizeof(struct F) == sizeof(struct A) ? 1 : -1];
+
+/* __extension__ enables GNU C mode for the duration of the declaration. */
+__extension__ struct G {
+ struct { char z; };
+ char g;
+};
+char testG[sizeof(G) == 2 * sizeof(A) ? 1 : -1];
+
+struct H {
+ __extension__ struct { char z; };
+ char h;
+};
+char testH[sizeof(H) == 2 * sizeof(A) ? 1 : -1];
+
+/* Make sure __extension__ gets turned back off. */
+struct I {
+ struct { char z; }; /* { dg-error "prohibits anonymous structs" } */
+ char i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct2.C
new file mode 100644
index 000000000..0c629ed48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct2.C
@@ -0,0 +1,46 @@
+/* { dg-options "" } */
+/* In GNU C++ mode, we recognize the anonymous struct extension,
+ but not Microsoft C extensions. */
+
+struct A { char a; };
+
+struct B {
+ struct A; /* forward decl of B::A. */
+ char b;
+};
+char testB[sizeof(B) == sizeof(A) ? 1 : -1];
+
+struct C {
+ struct D { char d; }; /* decl of C::D. */
+ char c;
+};
+char testC[sizeof(C) == sizeof(A) ? 1 : -1];
+char testD[sizeof(C::D) == sizeof(A) ? 1 : -1];
+
+/* GNU extension. */
+struct E {
+ struct { char z; };
+ char e;
+};
+char testE[sizeof(E) == 2 * sizeof(A) ? 1 : -1];
+char testEz[sizeof( ((E *)0)->z )];
+
+typedef struct A typedef_A;
+struct F {
+ typedef_A; /* { dg-error "does not declare anything" } */
+ char f;
+};
+char testF[sizeof(F) == sizeof(A) ? 1 : -1];
+
+/* Test that __extension__ does the right thing coming _from_ GNU C mode. */
+__extension__ struct G {
+ struct { char z; };
+ char g;
+};
+char testG[sizeof(G) == 2 * sizeof(A) ? 1 : -1];
+
+struct H {
+ struct { char z; };
+ char h;
+};
+char testH[sizeof(H) == 2 * sizeof(A) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct3.C
new file mode 100644
index 000000000..1460d6c12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct3.C
@@ -0,0 +1,34 @@
+/* { dg-options "-fms-extensions" } */
+/* Verify that enabling Microsoft mode doesn't twist C++ as much as
+ their corresponding C extensions. Checked vs
+ Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
+ */
+
+struct A { char a; };
+
+struct B {
+ struct A; /* forward decl of B::A. */
+ char b;
+};
+char testB[sizeof(B) == sizeof(A) ? 1 : -1];
+
+struct C {
+ struct D { char d; }; /* decl of C::D. */
+ char c;
+};
+char testC[sizeof(C) == sizeof(A) ? 1 : -1];
+char testD[sizeof(C::D) == sizeof(A) ? 1 : -1];
+
+struct E {
+ struct { char z; };
+ char e;
+};
+char testE[sizeof(E) == 2 * sizeof(A) ? 1 : -1];
+char testEz[sizeof( ((E *)0)->z )];
+
+typedef struct A typedef_A;
+struct F {
+ typedef_A; /* { dg-error "does not declare anything" } */
+ char f;
+};
+char testF[sizeof(F) == sizeof(A) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct4.C
new file mode 100644
index 000000000..0097ba124
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct4.C
@@ -0,0 +1,5 @@
+// PR c++/14401
+
+struct { struct { int& i ; } bar ; } foo ; // { dg-error "deleted|uninitialized" "uninit" }
+// { dg-warning "anonymous" "anon" { target { ! c++11 } } 3 }
+// { dg-message "should be initialized" "ref-uninit" { target { ! c++11 } } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct5.C
new file mode 100644
index 000000000..ec022251c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct5.C
@@ -0,0 +1,13 @@
+// PR c++/30302
+
+struct A
+{
+ struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct|unnamed class" }
+ void foo() { i; }
+};
+
+struct B
+{
+ union { static int i; }; // { dg-error "an anonymous union|member of a union|unnamed class" }
+ void foo() { i; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct6.C
new file mode 100644
index 000000000..66d4b3271
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/anon-struct6.C
@@ -0,0 +1,10 @@
+// PR c++/33460
+
+struct A
+{
+ struct
+ { // { dg-error "anonymous struct cannot have function members" }
+ struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members|unnamed class" }
+ void foo() { i; }
+ }; // { dg-error "prohibits anonymous structs" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C
new file mode 100644
index 000000000..0c601e68c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C
@@ -0,0 +1,5 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do run { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee" } */
+
+#include "arm-fp16-ops.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C
new file mode 100644
index 000000000..244e31082
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C
@@ -0,0 +1,5 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do run { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee -ffast-math" } */
+
+#include "arm-fp16-ops.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C
new file mode 100644
index 000000000..8f9ab64bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C
@@ -0,0 +1,5 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do run { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=alternative" } */
+
+#include "arm-fp16-ops.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C
new file mode 100644
index 000000000..4877f392c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C
@@ -0,0 +1,5 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do run { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=alternative -ffast-math" } */
+
+#include "arm-fp16-ops.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C
new file mode 100644
index 000000000..92bc8a9c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C
@@ -0,0 +1,15 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-require-effective-target arm_fp16_ok } */
+/* { dg-options "-mfp16-format=ieee" } */
+/* { dg-add-options arm_fp16 } */
+
+#include "arm-fp16-ops.h"
+
+/* We've specified options for hardware float, including fp16 support, so
+ we should not see any calls to libfuncs here. */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C
new file mode 100644
index 000000000..ae40b1e86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C
@@ -0,0 +1,15 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-require-effective-target arm_fp16_ok } */
+/* { dg-options "-mfp16-format=ieee -ffast-math" } */
+/* { dg-add-options arm_fp16 } */
+
+#include "arm-fp16-ops.h"
+
+/* We've specified options for hardware float, including fp16 support, so
+ we should not see any calls to libfuncs here. */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C
new file mode 100644
index 000000000..ed8089bd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C
@@ -0,0 +1,13 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-options "-mfp16-format=ieee" } */
+/* { dg-add-options arm_neon } */
+
+#include "arm-fp16-ops.h"
+
+/* We've specified options for hardware float, so we should not see any
+ calls to libfuncs here except for those to the conversion functions. */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C
new file mode 100644
index 000000000..b138ca187
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C
@@ -0,0 +1,13 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-options "-mfp16-format=ieee -ffast-math" } */
+/* { dg-add-options arm_neon } */
+
+#include "arm-fp16-ops.h"
+
+/* We've specified options for hardware float, so we should not see any
+ calls to libfuncs here except for those to the conversion functions. */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
+/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h
new file mode 100644
index 000000000..320494ee7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h
@@ -0,0 +1,135 @@
+/* Test various operators on __fp16 and mixed __fp16/float operands. */
+
+#include <assert.h>
+
+#define CHECK(e,r) assert ((e) == r)
+#define CHECK2(e,r) (assert ((e) == r), temp = (e), assert (temp == r))
+#define TEST(e) assert (e)
+#define TESTNOT(e) assert (!(e))
+
+volatile __fp16 h0 = 0.0;
+volatile __fp16 h1 = 1.0;
+volatile __fp16 h42 = 42.0;
+volatile __fp16 hm2 = -2.0;
+volatile __fp16 temp;
+
+volatile float f0 = 0.0;
+volatile float f1 = 1.0;
+volatile float f42 = 42.0;
+volatile float fm2 = -2.0;
+
+int main (void)
+{
+ TEST (h1);
+ TESTNOT (h0);
+ TEST (!h0);
+ TESTNOT (!h1);
+
+ CHECK2 (-h1, -1.0);
+ CHECK2 (+h1, 1.0);
+
+ CHECK (h1++, 1.0);
+ CHECK (h1, 2.0);
+ CHECK (++h1, 3.0);
+ CHECK (h1, 3.0);
+
+ CHECK (--h1, 2.0);
+ CHECK (h1, 2.0);
+ CHECK (h1--, 2.0);
+ CHECK (h1, 1.0);
+
+ CHECK2 (h42 * hm2, -84.0);
+ CHECK2 (h42 * (__fp16) -2.0, -84.0);
+ CHECK2 (h42 * fm2, -84.0);
+ CHECK2 (f42 * hm2, -84.0);
+
+ CHECK2 (h42 / hm2, -21.0);
+ CHECK2 (h42 / (__fp16) -2.0, -21.0);
+ CHECK2 (h42 / fm2, -21.0);
+ CHECK2 (f42 / hm2, -21.0);
+
+ CHECK2 (hm2 + h42, 40.0);
+ CHECK2 ((__fp16)-2.0 + h42, 40.0);
+ CHECK2 (hm2 + f42, 40.0);
+ CHECK2 (fm2 + h42, 40.0);
+
+ CHECK2 (hm2 - h42, -44.0);
+ CHECK2 ((__fp16)-2.0 - h42, -44.0);
+ CHECK2 (hm2 - f42, -44.0);
+ CHECK2 (fm2 - h42, -44.0);
+
+ TEST (hm2 < h42);
+ TEST (hm2 < (__fp16)42.0);
+ TEST (hm2 < f42);
+ TEST (fm2 < h42);
+
+ TEST (h42 > hm2);
+ TEST ((__fp16)42.0 > hm2);
+ TEST (h42 > fm2);
+ TEST (f42 > hm2);
+
+ TEST (hm2 <= h42);
+ TEST (hm2 <= (__fp16)42.0);
+ TEST (hm2 <= f42);
+ TEST (fm2 <= h42);
+
+ TEST (h42 >= hm2);
+ TEST (h42 >= (__fp16)-2.0);
+ TEST (h42 >= fm2);
+ TEST (f42 >= hm2);
+
+ TESTNOT (h1 == hm2);
+ TEST (h1 == h1);
+ TEST (h1 == (__fp16)1.0);
+ TEST (h1 == f1);
+ TEST (f1 == h1);
+
+ TEST (h1 != hm2);
+ TESTNOT (h1 != h1);
+ TESTNOT (h1 != (__fp16)1.0);
+ TESTNOT (h1 != f1);
+ TESTNOT (f1 != h1);
+
+ CHECK2 ((h1 ? hm2 : h42), -2.0);
+ CHECK2 ((h0 ? hm2 : h42), 42.0);
+
+ CHECK (h0 = h42, 42.0);
+ CHECK (h0, 42.0);
+ CHECK (h0 = (__fp16)-2.0, -2.0);
+ CHECK (h0, -2.0);
+ CHECK (h0 = f0, 0.0);
+ CHECK (h0, 0.0);
+
+ CHECK (h0 += h1, 1.0);
+ CHECK (h0, 1.0);
+ CHECK (h0 += (__fp16)1.0, 2.0);
+ CHECK (h0, 2.0);
+ CHECK (h0 += fm2, 0.0);
+ CHECK (h0, 0.0);
+
+ CHECK (h0 -= h1, -1.0);
+ CHECK (h0, -1.0);
+ CHECK (h0 -= (__fp16)1.0, -2.0);
+ CHECK (h0, -2.0);
+ CHECK (h0 -= fm2, 0.0);
+ CHECK (h0, 0.0);
+
+ h0 = hm2;
+ CHECK (h0 *= hm2, 4.0);
+ CHECK (h0, 4.0);
+ CHECK (h0 *= (__fp16)-2.0, -8.0);
+ CHECK (h0, -8.0);
+ CHECK (h0 *= fm2, 16.0);
+ CHECK (h0, 16.0);
+
+ CHECK (h0 /= hm2, -8.0);
+ CHECK (h0, -8.0);
+ CHECK (h0 /= (__fp16)-2.0, 4.0);
+ CHECK (h0, 4.0);
+ CHECK (h0 /= fm2, -2.0);
+ CHECK (h0, -2.0);
+
+ CHECK ((h0, h1), 1.0);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C
new file mode 100644
index 000000000..25a872af6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C
@@ -0,0 +1,14 @@
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee" } */
+
+/* Test mangling */
+
+/* { dg-final { scan-assembler "\t.global\t_Z1fPDh" } } */
+void f (__fp16 *x) { }
+
+/* { dg-final { scan-assembler "\t.global\t_Z1gPDhS_" } } */
+void g (__fp16 *x, __fp16 *y) { }
+
+/* { dg-final { scan-assembler "\t.global\t_ZN1SIDhDhE1iE" } } */
+template <typename T, typename U> struct S { static int i; };
+template <> int S<__fp16, __fp16>::i = 3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C
new file mode 100644
index 000000000..bf0139d7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C
@@ -0,0 +1,16 @@
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee" } */
+
+/* __fp16 values are autoconverted to float and should therefore be treated
+ * just like float for overloading purposes. */
+
+extern int frobnify (float x);
+extern int frobnify (double x);
+
+int g (void)
+{
+ return frobnify ((__fp16)1.0);
+}
+
+/* { dg-final { scan-assembler "_Z8frobnifyf" } } */
+/* { dg-final { scan-assembler-not " _Z8frobnifyd" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C
new file mode 100644
index 000000000..03feb1a4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee" } */
+
+/* Functions cannot have parameters of type __fp16. */
+extern void f (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
+extern void (*pf) (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
+
+/* These should be OK. */
+extern void g (__fp16 *);
+extern void (*pg) (__fp16 *);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C
new file mode 100644
index 000000000..406dfacd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-options "-mfp16-format=ieee" } */
+
+/* Functions cannot return type __fp16. */
+extern __fp16 f (void); /* { dg-error "cannot return __fp16" } */
+extern __fp16 (*pf) (void); /* { dg-error "cannot return __fp16" } */
+
+/* These should be OK. */
+extern __fp16 *g (void);
+extern __fp16 *(*pg) (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/array1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/array1.C
new file mode 100644
index 000000000..7e54dc919
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/array1.C
@@ -0,0 +1,14 @@
+// PR c++/13574
+// { dg-options "" }
+
+class A {
+public:
+ A() : argc(0), argv() { };
+private:
+ int argc;
+ char* argv[];
+};
+
+int main() {
+ A y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/array2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/array2.C
new file mode 100644
index 000000000..2d645ca94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/array2.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Avoid -pedantic-error default
+// { dg-options "" }
+
+// PR 19989 - dependent array of size 0 fails to compile.
+
+template<int I> struct A
+{
+ static const int zero = 0;
+};
+
+template<int N> struct B
+{
+ int x[A<N>::zero];
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm1.C
new file mode 100644
index 000000000..dd4aede24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm1.C
@@ -0,0 +1,56 @@
+// Check that the 3.1 named operand syntax can be used in template functions.
+
+struct arg1 {
+ int value;
+ static const int info = 99;
+};
+
+struct arg2 {
+ int value;
+ static const int info = 11;
+};
+
+template<int j>
+int foo (void)
+{
+ int i;
+ asm ("# foo on %[third] %[second] %[fourth] %[first]"
+ : [first] "=r" (i)
+ : [second] "i" (j),
+ [third] "i" (j + 2),
+ [fourth] "i" (100));
+ return i;
+}
+
+template<class TYPE>
+TYPE bar (TYPE t)
+{
+ asm ("# bar on %[first] %[second] %[third]"
+ : [first] "=r" (t.value)
+ : [second] "i[first]" (t.value),
+ [third] "i" (t.info));
+ return t;
+}
+
+template<class TYPE>
+struct S {
+ static void frob (TYPE t)
+ {
+ asm ("# frob on %[arg]" :: [arg] "i" (t.info));
+ }
+};
+
+void test ()
+{
+ arg1 x;
+ arg2 y;
+
+ foo<42> ();
+ bar (x);
+ bar (y);
+ S<arg1>::frob (x);
+}
+
+// { dg-final { scan-assembler "foo on" } }
+// { dg-final { scan-assembler "bar on" } }
+// { dg-final { scan-assembler "frob on" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm10.C
new file mode 100644
index 000000000..b95027c8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm10.C
@@ -0,0 +1,14 @@
+// PR inline-asm/32109
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A { int i[3]; ~A (); };
+struct A a;
+struct B { struct A c; int i; B (); } b;
+
+B::B ()
+{
+ __asm ("" : : "r" (a)); // { dg-error "impossible constraint|non-memory input" }
+ __asm ("" : : "r" (b.c)); // { dg-error "impossible constraint|non-memory input" }
+ __asm ("" : : "r" (c)); // { dg-error "impossible constraint|non-memory input" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm11.C
new file mode 100644
index 000000000..7939aacc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm11.C
@@ -0,0 +1,20 @@
+// PR c/37772
+// { dg-do compile }
+// { dg-options "" }
+
+void
+foo ()
+{
+ int i;
+ asm (); // { dg-error "expected string-literal before" }
+ asm (1); // { dg-error "expected string-literal before" }
+ asm (int); // { dg-error "expected string-literal before" }
+ asm (: "=r" (i)); // { dg-error "expected string-literal before" }
+ asm (1 : "=r" (i)); // { dg-error "expected string-literal before" }
+ asm (int : "=r" (i)); // { dg-error "expected string-literal before" }
+ asm (: : "r" (i)); // { dg-error "expected string-literal before" }
+ asm (1 : : "r" (i)); // { dg-error "expected string-literal before" }
+ asm (int : : "r" (i)); // { dg-error "expected string-literal before" }
+ asm (: : : "memory"); // { dg-error "expected string-literal before" }
+ asm (1 : : : "memory"); // { dg-error "expected string-literal before" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm12.C
new file mode 100644
index 000000000..9823a8fd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm12.C
@@ -0,0 +1,14 @@
+// PR c++/55619
+// { dg-do compile }
+
+typedef int V __attribute__ ((vector_size (4 * sizeof (int))));
+
+static const V C = { 0x201, 0, 0, 0 };
+static const int D = 0x201;
+
+void
+f ()
+{
+ __asm volatile ("" : : "m" (C));
+ __asm volatile ("" : : "m" (D));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm2.C
new file mode 100644
index 000000000..6cec382c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm2.C
@@ -0,0 +1,12 @@
+// Bug: in a template, we forgot that this was a simple asm, and decided
+// that %edi was a malformed operand specifier.
+
+template <class T> class I {
+public:
+ void f() { asm ("# mov %edi, %esi" ); }
+};
+
+int main () {
+ I<int> x;
+ x.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm3.C
new file mode 100644
index 000000000..090218fe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm3.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7015. ICE with asms
+
+int two(int in)
+{
+ register int out;
+ __asm__ ("" : "r" (out) : "r" (in));
+ return out;
+}
+
+// { dg-message "error:" "" { target *-*-* } 11 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm4.C
new file mode 100644
index 000000000..2726d8e42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm4.C
@@ -0,0 +1,4 @@
+void f ()
+{
+ __asm__ __volatile__ ("" : : );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm5.C
new file mode 100644
index 000000000..9395395ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm5.C
@@ -0,0 +1,35 @@
+void f (int i)
+{
+ __asm__("" : );
+ __asm__("" : "+g" (i));
+
+ __asm__("" :: );
+ __asm__("" :: "g" (i));
+
+ __asm__("" : : );
+ __asm__("" : "+g" (i) : );
+ __asm__("" : : "g" (i));
+ __asm__("" : "+g" (i) : "g" (i));
+
+ __asm__("" ::: );
+ __asm__("" ::: "memory");
+
+ __asm__("" : :: );
+ __asm__("" : "+g" (i) :: );
+ __asm__("" : :: "memory");
+ __asm__("" : "+g" (i) :: "memory");
+
+ __asm__("" :: : );
+ __asm__("" :: "g" (i) : );
+ __asm__("" :: : "memory");
+ __asm__("" :: "g" (i) : "memory");
+
+ __asm__("" : : : );
+ __asm__("" : "+g" (i) : : );
+ __asm__("" : : "g" (i) : );
+ __asm__("" : : : "memory");
+ __asm__("" : "+g" (i) : "g" (i) : );
+ __asm__("" : "+g" (i) : : "memory");
+ __asm__("" : : "g" (i) : "memory");
+ __asm__("" : "+g" (i) : "g" (i) : "memory");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm6.C
new file mode 100644
index 000000000..96ef9d385
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm6.C
@@ -0,0 +1,11 @@
+struct A
+{
+ ~A();
+};
+int foo(A);
+void bar()
+{
+ A a;
+ asm("" : : "r"(foo(a)) );//<-- cleanup needed here.
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm7.C
new file mode 100644
index 000000000..a5cad0073
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm7.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+const int i = 0;
+
+void f(void)
+{
+ __asm__ __volatile__ ("" : "=m" (i)); /* { dg-error "read-only variable" } */
+}
+
+void g(const int set)
+{
+ __asm__ __volatile__ ("" : "=r" (set)); /* { dg-error "read-only parameter" } */
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm8.C
new file mode 100644
index 000000000..0b1be7da7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm8.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+/* Test that asm with no outputs are treated as volatile. */
+
+void f(int x)
+{
+ __asm__ ("extended asm not discarded" : : "r" (x));
+}
+
+void g (void)
+{
+ __asm__ ("simple asm not discarded");
+}
+/* { dg-final { scan-assembler "extended asm not discarded" } } */
+/* { dg-final { scan-assembler "simple asm not discarded" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asm9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm9.C
new file mode 100644
index 000000000..9daa01bbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asm9.C
@@ -0,0 +1,7 @@
+// PR 27451
+// { dg-do compile }
+
+void foo()
+{
+ asm("" ::: X); // { dg-error "before" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asmgoto1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmgoto1.C
new file mode 100644
index 000000000..dda516797
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmgoto1.C
@@ -0,0 +1,32 @@
+// PR middle-end/44102
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void baz (void);
+struct A { A (); ~A (); };
+
+static inline int
+foo (void)
+{
+ asm goto ("" : : : : l1, l2);
+ __builtin_unreachable ();
+ l1:
+ return 1;
+ l2:
+ return 0;
+}
+
+int
+bar (int x)
+{
+ if (x == 5)
+ {
+ A a, b;
+ baz ();
+ }
+ if (foo () || x == 6)
+ x = 1;
+ else
+ x = 2;
+ return x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspec1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspec1.C
new file mode 100644
index 000000000..0661136fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspec1.C
@@ -0,0 +1,8 @@
+// PR c++/28343
+// { dg-do compile }
+
+struct A
+{
+ int i __asm__(int); // { dg-error "expected" }
+ static int j __asm__(int); // { dg-error "expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecInvalid.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecInvalid.C
new file mode 100644
index 000000000..4c528a0f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecInvalid.C
@@ -0,0 +1,18 @@
+// tests that the asm directive is correctly handled for static fields
+// in structures and classes. This only applies to C++; such
+// directives generate errors in C. Assembler directives for local
+// variables should be tested by the C test suite.
+//
+// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003
+
+// { dg-do compile }
+
+struct Foo {
+ // This should reference a variable called bar
+ int i __asm__("bar"); /* { dg-error "specifiers are not permitted" } */
+};
+
+int main (void ) {
+ int j = 0;
+ return j;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecValid.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecValid.C
new file mode 100644
index 000000000..98d98b46f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/asmspecValid.C
@@ -0,0 +1,43 @@
+// tests that the asm directive is correctly handled for static fields
+// in structures and classes. This only applies to C++; such
+// directives generate errors in C. Assembler directives for local
+// variables should be tested by the C test suite.
+//
+// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003
+
+// { dg-do compile }
+
+struct Foo {
+ // This should reference a variable called bar
+ static int i __asm__("bar");
+};
+
+
+class Bar {
+public:
+ static int i __asm__("theRealI");
+ static int j __asm__("theRealJ");
+ int boof;
+};
+
+class Baz : public Bar {
+public:
+ static char *ptr __asm__ ("theRealString");
+};
+
+int main (int argc, char **argv) {
+ struct Foo myFoo;
+ Bar b;
+ myFoo.i = 1;
+ Foo::i = 2;
+ Baz::j = 10;
+ Baz::ptr = 0;
+ b.i = 1;
+ return (b.i);
+}
+
+
+/* { dg-final {scan-assembler "bar"} } */
+/* { dg-final {scan-assembler "theRealString"} } */
+/* { dg-final {scan-assembler "theRealI" } } */
+/* { dg-final {scan-assembler "theRealJ" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/atomic-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/atomic-1.C
new file mode 100644
index 000000000..58069c309
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/atomic-1.C
@@ -0,0 +1,12 @@
+// PR c++/52215
+// { dg-do compile }
+
+enum E { ZERO };
+
+int
+main ()
+{
+ E e = ZERO;
+ __atomic_compare_exchange_n (&e, &e, e, true, __ATOMIC_ACQ_REL,
+ __ATOMIC_RELAXED);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-1.C
new file mode 100644
index 000000000..1427267e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-1.C
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-require-alias "" } */
+
+#include <typeinfo>
+
+struct Klass
+{
+ int implementation () const;
+ int magic () const;
+};
+
+int Klass::implementation (void) const
+{
+ return 0;
+}
+
+int Klass::magic () const
+ __attribute__ ((alias ("_ZNK5Klass14implementationEv")));
+
+int __attribute__ ((noinline))
+ Foo (Klass const *ptr)
+{
+ if (ptr->magic () != 0)
+ return 1;
+
+ if (typeid (*ptr) != typeid (Klass))
+ return 2;
+
+ return 0;
+}
+
+int main ()
+{
+ Klass obj;
+
+ return Foo (&obj);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-2.C
new file mode 100644
index 000000000..61a132f77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-2.C
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-require-alias "" } */
+
+#include <typeinfo>
+
+struct Klass
+{
+ int implementation () const;
+ virtual int magic () const;
+};
+
+int Klass::implementation (void) const
+{
+ return 0;
+}
+
+int Klass::magic () const
+ __attribute__ ((alias ("_ZNK5Klass14implementationEv")));
+
+int __attribute__ ((noinline))
+ Foo (Klass const *ptr)
+{
+ if (ptr->magic () != 0)
+ return 1;
+
+ if (typeid (*ptr) != typeid (Klass))
+ return 2;
+
+ return 0;
+}
+
+int main ()
+{
+ Klass obj;
+
+ return Foo (&obj);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-3.C
new file mode 100644
index 000000000..7f6aa2cbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-alias-3.C
@@ -0,0 +1,8 @@
+// PR c++/56134
+// { dg-require-alias "" }
+
+char a;
+class Q
+{
+ static char q __attribute__ ((alias ("a")));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-aligned01.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-aligned01.C
new file mode 100644
index 000000000..c8ec07d51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-aligned01.C
@@ -0,0 +1,25 @@
+// PR c++/48138
+
+#define ALIGNED(x) __attribute__((aligned(x)))
+#define SA(X) int ar[(X)?1:-1];
+
+template<typename T>
+void type_alignment(const T&) {
+ struct { char c; T t; } s;
+ SA((char*)&s.t - (char*)&s.c == 1);
+}
+
+template <class T> struct A { char c; T t; };
+
+int main() {
+ typedef char unaligned[15];
+ typedef char aligned[15] ALIGNED(8);
+
+ A<aligned> a; // { dg-warning "ignoring attributes" }
+
+ SA((char*)&a.t - (char*)&a.c == 1);
+
+ aligned z;
+ type_alignment(z); // { dg-warning "ignoring attributes" "" { xfail *-*-* } }
+ type_alignment<unaligned ALIGNED(8)>(z); // { dg-warning "ignoring attributes" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C
new file mode 100644
index 000000000..d41fa7d32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-Wno-pmf-conversions" } */
+
+#include <stdio.h>
+
+struct Klass
+{
+ int implementation ();
+ int magic ();
+ static void *resolver ();
+};
+
+int Klass::implementation (void)
+{
+ printf ("'ere I am JH\n");
+ return 0;
+}
+
+void *Klass::resolver (void)
+{
+ int (Klass::*pmf) () = &Klass::implementation;
+
+ return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf);
+}
+
+int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv")));
+
+int main ()
+{
+ Klass obj;
+
+ return obj.magic () != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C
new file mode 100644
index 000000000..e205a2a6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-Wno-pmf-conversions" } */
+
+#include <stdio.h>
+
+struct Klass
+{
+ int implementation ();
+ int magic ();
+ static void *resolver ();
+};
+
+int Klass::implementation (void)
+{
+ printf ("'ere I am JH\n");
+ return 0;
+}
+
+void *Klass::resolver (void)
+{
+ int (Klass::*pmf) () = &Klass::implementation;
+
+ return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf);
+}
+
+int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv")));
+
+struct Klassier : Klass
+{
+};
+
+int main ()
+{
+ Klassier obj;
+
+ return obj.magic () != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C
new file mode 100644
index 000000000..ba65976b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C
@@ -0,0 +1,39 @@
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-Wno-pmf-conversions" } */
+
+#include <stdio.h>
+
+struct Klass
+{
+ int implementation ();
+ int magic ();
+ static void *resolver ();
+};
+
+int Klass::implementation (void)
+{
+ printf ("'ere I am JH\n");
+ return 0;
+}
+
+void *Klass::resolver (void)
+{
+ int (Klass::*pmf) () = &Klass::implementation;
+
+ return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf);
+}
+
+int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv")));
+
+int Foo (Klass &obj, int (Klass::*pmf) ())
+{
+ return (obj.*pmf) ();
+}
+
+int main ()
+{
+ Klass obj;
+
+ return Foo (obj, &Klass::magic) != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C
new file mode 100644
index 000000000..0cae41028
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-Wno-pmf-conversions" } */
+
+#include <stdio.h>
+
+struct Klass
+{
+ virtual int magic () = 0;
+};
+
+struct Klassier : Klass
+{
+ int implementation ();
+ int magic ();
+ static void *resolver ();
+};
+
+int Klassier::implementation (void)
+{
+ printf ("'ere I am JH\n");
+ return 0;
+}
+
+void *Klassier::resolver (void)
+{
+ int (Klassier::*pmf) () = &Klassier::implementation;
+
+ return (void *)(int (*)(Klassier *))(((Klassier *)0)->*pmf);
+}
+
+int Klassier::magic (void) __attribute__ ((ifunc ("_ZN8Klassier8resolverEv")));
+
+int __attribute__ ((weak)) Foo (Klass &base)
+{
+ return base.magic ();
+}
+
+int main ()
+{
+ Klassier obj;
+
+ return Foo (obj) != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-used-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-used-1.C
new file mode 100644
index 000000000..6754c7ffb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attr-used-1.C
@@ -0,0 +1,17 @@
+// Attribute used on a member function or static data member
+// of a template should cause them to be instantiated along
+// with the class itself.
+
+// { dg-final { scan-assembler "_ZN1AIiE1fEv" } }
+// { dg-final { scan-assembler "_ZN1AIiE1tE" } }
+
+template <class T> struct A
+{
+ void f() __attribute ((used));
+ static T t __attribute ((used));
+};
+
+template <class T> void A<T>::f() { }
+template <class T> T A<T>::t;
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib1.C
new file mode 100644
index 000000000..2bd69e82a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib1.C
@@ -0,0 +1,10 @@
+// Test for interpretation of attribute immediately before function name.
+// Origin: Joseph Myers <jsm28@cam.ac.uk>
+// { dg-do compile }
+
+// An attribute immediately before the function name should in this
+// case properly apply to the return type, but compatibility with
+// existing code using this form requires it to apply to the function
+// type instead in the case of attributes applying to function types,
+// and to the declaration in the case of attributes applying to declarations.
+int ****__attribute__((format(printf, 1, 2))) foo(const char *, ...);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib10.C
new file mode 100644
index 000000000..42d967dde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib10.C
@@ -0,0 +1,8 @@
+// PR c++/12795
+// { dg-require-alias "" }
+
+void foo()
+{
+ extern void bar () __attribute__ ((__alias__ ("BAR"))); // { dg-warning "ignored" }
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib11.C
new file mode 100644
index 000000000..26bc7907c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib11.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Dec 2003 <nathan@codesourcery.com>
+
+
+// PR c++/13507, spurious warning due to attribute clobbering
+extern "C" {
+ extern int printf (__const char *__restrict __format, ...) throw ();
+ extern int scanf (__const char *__restrict __format, ...) throw ();
+}
+
+void foo(unsigned int x)
+{
+ printf ("%d\n", x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib12.C
new file mode 100644
index 000000000..aea93781d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib12.C
@@ -0,0 +1,16 @@
+// PR c++/13791
+
+template <typename T> struct O {
+ struct __attribute__((packed)) I {
+ int i;
+ char c;
+ };
+
+ I* foo();
+};
+
+template <typename T>
+typename O<T>::I*
+O<T>::foo() { return 0; }
+
+template class O<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib13.C
new file mode 100644
index 000000000..22ea97ae7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib13.C
@@ -0,0 +1,4 @@
+// PR c++/13854
+
+extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__));
+extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib14.C
new file mode 100644
index 000000000..ebe0456d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib14.C
@@ -0,0 +1,13 @@
+// PR c++/13170
+// The bogus attribute is ignored, but was in TYPE_ATTRIBUTES during
+// parsing of the class, causing some variants to have it and some not.
+
+struct __attribute__((bogus)) A // { dg-warning "ignored" "" }
+{
+ virtual ~A();
+ void foo(const A&);
+ void bar(const A&);
+};
+
+void A::foo(const A&) {}
+void A::bar(const A& a) { foo(a); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib15.C
new file mode 100644
index 000000000..05de12cce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib15.C
@@ -0,0 +1,9 @@
+// PR c++/15317
+
+struct A
+{
+ A(char);
+};
+A::A(__attribute__((unused)) char i2)
+{}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib16.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib16.C
new file mode 100644
index 000000000..2e73fca70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib16.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// Origin: <rguenth at tat dot physik dot uni-tuebingen dot de>
+// PR c++/10479: use of non dependent expressions in attributes in templates
+
+template <int i>
+struct foo2 {
+ float bar __attribute__((aligned(__alignof__(double))));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib17.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib17.C
new file mode 100644
index 000000000..43cf264f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib17.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org>
+// PR c++/17743: Attributes applied to typedefs.
+
+struct A {
+ typedef char layout_type[sizeof(double)]
+ __attribute__((aligned(__alignof__(double))));
+ layout_type data;
+};
+
+struct B {
+ typedef char layout_type[sizeof(double)];
+ layout_type data __attribute__((aligned(__alignof__(double))));
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof__(A) == __alignof__(B)> a1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib18.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib18.C
new file mode 100644
index 000000000..ab9fea095
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib18.C
@@ -0,0 +1,10 @@
+// PR c++/17542
+// Test that we warn when an attribute preceding the class-key is ignored.
+// { dg-do compile }
+
+__attribute__ ((packed)) struct A // { dg-warning "attribute" }
+{
+ char c;
+ int x;
+ void f();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib19.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib19.C
new file mode 100644
index 000000000..f1362c3b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib19.C
@@ -0,0 +1,10 @@
+// PR c++/19739
+
+void Dummy() __attribute__(( , ));
+void Dummy() {}
+
+int main (int argc, char **argv)
+{
+ Dummy();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib2.C
new file mode 100644
index 000000000..a7563f388
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib2.C
@@ -0,0 +1,12 @@
+// Test that an early attribute doesn't confuse uses of a class.
+// { dg-do compile }
+
+struct __attribute__ ((packed)) A
+{
+ void f () const;
+};
+
+void
+A::f () const
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib20.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib20.C
new file mode 100644
index 000000000..25b27f307
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib20.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-g" }
+// Origin: <jan at etpmod dot phys dot tue dot nl>
+// PR c++/19508: avoid attributes for template parameters
+
+template <typename T>
+struct BVector
+{
+ typedef T T2;
+ typedef T value_type __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" }
+ typedef T2 value_type2 __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" }
+ value_type v;
+};
+BVector<int> m;
+
+template <template <class> class T>
+struct BV2
+{
+ typedef T<float> value_type __attribute__((aligned(8))); // { dg-bogus "attribute" "attribute" }
+ value_type v;
+};
+BV2<BVector> m2;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib21.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib21.C
new file mode 100644
index 000000000..2fc5800b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib21.C
@@ -0,0 +1,17 @@
+// PR c++/20763
+
+typedef void *voidp;
+
+struct S
+{
+ char a;
+ voidp __attribute__ ((aligned (16))) b;
+};
+
+struct T
+{
+ char a;
+ void *__attribute__ ((aligned (16))) b;
+};
+
+int f[sizeof (struct S) != sizeof (struct T) ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib22.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib22.C
new file mode 100644
index 000000000..5304a35d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib22.C
@@ -0,0 +1,6 @@
+// PR c++/27648
+
+void f()
+{
+ static_cast<float *__attribute((unused))>(0); // { dg-error "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib23.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib23.C
new file mode 100644
index 000000000..0a2c58689
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib23.C
@@ -0,0 +1,11 @@
+// PR c++/28112
+// { dg-do compile }
+
+int i __attribute__((init_priority(;))); // { dg-error "before" }
+int j __attribute__((vector_size(;))); // { dg-error "before" }
+int k __attribute__((visibility(;))); // { dg-error "before" }
+struct A {} __attribute__((aligned(;))); // { dg-error "before" }
+struct B {} __attribute__((mode(;))); // { dg-error "before" }
+void foo() __attribute__((alias(;))); // { dg-error "before" }
+void bar() __attribute__((nonnull(;))); // { dg-error "before" }
+void baz() __attribute__((section(;))); // { dg-error "before" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib24.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib24.C
new file mode 100644
index 000000000..208809a3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib24.C
@@ -0,0 +1,4 @@
+// PR c++/28387
+// { dg-do compile }
+
+enum __attribute__((unused)) E; // { dg-error "without previous declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib25.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib25.C
new file mode 100644
index 000000000..aeffdffe3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib25.C
@@ -0,0 +1,11 @@
+// PR c++/28559
+
+template<typename T> struct A
+{
+ struct B;
+};
+
+struct C
+{
+ template<typename T> friend struct __attribute__((packed)) A<T>::B; // { dg-warning "uninstantiated" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib26.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib26.C
new file mode 100644
index 000000000..dedf43a02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib26.C
@@ -0,0 +1,14 @@
+// PR c++/28659
+// The attribute was causing us to get confused in merge_types when
+// combining the template type with an uninstantiated version.
+
+template<class T>
+struct __attribute__((aligned(1))) A
+{
+ A& operator=(const A &t);
+};
+
+template<class T>
+A<T>& A<T>::operator=(const A<T> &t)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib27.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib27.C
new file mode 100644
index 000000000..b770c1c44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib27.C
@@ -0,0 +1,5 @@
+//PR c++/29980
+
+struct A { typedef int X; }; // { dg-message "previous declaration" }
+
+struct __attribute__((unused)) A::X; // { dg-error "typedef-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib28.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib28.C
new file mode 100644
index 000000000..2f18d4184
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib28.C
@@ -0,0 +1,12 @@
+// PR c++/28558
+// { dg-options "" }
+
+struct A
+{
+ A(int) { }
+};
+
+int main()
+{
+ A a = (A __attribute__((unused)))0; // { dg-warning "attribute" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib29.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib29.C
new file mode 100644
index 000000000..710a5ce27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib29.C
@@ -0,0 +1,10 @@
+// PR c++/33506
+// { dg-do compile }
+
+extern int f1 (char *) __attribute__ ((warn_unused_result));
+extern int f2 (char *) throw () __attribute__ ((warn_unused_result));
+extern int f2 (char *) throw ();
+
+extern int f3 (char *) __attribute__ ((nonnull (1)));
+extern int f4 (char *) throw () __attribute__ ((nonnull (1)));
+extern int f4 (char *) throw ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib3.C
new file mode 100644
index 000000000..17a904c09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib3.C
@@ -0,0 +1,21 @@
+// Test that attributes work in a variety of situations.
+// { dg-options -O }
+// { dg-do run }
+
+#define attrib __attribute ((mode (QI)))
+
+attrib signed int a; // attributes before type are broken
+static attrib unsigned int b;
+
+int foo(attrib int o) // attribute arguments are broken
+{
+ return (sizeof (a) != 1
+ || sizeof (b) != 1
+ || sizeof (o) != 1
+ || sizeof ((attrib signed int) b) != 1);
+}
+
+int main ()
+{
+ return foo (42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib30.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib30.C
new file mode 100644
index 000000000..fd2826a60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib30.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR c++/35074
+template<typename T> struct A
+{
+ void foo() const;
+} __attribute((aligned(4)));
+
+template<typename T> void A<T>::foo() const {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib31.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib31.C
new file mode 100644
index 000000000..c614ed4f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib31.C
@@ -0,0 +1,15 @@
+// PR c++/35097
+
+template<int> struct A;
+
+template<> struct A<0>
+{
+ typedef int X __attribute((aligned(4)));
+};
+
+template<typename T> void foo(const A<0>::X&, T);
+
+void bar()
+{
+ foo(A<0>::X(), 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib32.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib32.C
new file mode 100644
index 000000000..31a92b8f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib32.C
@@ -0,0 +1,36 @@
+// PR c++/35315
+
+typedef union { int i; } U __attribute__((transparent_union));
+
+static void foo(U) {}
+static void foo(int) {}
+
+void bar()
+{
+ foo(0);
+}
+
+typedef union U1 { int i; } U2 __attribute__((transparent_union)); // { dg-warning "ignored" }
+
+static void foo2(U1) {} // { dg-message "previously defined" }
+static void foo2(U2) {} // { dg-error "redefinition" }
+
+void bar2(U1 u1, U2 u2)
+{
+ foo2(u1);
+ foo2(u2);
+}
+
+// PR c++/36410
+struct A
+{
+ typedef union
+ {
+ int i;
+ } B __attribute__((transparent_union));
+};
+
+void foo(A::B b)
+{
+ b.i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib33.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib33.C
new file mode 100644
index 000000000..55bfc4cad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib33.C
@@ -0,0 +1,19 @@
+// PR c++/35546
+// { dg-do compile }
+// { dg-options "-g" }
+
+template <int N>
+struct T
+{
+ void foo (char const * ...) __attribute__ ((format (printf,2,3)));
+};
+
+template struct T<3>;
+
+template <typename T>
+struct U
+{
+ typedef T __attribute__((mode (SI))) V;
+};
+
+U<int>::V v;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib34.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib34.C
new file mode 100644
index 000000000..f4794143d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib34.C
@@ -0,0 +1,19 @@
+// PR c/37171
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+unsigned int f1 () __attribute__((const));
+unsigned int f2 () __attribute__((__const));
+unsigned int f3 () __attribute__((__const__));
+
+unsigned int f4 ()
+{
+ return f1 () + f1 () + f1 () + f1 ()
+ + f2 () + f2 () + f2 () + f2 ()
+ + f3 () + f3 () + f3 () + f3 ();
+}
+
+// { dg-final { scan-tree-dump-times "= f1 \\(\\)" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "= f2 \\(\\)" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "= f3 \\(\\)" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib35.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib35.C
new file mode 100644
index 000000000..e60a59dff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib35.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O3 -msse2" }
+// { dg-require-effective-target sse2 }
+
+// You can make NON-template typedefs with a large alignment.
+typedef double AlignedDoubleType __attribute__((aligned(16)));
+
+template <typename RealType>
+RealType f(const RealType* p)
+{
+ // But if you use a template parameter it complains.
+ typedef RealType AlignedRealType __attribute__((aligned(16)));
+
+ return p[0];
+}
+
+double f2(const double* p)
+{
+ return f<double>(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib36.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib36.C
new file mode 100644
index 000000000..625ffe6bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib36.C
@@ -0,0 +1,20 @@
+// PR c++/43031
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+class T;
+class L { };
+class P : public L
+{
+ typedef void (__attribute__((__stdcall__)) T::*F) (L*);
+ void f(bool aAdd);
+};
+class T
+{
+public:
+ virtual void __attribute__((__stdcall__)) A(L *listener) = 0;
+ virtual void __attribute__((__stdcall__)) R(L *listener) = 0;
+};
+void P::f(bool aAdd)
+{
+ F addRemoveEventListener = (aAdd ? &T::A : &T::R);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib37.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib37.C
new file mode 100644
index 000000000..5aacac62c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib37.C
@@ -0,0 +1,14 @@
+// PR c++/43093
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+struct S {
+ int x;
+ S(const S &s) {}
+};
+
+S __attribute__((__stdcall__)) getS();
+
+void test()
+{
+ S s = getS();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib38.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib38.C
new file mode 100644
index 000000000..be3c7f2ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib38.C
@@ -0,0 +1,11 @@
+// PR c++/36625
+
+template <int N>
+struct A {
+ struct S { short f[3]; } __attribute__ ((aligned (N)));
+};
+
+int main ()
+{
+ A<4>::S s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib39.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib39.C
new file mode 100644
index 000000000..22a742942
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib39.C
@@ -0,0 +1,9 @@
+// PR debug/43370
+// { dg-options "-g" }
+
+int fragile_block(void) {
+ typedef __attribute__ ((aligned (16))) struct {
+ int i;
+ } XmmUint16;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib4.C
new file mode 100644
index 000000000..68cc74155
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib4.C
@@ -0,0 +1,31 @@
+// Test for syntax support of various attribute permutations.
+
+int
+__attribute__((noreturn))
+__attribute__((unused))
+one(void); // OK
+
+__attribute__((noreturn))
+__attribute__((unused))
+int
+two(void); // OK
+
+int
+__attribute__((unused))
+three (void)
+__attribute__((noreturn)); // OK
+
+__attribute__((unused))
+int
+four (void)
+__attribute__((noreturn)); // OK
+
+int
+five(void)
+__attribute__((noreturn))
+__attribute__((unused)); // OK
+
+__attribute__((noreturn))
+int
+__attribute__((unused)) // parse error before '__attribute__' in C++
+six (void); // OK in C
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib40.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib40.C
new file mode 100644
index 000000000..9c3f76159
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib40.C
@@ -0,0 +1,4 @@
+// PR c++/46803
+
+int strftime(char *, int, const char *, const struct tm *)
+ __attribute__ ((__bounded__(__string__,1,2))); // { dg-warning "ignored" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib41.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib41.C
new file mode 100644
index 000000000..368554a1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib41.C
@@ -0,0 +1,19 @@
+// PR c++/45267
+// { dg-options "-O" }
+
+template<typename T> struct Vector {
+ Vector(long long x);
+ inline Vector<T> operator<<(int x) const __attribute__((always_inline));
+};
+long long bar (long long);
+template<> inline Vector<int> Vector<int>::operator<<(int x) const {
+ return bar(x);
+}
+bool b;
+int main() {
+ Vector<int> a(1);
+ if ((a << 2), b) {
+ a << 2;
+ throw 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib42.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib42.C
new file mode 100644
index 000000000..d0c7ad723
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib42.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target { i?86-*-* && ilp32 } } }
+
+struct A {
+ __attribute__((fastcall))
+ void f();
+};
+
+int main()
+{
+ typedef void (A::*FP)();
+ FP fp[] = {&A::f}; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib43.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib43.C
new file mode 100644
index 000000000..acae3f23c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib43.C
@@ -0,0 +1,5 @@
+template <class T> struct A { };
+
+template
+__attribute__ ((packed))
+struct A<int>; // { dg-warning "attribute" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib44.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib44.C
new file mode 100644
index 000000000..cb83653f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib44.C
@@ -0,0 +1,4 @@
+// PR c++/52671
+// { dg-do compile }
+__attribute__ ((deprecated)) enum E { E0 }; // { dg-warning "attribute ignored in declaration of" "ignored" }
+// { dg-message "must follow the" "must follow" { target *-*-* } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib45.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib45.C
new file mode 100644
index 000000000..0be1322ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib45.C
@@ -0,0 +1,3 @@
+// PR c++/52906
+
+__attribute__ ((__deprecated__)); // { dg-error "does not declare anything" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib46.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib46.C
new file mode 100644
index 000000000..1c71990fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib46.C
@@ -0,0 +1,4 @@
+// PR c++/40821
+
+struct __attribute__((aligned(8)) S1 { int i; }; // { dg-error "expected" }
+struct __attribute__( aligned(8) S2 { int i; }; // { dg-error "expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib47.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib47.C
new file mode 100644
index 000000000..22f49084b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib47.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class A
+{
+ public:
+ template <class T>
+ T foo(T a) __attribute__ ((noinline));
+};
+
+template <class T>
+ T A::foo(T a)
+ {
+ return a+1;
+ }
+
+int bar(A a) {
+ return a.foo(1);
+}
+
+// { dg-final { scan-assembler "_ZN1A3fooIiEET_S1_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib48.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib48.C
new file mode 100644
index 000000000..19a995910
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib48.C
@@ -0,0 +1,6 @@
+// PR c++/54652
+
+typedef unsigned L __attribute__ ((aligned));
+typedef unsigned L __attribute__ ((aligned));
+
+L l;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib5.C
new file mode 100644
index 000000000..f67510dab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib5.C
@@ -0,0 +1,21 @@
+// There were two related problems here, depending on the vintage. At
+// one time:
+//
+// typedef struct A { ... } A __attribute__ ((aligned (16)));
+//
+// would cause original_types to go into an infinite loop. At other
+// times, the attributes applied to an explicit typedef would be lost
+// (check_b3 would have a negative size).
+
+// First check that the declaration is accepted and has an effect.
+typedef struct A { int i; } A __attribute__ ((aligned (16)));
+int check_A[__alignof__ (A) >= 16 ? 1 : -1];
+
+// Check that the alignment is only applied to the typedef.
+struct B { int i; };
+struct B b1;
+typedef struct B B __attribute__((aligned (16)));
+struct B b2;
+B b3;
+int check_b1[__alignof__ (b1) == __alignof__ (b2) ? 1 : -1];
+int check_b3[__alignof__ (b3) >= 16 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib6.C
new file mode 100644
index 000000000..2bdb180d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib6.C
@@ -0,0 +1,21 @@
+// Copyright (C) 2002 Free Software Foundation.
+//
+// Test that the nothrow attribute is working correctly.
+//
+// Written by Richard Henderson, 26 May 2002.
+
+// { dg-do link }
+extern void foo() __attribute__((nothrow));
+extern void link_error();
+
+int main()
+{
+ try {
+ foo();
+ } catch (...) {
+ link_error();
+ }
+}
+
+void foo() { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib7.C
new file mode 100644
index 000000000..fa16fdd98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib7.C
@@ -0,0 +1,3 @@
+// { dg-options "-Wunused-parameter" }
+
+void f (int i __attribute__((__unused__))) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib8.C
new file mode 100644
index 000000000..130fe2587
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib8.C
@@ -0,0 +1,10 @@
+// PR 8656
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+extern int * (__attribute__((stdcall)) *fooPtr)( void);
+int * __attribute__((stdcall)) myFn01( void) { return 0; }
+
+void snafu( void)
+{
+ fooPtr = myFn01;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib9.C
new file mode 100644
index 000000000..6672f7525
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attrib9.C
@@ -0,0 +1,10 @@
+class __attribute__((unused)) C;
+struct __attribute__((unused)) S;
+union __attribute__((unused)) U;
+enum e {};
+enum __attribute__((unused)) e; // { dg-warning "already defined" }
+
+struct __attribute((unused)) B *p; // { dg-warning "attributes" }
+
+template <class T> struct A { };
+struct __attribute((unused)) A<int>; // { dg-warning "attributes" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-1.C
new file mode 100644
index 000000000..93e08d7ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-1.C
@@ -0,0 +1,39 @@
+// { dg-do run }
+// { dg-options "" }
+// PR c++/13989
+
+extern "C" void abort();
+
+#define vector __attribute__((vector_size(16)))
+
+struct Constants {
+ inline vector unsigned int deadbeef(void) const {
+ return (vector unsigned int){0xdeadbeef, 0xabababab, 0x55555555, 0x12345678};
+ };
+};
+
+inline vector unsigned int const_deadbeef(Constants &C)
+{
+ return C.deadbeef();
+}
+
+union u {
+ unsigned int f[4];
+ vector unsigned int v;
+} data;
+
+int main()
+{
+ Constants c;
+ data.v = const_deadbeef(c);
+
+ if (data.f[0] != 0xdeadbeef || data.f[1] != 0xabababab
+ || data.f[2] != 0x55555555 || data.f[3] != 0x12345678)
+ abort();
+
+ return 0;
+}
+
+/* Ignore a warning that is irrelevant to the purpose of this test. */
+/* { dg-prune-output ".*GCC vector returned by reference.*" } */
+/* { dg-prune-output "changes the ABI" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-2.C
new file mode 100644
index 000000000..d7c417dcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-2.C
@@ -0,0 +1,53 @@
+// { dg-do run }
+// { dg-options "-Wno-abi" }
+// PR c++/9844
+
+extern "C" void abort();
+
+#define vector __attribute__((vector_size(16)))
+
+class vector_holder
+{
+ char __attribute__((vector_size(16))) vec;
+ char __attribute__((vector_size(16))) vec1;
+public:
+ operator __attribute__((vector_size(16))) short (void) {
+ return (__attribute__((vector_size(16))) short) vec;
+ }
+
+ operator __attribute__((vector_size(16))) unsigned int (void) {
+ return (__attribute__((vector_size(16))) unsigned int) vec1;
+ }
+
+ vector_holder () {
+ vec = (__attribute__((vector_size(16))) char) {'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd',
+ 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'};
+ vec1 = (__attribute__((vector_size(16))) char) {'m', 'n', 'o', 'q', 'm', 'n', 'o', 'p',
+ 'm', 'n', 'o', 'q', 'm', 'n', 'o', 'p'};
+ }
+};
+
+union u {
+ char f[16];
+ vector unsigned int v;
+ vector short vs;
+} data;
+
+
+vector_holder vh;
+
+int main()
+{
+ data.vs = (__attribute__((vector_size(16))) short) vh;
+ if (data.f[0] != 'a' || data.f[15] != 'd')
+ abort();
+ data.v = (__attribute__((vector_size(16))) unsigned int) vh;
+ if (data.f[0] != 'm' || data.f[15] != 'p')
+ abort();
+
+ return 0;
+}
+
+/* Ignore a warning that is irrelevant to the purpose of this test. */
+/* { dg-prune-output ".*GCC vector returned by reference.*" } */
+/* { dg-prune-output "changes the ABI" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-3.C
new file mode 100644
index 000000000..4b0939ea3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-3.C
@@ -0,0 +1,55 @@
+// { dg-do run }
+
+#define vector __attribute__((vector_size(16)))
+
+extern "C" void abort();
+
+class Star
+{
+ public:
+ inline vector float foo() const;
+
+ Star()
+ {
+ data.f[0] = 1.0; data.f[1] = 2.0; data.f[2] = 3.0, data.f[3] = 4.0;
+ }
+
+ private:
+ union {
+ float f[4];
+ vector float v;
+ } data;
+
+ friend vector float fTest(const Star &);
+};
+
+vector float Star::foo() const
+{
+ return data.v;
+}
+
+vector float fTest(const Star & val)
+{
+ vector float vf = val.foo();
+ return vf;
+}
+
+int main() {
+
+ Star s;
+
+ union u {
+ float f[4];
+ vector float v;
+ } data;
+
+ data.v = fTest(s);
+ for (int i=0 ; i < 4; i++)
+ if (data.f[i] != (float)(i+1))
+ abort();
+ return 0;
+}
+
+/* Ignore a warning that is irrelevant to the purpose of this test. */
+/* { dg-prune-output ".*GCC vector returned by reference.*" } */
+/* { dg-prune-output "changes the ABI" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-4.C
new file mode 100644
index 000000000..c3e949a9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/attribute-test-4.C
@@ -0,0 +1,52 @@
+// { dg-do run }
+
+#define vector __attribute__((vector_size(16)))
+
+extern "C" void abort();
+
+union U {
+ float f[4];
+ vector float v;
+} data;
+
+class Star
+{
+ public:
+ static vector float foo();
+
+ Star()
+ {
+ data.f[0] = 1.0; data.f[1] = 2.0; data.f[2] = 3.0, data.f[3] = 4.0;
+ }
+
+ private:
+ friend vector float fTest();
+};
+
+vector float Star::foo()
+{
+ return data.v;
+}
+
+vector float fTest()
+{
+ vector float vf = Star::foo();
+ return vf;
+}
+
+int main() {
+
+ U data;
+ Star s;
+
+
+ data.v = fTest();
+ for (int i=0 ; i < 4; i++)
+ if (data.f[i] != (float)(i+1))
+ abort();
+ return 0;
+}
+
+/* Ignore a warning that is irrelevant to the purpose of this test. */
+/* { dg-prune-output ".*GCC vector returned by reference.*" } */
+/* { dg-prune-output "changes the ABI" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bases.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bases.C
new file mode 100644
index 000000000..43f71925d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bases.C
@@ -0,0 +1,35 @@
+// { dg-options "-w" }
+// { dg-do run { target c++11 } }
+
+#include<typeinfo>
+#include<cassert>
+
+// A simple typelist
+template<typename... _Elements> struct types {};
+
+// Simple bases implementation
+template<typename T> struct b {
+ typedef types<__bases(T)...> type;
+};
+
+// Simple direct_bases implementation
+template<typename T> struct db {
+ typedef types<__direct_bases(T)...> type;
+};
+
+template <class,class> struct assert_same_type;
+template <class T> struct assert_same_type<T,T> {};
+
+struct A {};
+struct C : virtual A {};
+struct D : public C {};
+struct B : D, virtual A {};
+struct E : C, virtual D, B {};
+struct F : A, B, E {};
+
+int main() {
+ assert_same_type<b<F>::type, types<A,C,D,A,C,D,B,C,C,D,B,E>>();
+ assert_same_type<db<F>::type, types<A,B,E>>();
+ assert_same_type<db<int>::type, types<>>();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield1.C
new file mode 100644
index 000000000..25c90df41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield1.C
@@ -0,0 +1,22 @@
+// PR c++/30328
+// { dg-do link }
+// { dg-options "" }
+
+struct S
+{
+ signed int a:17;
+} x;
+
+typedef typeof (x.a) foo;
+
+template <class T>
+T* inc(T* p) { return p+1; }
+
+int main ()
+{
+ foo x[2] = { 1,2 };
+ int y[2] = { 1,2 };
+ *inc(x);
+ *inc(y);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield2.C
new file mode 100644
index 000000000..09e0352f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield2.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* Remove pedantic. Allow the GCC extension to use char for bitfields. */
+/* { dg-options "" } */
+/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target { i?86-*-mingw* x86_64-*-mingw* } } } */
+
+struct t /* { dg-message "note: offset of packed bit-field 't::b' has changed in GCC 4.4" "" { target pcc_bitfield_type_matters } } */
+{
+ char a:4;
+ char b:8;
+ char c:4;
+} __attribute__ ((packed));
+
+int assrt[sizeof (struct t) == 2 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield3.C
new file mode 100644
index 000000000..75d290f00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield3.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-packed-bitfield-compat" } */
+/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target { i?86-*-mingw* x86_64-*-mingw* } } } */
+
+struct t
+{
+ char a:4;
+ char b:8;
+ char c:4;
+} __attribute__ ((packed));
+
+int assrt[sizeof (struct t) == 2 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield4.C
new file mode 100644
index 000000000..d707376e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield4.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target { i?86-*-mingw* x86_64-*-mingw* } } } */
+
+struct t /* { dg-message "note: offset of packed bit-field 't::b' has changed in GCC 4.4" "" { target pcc_bitfield_type_matters } } */
+{
+ char a:4;
+ char b:8 __attribute__ ((packed));
+ char c:4;
+};
+
+int assrt[sizeof (struct t) == 2 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield5.C
new file mode 100644
index 000000000..748669543
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/bitfield5.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-packed-bitfield-compat" } */
+/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target { i?86-*-mingw* x86_64-*-mingw* } } } */
+
+struct t
+{
+ char a:4;
+ char b:8 __attribute__ ((packed));
+ char c:4;
+};
+
+int assrt[sizeof (struct t) == 2 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/boolcomplex-1.c b/gcc-4.9/gcc/testsuite/g++.dg/ext/boolcomplex-1.c
new file mode 100644
index 000000000..d05d9bbd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/boolcomplex-1.c
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+bool b = --0i == 0; /* { dg-error "lvalue required as decrement operand" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-bswap1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-bswap1.C
new file mode 100644
index 000000000..787ecba43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-bswap1.C
@@ -0,0 +1,22 @@
+// PR c/37743
+// { dg-do compile }
+
+#if defined(__UINT32_TYPE__) && defined(__INT32_TYPE__)
+
+void foo (__UINT32_TYPE__);
+void foo (__INT32_TYPE__);
+
+void
+bar (__UINT32_TYPE__ x)
+{
+ foo (__builtin_bswap32 (x));
+}
+
+#else
+
+void
+bar ()
+{
+}
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-line1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-line1.C
new file mode 100644
index 000000000..21a4f59a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-line1.C
@@ -0,0 +1,17 @@
+// __builtin_LINE gets the location where the default argument is expanded.
+// { dg-do run }
+
+#include <cassert>
+struct Foo
+{
+ int line;
+ Foo( int line = __builtin_LINE() )
+ : line( line )
+ {}
+};
+
+int main()
+{
+ assert (Foo().line == __LINE__);
+ assert ((new Foo)->line == __LINE__);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size1.C
new file mode 100644
index 000000000..8590a0bbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size1.C
@@ -0,0 +1,435 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void abort ();
+extern "C" void exit (int);
+extern "C" void *malloc (size_t);
+extern "C" void free (void *);
+
+struct A
+{
+ char a[10];
+ int b;
+ char c[10];
+};
+
+void
+__attribute__ ((noinline))
+test1 (A *p)
+{
+ char *c;
+ if (__builtin_object_size (&p->a, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != (size_t) -1)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != (size_t) -1)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 1) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->b, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 2) != 0)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 3) != 0)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 3) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 3) != 0)
+ abort ();
+}
+
+void
+__attribute__ ((noinline))
+test2 (void)
+{
+ char *c;
+ size_t s = 2 * sizeof (A);
+ A *p = (A *) malloc (2 * sizeof (A));
+ if (__builtin_object_size (&p->a, 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 0) != s)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 0) != s)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 0) != s - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 1) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 1) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 2) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 2) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 2) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 2) != s)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 2) != s)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 2) != s - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 3) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 3) != s - __builtin_offsetof (A, c))
+ abort ();
+ free (p);
+}
+
+void
+__attribute__ ((noinline))
+test3 (void)
+{
+ char *c;
+ size_t s;
+ A *p = (A *) malloc (4);
+ if (__builtin_object_size (&p->a, 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != 1)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != 1)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != 0)
+ abort ();
+ free (p);
+ s = __builtin_offsetof (A, c) + 4;
+ p = (A *) malloc (s);
+ if (__builtin_object_size (&p->a, 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != 4)
+ abort ();
+ free (p);
+}
+
+struct B
+{
+ A a[4];
+};
+
+void
+__attribute__ ((noinline))
+test4 (struct B *q, int i)
+{
+ if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+}
+
+struct C
+{
+ char a[10];
+ char b;
+};
+
+void
+__attribute__ ((noinline))
+test5 (struct C *c)
+{
+ if (__builtin_object_size (&c->b, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&c->b, 1) != 1)
+ abort ();
+ if (__builtin_object_size (&c->b, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&c->b, 3) != 1)
+ abort ();
+}
+
+struct D
+{
+ int i;
+ struct D1
+ {
+ char b;
+ char a[10];
+ } j;
+};
+
+void
+__attribute__ ((noinline))
+test6 (struct D *d)
+{
+ if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3)
+ abort ();
+}
+
+struct E
+{
+ int i;
+ struct E1
+ {
+ char b;
+ char a[10];
+ } j[1];
+};
+
+void
+__attribute__ ((noinline))
+test7 (struct E *e)
+{
+ if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 2) != 0)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
+ abort ();
+}
+
+union F
+{
+ char a[1];
+ struct F1
+ {
+ char b;
+ char c[10];
+ } d;
+};
+
+void
+__attribute__ ((noinline))
+test8 (union F *f)
+{
+ if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 3) != 0)
+ abort ();
+}
+
+int
+main (void)
+{
+ A a, *p = &a;
+ int i = 1;
+ __asm ("" : "+r" (p));
+ test1 (p);
+ test2 ();
+ test3 ();
+ struct B b, *q = &b;
+ __asm ("" : "+r" (q), "+r" (i));
+ test4 (q, i);
+ struct C c, *cp = &c;
+ __asm ("" : "+r" (cp));
+ test5 (cp);
+ struct D d, *dp = &d;
+ __asm ("" : "+r" (dp));
+ test6 (dp);
+ struct E e, *ep = &e;
+ __asm ("" : "+r" (ep));
+ test7 (ep);
+ union F f, *fp = &f;
+ __asm ("" : "+r" (fp));
+ test8 (fp);
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size2.C
new file mode 100644
index 000000000..d79b1b833
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size2.C
@@ -0,0 +1,438 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void abort ();
+extern "C" void exit (int);
+extern "C" void *malloc (size_t);
+extern "C" void free (void *);
+
+typedef struct A
+{
+ char a[10];
+ int b;
+ char c[10];
+ static int d;
+} AT;
+
+int A::d = 6;
+
+void
+__attribute__ ((noinline))
+test1 (A *p)
+{
+ char *c;
+ if (__builtin_object_size (&p->a, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != (size_t) -1)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != (size_t) -1)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 1) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&p->a, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->b, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 2) != 0)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 3) != 0)
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 3) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 3) != 0)
+ abort ();
+}
+
+void
+__attribute__ ((noinline))
+test2 (void)
+{
+ char *c;
+ size_t s = 2 * sizeof (A);
+ A *p = (A *) malloc (2 * sizeof (A));
+ if (__builtin_object_size (&p->a, 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 0) != s)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 0) != s)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 0) != s - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 1) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 1) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 1) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 2) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 2) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 2) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 2) != s)
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 2) != s)
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 2) != s - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, c))
+ abort ();
+ if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (A, c))
+ abort ();
+ c = p->a;
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[0];
+ if (__builtin_object_size (c, 3) != sizeof (p->a))
+ abort ();
+ c = &p->a[3];
+ if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
+ abort ();
+ c = (char *) &p->b;
+ if (__builtin_object_size (c, 3) != sizeof (p->b))
+ abort ();
+ c = (char *) &p->c;
+ if (__builtin_object_size (c, 3) != s - __builtin_offsetof (A, c))
+ abort ();
+ free (p);
+}
+
+void
+__attribute__ ((noinline))
+test3 (void)
+{
+ char *c;
+ size_t s;
+ A *p = (A *) malloc (4);
+ if (__builtin_object_size (&p->a, 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != 1)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != 0)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != 1)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != 0)
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != 0)
+ abort ();
+ free (p);
+ s = __builtin_offsetof (A, c) + 4;
+ p = (A *) malloc (s);
+ if (__builtin_object_size (&p->a, 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[0], 0) != s)
+ abort ();
+ if (__builtin_object_size (&p->a[3], 0) != s - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b))
+ abort ();
+ if (__builtin_object_size (&p->c, 0) != 4)
+ abort ();
+ if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
+ abort ();
+ if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
+ abort ();
+ if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
+ abort ();
+ if (__builtin_object_size (&p->c, 1) != 4)
+ abort ();
+ free (p);
+}
+
+struct B
+{
+ A a[4];
+};
+
+void
+__attribute__ ((noinline))
+test4 (struct B *q, int i)
+{
+ if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2)
+ abort ();
+ if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2)
+ abort ();
+}
+
+struct C
+{
+ char a[10];
+ char b;
+};
+
+void
+__attribute__ ((noinline))
+test5 (struct C *c)
+{
+ if (__builtin_object_size (&c->b, 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&c->b, 1) != 1)
+ abort ();
+ if (__builtin_object_size (&c->b, 2) != 0)
+ abort ();
+ if (__builtin_object_size (&c->b, 3) != 1)
+ abort ();
+}
+
+struct D
+{
+ int i;
+ struct D1
+ {
+ char b;
+ char a[10];
+ } j;
+};
+
+void
+__attribute__ ((noinline))
+test6 (struct D *d)
+{
+ if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3)
+ abort ();
+}
+
+struct E
+{
+ int i;
+ struct E1
+ {
+ char b;
+ char a[10];
+ } j[1];
+};
+
+void
+__attribute__ ((noinline))
+test7 (struct E *e)
+{
+ if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 2) != 0)
+ abort ();
+ if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
+ abort ();
+}
+
+union F
+{
+ char a[1];
+ struct F1
+ {
+ char b;
+ char c[10];
+ } d;
+};
+
+void
+__attribute__ ((noinline))
+test8 (union F *f)
+{
+ if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 2) != 0)
+ abort ();
+ if (__builtin_object_size (&f->d.c[3], 3) != 0)
+ abort ();
+}
+
+int
+main (void)
+{
+ A a, *p = &a;
+ int i = 1;
+ __asm ("" : "+r" (p));
+ test1 (p);
+ test2 ();
+ test3 ();
+ struct B b, *q = &b;
+ __asm ("" : "+r" (q), "+r" (i));
+ test4 (q, i);
+ struct C c, *cp = &c;
+ __asm ("" : "+r" (cp));
+ test5 (cp);
+ struct D d, *dp = &d;
+ __asm ("" : "+r" (dp));
+ test6 (dp);
+ struct E e, *ep = &e;
+ __asm ("" : "+r" (ep));
+ test7 (ep);
+ union F f, *fp = &f;
+ __asm ("" : "+r" (fp));
+ test8 (fp);
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size3.C
new file mode 100644
index 000000000..09263e587
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-object-size3.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void baz (int *, int *);
+
+#define MEMCPY(d,s,l) __builtin___memcpy_chk (d, s, l, __builtin_object_size (d, 0))
+
+int
+foo ()
+{
+ int *p = new int;
+ int *q = new int[4];
+ MEMCPY (p, "abcdefghijklmnopqrstuvwxyz", sizeof (int));
+ MEMCPY (q, "abcdefghijklmnopqrstuvwxyz", 4 * sizeof (int));
+ baz (p, q);
+}
+
+int
+bar ()
+{
+ int *p = new int;
+ int *q = new int[4];
+ MEMCPY (p, "abcdefghijklmnopqrstuvwxyz", sizeof (int) + 1); // { dg-warning "will always overflow destination buffer" }
+ MEMCPY (q, "abcdefghijklmnopqrstuvwxyz", 4 * sizeof (int) + 1); // { dg-warning "will always overflow destination buffer" }
+ baz (p, q);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C
new file mode 100644
index 000000000..5c5e9cf24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C
@@ -0,0 +1,9 @@
+// PR c++/51413
+// { dg-options "-w" }
+
+struct A
+{
+ static void foo();
+};
+
+int i = __builtin_offsetof(A, foo[1]); // { dg-error "neither a single identifier nor a sequence of member accesses and array references" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin1.C
new file mode 100644
index 000000000..9947c85bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin1.C
@@ -0,0 +1,10 @@
+// Test whether alternate 'asm' name is applied correctly to
+// builtin in global namespace
+
+// { dg-do compile }
+// { dg-options "" }
+// { dg-final { scan-assembler "fancy_printf" } }
+
+extern "C" int printf(const char*, ...) __asm("_fancy_printf");
+
+void foo() { printf("abc"); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin10.C
new file mode 100644
index 000000000..8742223a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin10.C
@@ -0,0 +1,56 @@
+// { dg-do compile { target correct_iso_cpp_string_wchar_protos } }
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+#include <cstring>
+
+const void *cv1;
+const char *cc1, *cc2, *cc3, *cc4;
+void *v1;
+char *c1, *c2, *c3, *c4;
+
+void
+f1 (void)
+{
+ cv1 = memchr ("abcba", 'b', 3);
+ cc1 = strchr ("abcba", 'b');
+ cc2 = strrchr ("abcba", 'b');
+ cc3 = strpbrk ("dabc", "abc");
+ cc4 = strstr ("aaabc", "abc");
+}
+
+void
+f2 (void)
+{
+ cv1 = std::memchr ("abcba", 'b', 3);
+ cc1 = std::strchr ("abcba", 'b');
+ cc2 = std::strrchr ("abcba", 'b');
+ cc3 = std::strpbrk ("dabc", "abc");
+ cc4 = std::strstr ("aaabc", "abc");
+}
+
+void
+f3 (void)
+{
+ v1 = memchr ((char *)"abcba", 'b', 3);
+ c1 = strchr ((char *)"abcba", 'b');
+ c2 = strrchr ((char *)"abcba", 'b');
+ c3 = strpbrk ((char *)"dabc", "abc");
+ c4 = strstr ((char *)"aaabc", "abc");
+}
+
+void
+f4 (void)
+{
+ v1 = std::memchr ((char *)"abcba", 'b', 3);
+ c1 = std::strchr ((char *)"abcba", 'b');
+ c2 = std::strrchr ((char *)"abcba", 'b');
+ c3 = std::strpbrk ((char *)"dabc", "abc");
+ c4 = std::strstr ((char *)"aaabc", "abc");
+}
+
+// { dg-final { scan-tree-dump-not "memchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strrchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strpbrk" "optimized" } }
+// { dg-final { scan-tree-dump-not "strstr" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin11.C
new file mode 100644
index 000000000..2749671fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin11.C
@@ -0,0 +1,9 @@
+// PR c++/40138
+// { dg-options "-Wall" }
+
+void foo(int i, ...)
+{
+ V v; // { dg-error "not declared|expected" }
+ __builtin_va_start(v, i); // { dg-error "not declared" }
+ i = __builtin_va_arg(v, int);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin2.C
new file mode 100644
index 000000000..ffa25285b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin2.C
@@ -0,0 +1,13 @@
+// PR c++/18514
+// Test whether alternate 'asm' name is applied correctly to
+// builtin imported into namespace std.
+
+// { dg-do compile }
+// { dg-options "" }
+// { dg-final { scan-assembler "fancy_printf" } }
+
+extern "C" int printf(const char*, ...) __asm("_fancy_printf");
+
+namespace std { using ::printf; }
+
+namespace std { void foo() { printf("abc"); } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin3.C
new file mode 100644
index 000000000..001d5f784
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin3.C
@@ -0,0 +1,14 @@
+// Verify that declaring builtin in namespace std doesn't give us
+// declaration in global namespace
+
+// { dg-do compile }
+// { dg-options "" }
+
+namespace std {
+extern "C" int printf(char*, ...); // { dg-message "std::printf" }
+}
+
+void foo() {
+ printf("abc"); // { dg-error "not declared" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 12 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin30.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin30.C
new file mode 100644
index 000000000..d0a75fb17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin30.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" {
+extern void __chk_fail (void);
+extern int snprintf (char *, size_t, const char *, ...);
+extern inline __attribute__((gnu_inline, always_inline)) int snprintf (char *a, size_t b, const char *fmt, ...)
+{
+ if (__builtin_object_size (a, 0) != -1UL && __builtin_object_size (a, 0) < b)
+ __chk_fail ();
+ return __builtin_snprintf (a, b, fmt, __builtin_va_arg_pack ());
+}
+extern int snprintf (char *, size_t, const char *, ...) __asm ("mysnprintf");
+}
+
+char buf[10];
+
+int
+main (void)
+{
+ snprintf (buf, 10, "%d%d\n", 10, 10);
+ return 0;
+}
+
+// { dg-final { scan-assembler "mysnprintf" } }
+// { dg-final { scan-assembler-not "__chk_fail" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin4.C
new file mode 100644
index 000000000..8804b53bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin4.C
@@ -0,0 +1,10 @@
+// Verify that builtin is used when declared in global namespace
+
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+extern "C" int printf(const char*,...);
+
+void foo() {
+ printf("%d"); // { dg-warning "expects a matching" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin5.C
new file mode 100644
index 000000000..051224ffd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin5.C
@@ -0,0 +1,12 @@
+// Verify that builtin is used when declared in namespace std
+
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+namespace std {
+ extern "C" int printf(const char*,...);
+}
+
+void foo() {
+ std::printf("%d"); // { dg-warning "expects a matching" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin6.C
new file mode 100644
index 000000000..8f405b095
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin6.C
@@ -0,0 +1,11 @@
+// PR c++/19044
+// Verify that alternate asm name for builtin named "foo" also gets
+// applied to its sibling "__builtin_foo".
+
+// { dg-do compile }
+// { dg-final { scan-assembler "fancy_sin" } }
+
+extern "C" double sin(double) __asm("_fancy_sin");
+
+double foo(double x) { return __builtin_sin(x); }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin7.C
new file mode 100644
index 000000000..dae658abc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin7.C
@@ -0,0 +1,14 @@
+// PR c++/19628
+// Verify that __builtin_constant_p may appear in a constant-expression.
+
+// { dg-do run }
+
+int main()
+{
+ switch (3) {
+ case (__builtin_constant_p(7) ? 3 : 8):
+ return 0;
+ default:
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin8.C
new file mode 100644
index 000000000..dd4997725
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin8.C
@@ -0,0 +1,16 @@
+// PR c++/19628
+// Verify that __builtin_constant_p may appear in a constant-expression.
+
+// { dg-do compile }
+
+template <int I>
+int f(int x[__builtin_constant_p(I)])
+{
+ return x[0];
+}
+
+int g()
+{
+ int a[1] = { 7 };
+ return f<32>(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin9.C
new file mode 100644
index 000000000..6b2b712de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/builtin9.C
@@ -0,0 +1,3 @@
+// PR c++/21619
+// { dg-options "" }
+int f[__builtin_constant_p(&"Hello"[0])?1:-1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/c99struct1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/c99struct1.C
new file mode 100644
index 000000000..93e84b460
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/c99struct1.C
@@ -0,0 +1,12 @@
+// { dg-options "" }
+// C99 anon struct variable with array accesses.
+
+struct s { int a[1]; };
+
+void
+foo5 (void)
+{
+ ((struct s) { { 0 } }).a[0] = 1;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range1.C
new file mode 100644
index 000000000..0e313d6b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range1.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// Tests if case ranges (a GNU extension) are accepted
+// { dg-options "" }
+const int low = -2;
+const int high = 15;
+
+template <typename T>
+T f2 (T i)
+{
+ switch (i)
+ {
+ case low ... high : return i + 1;
+ default : return 0;
+ }
+}
+
+int f (int i)
+{
+ switch (i) {
+ case 1 ... 10: return i + 1;
+ default: return f2 (i);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range2.C
new file mode 100644
index 000000000..985ded336
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Tests if case ranges (a GNU extension) correctly emit messages
+// about overlapping ranges.
+// { dg-options "" }
+
+const int low = -2;
+const int high = 15;
+
+template <typename T>
+T f2 (T i)
+{
+ switch (i)
+ {
+ case low ... high : return i + 1; // { dg-error "previously" }
+ case 5 : return i + 2; // { dg-error "duplicate" }
+ default : return 0;
+ }
+}
+
+int f (int i)
+{
+ switch (i) {
+ case 1 ... 10: return i + 1; // { dg-error "first entry" }
+ case 3 ... 5 : return i + 3; // { dg-error "duplicate" }
+ default: return f2 (i); // { dg-message "required" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range3.C
new file mode 100644
index 000000000..0b0c1fc69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/case-range3.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// Tests if case ranges (a GNU extension) emit errors in ISO mode
+// { dg-options "-pedantic" }
+const int low = -2;
+const int high = 15;
+
+template <typename T>
+T f2 (T i)
+{
+ switch (i)
+ {
+ case low ... high : return i + 1; // { dg-warning "non-standard" }
+ default : return 0;
+ }
+}
+
+int f (int i)
+{
+ switch (i) {
+ case 1 ... 10: return i + 1; // { dg-warning "non-standard" }
+ default: return f2 (i); // { dg-message "required" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-1.C
new file mode 100644
index 000000000..7cf14c998
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-1.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall -ftrack-macro-expansion=0" } */
+/* Validate expected warnings and errors. */
+
+#define U __attribute__((unused))
+#define C(x) __attribute__((cleanup(x)))
+
+static int f1(void *x U) { return 0; }
+static void f2() { } /* { dg-message "note: declared here" } */
+static void f3(void) { } /* { dg-message "note: declared here" } */
+static void f4(void *x U) { }
+static void f5(int *x U) { }
+static void f6(double *x U) { }
+static void f7(const int *x U) { }
+static void f8(const int *x U, int y U) { } /* { dg-message "note: declared here" } */
+static void f9(int x U) { }
+
+void test(void)
+{
+ int o1 C(f1);
+ int o2 C(f2); /* { dg-error "too many arguments" } */
+ int o3 C(f3); /* { dg-error "too many arguments" } */
+ int o4 C(f4);
+ int o5 C(f5);
+ int o6 C(f6); /* { dg-error "cannot convert" } */
+ int o7 C(f7);
+ int o8 C(f8); /* { dg-error "too few arguments" } */
+ int o9 C(f9); /* { dg-error "conversion" } */
+ int o10 U C(undef); /* { dg-error "not a function" } */
+ int o11 U C(o1); /* { dg-error "not a function" } */
+ int o12 U C("f1"); /* { dg-error "not an identifier" } */
+ static int o13 U C(f1); /* { dg-warning "attribute ignored" } */
+}
+
+int o14 C(f1); /* { dg-warning "attribute ignored" } */
+void t15(int o U C(f1)) {} /* { dg-warning "attribute ignored" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-10.C
new file mode 100644
index 000000000..66c7b76bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-10.C
@@ -0,0 +1,117 @@
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
+/* Verify that cleanups work with exception handling through signal frames
+ on alternate stack. */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void force_unwind ()
+{
+ struct _Unwind_Exception *exc
+ = (struct _Unwind_Exception *) malloc (sizeof (*exc));
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+int count;
+char *null;
+
+static void counter (void *p __attribute__((unused)))
+{
+ ++count;
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+ if (count != 2)
+ abort ();
+ exit (0);
+}
+
+static int __attribute__((noinline)) fn5 ()
+{
+ char dummy __attribute__((cleanup (counter)));
+ force_unwind ();
+ return 0;
+}
+
+static void fn4 (int sig, siginfo_t *info, void *ctx)
+{
+ char dummy __attribute__((cleanup (counter)));
+ fn5 ();
+ null = NULL;
+}
+
+static void fn3 ()
+{
+ abort ();
+}
+
+static int __attribute__((noinline)) fn2 ()
+{
+ *null = 0;
+ fn3 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn1 ()
+{
+ stack_t ss;
+ struct sigaction s;
+
+ ss.ss_size = 4 * sysconf (_SC_PAGESIZE);
+ if (ss.ss_size < SIGSTKSZ)
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_sp = malloc (ss.ss_size);
+ if (ss.ss_sp == NULL)
+ exit (1);
+ ss.ss_flags = 0;
+ if (sigaltstack (&ss, NULL) < 0)
+ exit (1);
+
+ sigemptyset (&s.sa_mask);
+ s.sa_sigaction = fn4;
+ s.sa_flags = SA_RESETHAND | SA_ONSTACK;
+ sigaction (SIGSEGV, &s, NULL);
+ sigaction (SIGBUS, &s, NULL);
+ fn2 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn0 ()
+{
+ char dummy __attribute__((cleanup (handler)));
+ fn1 ();
+ null = 0;
+ return 0;
+}
+
+int main()
+{
+ fn0 ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-11.C
new file mode 100644
index 000000000..6e9652141
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-11.C
@@ -0,0 +1,117 @@
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
+/* Verify that cleanups work with exception handling through realtime signal
+ frames on alternate stack. */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void force_unwind ()
+{
+ struct _Unwind_Exception *exc
+ = (struct _Unwind_Exception*) malloc (sizeof (*exc));
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+int count;
+char *null;
+
+static void counter (void *p __attribute__((unused)))
+{
+ ++count;
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+ if (count != 2)
+ abort ();
+ exit (0);
+}
+
+static int __attribute__((noinline)) fn5 ()
+{
+ char dummy __attribute__((cleanup (counter)));
+ force_unwind ();
+ return 0;
+}
+
+static void fn4 (int sig, siginfo_t *info, void *ctx)
+{
+ char dummy __attribute__((cleanup (counter)));
+ fn5 ();
+ null = NULL;
+}
+
+static void fn3 ()
+{
+ abort ();
+}
+
+static int __attribute__((noinline)) fn2 ()
+{
+ *null = 0;
+ fn3 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn1 ()
+{
+ stack_t ss;
+ struct sigaction s;
+
+ ss.ss_size = 4 * sysconf (_SC_PAGESIZE);
+ if (ss.ss_size < SIGSTKSZ)
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_sp = malloc (ss.ss_size);
+ if (ss.ss_sp == NULL)
+ exit (1);
+ ss.ss_flags = 0;
+ if (sigaltstack (&ss, NULL) < 0)
+ exit (1);
+
+ sigemptyset (&s.sa_mask);
+ s.sa_sigaction = fn4;
+ s.sa_flags = SA_RESETHAND | SA_ONSTACK | SA_SIGINFO;
+ sigaction (SIGSEGV, &s, NULL);
+ sigaction (SIGBUS, &s, NULL);
+ fn2 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn0 ()
+{
+ char dummy __attribute__((cleanup (handler)));
+ fn1 ();
+ null = 0;
+ return 0;
+}
+
+int main()
+{
+ fn0 ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-2.C
new file mode 100644
index 000000000..d9033b454
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-2.C
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* { dg-options "" } */
+/* Verify that cleanup works in the most basic of ways. */
+
+extern "C" void exit(int);
+extern "C" void abort(void);
+
+static void handler(void *p __attribute__((unused)))
+{
+ exit (0);
+}
+
+static void doit(void)
+{
+ int x __attribute__((cleanup (handler)));
+}
+
+int main()
+{
+ doit ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-3.C
new file mode 100644
index 000000000..5367c496e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-3.C
@@ -0,0 +1,45 @@
+/* { dg-do run } */
+/* { dg-options "" } */
+/* Verify that the cleanup handler receives the proper contents
+ of the variable. */
+
+extern "C" void exit(int);
+extern "C" void abort(void);
+
+static int expected;
+
+static void
+handler(int *p)
+{
+ if (*p != expected)
+ abort ();
+}
+
+static void __attribute__((noinline))
+bar(void)
+{
+}
+
+static void doit(int x, int y)
+{
+ int r __attribute__((cleanup (handler)));
+ if (x < y)
+ {
+ r = 0;
+ return;
+ }
+
+ bar();
+ r = x + y;
+}
+
+int main()
+{
+ expected = 0;
+ doit (1, 2);
+
+ expected = 3;
+ doit (2, 1);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-4.C
new file mode 100644
index 000000000..ae9a6e40f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-4.C
@@ -0,0 +1,39 @@
+/* { dg-do run } */
+/* { dg-options "" } */
+/* Verify cleanup execution on non-trivial exit from a block. */
+
+extern "C" void exit(int);
+extern "C" void abort(void);
+
+static int counter;
+
+static void
+handler(int *p)
+{
+ counter += *p;
+}
+
+static void __attribute__((noinline))
+bar(void)
+{
+}
+
+static void doit(int n, int n2)
+{
+ int i;
+ for (i = 0; i < n; ++i)
+ {
+ int dummy __attribute__((cleanup (handler))) = i;
+ if (i == n2)
+ break;
+ bar();
+ }
+}
+
+int main()
+{
+ doit (10, 6);
+ if (counter != 0 + 1 + 2 + 3 + 4 + 5 + 6)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-5.C
new file mode 100644
index 000000000..db4c2bbc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-5.C
@@ -0,0 +1,54 @@
+/* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
+/* { dg-do run } */
+/* { dg-options "-fexceptions" } */
+/* { dg-skip-if "" { "ia64-*-hpux11.*" } { "*" } { "" } } */
+/* Verify that cleanups work with exception handling. */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void force_unwind ()
+{
+ struct _Unwind_Exception *exc
+ = (struct _Unwind_Exception *) malloc (sizeof (*exc));
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+ exit (0);
+}
+
+static void doit ()
+{
+ char dummy __attribute__((cleanup (handler)));
+ force_unwind ();
+}
+
+int main()
+{
+ doit ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-6.C
new file mode 100644
index 000000000..4e3d53893
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-6.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+/* Verify that a cleanup marked "inline" gets inlined. */
+
+static inline void xyzzy(void *p __attribute__((unused)))
+{
+}
+
+void doit(void)
+{
+ int x __attribute__((cleanup (xyzzy)));
+}
+
+/* { dg-final { scan-assembler-not "xyzzy" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-8.C
new file mode 100644
index 000000000..ccf9bef68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-8.C
@@ -0,0 +1,100 @@
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
+/* Verify that cleanups work with exception handling through signal
+ frames. */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void force_unwind ()
+{
+ struct _Unwind_Exception *exc
+ = (struct _Unwind_Exception *) malloc (sizeof (*exc));
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+int count;
+char *null;
+
+static void counter (void *p __attribute__((unused)))
+{
+ ++count;
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+ if (count != 2)
+ abort ();
+ exit (0);
+}
+
+static int __attribute__((noinline)) fn5 ()
+{
+ char dummy __attribute__((cleanup (counter)));
+ force_unwind ();
+ return 0;
+}
+
+static void fn4 (int sig)
+{
+ char dummy __attribute__((cleanup (counter)));
+ fn5 ();
+ null = NULL;
+}
+
+static void fn3 ()
+{
+ abort ();
+}
+
+static int __attribute__((noinline)) fn2 ()
+{
+ *null = 0;
+ fn3 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn1 ()
+{
+ signal (SIGSEGV, fn4);
+ signal (SIGBUS, fn4);
+ fn2 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn0 ()
+{
+ char dummy __attribute__((cleanup (handler)));
+ fn1 ();
+ null = 0;
+ return 0;
+}
+
+int main()
+{
+ fn0 ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-9.C
new file mode 100644
index 000000000..dcdfcae0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-9.C
@@ -0,0 +1,104 @@
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
+/* Verify that cleanups work with exception handling through realtime
+ signal frames. */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+
+static _Unwind_Reason_Code
+force_unwind_stop (int version, _Unwind_Action actions,
+ _Unwind_Exception_Class exc_class,
+ struct _Unwind_Exception *exc_obj,
+ struct _Unwind_Context *context,
+ void *stop_parameter)
+{
+ if (actions & _UA_END_OF_STACK)
+ abort ();
+ return _URC_NO_REASON;
+}
+
+static void force_unwind ()
+{
+ struct _Unwind_Exception *exc
+ = (struct _Unwind_Exception *) malloc (sizeof (*exc));
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
+ exc->exception_cleanup = 0;
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
+#else
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
+#endif
+
+ abort ();
+}
+
+int count;
+char *null;
+
+static void counter (void *p __attribute__((unused)))
+{
+ ++count;
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+ if (count != 2)
+ abort ();
+ exit (0);
+}
+
+static int __attribute__((noinline)) fn5 ()
+{
+ char dummy __attribute__((cleanup (counter)));
+ force_unwind ();
+ return 0;
+}
+
+static void fn4 (int sig, siginfo_t *info, void *ctx)
+{
+ char dummy __attribute__((cleanup (counter)));
+ fn5 ();
+ null = NULL;
+}
+
+static void fn3 ()
+{
+ abort ();
+}
+
+static int __attribute__((noinline)) fn2 ()
+{
+ *null = 0;
+ fn3 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn1 ()
+{
+ struct sigaction s;
+ sigemptyset (&s.sa_mask);
+ s.sa_sigaction = fn4;
+ s.sa_flags = SA_RESETHAND | SA_SIGINFO;
+ sigaction (SIGSEGV, &s, NULL);
+ sigaction (SIGBUS, &s, NULL);
+ fn2 ();
+ return 0;
+}
+
+static int __attribute__((noinline)) fn0 ()
+{
+ char dummy __attribute__((cleanup (handler)));
+ fn1 ();
+ null = 0;
+ return 0;
+}
+
+int main()
+{
+ fn0 ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-dtor.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-dtor.C
new file mode 100644
index 000000000..58da64670
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cleanup-dtor.C
@@ -0,0 +1,28 @@
+// Check that destructors are run after cleanup functions.
+// { dg-do run }
+
+extern "C" void abort ();
+
+int i;
+
+struct S {
+ ~S() {
+ if (i != 1)
+ abort ();
+ i = 2;
+ }
+};
+
+void f(void *) {
+ if (i != 0)
+ abort ();
+ i = 1;
+}
+
+int main () {
+ {
+ S s __attribute__((cleanup (f)));
+ }
+ if (i != 2)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex1.C
new file mode 100644
index 000000000..ac6771106
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex1.C
@@ -0,0 +1,6 @@
+/* { dg-options "" } */
+/* { dg-do compile } */
+// Testing if we can do a new of a complex type
+// PR C++/28450
+
+void* q = new __complex__ int ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex2.C
new file mode 100644
index 000000000..c9e8cdce5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex2.C
@@ -0,0 +1,5 @@
+// PR c++/31388
+// { dg-options "" }
+
+bool b = !0i;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex3.C
new file mode 100644
index 000000000..062c2d44b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex3.C
@@ -0,0 +1,28 @@
+// PR c++/31780
+// { dg-do run }
+// { dg-options "" }
+
+// Test that we can implicitly convert to _Complex, but that it's worse
+// than a scalar arithmetic conversion.
+
+extern "C" void exit (int);
+
+int r = 0;
+
+void f (_Complex int) { ++r; }
+void f (double) { }
+
+void g (_Complex int) { }
+
+int main()
+{
+ f (1);
+ g (1);
+
+ return r;
+}
+
+void bar()
+{
+ r ? 0i : 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex4.C
new file mode 100644
index 000000000..78b935670
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex4.C
@@ -0,0 +1,5 @@
+// { dg-do compile }
+// This code used to be rejected as there was no conversion from int to float __complex__
+ #include <vector>
+ typedef float __complex__ fcomplex;
+ std::vector<fcomplex> vfc(10);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex5.C
new file mode 100644
index 000000000..4a29960f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex5.C
@@ -0,0 +1,6 @@
+/* PR c++/21210 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef float __complex__ fcomplex;
+fcomplex cplx = fcomplex(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex6.C
new file mode 100644
index 000000000..9a7c50a7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex6.C
@@ -0,0 +1,10 @@
+// PR c++/46304
+// { dg-options "" }
+
+template<class T>
+void f()
+{
+ __complex double d = 1.0 + 2.0i;
+}
+
+template void f<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex7.C
new file mode 100644
index 000000000..5b3eead18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex7.C
@@ -0,0 +1,8 @@
+// { dg-options "" }
+
+class A
+{
+ static const _Complex double x = 1.0 + 2.0i;
+};
+
+// { dg-prune-output "constexpr. needed" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex8.C
new file mode 100644
index 000000000..4d79cc645
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex8.C
@@ -0,0 +1,66 @@
+// PR libstdc++/48760
+// { dg-do run { target c++11 } }
+
+constexpr _Complex int i{1,2};
+constexpr _Complex int j{3};
+
+#define SA(X) static_assert((X),#X)
+
+SA(__real i == 1);
+SA(__imag i == 2);
+SA(__real j == 3);
+SA(__imag j == 0);
+
+struct A
+{
+ _Complex int c;
+ constexpr A(int i, int j): c{i,j} { }
+ constexpr A(int i): c{i} { }
+};
+
+constexpr A a1(1,2);
+constexpr A a2(3);
+
+SA(__real a1.c == 1);
+SA(__imag a1.c == 2);
+SA(__real a2.c == 3);
+SA(__imag a2.c == 0);
+
+typedef _Complex int ci;
+
+SA((__real ci{1,2} == 1));
+SA((__imag ci{1,2} == 2));
+SA((__real ci{3} == 3));
+SA((__imag ci{3} == 0));
+
+struct B
+{
+ _Complex int c;
+ int i;
+};
+
+constexpr B b1 = { { 1,2 }, 42 };
+constexpr B b2 = { { 3 }, 24 };
+// No brace elision for complex.
+constexpr B b3 = { 5, 6 };
+
+SA(__real b1.c == 1);
+SA(__imag b1.c == 2);
+SA(b1.i == 42);
+SA(__real b2.c == 3);
+SA(__imag b2.c == 0);
+SA(b2.i == 24);
+SA(__real b3.c == 5);
+SA(__imag b3.c == 0);
+SA(b3.i == 6);
+
+int main()
+{
+ ci* p = new ci{1,2};
+ if (__real *p != 1 || __imag *p != 2)
+ return 1;
+ delete p;
+ p = new ci{3};
+ if (__real *p != 3 || __imag *p != 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complex9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex9.C
new file mode 100644
index 000000000..5bb1625c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complex9.C
@@ -0,0 +1,8 @@
+// PR c++/28501
+
+struct A
+{
+ operator int();
+};
+
+int i = __real__ A();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit1.C
new file mode 100644
index 000000000..ab2b038fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit1.C
@@ -0,0 +1,16 @@
+// PR c++/11063
+// { dg-options "" }
+
+class Foo
+{
+private:
+ const int val_[2];
+
+public:
+ Foo(int, int);
+};
+
+Foo::Foo(int v0, int v1)
+ : val_((int[]) {v0, v1}) // { dg-error "" "" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit10.C
new file mode 100644
index 000000000..7f159f0f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit10.C
@@ -0,0 +1,20 @@
+// PR c++/36023
+// { dg-do compile }
+// { dg-options "" }
+
+struct A;
+
+void
+f1 (int i)
+{
+ (int[i]) { 1 }; // { dg-error "variable-sized compound literal" }
+ (A[5]) { 1 }; // { dg-error "have incomplete type" }
+ (A[i]) { 1 }; // { dg-error "have incomplete type" }
+}
+
+void
+f2 ()
+{
+ (int[]) { 1 };
+ (int[1]) { 1 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit11.C
new file mode 100644
index 000000000..0662543d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit11.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "" }
+
+struct A { int i; };
+
+template<int t>
+void foo()
+{
+ ((struct A) { 0 }).i += 1; // { dg-error "temporary" }
+}
+
+void g(void)
+{
+ foo<0>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit12.C
new file mode 100644
index 000000000..5c6a731f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit12.C
@@ -0,0 +1,67 @@
+// PR c++/40948
+// { dg-do run }
+// { dg-options "" }
+
+int c;
+struct M
+{
+ M () { ++c; }
+ M (const M&) { ++c; }
+ ~M () { --c; }
+};
+
+struct S
+{
+ S ();
+ M m[1];
+};
+
+S::S () : m ((M[1]) { M () })
+{
+}
+
+struct T
+{
+ T ();
+ M m[4];
+};
+
+T::T () : m ((M[4]) { M (), M (), M (), M () })
+{
+}
+
+typedef M MA[1];
+MA &bar (MA, MA& r) { return r; }
+
+M f(M m) { return m; }
+
+int main ()
+{
+ {
+ M m[1] = (M[1]) { M () };
+ if (c != 1)
+ return 1;
+ M n = (M) { M () };
+ if (c != 2)
+ return 2;
+ M o[4] = (M[4]) { M (), M (), M (), M () };
+ if (c != 6)
+ return 3;
+ S s;
+ if (c != 7)
+ return 4;
+ T t;
+ if (c != 11)
+ return 5;
+ M mm[2] = ((M[2]) { f(M()), f(M()) });
+ if (c != 13)
+ return 8;
+#if 0
+ MA ma = bar ((M[2]) { M(), M() }, m);
+ if (c != 14)
+ return 7;
+#endif
+ }
+ if (c != 0)
+ return 6;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit13.C
new file mode 100644
index 000000000..c12678ba8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit13.C
@@ -0,0 +1,11 @@
+// PR c++/10207
+// { dg-options "" }
+
+typedef struct { } EmptyStruct;
+typedef struct { EmptyStruct Empty; } DemoStruct;
+
+void Func()
+{
+ DemoStruct Demo;
+ Demo.Empty = (EmptyStruct) {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit2.C
new file mode 100644
index 000000000..9fe00c42e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit2.C
@@ -0,0 +1,22 @@
+// PR c++/12726
+// Origin: Vladimir Zidar <mr_W@mindnever.org>
+// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-options "" }
+
+struct A
+{
+ A();
+ A(const A&);
+ A(int);
+};
+
+struct B
+{
+ A a;
+};
+
+void foo()
+{
+ B b;
+ b = (B){0};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit3.C
new file mode 100644
index 000000000..a54a8bce1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit3.C
@@ -0,0 +1,8 @@
+// { dg-options "" }
+
+int Compound_Literals_0()
+{
+ static int y[] = (int []) {1, 2, 3}; // { dg-error "init" }
+ static int z[] = (int [3]) {1}; // { dg-error "init" }
+ return y[0]+z[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit4.C
new file mode 100644
index 000000000..1448e7a66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit4.C
@@ -0,0 +1,10 @@
+// PR c++/23172
+// { dg-do run }
+// { dg-options "" }
+
+int i = (int) {7};
+
+int main () {
+ if (i != 7)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit5.C
new file mode 100644
index 000000000..c406c9980
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit5.C
@@ -0,0 +1,12 @@
+// PR c++/25417
+// { dg-options "" }
+
+struct object {
+ int a;
+ int b;
+};
+
+void f (int c, int d)
+{
+ object o = ((object){ a : c, b : d});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit6.C
new file mode 100644
index 000000000..d3187a65b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit6.C
@@ -0,0 +1,19 @@
+// PR c++/20103
+// { dg-options "" }
+
+struct A
+{
+ A(const A&);
+};
+
+struct B
+{
+ A a;
+};
+
+void foo(B);
+
+void bar(A &x)
+{
+ foo((B){x});
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit7.C
new file mode 100644
index 000000000..bceb6d108
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit7.C
@@ -0,0 +1,4 @@
+// PR c++/27807
+// { dg-options "" }
+
+int i = (int()){0}; // { dg-error "type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit8.C
new file mode 100644
index 000000000..97ff563fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit8.C
@@ -0,0 +1,12 @@
+// PR c++/27270
+// { dg-options "" }
+
+template<typename Entry>
+struct Array {
+ Entry *array[32];
+ Array () :
+ array ( (Entry*[1]) { 0, 0 } ) // { dg-error "initializers|incompatible" }
+ {}
+};
+
+Array<void*> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/complit9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit9.C
new file mode 100644
index 000000000..5b7fbe75c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/complit9.C
@@ -0,0 +1,15 @@
+// PR c++/35708
+// { dg-options "" }
+
+struct object { int one_o; int allocstamp; };
+int pgci_pointable (object obj);
+void foo(void);
+int main (int argc, char *argv[])
+{
+ if (pgci_pointable((object){7,100}))
+ {
+ bad_rehash_size:
+ foo();
+ }
+ goto bad_rehash_size;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/cond1.C
new file mode 100644
index 000000000..ec342121e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/cond1.C
@@ -0,0 +1,4 @@
+// PR c++/12515
+// { dg-do compile }
+// { dg-options "" }
+template<int> void foo() { 0 ?: 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/construct1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/construct1.C
new file mode 100644
index 000000000..6a7d8cee4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/construct1.C
@@ -0,0 +1,12 @@
+// PR c++/16717
+// { dg-options "-O2" }
+
+int i;
+
+void hello (void) __attribute__ ((constructor));
+void hello (void) { i = 1; }
+
+int main (void) {
+ if (i != 1)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/conv1.C
new file mode 100644
index 000000000..6c16fe484
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/conv1.C
@@ -0,0 +1,19 @@
+// Test for backwards brain-damage compatibility with -fpermissive.
+// { dg-options "-fpermissive -w" }
+
+void f ();
+void f (int *);
+void g (int);
+
+int main ()
+{
+ void *v = 1234;
+ void (*p)() = v;
+ int i = v;
+ f (i);
+ f (v);
+ g (v);
+ enum { a } b = i;
+ void (*p2)(int) = p;
+ unsigned *ip = &i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig1.C
new file mode 100644
index 000000000..c3ff4c142
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig1.C
@@ -0,0 +1,24 @@
+// { dg-options "" }
+
+struct a {
+ int x;
+};
+
+struct b {
+ int x;
+ int y;
+};
+
+struct foo {
+ union {
+ struct a a;
+ struct b b;
+ } u;
+};
+
+int main(void)
+{
+ struct foo bar = { u: { b: { x: 0, y: 0, }}};
+ (void)bar;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig2.C
new file mode 100644
index 000000000..229ae527d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig2.C
@@ -0,0 +1,25 @@
+// Test for C99-style designated array initializer
+
+union U
+{
+ long l;
+ const char *p;
+};
+
+__extension__ U u = { .p = "" };
+
+__extension__ int i[4] = { [0] = 1, [1] = 2 };
+
+// Currently, except for unions, the C++ front end only supports
+// designators that designate the element that would have been initialized
+// anyway. While that's true, make sure that we get a sorry rather than
+// bad code.
+
+struct A
+{
+ int i;
+ int j;
+};
+
+__extension__ A a = { .j = 1 }; // { dg-message "non-trivial" }
+__extension__ int j[2] = { [1] = 1 }; // { dg-message "non-trivial" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig3.C
new file mode 100644
index 000000000..d1ff5e53e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig3.C
@@ -0,0 +1,9 @@
+// PR c++/51229
+// { dg-do compile }
+// { dg-options "" }
+
+struct A { int i; };
+
+int a[5] = { .foo = 7 };// { dg-error "used in a GNU-style designated initializer for an array" }
+int b[] = { .foo = 8 }; // { dg-error "used in a GNU-style designated initializer for an array" }
+A c = { [0] = {} }; // { dg-error "used in a GNU-style designated initializer for class" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig4.C
new file mode 100644
index 000000000..48d629a94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig4.C
@@ -0,0 +1,10 @@
+// PR c++/51458
+// { dg-options "" }
+
+char g[] = { [7] = "abcd" }; // { dg-error "designator" }
+int a = { .foo = 6 }; // { dg-error "designator" }
+int b = { [0] = 1 }; // { dg-error "designator" }
+_Complex float c = { .foo = 0, 1 }; // { dg-error "designator" }
+_Complex float d = { [0] = 0, 1 }; // { dg-error "designator" }
+_Complex float e = { 0, .foo = 1 }; // { dg-error "designator" }
+_Complex float f = { 0, [0] = 1 }; // { dg-error "designator" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig5.C
new file mode 100644
index 000000000..48cce3183
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig5.C
@@ -0,0 +1,7 @@
+// PR c++/55951
+
+enum { A };
+
+static const char *a[] = {
+ [A] = "a"
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/desig6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig6.C
new file mode 100644
index 000000000..f71d6eeec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/desig6.C
@@ -0,0 +1,18 @@
+// PR c++/57041
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename T>
+union u {
+ T a;
+ char b;
+};
+
+template<typename T>
+u<T> make_u(T t) {
+ return { .a = t };
+}
+
+int main() {
+ return make_u<int>(1).a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dll-MI1.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/dll-MI1.h
new file mode 100644
index 000000000..2f8b83669
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dll-MI1.h
@@ -0,0 +1,39 @@
+// Class definitions for dllexport-MI1.C and dllimport-MI1.C
+
+#ifdef BUILDING_MI_DLL
+#define DLL_IMPEXP __attribute__ ((dllexport))
+#else
+#define DLL_IMPEXP __attribute__ ((dllimport))
+#endif
+
+
+#define D1_return 1
+#define D2_return 2
+
+class DLL_IMPEXP MBase
+{
+public:
+ virtual int vf() const = 0;
+ virtual ~MBase();
+};
+
+class DLL_IMPEXP D1 : virtual public MBase
+{
+public:
+ int vf() const;
+};
+
+class DLL_IMPEXP D2 : virtual public MBase
+{
+public:
+ D2 ();
+ D2 (D2 const&);
+ int vf() const;
+};
+
+class DLL_IMPEXP MI1 : public D1, public D2
+{
+public:
+ int vf() const;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport-MI1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport-MI1.C
new file mode 100644
index 000000000..08e65ec96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport-MI1.C
@@ -0,0 +1,51 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw*} }
+// Test that non-virtual MI thunks are exported.
+
+
+// To build the dll and client app:
+// g++ -shared -o MI.dll dllexport-MI1.C
+// g++ -o MItest.exe dllimport-MI1.C -L. MI.dll
+
+#define BUILDING_MI_DLL
+#include "dll-MI1.h"
+
+MBase::~MBase(){}
+
+int D1::vf() const { return D1_return; }
+
+D2::D2() { }
+D2::D2 (D2 const&) { }
+int D2::vf() const { return D2_return; }
+
+int MI1::vf() const { return D1::vf();}
+
+// a dllexported object
+DLL_IMPEXP MI1 dllMI1;
+
+// use default copy ctor
+DLL_IMPEXP MI1 dllMI1Copy = dllMI1;
+
+// Scan for export of some methods that are undefined in dllimportMI1.C,
+
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK2D12vfEv" } }
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK2D22vfEv" } }
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK3MI12vfEv" } }
+
+// and MI thunks,
+
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZThn._NK3MI12vfEv" } }
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZTv0_n.._NK2D12vfEv" } }
+
+// and a vtable data variable.
+
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZTV2D1\[\\\\\"\]*,data" } }
+
+// an explicit copy ctor
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZN2D2C2ERKS_" } }
+
+// but not implicit copy ctor generated by compiler
+// nor implicit dtor
+
+// { dg-final { scan-assembler-not "-export:\[\\\\\"\]*_ZN2D1C2ERKS_" } }
+// { dg-final { scan-assembler-not "-export:\[\\\\\"\]*_ZN2D1D2Ev" } }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport1.C
new file mode 100644
index 000000000..3683d08b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport1.C
@@ -0,0 +1,23 @@
+// Test that inline functions are exported with -fkeep-inline-functions.
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw*} }
+// { dg-options -fkeep-inline-functions }
+
+__attribute__((dllexport)) inline int foo (int a) { return a;}
+
+
+class __attribute__((dllexport)) Bar
+{
+ public:
+ Bar(){};
+ int inline_bar(int a) {return a;}
+ int outline_bar(int a);
+};
+
+int Bar::outline_bar(int a) {return foo (a);}
+
+
+Bar abar;
+
+// { dg-final { scan-assembler "\.section\[ \t\]*.drectve\n.*_ZN3Bar11outline_barEi" } }
+// { dg-final { scan-assembler " -export:\[\\\\\"\]*_ZN3Bar10inline_barEi" } }
+// { dg-final { scan-assembler " -export:\[\\\\\"\]*_Z3fooi" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2.C
new file mode 100644
index 000000000..71ccf670b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2.C
@@ -0,0 +1,52 @@
+// { dg-do link }
+// { dg-require-dll "" }
+// { dg-additional-sources "dllexport2a.cc" }
+// { dg-options "-O2" }
+
+/* Test that inline functions declared "dllexport" appear in object
+ files, even if they are not called.
+
+ This behavior is required by the ARM C++ ABI:
+
+ Exporting a function that can be inlined should force the
+ creation and export of an out-of-line copy of it.
+
+ and should presumably also apply.
+
+ Visual Studio 2005 also honors that rule. */
+
+__declspec(dllexport) inline void i1() {}
+
+__declspec(dllexport) extern inline void e1() {}
+
+/* It is invalid to declare the function inline after its definition. */
+#if 0
+__declspec(dllexport) void i2() {}
+inline void i2();
+
+__declspec(dllexport) extern void e2() {}
+inline void e2();
+#endif
+
+__declspec(dllexport) inline void i3() {}
+void i3();
+
+__declspec(dllexport) inline void e3() {}
+extern void e3();
+
+__declspec(dllexport) void i4();
+inline void i4() {};
+
+__declspec(dllexport) extern void e4();
+inline void e4() {};
+
+__declspec(dllexport) inline void i5();
+void i5() {};
+
+__declspec(dllexport) inline void e5();
+extern void e5() {};
+
+/* Make sure that just declaring the function -- without defining it
+ -- does not cause errors. */
+__declspec(dllexport) inline void i6();
+__declspec(dllexport) extern inline void e6();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2a.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2a.cc
new file mode 100644
index 000000000..80caf3217
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport2a.cc
@@ -0,0 +1,21 @@
+extern void i1();
+extern void i3();
+extern void i4();
+extern void i5();
+
+extern void e1();
+extern void e3();
+extern void e4();
+extern void e5();
+
+int main () {
+ i1();
+ i3();
+ i4();
+ i5();
+
+ e1();
+ e3();
+ e4();
+ e5();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport3.C
new file mode 100644
index 000000000..206dfc92c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport3.C
@@ -0,0 +1,19 @@
+// PR c++/42870
+// { dg-do compile { target i?86-*-cygwin *-*-mingw* } }
+// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZN2SaD1Ev" } }
+
+#define ATTRIBUTE __attribute__ ((dllexport))
+class ATTRIBUTE Sa {
+ public:
+ Sa()
+ {}
+ ~Sa();
+};
+ATTRIBUTE Sa::~Sa()
+{return;}
+
+bool DllMain(void *a,void*b,int)
+{
+ Sa s;
+ return true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4.C
new file mode 100644
index 000000000..81c57c3fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4.C
@@ -0,0 +1,54 @@
+// { dg-do link }
+// { dg-require-dll "" }
+// { dg-additional-sources "dllexport4a.cc" }
+// { dg-options "-O2 -fno-keep-inline-dllexport" }
+// { dg-prune-output .*undefined.* }
+// { dg-xfail-if "link failure expected" { *-*-* } }
+
+/* Test that inline functions declared "dllexport" appear in object files,
+ even if they are not called - except when -fno-keep-inline-dllexport.
+
+ This behavior is required by the ARM C++ ABI:
+
+ Exporting a function that can be inlined should force the
+ creation and export of an out-of-line copy of it.
+
+ and should presumably also apply.
+
+ Visual Studio 2005 also honors that rule. */
+
+__declspec(dllexport) inline void i1() {}
+
+__declspec(dllexport) extern inline void e1() {}
+
+/* It is invalid to declare the function inline after its definition. */
+#if 0
+__declspec(dllexport) void i2() {}
+inline void i2();
+
+__declspec(dllexport) extern void e2() {}
+inline void e2();
+#endif
+
+__declspec(dllexport) inline void i3() {}
+void i3();
+
+__declspec(dllexport) inline void e3() {}
+extern void e3();
+
+__declspec(dllexport) void i4();
+inline void i4() {};
+
+__declspec(dllexport) extern void e4();
+inline void e4() {};
+
+__declspec(dllexport) inline void i5();
+void i5() {};
+
+__declspec(dllexport) inline void e5();
+extern void e5() {};
+
+/* Make sure that just declaring the function -- without defining it
+ -- does not cause errors. */
+__declspec(dllexport) inline void i6();
+__declspec(dllexport) extern inline void e6();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4a.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4a.cc
new file mode 100644
index 000000000..80caf3217
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport4a.cc
@@ -0,0 +1,21 @@
+extern void i1();
+extern void i3();
+extern void i4();
+extern void i5();
+
+extern void e1();
+extern void e3();
+extern void e4();
+extern void e5();
+
+int main () {
+ i1();
+ i3();
+ i4();
+ i5();
+
+ e1();
+ e3();
+ e4();
+ e5();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5.C
new file mode 100644
index 000000000..8b2780731
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5.C
@@ -0,0 +1,52 @@
+// { dg-do link }
+// { dg-require-dll "" }
+// { dg-additional-sources "dllexport5a.cc" }
+// { dg-options "-O2 -fkeep-inline-dllexport" }
+
+/* Test that inline functions declared "dllexport" appear in object files,
+ even if they are not called, when -fkeep-inline-dllexport is supplied.
+
+ This behavior is required by the ARM C++ ABI:
+
+ Exporting a function that can be inlined should force the
+ creation and export of an out-of-line copy of it.
+
+ and should presumably also apply.
+
+ Visual Studio 2005 also honors that rule. */
+
+__declspec(dllexport) inline void i1() {}
+
+__declspec(dllexport) extern inline void e1() {}
+
+/* It is invalid to declare the function inline after its definition. */
+#if 0
+__declspec(dllexport) void i2() {}
+inline void i2();
+
+__declspec(dllexport) extern void e2() {}
+inline void e2();
+#endif
+
+__declspec(dllexport) inline void i3() {}
+void i3();
+
+__declspec(dllexport) inline void e3() {}
+extern void e3();
+
+__declspec(dllexport) void i4();
+inline void i4() {};
+
+__declspec(dllexport) extern void e4();
+inline void e4() {};
+
+__declspec(dllexport) inline void i5();
+void i5() {};
+
+__declspec(dllexport) inline void e5();
+extern void e5() {};
+
+/* Make sure that just declaring the function -- without defining it
+ -- does not cause errors. */
+__declspec(dllexport) inline void i6();
+__declspec(dllexport) extern inline void e6();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5a.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5a.cc
new file mode 100644
index 000000000..80caf3217
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllexport5a.cc
@@ -0,0 +1,21 @@
+extern void i1();
+extern void i3();
+extern void i4();
+extern void i5();
+
+extern void e1();
+extern void e3();
+extern void e4();
+extern void e5();
+
+int main () {
+ i1();
+ i3();
+ i4();
+ i5();
+
+ e1();
+ e3();
+ e4();
+ e5();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport-MI1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport-MI1.C
new file mode 100644
index 000000000..3f2d05683
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport-MI1.C
@@ -0,0 +1,53 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// Test handling of MI thunks in dllimported classes.
+
+// To build the dll and client app:
+// g++ -shared -o MI.dll dllexport-MI1.C
+// g++ -o MItest.exe dllimport-MI1.C -L. MI.dll
+
+#include <stdlib.h>
+#include "dll-MI1.h"
+
+extern DLL_IMPEXP MI1 dllMI1;
+
+// This should use the implicit copy ctor for D1 (not imported)
+// and the explicit copy ctor for D2 (dll-imported).
+MI1 dllMI1LocalCopy = dllMI1;
+
+class MI2 : public D1, public D2
+{
+public:
+ int vf() const { return D2::vf();}
+};
+
+class MI3 : public MI1
+{
+};
+
+int main ()
+
+{
+ MI1 bar1;
+ MI2 bar2;
+ MI3 bar3;
+
+ if (dllMI1.vf() != D1_return)
+ abort();
+
+ if (dllMI1LocalCopy.vf() != D1_return)
+ abort();
+
+ if (bar1.vf() != D1_return)
+ abort();
+
+ if (bar2.vf() != (D2_return))
+ abort();
+
+ if (bar3.vf() != D1_return )
+ abort();
+}
+
+// Scan for import of explicit copy ctor for D2, but no import
+// of compiler generated copy ctor for D1.
+// { dg-final { scan-assembler "__imp\[_\]*__ZN2D2C2ERKS_" } }
+// { dg-final { scan-assembler-not "__imp\[_\]*__ZN2D1C2ERKS_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport1.C
new file mode 100644
index 000000000..d7ddfe8a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport1.C
@@ -0,0 +1,31 @@
+// PR c++/7910
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// { dg-options { -Wall -W } }
+
+class __attribute__((dllimport)) Foo
+{
+ public:
+ virtual void dummy_foo_func(void)
+ {}
+ void dummy_foo_fun2();
+ virtual ~Foo(); // avoid warning
+};
+
+void Foo::dummy_foo_fun2() // { dg-warning "redeclared without dllimport" }
+{
+}
+
+class Bar : public Foo
+{
+public:
+ ~Bar();
+ void dummy_bar_func();
+};
+
+Bar::~Bar()
+{}
+
+void Bar::dummy_bar_func()
+{}
+
+// { dg-final { scan-assembler-not "__imp\[_\]*__ZN3Foo14dummy_foo_fun" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport10.C
new file mode 100644
index 000000000..808337661
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport10.C
@@ -0,0 +1,16 @@
+// PR c++/5287, c++/11021
+// Inherit a virtual method from a dllimport'd base class.
+
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+struct __attribute__((dllimport)) A
+{
+ virtual void vfunc(void);
+};
+
+struct B : public A
+{
+};
+
+
+B aB;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport11.C
new file mode 100644
index 000000000..6d822be22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport11.C
@@ -0,0 +1,15 @@
+// PR target/23589
+// Template member functions do not get dllimport status of class.
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+struct __attribute__((dllimport)) Foo
+{
+ template <class T> Foo (T);
+};
+
+void a (int i)
+{
+ Foo f(i);
+}
+
+template <class T> Foo::Foo (T) {} // no dllimport warnings on definition.
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport12.C
new file mode 100644
index 000000000..ede546f20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport12.C
@@ -0,0 +1,23 @@
+// PR target/27650
+// Don't use dllimport semantics on virtual methods when initializing
+// vtables
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+// Use import lib thunk for vtable entry of explicitly virtual method,
+struct base
+{
+ virtual void key_method();
+ __attribute__((dllimport)) virtual ~base();
+};
+
+void base::key_method() {}
+
+
+// Likewise for an implicitly virtual method.
+struct derived : public base
+{
+ void key_method();
+ __attribute__((dllimport)) ~derived();
+};
+
+void derived::key_method() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport13.C
new file mode 100644
index 000000000..fa1ffbfdb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport13.C
@@ -0,0 +1,14 @@
+// PR c++/34749
+// Ensure dllimport is handled correctly for friends
+
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+int __declspec (dllimport) bar();
+int __declspec (dllimport) baz();
+
+class Foo
+{
+// MS requires that the dllimport attribute be specified on each declaration
+ friend int __declspec (dllimport) bar();
+ friend int baz(); // { dg-warning "dllimport ignored" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport2.C
new file mode 100644
index 000000000..d0de2551a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport2.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// PR c++/9738 Dllimport attribute is overriden by later definition/redeclaration
+
+void __attribute__((dllimport)) Bar(void);
+void __attribute__((dllimport)) Baz(void);
+__attribute__((dllimport)) int Biz;
+__attribute__((dllimport)) int Boz;
+
+
+void Foo(void)
+ {
+ Bar();
+ Baz();
+ Biz++;
+ Boz++;
+ }
+
+void Baz(void); // { dg-warning "referenced with dll linkage" }
+void Bar(void) // { dg-warning "referenced with dll linkage" }
+ {
+ }
+extern int Biz; // { dg-warning "referenced with dll linkage" }
+int Boz; // { dg-warning "referenced with dll linkage" }
+
+void foo()
+{
+ Biz++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport3.C
new file mode 100644
index 000000000..6538232f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport3.C
@@ -0,0 +1,24 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+// PR 10148 Dllimport attribute of object is overriden by later
+// redefinition without attribute.
+
+struct Foo
+{
+ int a;
+};
+
+ __attribute__((dllimport)) struct Foo f;
+
+void Bar(void)
+{
+ void* dummy = (void*) &f;
+}
+
+struct Foo f; // { dg-warning "referenced with dll linkage" }
+
+// Dllimport'd symbols do not have a constant address, so following
+// assignment would require static_initialization_and_destruction
+// if attribute is retained.
+
+void* dummy = &f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport4.C
new file mode 100644
index 000000000..4d4074cbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport4.C
@@ -0,0 +1,38 @@
+// Report error if dllimport attribute in definition itself.
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+__attribute__((dllimport)) void bar () { } // { dg-error "definition" }
+
+__attribute__((dllimport)) int foo = 1; // { dg-error "definition" }
+
+void faz()
+{
+ __attribute__((dllimport)) int faa = 1; // { dg-error "definition" }
+ faa++;
+}
+
+__attribute__((dllimport)) int fee (1); // { dg-error "definition" }
+
+
+// In-class initialization of a static data member is not a definition.
+struct F
+{
+ __attribute__ ((dllimport)) static const int i = 1; // OK
+};
+
+// Reference the dllimport'd static data member.
+void f ()
+{
+ const int* j = &F::i;
+}
+
+struct G
+{
+ __attribute__ ((dllimport)) static const int i = 1;
+};
+
+// Define the static data member _without_ the dllimport.
+// This should override the prior declaration with dllimport.
+
+const int G::i; // { dg-warning "dllimport ignored" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport5.C
new file mode 100644
index 000000000..5f1adb1ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport5.C
@@ -0,0 +1,28 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// Report error if static symbol definition has dllimport attribute.
+
+__attribute__((dllimport))
+ int impvar; // OK, implicit "extern"
+
+ static __attribute__((dllimport))
+ int static_impvar; // { dg-error "external linkage" }
+
+ static __attribute__((dllexport))
+int static_expvar; // { dg-error "external linkage" }
+
+static __attribute__((dllimport))
+void static_impfun(void); // { dg-error "external linkage" }
+
+void foo()
+{
+ __attribute__((dllimport))
+ int foovar; // OK, implicit "extern"
+ foovar++;
+}
+
+void bar()
+{
+ __attribute__((dllexport))
+ int barvar; // { dg-error "external linkage" }
+ barvar++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport6.C
new file mode 100644
index 000000000..52b0476c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport6.C
@@ -0,0 +1,30 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// Mark class static members as dllimport.
+
+struct Baz
+{
+ Baz(int a_ =0) : a(a_) {}
+ int a;
+};
+
+class __attribute__ ((dllimport)) Bar
+{
+ public:
+ static const int two = 2;
+ static const int three;
+ static const Baz null_baz;
+};
+
+int foo()
+{
+ Bar foobar;
+ const int* baz = &Bar::two;
+ int a = foobar.two;
+ int b = foobar.three;
+ int c = foobar.null_baz.a;
+ return (a + b + c + *baz);
+}
+
+// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar3twoE } }
+// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar5threeE } }
+// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar8null_bazE } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport7.C
new file mode 100644
index 000000000..0a79b3da3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport7.C
@@ -0,0 +1,34 @@
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+
+// Report errors on definition of dllimport'd static data member .
+
+
+struct Baz
+{
+ Baz(int a_ =0) : a(a_) {}
+ int a;
+};
+
+class __declspec(dllimport) Bar
+{
+ public:
+ enum {one = 1};
+ static const int two = 2;
+ static const int three;
+ static const Baz null_baz;
+};
+
+const int Bar::three = 3; // { dg-warning "redeclared without dllimport" }
+// { dg-error "definition of static data" "C++ specific error" { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } 21 }
+
+const Baz Bar::null_baz; // { dg-warning "redeclared without dllimport" }
+
+int foo()
+{
+ Bar foobar;
+ const int* baz = &Bar::two;
+ int a = foobar.two;
+ int b = foobar.three;
+ int c = foobar.null_baz.a;
+ return (a + b + c + *baz);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport8.C
new file mode 100644
index 000000000..af605a368
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport8.C
@@ -0,0 +1,29 @@
+// PR c++/8378
+// Ignore dllimport of static members if marked inlined.
+// or if definition follows declaration in dllimported class.
+
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// { dg-options { -Wall -W } }
+
+struct __attribute__((dllimport)) Foo
+{
+ static int static_int;
+ static void static_func1();
+ static void static_func2();
+ };
+
+void Foo::static_func1() // { dg-warning "redeclared without dllimport" }
+{
+}
+
+inline void Foo::static_func2()
+{
+}
+
+void testfoo()
+{
+ Foo::static_func1();
+ Foo::static_func2();
+}
+
+// { dg-final { scan-assembler-not "__imp_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport9.C
new file mode 100644
index 000000000..da57ef4bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/dllimport9.C
@@ -0,0 +1,23 @@
+// Handle dllimport attribute for functions declared inline.
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } }
+// { dg-options { -W } }
+
+inline __attribute__((dllimport)) void bar() { } // { dg-warning "inline" }
+
+struct __attribute__ ((dllimport)) Blah
+{
+ void in_blah () { } // Don't warn if member declared inline in class definition.
+ void out_blah ();
+};
+
+inline void Blah::out_blah(){ } // Don't warn for inline override of external declaration
+
+void use_inlines()
+{
+ Blah aBlah;
+ bar();
+ aBlah.in_blah ();
+ aBlah.out_blah ();
+}
+
+// { dg-final { scan-assembler-not "__imp_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed1.C
new file mode 100644
index 000000000..5a479d689
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed1.C
@@ -0,0 +1,8 @@
+// PR c++/35325
+// { dg-options "" }
+
+template<int> struct A {};
+
+template<typename> struct B : A<sizeof(0=0r)> {}; // { dg-error "not supported" }
+
+template<typename> struct C : A<sizeof(0=0r)> {}; // { dg-error "not supported" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed2.C
new file mode 100644
index 000000000..1ee5538a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fixed2.C
@@ -0,0 +1,7 @@
+// PR c++/35319
+// { dg-options "" }
+
+void foo()
+{
+ throw 0r; // { dg-error "not supported" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary1.C
new file mode 100644
index 000000000..4033e339d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 11614
+
+typedef int ary_t[];
+
+struct test
+{
+ ary_t *b;
+ int (*a)[]; // this is not a flexible array member
+};
+
+void test(void)
+{
+ struct test s;
+ int (*a)[] = 0;
+ ary_t *b = 0;
+
+ a = s.a;
+ a = s.b;
+
+ s.a = a;
+ s.b = a;
+
+ b = s.a;
+ b = s.b;
+
+ s.a = b;
+ s.b = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary2.C
new file mode 100644
index 000000000..4855b3f57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary2.C
@@ -0,0 +1,11 @@
+// PR c++/46688
+// { dg-options "" }
+
+struct A {
+ A(int);
+};
+
+struct B {
+ B() {}
+ A a[];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary3.C
new file mode 100644
index 000000000..906877b11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/flexary3.C
@@ -0,0 +1,10 @@
+// PR c++/54441
+// { dg-options "" }
+
+struct s { char c[]; };
+
+int main()
+{
+ struct s s = { .c = 0 }; // { dg-error "initializer" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname1.C
new file mode 100644
index 000000000..521d5a736
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname1.C
@@ -0,0 +1,26 @@
+// Test whether __func__ works for namespace-scope C++ functions.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+namespace xyzzy
+{
+ const char* ab6(double, void*)
+ {
+ return __func__;
+ }
+}
+
+int main()
+{
+ const char* s = xyzzy::ab6(2.3, (void*) 0);
+ bool ok = true;
+
+ ok = ok && s[0] == 'a';
+ ok = ok && s[1] == 'b';
+ ok = ok && s[2] == '6';
+ ok = ok && s[3] == '\0';
+
+ return ok ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname2.C
new file mode 100644
index 000000000..ea0c1826f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname2.C
@@ -0,0 +1,31 @@
+// Test whether __func__ works for ordinary member functions.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+struct y8a
+{
+ const char* zqjx(int, char);
+};
+
+const char* y8a::zqjx(int, char)
+{
+ return __func__;
+}
+
+
+int main()
+{
+ y8a tmp;
+ const char* s = tmp.zqjx(16, 'x');
+ bool ok = true;
+
+ ok = ok && s[0] == 'z';
+ ok = ok && s[1] == 'q';
+ ok = ok && s[2] == 'j';
+ ok = ok && s[3] == 'x';
+ ok = ok && s[4] == '\0';
+
+ return ok ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname3.C
new file mode 100644
index 000000000..c29170a9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fnname3.C
@@ -0,0 +1,65 @@
+// Test whether __func__ works for constructors and destructors.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+struct uk9i
+{
+ uk9i();
+ ~uk9i();
+
+ static const char* fname;
+ static bool obj_exists;
+};
+
+uk9i::uk9i()
+{
+ obj_exists = true;
+ fname = __func__;
+}
+
+uk9i::~uk9i()
+{
+ obj_exists = false;
+ fname = __func__;
+}
+
+const char* uk9i::fname = 0;
+bool uk9i::obj_exists = false;
+
+int main()
+{
+ bool ok = true;
+
+ ok = ok && uk9i::fname == 0;
+ ok = ok && !uk9i::obj_exists;
+
+ {
+ uk9i tmp;
+ ok = ok && uk9i::obj_exists;
+ ok = ok && uk9i::fname != 0;
+ if (ok)
+ {
+ ok = ok && uk9i::fname[0] == 'u';
+ ok = ok && uk9i::fname[1] == 'k';
+ ok = ok && uk9i::fname[2] == '9';
+ ok = ok && uk9i::fname[3] == 'i';
+ ok = ok && uk9i::fname[4] == '\0';
+ }
+ }
+
+ ok = ok && !uk9i::obj_exists;
+ ok = ok && uk9i::fname != 0;
+ if (ok)
+ {
+ ok = ok && uk9i::fname[0] == '~';
+ ok = ok && uk9i::fname[1] == 'u';
+ ok = ok && uk9i::fname[2] == 'k';
+ ok = ok && uk9i::fname[3] == '9';
+ ok = ok && uk9i::fname[4] == 'i';
+ ok = ok && uk9i::fname[5] == '\0';
+ }
+
+ return ok ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope1.C
new file mode 100644
index 000000000..fa6401a3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options -fno-for-scope }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 4206. We were nesting SCOPE_STMTs badly.
+
+
+struct A
+{
+ A ();
+ ~A ();
+};
+
+
+void Go( )
+{
+ for (int i = 1;;)
+ {
+ switch (1) {
+ default: {}
+ }
+ A d;
+ }
+ i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope2.C
new file mode 100644
index 000000000..4c63bab77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/forscope2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options "-fpermissive -std=c++98" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 4206. We were nesting SCOPE_STMTs badly.
+
+
+struct A
+{
+ A ();
+ ~A ();
+};
+
+
+void Go( )
+{
+ for (int i = 1;;) // { dg-warning "using obsolete binding" "" }
+ {
+ switch (1) {
+ default: {}
+ }
+ A d;
+ }
+ i; // { dg-warning "name lookup" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/fpreg1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/fpreg1.C
new file mode 100644
index 000000000..c5170a4a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/fpreg1.C
@@ -0,0 +1,82 @@
+// Test permitted and invalid uses of __fpreg, for C++.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile { target ia64-*-* } }
+// { dg-options "" }
+
+__float80 f80;
+double d;
+// Default initialized __fpreg is OK.
+__fpreg fpreg, fpreg2;
+// But explicitly zero-initialized is an invalid conversion.
+__fpreg fi = 0; // { dg-error "invalid conversion to '__fpreg'" }
+
+__fpreg f0 (__fpreg);
+int f1 (__float80);
+
+// __fpreg in a structure is OK.
+struct s {
+ __float80 b;
+ __fpreg a;
+} x;
+
+void
+f (void)
+{
+ __fpreg *p;
+ // Valid operations.
+ fpreg = fpreg2;
+ fpreg2 = (__fpreg) fpreg;
+ fpreg = f0 (fpreg2);
+ fpreg = +fpreg2;
+ p = &fpreg;
+ (void) fpreg;
+ fpreg = x.a;
+ fpreg2 = (struct s) { 0 }.a;
+ fpreg = (d ? fpreg : fpreg2);
+ d = sizeof (fpreg);
+ (void)(fpreg, fpreg);
+ // Invalid operations.
+ ++fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ --fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg++; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg--; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = -fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = ~fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = !fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = *fpreg; // { dg-error "invalid type argument" }
+ if (fpreg) // { dg-error "invalid conversion from '__fpreg'" }
+ return;
+ d = fpreg; // { dg-error "invalid conversion from '__fpreg'" }
+ d = (double) fpreg; // { dg-error "invalid conversion from '__fpreg'" }
+ fpreg = (__fpreg) d; // { dg-error "invalid conversion to '__fpreg'" }
+ fpreg = fpreg * fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg / fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg % fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg + fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg - fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg << fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ fpreg = fpreg >> fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg < fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg > fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg <= fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg >= fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg == fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg != fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg & fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg ^ fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg | fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg && fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = fpreg || fpreg; // { dg-error "invalid operation on '__fpreg'" }
+ d = (fpreg ? 1 : 2); // { dg-error "invalid conversion from '__fpreg'" }
+ fpreg = (d ? fpreg : d); // { dg-error "invalid conversion to '__fpreg'" }
+ fpreg *= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg /= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg %= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg += fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg -= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg <<= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg >>= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg &= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg ^= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+ fpreg |= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C
new file mode 100644
index 000000000..b33629dcf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler-not "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler-not "func4" } } */
+/* { dg-final { scan-assembler-not "func5" } } */
+
+namespace {
+#include "gnu-inline-global.C"
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C
new file mode 100644
index 000000000..f22a23c0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler "func5" } } */
+
+#undef IN_CLASS
+#define IN_CLASS gnu_test_static
+
+struct IN_CLASS {
+ static int func1(void);
+ static int func2(void);
+ static int func3(void);
+ static int func4(void);
+ static int func5(void);
+};
+
+#include "gnu-inline-global.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class.C
new file mode 100644
index 000000000..71a0b1e36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-class.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler "func5" } } */
+
+#define IN_CLASS gnu_test
+
+struct IN_CLASS {
+ int func1(void);
+ int func2(void);
+ int func3(void);
+ int func4(void);
+ int func5(void);
+};
+
+#include "gnu-inline-global.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-common.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-common.h
new file mode 100644
index 000000000..87455ae7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-common.h
@@ -0,0 +1,24 @@
+#ifndef gnu
+# define gnu_inline __attribute__((gnu_inline)) inline
+#endif
+
+#define declspec(spec, name) spec int name (void)
+#ifdef IN_CLASS
+# define decl(spec, name)
+#else
+# define decl(spec, name) defpfx declspec(spec, name);
+#endif
+#define def(spec, name, ret) defpfx declspec(spec, name) { return ret; }
+#define gnuindef(name, ret) def(gnu_inline, name, ret)
+
+#ifndef pfx
+# ifdef IN_CLASS
+# define pfx(x) IN_CLASS::x
+# else
+# define pfx(x) x
+# endif
+#endif
+
+#ifndef defpfx
+# define defpfx
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C
new file mode 100644
index 000000000..fc72d26fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C
@@ -0,0 +1,19 @@
+/* Test __attribute__((gnu_inline)).
+
+ Check that we don't get out-of-line definitions for extern inline
+ gnu_inline functions, regardless of redeclaration.
+
+ */
+
+/* { dg-do link } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+
+#include "gnu-inline-common.h"
+
+decl(extern, fn)
+gnuindef(fn, 0)
+decl(extern, fn)
+
+int main () {
+ fn ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C
new file mode 100644
index 000000000..7e84fa773
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C
@@ -0,0 +1,56 @@
+/* Test __attribute__((gnu_inline)).
+
+ Check that we reject various forms of duplicate definitions.
+*/
+
+/* { dg-do compile } */
+/* { dg-options " -ansi -Wno-long-long -ftrack-macro-expansion=0" } */
+
+#include "gnu-inline-common.h"
+
+#undef fn
+#define fn pfx(func_decl_inline_before)
+decl(inline, fn) // { dg-message "previous" "" }
+gnuindef(fn, 0) // { dg-error "redeclared" "" }
+
+#undef fn
+#define fn pfx(func_decl_inline_after)
+gnuindef(fn, 0) // { dg-message "previous" "" }
+decl(inline, fn) // { dg-error "redeclared" "" }
+
+#undef fn
+#define fn pfx(func_def_gnuin_redef)
+gnuindef(fn, 0) // { dg-message "previous" "" }
+gnuindef(fn, 1) // { dg-error "redefinition" "" }
+
+#undef fn
+#define fn pfx(func_def_inline_redef)
+def(inline, fn, 0) // { dg-message "previous" "" }
+def(inline, fn, 1) // { dg-error "redefinition" "" }
+
+#undef fn
+#define fn pfx(func_def_inline_after)
+gnuindef(fn, 0) // { dg-message "previous" "" }
+def(inline, fn, 1) // { dg-error "redeclare" "" }
+
+#undef fn
+#define fn pfx(func_def_inline_before)
+def(inline, fn, 0) // { dg-message "previous" "" }
+gnuindef(fn, 1) // { dg-error "redefinition" "" }
+
+#undef fn
+#define fn pfx(func_def_before)
+def(, fn, 0) // { dg-message "previous" "" }
+gnuindef(fn, 1) // { dg-error "redefinition" "" }
+
+#undef fn
+#define fn pfx(func_decl_static_inline_before)
+decl(static inline, fn) // { dg-message "previous" "" }
+gnuindef(fn, 0) // { dg-error "redeclared" "" }
+
+#undef fn
+#define fn pfx(func_def_static_inline_after)
+decl(static, fn)
+gnuindef(fn, 0) // { dg-message "previous" "" }
+decl(static, fn)
+def(static inline, fn, 1) // { dg-error "redeclare" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global.C
new file mode 100644
index 000000000..f628073f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-global.C
@@ -0,0 +1,50 @@
+/* Test __attribute__((gnu_inline)).
+
+ Check that __attribute__((gnu_inline)) has no effect, in the
+ absence of extern and/or inline.
+
+ Check that we don't get out-of-line definitions for extern inline
+ gnu_inline functions, regardless of declarations or definitions.
+
+ Check that such functions can be overridden by out-of-line
+ definitions.
+
+ */
+
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler-not "func5" } } */
+
+#include "gnu-inline-common.h"
+
+#undef fn
+#define fn pfx(func1) // must be emitted out-of-line
+gnuindef(fn, 0)
+def(, fn, 2)
+
+#undef fn
+#define fn pfx(func2) // must be emitted out-of-line
+decl(extern, fn)
+gnuindef(fn, 0)
+def(, fn, 2)
+
+#undef fn
+#define fn pfx(func3) // must not be emitted
+decl(extern, fn)
+gnuindef(fn, 0)
+
+#undef fn
+#define fn pfx(func4) // must be emitted out-of-line
+decl(extern, fn)
+gnuindef(fn, 0)
+def(, fn, 1)
+
+#undef fn
+#define fn pfx(func5) // must NOT be emitted, because it's static and unused
+decl(static, fn)
+gnuindef(fn, 0)
+def(, fn, 1)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C
new file mode 100644
index 000000000..ce3fea655
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler-not "func5" } } */
+
+namespace gnu_test {
+#include "gnu-inline-global.C"
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C
new file mode 100644
index 000000000..9bf36a8d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler "func5" } } */
+
+template <typename T> struct gnu_test {
+ int func1(void);
+ int func2(void);
+ int func3(void);
+ int func4(void);
+ int func5(void);
+};
+
+#define defpfx template <typename T>
+#define IN_CLASS gnu_test<T>
+
+#include "gnu-inline-global.C"
+
+template struct gnu_test<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C
new file mode 100644
index 000000000..fb88a2a91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */ // such that static functions are optimized out
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler "func2" } } */
+/* { dg-final { scan-assembler-not "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+/* { dg-final { scan-assembler-not "func5" } } */
+
+#define defpfx template <typename T>
+
+#include "gnu-inline-global.C"
+
+template int func1<int>(void);
+template int func2<int>(void);
+template int func3<int>(void);
+template int func4<int>(void);
+template int func5<int>(void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C
new file mode 100644
index 000000000..e6e9fc6ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C
@@ -0,0 +1,152 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ A a;
+};
+
+struct C
+: public A { };
+
+struct D
+{
+ D& operator=(const D&) throw() { return *this; }
+};
+
+struct E
+{
+ E& operator=(const E&) throw(int) { return *this; }
+};
+
+struct E1
+{
+ E1& operator=(const E1&) throw(int) { throw int(); return *this; }
+};
+
+struct F
+{
+ F() throw(int) { }
+};
+
+struct G
+{
+ G() throw(int) { throw int(); }
+};
+
+struct H
+{
+ H& operator=(H&) throw(int) { return *this; }
+};
+
+struct H1
+{
+ H1& operator=(H1&) throw(int) { throw int(); return *this; }
+};
+
+struct I
+{
+ I& operator=(I&) throw(int) { return *this; }
+ I& operator=(const I&) throw() { return *this; }
+};
+
+struct I1
+{
+ I1& operator=(I1&) throw(int) { throw int(); return *this; }
+ I1& operator=(const I1&) throw() { return *this; }
+};
+
+struct J
+{
+ J& operator=(J&) throw() { return *this; }
+ J& operator=(const J&) throw() { return *this; }
+ J& operator=(volatile J&) throw() { return *this; }
+ J& operator=(const volatile J&) throw() { return *this; }
+};
+
+struct K
+{
+ K& operator=(K&) throw() { return *this; }
+};
+
+struct L
+{
+ L& operator=(const L&) throw() { return *this; }
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_nothrow_assign(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_nothrow_assign(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_nothrow_assign(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_nothrow_assign(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_nothrow_assign(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_nothrow_assign(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (B));
+ assert (PTEST (C));
+ assert (PTEST (C[]));
+ assert (PTEST (D));
+ assert (NTEST (E));
+ assert (NTEST (E1));
+ assert (PTEST (F));
+ assert (PTEST (G));
+ assert (NTEST (H));
+ assert (NTEST (H1));
+ assert (NTEST (I));
+ assert (NTEST (I1));
+ assert (PTEST (J));
+ assert (NTEST (const K));
+ assert (NTEST (const L));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C
new file mode 100644
index 000000000..c2e99ef54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do run }
+#include <cassert>
+
+struct S { const S& operator= (const S&); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_assign (S) == f ());
+}
+
+const S& S::operator= (const S&) { }
+
+bool f () { return __has_nothrow_assign (S); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C
new file mode 100644
index 000000000..8123fe93d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C
@@ -0,0 +1,7 @@
+// PR c++/55842
+// { dg-do compile { target c++11 } }
+
+template <class=void> struct number {
+ number() noexcept(noexcept(0)) { }
+};
+const int z=__has_nothrow_constructor(number<>);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C
new file mode 100644
index 000000000..1f1227c30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C
@@ -0,0 +1,106 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ A a;
+};
+
+struct C
+: public A { };
+
+struct D
+{
+ D() throw() { }
+};
+
+struct E
+{
+ E() throw(int) { }
+};
+
+struct E1
+{
+ E1() throw(int) { throw int(); }
+};
+
+struct F
+{
+ F(const F&) throw() { }
+};
+
+struct G
+{
+ G(const G&) throw(int) { throw int(); }
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_nothrow_constructor(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_nothrow_constructor(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_nothrow_constructor(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+
+template<typename T, bool b = __has_nothrow_constructor(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_nothrow_constructor(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_nothrow_constructor(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (B));
+ assert (PTEST (C));
+ assert (PTEST (C[]));
+ assert (PTEST (D));
+ assert (NTEST (E));
+ assert (NTEST (E1));
+ assert (NTEST (F));
+ assert (NTEST (G));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C
new file mode 100644
index 000000000..68ca111b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do run }
+#include <cassert>
+
+struct S { S (); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_constructor (S) == f ());
+}
+
+S::S () { }
+
+bool f () { return __has_nothrow_constructor (S); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C
new file mode 100644
index 000000000..87785ae5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C
@@ -0,0 +1,140 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ A a;
+};
+
+struct C
+: public A { };
+
+struct D
+{
+ D(const D&) throw() { }
+};
+
+struct E
+{
+ E(const E&) throw(int) { }
+};
+
+struct E1
+{
+ E1(const E1&) throw(int) { throw int(); }
+};
+
+struct F
+{
+ F() throw() { }
+};
+
+struct G
+{
+ G() throw(int) { throw int(); }
+};
+
+struct H
+{
+ H(H&) throw(int) { }
+};
+
+struct H1
+{
+ H1(H1&) throw(int) { throw int(); }
+};
+
+struct I
+{
+ I(I&) throw(int) { }
+ I(const I&) throw() { }
+};
+
+struct I1
+{
+ I1(I1&) throw(int) { throw int(); }
+ I1(const I1&) throw() { }
+};
+
+struct J
+{
+ J(J&) throw() { }
+ J(const J&) throw() { }
+ J(volatile J&) throw() { }
+ J(const volatile J&) throw() { }
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_nothrow_copy(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_nothrow_copy(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_nothrow_copy(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_nothrow_copy(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_nothrow_copy(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_nothrow_copy(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (B));
+ assert (PTEST (C));
+ assert (PTEST (C[]));
+ assert (PTEST (D));
+ assert (NTEST (E));
+ assert (NTEST (E1));
+ assert (PTEST (F));
+ assert (PTEST (G));
+ assert (NTEST (H));
+ assert (NTEST (H1));
+ assert (NTEST (I));
+ assert (NTEST (I1));
+ assert (PTEST (J));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C
new file mode 100644
index 000000000..b2eb203f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C
@@ -0,0 +1,12 @@
+// PR c++/36871
+// { dg-do run }
+#include <cassert>
+
+struct A { template <class T> A (T) throw (int); };
+struct B { B (B&) throw (); template <class T> B (T) throw (int); };
+
+int main ()
+{
+ assert (__has_nothrow_copy (A));
+ assert (__has_nothrow_copy (B));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C
new file mode 100644
index 000000000..797004410
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C
@@ -0,0 +1,13 @@
+// PR c++/36871
+// { dg-do run }
+#include <cassert>
+
+struct F {
+ F (const F&) throw () { }
+ template <class T> F (T) throw () { }
+};
+
+int main ()
+{
+ assert (__has_nothrow_copy (F));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C
new file mode 100644
index 000000000..69e9a6bac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C
@@ -0,0 +1,13 @@
+// PR c++/36872
+// { dg-do run }
+#include <cassert>
+
+struct S {
+ S (const S&) throw ();
+ S (...) throw (int);
+};
+
+int main ()
+{
+ assert (__has_nothrow_copy (S));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C
new file mode 100644
index 000000000..b94b338c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C
@@ -0,0 +1,13 @@
+// PR c++/36872
+// { dg-do run }
+#include <cassert>
+
+struct S {
+ S (const S&) throw ();
+ S (int) throw (int);
+};
+
+int main ()
+{
+ assert (__has_nothrow_copy (S));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C
new file mode 100644
index 000000000..6268ee292
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C
@@ -0,0 +1,12 @@
+// { dg-do run }
+#include <cassert>
+
+struct S {
+ S (S&) throw ();
+ S (const S&, int) throw (int);
+};
+
+int main ()
+{
+ assert (__has_nothrow_copy (S));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C
new file mode 100644
index 000000000..10891b6b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C
@@ -0,0 +1,12 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+struct S {
+ S (const S&) throw ();
+ S (S&&) throw (int);
+};
+
+int main ()
+{
+ assert (__has_nothrow_copy (S));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C
new file mode 100644
index 000000000..b6862298d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C
@@ -0,0 +1,19 @@
+// PR c++/56268
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A {
+ A(const A&) noexcept (T::value);
+};
+
+struct B {
+ static const bool value = true;
+};
+
+template <class T>
+struct C {
+ static const bool value = __has_nothrow_copy (T);
+};
+
+#define SA(X) static_assert((X),#X)
+SA(C<A<B>>::value);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C
new file mode 100644
index 000000000..573fd2f80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do run }
+#include <cassert>
+
+struct S { S (const S&); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_copy (S) == f ());
+}
+
+S::S (const S&) { }
+
+bool f () { return __has_nothrow_copy (S); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_assign.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_assign.C
new file mode 100644
index 000000000..dce0f8b3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_assign.C
@@ -0,0 +1,106 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ B& operator=(const B&) { return *this;}
+};
+
+struct C
+{
+ virtual int f() { return 1; }
+};
+
+struct D
+: public B { };
+
+struct E
+: public A { };
+
+struct F
+{
+ A a;
+};
+
+struct G
+{
+ B b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_trivial_assign(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_trivial_assign(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_trivial_assign(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_trivial_assign(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_trivial_assign(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_trivial_assign(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (U));
+ assert (NTEST (B));
+ assert (NTEST (C));
+ assert (NTEST (D));
+ assert (PTEST (E));
+ assert (PTEST (E[]));
+ assert (PTEST (F));
+ assert (NTEST (G));
+ assert (NTEST (const A));
+ assert (NTEST (A&));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C
new file mode 100644
index 000000000..f4addd824
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C
@@ -0,0 +1,98 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ B() { }
+};
+
+struct C
+: public B { };
+
+struct D
+: public A { };
+
+struct E
+{
+ A a;
+};
+
+struct F
+{
+ B b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_trivial_constructor(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_trivial_constructor(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_trivial_constructor(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_trivial_constructor(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_trivial_constructor(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_trivial_constructor(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (U));
+ assert (NTEST (B));
+ assert (NTEST (C));
+ assert (PTEST (D));
+ assert (PTEST (D[]));
+ assert (PTEST (E));
+ assert (NTEST (F));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_copy.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_copy.C
new file mode 100644
index 000000000..4d2341b17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_copy.C
@@ -0,0 +1,105 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ B(const B&) { }
+};
+
+struct C
+{
+ virtual int f() { return 1; }
+};
+
+struct D
+: public B { };
+
+struct E
+: public A { };
+
+struct F
+{
+ A a;
+};
+
+struct G
+{
+ B b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_trivial_copy(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_trivial_copy(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_trivial_copy(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_trivial_copy(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_trivial_copy(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_trivial_copy(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (U));
+ assert (NTEST (B));
+ assert (NTEST (C));
+ assert (NTEST (D));
+ assert (PTEST (E));
+ assert (PTEST (E[]));
+ assert (PTEST (F));
+ assert (NTEST (G));
+ assert (PTEST (B&));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C
new file mode 100644
index 000000000..2834c238d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C
@@ -0,0 +1,86 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ ~B() { }
+};
+
+struct C
+: public B { };
+
+struct D
+: public A { };
+
+template<typename T>
+ bool
+ f()
+ { return __has_trivial_destructor(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_trivial_destructor(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_trivial_destructor(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_trivial_destructor(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_trivial_destructor(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_trivial_destructor(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (int (int)));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (U));
+ assert (NTEST (B));
+ assert (NTEST (C));
+ assert (PTEST (D));
+ assert (PTEST (D[]));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C
new file mode 100644
index 000000000..f9dacf179
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C
@@ -0,0 +1,3 @@
+// PR c++/36855
+
+typedef char assert_0 [__has_trivial_destructor (int&) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C
new file mode 100644
index 000000000..62b60aebf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C
@@ -0,0 +1,89 @@
+// { dg-do run }
+#include <cassert>
+#include <exception>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ virtual ~B() { }
+};
+
+struct C
+: public B { };
+
+struct D
+{
+ ~D() { }
+};
+
+template<typename T>
+ bool
+ f()
+ { return __has_virtual_destructor(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__has_virtual_destructor(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __has_virtual_destructor(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __has_virtual_destructor(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__has_virtual_destructor(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__has_virtual_destructor(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (PTEST (std::exception));
+ assert (NTEST (A));
+ assert (NTEST (U));
+ assert (PTEST (B));
+ assert (PTEST (C));
+ assert (NTEST (C[]));
+ assert (NTEST (D));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/init1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/init1.C
new file mode 100644
index 000000000..f8d8e8533
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/init1.C
@@ -0,0 +1,6 @@
+// PR c++/9623
+// Test for trivial use of named initializer extension
+// { dg-options "" }
+
+struct S { int x; int y; };
+S s = { x:1, y:2 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/injected-ttp.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/injected-ttp.C
new file mode 100644
index 000000000..5ef4a4ec4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/injected-ttp.C
@@ -0,0 +1,15 @@
+// Test for doing the right thing with injected-class-name used as template
+// type argument. This is an extension from DR 176.
+
+// { dg-options "-pedantic -std=c++98" }
+
+template <class T>
+struct A { };
+
+template <template <class> class TTP>
+struct B { };
+
+struct C: A<int>
+{
+ B<A> b; // { dg-warning "injected-class-name" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/inline1.C
new file mode 100644
index 000000000..7e5f062e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/inline1.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+// { dg-options "-O" }
+// Make sure inlined non-outlined functions aren't marked weak.
+// We'd get a ".weak xyzzy" annotation trigged by the second declaration.
+
+// { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?xyzzy" } }
+
+// The next check isn't really part of the actual test, just to make
+// sure there's no outline-copy of xyzzy, because if that really
+// happened, it *should* be marked linkonce or perhaps weak.
+// { dg-final { scan-assembler-not "xyzzy" } }
+
+extern int x;
+extern void foo(void);
+extern void bar(void);
+
+extern "C" inline int xyzzy(int a)
+{
+ foo();
+ return a + x;
+}
+
+extern "C" int xyzzy(int);
+
+extern inline int plugh(int c)
+{
+ return xyzzy (c);
+}
+
+int y;
+void doit(int b)
+{
+ y = xyzzy (b) + plugh (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate1.C
new file mode 100644
index 000000000..1d2a6200b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate1.C
@@ -0,0 +1,24 @@
+// Test that 'extern template' suppresses instantiations.
+// { dg-do compile }
+// { dg-options "" }
+
+template <class T> void f (T) { }
+extern template void f (int);
+
+template <class T> struct A {
+ void f ();
+};
+template <class T> void A<T>::f () { }
+extern template struct A<int>;
+
+// { dg-final { scan-assembler-not "\n_?_Z1fIiEvT_(:|\n|\t)" } }
+void test_f_int () { f(42); }
+
+// { dg-final { scan-assembler-not "\n_?_ZN1AIiE1fEv(:|\n|\t)" } }
+void test_A_int_f () { A<int> a; a.f (); }
+
+// { dg-final { scan-assembler "\n_?_Z1fIdEvT_(:|\n|\t)" } }
+void test_f_double () { f (2.0); }
+
+// { dg-final { scan-assembler "\n_?_ZN1AIdE1fEv(:|\n|\t)" } }
+void test_A_double_f () { A<double> b; b.f (); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate2.C
new file mode 100644
index 000000000..a6292892b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate2.C
@@ -0,0 +1,16 @@
+// Test that 'static template' instantiates statics.
+// { dg-do compile }
+// { dg-options "-fno-implicit-templates" }
+
+template <class T> struct A {
+ static T t;
+};
+template <class T> T A<T>::t = 0;
+static template struct A<int>;
+
+// { dg-final { scan-assembler "\n_?_ZN1AIiE1tE(:|\n|\t)" { target { ! *-*-darwin* } } } }
+// { dg-final { scan-assembler ".zerofill __DATA,__pu_bss2,__ZN1AIiE1tE" { target *-*-darwin* } } }
+void test_int() { A<int>::t = 42; }
+
+// { dg-final { scan-assembler-not "\n_?_ZN1AIcE1tE(:|\n|\t)" } }
+void test_char() { A<char>::t = 42; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate3.C
new file mode 100644
index 000000000..ea60d5bf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/instantiate3.C
@@ -0,0 +1,14 @@
+// Test that 'inline template' instantiates the vtable.
+// { dg-do compile }
+// { dg-options "-O -fno-implicit-templates" }
+
+template <class T> struct A {
+ virtual void f () { }
+};
+inline template struct A<int>;
+
+// { dg-final { scan-assembler "\n_?_ZTV1AIiE(:|\n|\t)" } }
+A<int> a;
+
+// { dg-final { scan-assembler-not "\n_?_ZTV1AIcE(:|\n|\t)" } }
+A<char> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-1.C
new file mode 100644
index 000000000..65540e848
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-1.C
@@ -0,0 +1,11 @@
+// PR c++/50454
+// { dg-do compile { target int128 } }
+
+template<typename T>
+ struct limits;
+
+template<>
+ struct limits<__int128> { }; // { dg-error "does not support" }
+
+template<>
+ struct limits<unsigned __int128> { }; // { dg-error "does not support" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.C
new file mode 100644
index 000000000..36a3f1a44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.C
@@ -0,0 +1,4 @@
+// PR c++/50454
+// { dg-do compile { target int128 } }
+
+#include "int128-2.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.h
new file mode 100644
index 000000000..4e441be8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-2.h
@@ -0,0 +1,10 @@
+#pragma GCC system_header
+
+template<typename T>
+ struct limits;
+
+template<>
+ struct limits<__int128> { };
+
+template<>
+ struct limits<unsigned __int128> { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-3.C
new file mode 100644
index 000000000..f62b62d10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-3.C
@@ -0,0 +1,12 @@
+// Test for int128 enums.
+// { dg-do compile { target int128 } }
+// { dg-options "" }
+
+enum E {
+ e1 = 0xffffffffffffffff,
+ e2, e3
+} e = e3;
+
+#define SA(I,X) int a##I[(X)? 1 : -1]
+
+SA(1, sizeof(E) == sizeof(__int128));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-4.C
new file mode 100644
index 000000000..7e5a5020f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/int128-4.C
@@ -0,0 +1,20 @@
+// Test for int128 arithmetic conversions.
+// { dg-do compile { target int128 } }
+// { dg-require-effective-target c++11 }
+// { dg-options "" }
+
+template <class T, class U> struct same;
+template <class T> struct same<T,T> { };
+#define assert_same(T,U) (same<T,U>())
+
+int main()
+{
+ long long ll;
+ unsigned long long ull;
+ __int128 i8;
+ unsigned __int128 u8;
+ assert_same (decltype (ll+i8), __int128);
+ assert_same (decltype (ull+i8), __int128);
+ assert_same (decltype (ll+u8), unsigned __int128);
+ assert_same (decltype (ull+u8), unsigned __int128);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.C
new file mode 100644
index 000000000..0f803abc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.C
@@ -0,0 +1,7 @@
+// PR c++/22252
+// { dg-do link }
+// { dg-additional-sources "interface1a.cc" }
+// { dg-options "-fno-inline" }
+
+#pragma implementation
+#include "interface1.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.h
new file mode 100644
index 000000000..ce91527b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1.h
@@ -0,0 +1,10 @@
+#pragma interface
+struct B
+{
+ B(){};
+ ~B(){}
+};
+struct A {
+ B a;
+
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1a.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1a.cc
new file mode 100644
index 000000000..1859d5ce3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface1a.cc
@@ -0,0 +1,4 @@
+#include "interface1.h"
+A a;
+int main() {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2.C
new file mode 100644
index 000000000..3b306fdd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2.C
@@ -0,0 +1,7 @@
+// PR c++/26195
+// { dg-do link }
+// { dg-additional-sources "interface2b.cc" }
+// { dg-options "-fno-inline" }
+
+#pragma implementation "interface2-imaginary.h"
+#include "interface2a.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2a.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2a.h
new file mode 100644
index 000000000..efde3e24b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2a.h
@@ -0,0 +1,5 @@
+// PR c++/26195
+#pragma interface "interface2-imaginary.h"
+
+inline void foo1() { }
+inline void foo2() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2b.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2b.cc
new file mode 100644
index 000000000..9109949b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface2b.cc
@@ -0,0 +1,9 @@
+// PR c++/26195
+extern void foo1();
+extern void foo2();
+
+int main()
+{
+ foo1();
+ foo2();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h
new file mode 100644
index 000000000..874be7509
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h
@@ -0,0 +1,6 @@
+// PR c++/26195
+#pragma interface "dir1/interface3.h"
+#include "../dir2/interface3.h"
+
+inline void f1() { }
+inline void f2() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h
new file mode 100644
index 000000000..df6f7cd2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h
@@ -0,0 +1,5 @@
+// PR c++/26195
+#pragma interface "dir2/interface3.h"
+
+inline void g1() { }
+inline void g2() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a.C
new file mode 100644
index 000000000..b324dbef7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a.C
@@ -0,0 +1,7 @@
+// PR c++/26195
+// { dg-do link }
+// { dg-additional-sources "interface3a2.cc" }
+// { dg-options "-I. -fno-inline" }
+
+#pragma implementation "dir1/interface3.cc"
+#include "dir1/interface3.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc
new file mode 100644
index 000000000..cbf1ba801
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc
@@ -0,0 +1,9 @@
+// PR c++/26195
+extern void f1();
+extern void f2();
+
+int main()
+{
+ f1();
+ f2();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b.C
new file mode 100644
index 000000000..03f753209
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b.C
@@ -0,0 +1,7 @@
+// PR c++/26195
+// { dg-do link }
+// { dg-additional-sources "interface3b2.cc" }
+// { dg-options "-fno-inline" }
+
+#pragma implementation "dir2/interface3.cc"
+#include "dir1/interface3.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc
new file mode 100644
index 000000000..f532adc74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc
@@ -0,0 +1,9 @@
+// PR c++/26195
+extern void g1();
+extern void g2();
+
+int main()
+{
+ g1();
+ g2();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.C
new file mode 100644
index 000000000..85bb91283
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.C
@@ -0,0 +1,13 @@
+/* https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=227376 */
+
+/* { dg-do compile } */
+/* { dg-options "-g2" } */
+
+/* We used to crash when emitting debug info for type N::A because its
+ context was a namespace, not a function. */
+
+#include "interface4.h"
+
+void f ( ) {
+ g ( );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.h
new file mode 100644
index 000000000..0971b3722
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/interface4.h
@@ -0,0 +1,8 @@
+#pragma interface
+namespace N {
+ typedef int A;
+}
+inline void g ( ) {
+ static N :: A a = 0;
+ a = a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_abstract.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_abstract.C
new file mode 100644
index 000000000..2d7149452
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_abstract.C
@@ -0,0 +1,89 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+class B
+{
+ B();
+};
+
+class C
+{
+ virtual void rotate(int) = 0;
+};
+
+class D
+{
+ virtual void rotate(int) { }
+};
+
+template<typename T>
+ bool
+ f()
+ { return __is_abstract(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_abstract(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_abstract(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_abstract(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_abstract(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_abstract(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (NTEST (A));
+ assert (NTEST (U));
+ assert (NTEST (B));
+ assert (NTEST (B[]));
+ assert (PTEST (C));
+ assert (NTEST (D));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of.C
new file mode 100644
index 000000000..8afa532e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of.C
@@ -0,0 +1,94 @@
+// { dg-do run }
+#include <cassert>
+
+class A1
+{
+ double a;
+ double b;
+};
+
+class A2
+{
+ double a;
+ double b;
+};
+
+class B
+: private A1 { };
+
+class C
+: private A1, private A2 { };
+
+union U
+{
+ double a;
+ double b;
+};
+
+template<typename T, typename U>
+ bool
+ f()
+ { return __is_base_of(T, U); }
+
+template<typename T, typename U>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_base_of(T, U); }
+ };
+
+template<typename T, typename U>
+ class My2
+ {
+ public:
+ static const bool trait = __is_base_of(T, U);
+ };
+
+template<typename T, typename U>
+ const bool My2<T, U>::trait;
+
+template<typename T, typename U, bool b = __is_base_of(T, U)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, typename U, bool b>
+ const bool My3_help<T, U, b>::trait;
+
+template<typename T, typename U>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T, U>::trait; }
+ };
+
+#define PTEST(T, U) (__is_base_of(T, U) && f<T, U>() \
+ && My<T, U>().f() && My2<T, U>::trait && My3<T, U>().f())
+
+#define NTEST(T, U) (!__is_base_of(T, U) && !f<T, U>() \
+ && !My<T, U>().f() && !My2<T, U>::trait && !My3<T, U>().f())
+
+int main()
+{
+ assert (NTEST (int, A1));
+ assert (NTEST (A1, void));
+ assert (PTEST (A1, A1));
+ assert (NTEST (A1*, A1*));
+ assert (NTEST (A1&, A1&));
+ assert (PTEST (A1, B));
+ assert (NTEST (B, A1));
+ assert (PTEST (A1, C));
+ assert (PTEST (A2, C));
+ assert (NTEST (C, A1));
+ assert (PTEST (A1, const B));
+ assert (NTEST (const B, A1));
+ assert (PTEST (A1, volatile C));
+ assert (PTEST (volatile A2, const C));
+ assert (NTEST (const volatile C, A1));
+ assert (NTEST (U, U));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C
new file mode 100644
index 000000000..4ccc72b9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C
@@ -0,0 +1,15 @@
+class A
+{ };
+
+class B; // { dg-error "forward declaration" }
+
+union C
+{ };
+
+union D;
+
+void f()
+{
+ __is_base_of(A, B); // { dg-error "incomplete type" }
+ __is_base_of(C, D);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C
new file mode 100644
index 000000000..54862585d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C
@@ -0,0 +1,5 @@
+struct T;
+
+int check1[__is_base_of(T, T) ? 1 : -1];
+int check2[__is_base_of(T, const T) ? 1 : -1];
+int check3[__is_base_of(volatile T, T) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete.C
new file mode 100644
index 000000000..4704ff5de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_base_of_incomplete.C
@@ -0,0 +1,9 @@
+// PR c++/50732
+
+template <typename T>
+struct non_instantiable
+{
+ typedef typename T::THIS_TYPE_CANNOT_BE_INSTANTIATED type;
+};
+
+int check[__is_base_of(non_instantiable<int>, void) ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class.C
new file mode 100644
index 000000000..6f3982855
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class.C
@@ -0,0 +1,76 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+class B
+{
+ B() { }
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __is_class(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_class(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_class(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_class(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_class(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_class(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (B));
+ assert (NTEST (U));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error1.C
new file mode 100644
index 000000000..d037ec72b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error1.C
@@ -0,0 +1,6 @@
+// PR c++/33212
+
+template<int> void foo()
+{
+ __is_class((int); // { dg-error "type-specifier|primary-expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error2.C
new file mode 100644
index 000000000..8649dc441
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_class_error2.C
@@ -0,0 +1,22 @@
+// PR c++/33464
+
+template<int> void foo()
+{
+ __has_nothrow_assign(int)(); // { dg-error "'__has_nothrow_assign\\(int\\)' cannot be used" }
+ __has_trivial_assign(int)(); // { dg-error "'__has_trivial_assign\\(int\\)' cannot be used" }
+ __has_nothrow_constructor(int)(); // { dg-error "'__has_nothrow_constructor\\(int\\)' cannot be used" }
+ __has_trivial_constructor(int)(); // { dg-error "'__has_trivial_constructor\\(int\\)' cannot be used" }
+ __has_nothrow_copy(int)(); // { dg-error "'__has_nothrow_copy\\(int\\)' cannot be used" }
+ __has_trivial_copy(int)(); // { dg-error "'__has_trivial_copy\\(int\\)' cannot be used" }
+ __has_trivial_destructor(int)(); // { dg-error "'__has_trivial_destructor\\(int\\)' cannot be used" }
+ __has_virtual_destructor(int)(); // { dg-error "'__has_virtual_destructor\\(int\\)' cannot be used" }
+ __is_abstract(int)(); // { dg-error "'__is_abstract\\(int\\)' cannot be used" }
+ __is_base_of(int, float)(); // { dg-error "'__is_base_of\\(int, float\\)' cannot be used" }
+ __is_class(int)(); // { dg-error "'__is_class\\(int\\)' cannot be used" }
+ __is_convertible_to(int, float)(); // { dg-message "unimplemented" }
+ __is_empty(int)(); // { dg-error "'__is_empty\\(int\\)' cannot be used" }
+ __is_enum(int)(); // { dg-error "'__is_enum\\(int\\)' cannot be used" }
+ __is_pod(int)(); // { dg-error "'__is_pod\\(int\\)' cannot be used" }
+ __is_polymorphic(int)(); // { dg-error "'__is_polymorphic\\(int\\)' cannot be used" }
+ __is_union(int)(); // { dg-error "'__is_union\\(int\\)' cannot be used" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty.C
new file mode 100644
index 000000000..4c58941b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty.C
@@ -0,0 +1,78 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ virtual ~B() { }
+};
+
+class C
+{ };
+
+union U
+{ };
+
+template<typename T>
+ bool
+ f()
+ { return __is_empty(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_empty(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_empty(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_empty(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_empty(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_empty(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (NTEST (A));
+ assert (NTEST (B));
+ assert (PTEST (C));
+ assert (NTEST (C[]));
+ assert (NTEST (U));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty2.C
new file mode 100644
index 000000000..d1bf64c0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_empty2.C
@@ -0,0 +1,11 @@
+// PR c++/36797
+
+template <int> struct A { };
+
+template <class T>
+int foo (A<__is_empty (T)>* = 0); // { dg-error "built-in trait" }
+
+int main ()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_enum.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_enum.C
new file mode 100644
index 000000000..4ac1723ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_enum.C
@@ -0,0 +1,73 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+class B
+{ };
+
+enum E
+{
+ e0
+};
+
+template<typename T>
+ bool
+ f()
+ { return __is_enum(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_enum(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_enum(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_enum(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_enum(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_enum(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (NTEST (A));
+ assert (NTEST (B));
+ assert (PTEST (E));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_final.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_final.C
new file mode 100644
index 000000000..b3875ad04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_final.C
@@ -0,0 +1,45 @@
+// PR c++/51365
+// { dg-do compile { target c++11 } }
+
+struct A { };
+static_assert( ! __is_final (A), "A not final" );
+
+struct Af final { };
+static_assert( __is_final (Af), "Af is final" );
+
+class B { };
+static_assert( ! __is_final (B), "B not final" );
+
+class Bf final { };
+static_assert( __is_final (Bf), "Bf is final" );
+
+struct C : private A, private B { };
+static_assert( ! __is_final (C), "C not final" );
+
+struct Cf final : private A, private B { };
+static_assert( __is_final (Cf), "Cf is final" );
+
+struct D { virtual ~D() final { } };
+static_assert( ! __is_final (D), "D not final" );
+
+struct Df final { virtual ~Df() final { } };
+static_assert( __is_final (Df), "Df is final" );
+
+template<typename> struct E { };
+static_assert( ! __is_final (E<int>), "E<int> not final" );
+static_assert( ! __is_final (E<Af>), "E<Af> not final" );
+
+template<typename> struct Ef final { };
+static_assert( __is_final (Ef<int>), "Ef<int> is final" );
+static_assert( __is_final (Ef<A>), "Ef<A> is final" );
+static_assert( __is_final (Ef<Af>), "Ef<Af> is final" );
+
+template<typename> struct F { virtual ~F() final { }; };
+static_assert( ! __is_final (F<int>), "F<int> not final" );
+static_assert( ! __is_final (F<Af>), "F<Af> not final" );
+
+template<typename> struct Ff final { virtual ~Ff() final { }; };
+static_assert( __is_final (Ff<int>), "Ff<int> is final" );
+static_assert( __is_final (Ff<A>), "Ff<A> is final" );
+static_assert( __is_final (Ff<Af>), "Ff<Af> is final" );
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_literal_type1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_literal_type1.C
new file mode 100644
index 000000000..b146bdee9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_literal_type1.C
@@ -0,0 +1,10 @@
+// PR c++/48771
+// { dg-do compile { target c++11 } }
+
+struct NonLiteral {
+ NonLiteral();
+ ~NonLiteral();
+};
+
+static_assert(__is_literal_type(NonLiteral&), "Error");
+static_assert(__is_literal_type(NonLiteral&&), "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod.C
new file mode 100644
index 000000000..d073889c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod.C
@@ -0,0 +1,75 @@
+// { dg-do run { target c++11 } }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+struct B
+{
+ B() { }
+};
+
+struct C
+: public A { };
+
+template<typename T>
+ bool
+ f()
+ { return __is_pod(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_pod(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_pod(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_pod(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_pod(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_pod(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (PTEST (int));
+ assert (NTEST (void));
+ assert (PTEST (A));
+ assert (PTEST (A[]));
+ assert (NTEST (B));
+ assert (PTEST (C));
+ assert (PTEST (C[]));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_98.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_98.C
new file mode 100644
index 000000000..80a87c825
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_98.C
@@ -0,0 +1,16 @@
+// PR c++/43333
+// { dg-options "-std=c++98" }
+// { dg-do run }
+
+struct strPOD
+{
+ const char *const foo;
+ const char *const bar;
+};
+extern "C" void abort (void);
+int main ()
+{
+ if (!__is_pod (strPOD))
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C
new file mode 100644
index 000000000..a30ab1fdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C
@@ -0,0 +1,8 @@
+// PR c++/32158
+template<typename T>
+ struct A
+ {
+ A() { }
+ };
+
+int t[__is_pod(A<int>)?-1:1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_polymorphic.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_polymorphic.C
new file mode 100644
index 000000000..462e4b705
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_polymorphic.C
@@ -0,0 +1,83 @@
+// { dg-do run }
+#include <cassert>
+#include <exception>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+class B
+{
+ virtual void rotate(int) { }
+};
+
+class C
+: public B { };
+
+union U
+{
+ double a;
+ double b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __is_polymorphic(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_polymorphic(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_polymorphic(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_polymorphic(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_polymorphic(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_polymorphic(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (PTEST (std::exception));
+ assert (NTEST (A));
+ assert (PTEST (B));
+ assert (PTEST (C));
+ assert (NTEST (C[]));
+ assert (NTEST (U));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/is_union.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_union.C
new file mode 100644
index 000000000..c95f5a6e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/is_union.C
@@ -0,0 +1,76 @@
+// { dg-do run }
+#include <cassert>
+
+struct A
+{
+ double a;
+ double b;
+};
+
+class B
+{
+ B() { }
+};
+
+union U
+{
+ double a;
+ double b;
+};
+
+template<typename T>
+ bool
+ f()
+ { return __is_union(T); }
+
+template<typename T>
+ class My
+ {
+ public:
+ bool
+ f()
+ { return !!__is_union(T); }
+ };
+
+template<typename T>
+ class My2
+ {
+ public:
+ static const bool trait = __is_union(T);
+ };
+
+template<typename T>
+ const bool My2<T>::trait;
+
+template<typename T, bool b = __is_union(T)>
+ struct My3_help
+ { static const bool trait = b; };
+
+template<typename T, bool b>
+ const bool My3_help<T, b>::trait;
+
+template<typename T>
+ class My3
+ {
+ public:
+ bool
+ f()
+ { return My3_help<T>::trait; }
+ };
+
+#define PTEST(T) (__is_union(T) && f<T>() \
+ && My<T>().f() && My2<T>::trait && My3<T>().f())
+
+#define NTEST(T) (!__is_union(T) && !f<T>() \
+ && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
+
+int main()
+{
+ assert (NTEST (int));
+ assert (NTEST (void));
+ assert (NTEST (A));
+ assert (NTEST (B));
+ assert (PTEST (U));
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/ivdep-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/ivdep-1.C
new file mode 100644
index 000000000..751154deb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/ivdep-1.C
@@ -0,0 +1,18 @@
+// PR c++/60267
+// { dg-do compile }
+// { dg-options "-O3" }
+
+template <int N>
+void
+foo (int *a, int *b, int *c)
+{
+#pragma GCC ivdep
+ for (int i = 0; i < N; i++)
+ a[i] = b[i] * c[i];
+}
+
+void
+bar (int *a, int *b, int *c)
+{
+ foo <64> (a, b, c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/java-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/java-1.C
new file mode 100644
index 000000000..f88e1fcab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/java-1.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target { ! { powerpc-ibm-aix* } } } }
+// { dg-options "" }
+// Test extern "java" and some throwing of the objects.
+
+extern "Java"
+ namespace java
+ {
+ namespace lang
+ {
+ class Throwable;
+ class Class;
+ }
+}
+typedef class java::lang::Throwable* jthrowable;
+typedef class java::lang::Class* jclass;
+class java::lang::Throwable {
+public:
+ static jclass class$;
+};
+int
+_Jv_FindClassFromSignature ( )
+ try
+ {
+ }
+ catch (java::lang::Throwable *ncdfe) {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/java-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/java-2.C
new file mode 100644
index 000000000..8114517b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/java-2.C
@@ -0,0 +1,79 @@
+// PR c++/30293
+// PR c++/30294
+// { dg-do compile { target { ! { powerpc-ibm-aix* } } } }
+// { dg-options "" }
+
+extern "Java" {
+typedef __java_byte jbyte;
+namespace java {
+namespace lang {
+ class Object {};
+ class Class {};
+}
+}
+typedef struct java::lang::Object* jobject;
+typedef java::lang::Class *jclass;
+}
+extern "C" jobject _Jv_AllocObject (jclass);
+
+extern "Java" {
+ struct A { static java::lang::Class class$; };
+}
+
+struct B {
+ A a; // { dg-error "has Java class type" }
+};
+
+void* operator new (__SIZE_TYPE__, void*) throw();
+char buf[1024];
+
+A a; // { dg-error "not allocated with" }
+A b = A (); // { dg-error "not allocated with" }
+A *c = new ((void *) buf) A (); // { dg-error "using placement new" }
+A *d = new A ();
+jbyte e = 6;
+
+const A fn1 () // { dg-error "return type has Java class type" }
+{
+ A a; // { dg-error "not allocated with" }
+ return a;
+}
+
+A fn2 () // { dg-error "return type has Java class type" }
+{
+ A a; // { dg-error "not allocated with" }
+ return a;
+}
+
+A *fn3 ()
+{
+ return new A ();
+}
+
+A &fn4 ()
+{
+ return *c;
+}
+
+jbyte fn5 ()
+{
+ return 7;
+}
+
+void fn6 (A x) // { dg-error "has Java class type" }
+{
+}
+
+void fn7 (const A x) // { dg-error "has Java class type" }
+{
+}
+
+void fn8 (A *x)
+{
+ (void) x;
+}
+
+void fn9 (jbyte x)
+{
+ (void) x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label1.C
new file mode 100644
index 000000000..95fd644e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label1.C
@@ -0,0 +1,10 @@
+// { dg-options "" }
+
+int main(void) {
+ static const void* lbls[2][2] = {{&&lbl0, &&lbl0}, {&&lbl0, &&lbl0}};
+ goto *lbls[0][0];
+ goto *lbls[0][0][0]; // { dg-message "" }
+ goto *lbls[0]; // { dg-error "" }
+ lbl0:
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label10.C
new file mode 100644
index 000000000..632b2426e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label10.C
@@ -0,0 +1,17 @@
+// PR c++/33836
+// { dg-do compile }
+// { dg-options "" }
+
+template<int N> struct A
+{
+ enum { M = && N }; // { dg-error "referenced outside|cannot appear in|not an integer constant" }
+};
+
+A<0> a;
+
+void foo ()
+{
+ __label__ P;
+ enum { O = && P }; // { dg-error "cannot appear in|not an integer constant" }
+ P:;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label11.C
new file mode 100644
index 000000000..dd9222860
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label11.C
@@ -0,0 +1,46 @@
+// PR c++/38725
+// { dg-do compile }
+// { dg-options "" }
+
+struct A {};
+struct B : virtual A {};
+int vi;
+void *vp;
+
+void
+f1 (int i)
+{
+ goto *i;
+}
+
+void
+f2 (B b)
+{
+ goto *b; // { dg-error "cannot convert" }
+}
+
+template <typename T>
+void
+f3 (T i)
+{
+ goto *i;
+}
+
+void
+f3a ()
+{
+ f3 (vi);
+}
+
+template <typename T>
+void
+f4 (T i)
+{
+ goto *i;
+}
+
+void
+f4a ()
+{
+ f4 (vp);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label12.C
new file mode 100644
index 000000000..2585318b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label12.C
@@ -0,0 +1,39 @@
+// PR c++/39028
+// { dg-do compile }
+// Origin: Stephan Springl <springl@bfw-online.de>
+
+void
+f ()
+{
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ __label__ l;
+ goto l;
+ l:;
+ }
+ while (i++ < 5)
+ {
+ __label__ l;
+ goto l;
+ l:;
+ }
+ do
+ {
+ __label__ l;
+ goto l;
+ l:;
+ }
+ while (i++ < 8);
+ if (1)
+ {
+ __label__ l;
+ goto l;
+ l:;
+ }
+ {
+ __label__ l;
+ goto l;
+ l:;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label13.C
new file mode 100644
index 000000000..0887d46a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label13.C
@@ -0,0 +1,22 @@
+// PR c++/41090
+// { dg-do run }
+// { dg-options "" }
+
+int i;
+struct C
+{
+ C();
+};
+
+C::C() // { dg-bogus "can never be copied" "" }
+{
+ static void *labelref = &&label;
+ goto *labelref;
+ label: i = 1;
+}
+
+int main()
+{
+ C c;
+ return (i != 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label13a.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label13a.C
new file mode 100644
index 000000000..3be8e3114
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label13a.C
@@ -0,0 +1,25 @@
+// PR c++/41090
+// { dg-do run }
+// { dg-options "-save-temps" }
+// { dg-final { scan-assembler "_ZN1CC4Ev" } }
+// { dg-final cleanup-saved-temps }
+
+int i;
+struct A { A() {} };
+struct C: virtual A
+{
+ C();
+};
+
+C::C()
+{
+ static void *labelref = &&label;
+ goto *labelref;
+ label: i = 1;
+}
+
+int main()
+{
+ C c;
+ return (i != 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label14.C
new file mode 100644
index 000000000..d1a8b0d52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label14.C
@@ -0,0 +1,17 @@
+// PR c++/53812
+// { dg-do compile }
+// { dg-options "" }
+
+struct T { T () : t(0) {}; int t; ~T (); };
+struct S { void *operator [] (T); };
+void bar (S &, void *, void *);
+
+void
+foo (S &x, T &y)
+{
+ bar (x, &&l1, &&l2);
+l1:
+ goto *x[y];
+l2:
+ bar (x, &&l1, &&l2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label2.C
new file mode 100644
index 000000000..7d11d00f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label2.C
@@ -0,0 +1,11 @@
+// { dg-options "" }
+
+template <typename T>
+void f() {
+ l:
+ void *p[] = { &&l };
+
+ goto *p[0];
+}
+
+template void f<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label3.C
new file mode 100644
index 000000000..604bfdc12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label3.C
@@ -0,0 +1,39 @@
+// Bug: we were removing the p = q assignment in dce, and then reinserting
+// it *after* the try/catch in out-of-ssa. Oops.
+
+// testcase reduced from libjava/interpret.cc.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" int printf (const char *, ...);
+
+bool b;
+
+int main()
+{
+ __label__ one, two, done;
+ void *labs[] = { &&one, &&two, &&done };
+ const void **q = (const void **)labs;
+ const void **p = q;
+
+ try
+ {
+ one:
+ printf ("one!\n");
+ if (b)
+ throw 42;
+ goto **p++;
+
+ two:
+ printf ("two!\n");
+ goto **p++;
+
+ done:
+ printf ("done!\n");
+ }
+ catch (int)
+ {
+ printf ("caught!\n");
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label4.C
new file mode 100644
index 000000000..93f140f34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label4.C
@@ -0,0 +1,6 @@
+// PR c++/20563: ICE (--enable-checking), infinite loop (--disable-checking)
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// { dg-do compile }
+
+__label__ *l; // { dg-error "not at the beginning of" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label5.C
new file mode 100644
index 000000000..34ca90d87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label5.C
@@ -0,0 +1,6 @@
+// { dg-options "" }
+// PR c++/24052
+
+struct A { };
+int main() { b: A() && && b; } // { dg-error "operand types are 'A' and 'void\\*'" }
+// { dg-message "candidate|operator&&|no known conversion" "additional" { target *-*-* } 5 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label6.C
new file mode 100644
index 000000000..e4b0c37c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label6.C
@@ -0,0 +1,3 @@
+// PR c++/32108
+
+__label__ L; // { dg-error "not at the beginning" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label7.C
new file mode 100644
index 000000000..e92dccf5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label7.C
@@ -0,0 +1,12 @@
+// PR c++/32121
+// { dg-do compile }
+
+int f (void)
+{
+ a:;
+ __label__ a; // { dg-error "not at the beginning" }
+ int b;
+ __label__ c; // { dg-error "not at the beginning" }
+ a:; // { dg-error "duplicate label" }
+ c:;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label8.C
new file mode 100644
index 000000000..1f6175df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label8.C
@@ -0,0 +1,22 @@
+// PR c++/32121
+// { dg-do compile }
+
+int f (void)
+{
+ __label__ a, b;
+ __label__ c;
+ a:;
+ b:;
+ c:;
+ {
+ __label__ d;
+ d:;
+ if (0)
+ {
+ __label__ e;
+ __label__ f;
+ f:;
+ e:;
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/label9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/label9.C
new file mode 100644
index 000000000..81b385ffe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/label9.C
@@ -0,0 +1,10 @@
+// PR c++/32121
+// { dg-do compile }
+
+int f (void)
+{
+ while (1)
+ __label__ a; // { dg-error "not at the beginning" }
+ for (;;)
+ __label__ b; // { dg-error "not at the beginning" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/lvaddr.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/lvaddr.C
new file mode 100644
index 000000000..5b217d165
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/lvaddr.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+
+void f()
+{
+ int n;
+ char* p = &(char) n; // { dg-error "lvalue" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/lvalue1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/lvalue1.C
new file mode 100644
index 000000000..bf883eae2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/lvalue1.C
@@ -0,0 +1,10 @@
+// Test that we complain about the gcc cast-as-lvalue extension.
+
+int main ()
+{
+ char c;
+
+ static_cast<int>(c) = 2; // { dg-error "lvalue" "not an lvalue" }
+
+ return c != 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/max.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/max.C
new file mode 100644
index 000000000..bc65f1f70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/max.C
@@ -0,0 +1,6 @@
+struct s_t {
+};
+void foo(void) {
+ s_t s; int i;
+ s<?=i; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/member-attr.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/member-attr.C
new file mode 100644
index 000000000..2a7e18bf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/member-attr.C
@@ -0,0 +1,14 @@
+/* Test to see if__attribute__'s are handled by inline member functions */
+/* { dg-do compile } */
+/* { dg-options "-fmessage-length=0" } */
+
+/* Previously __attribute__'s were handled by the grammar but "dropped
+ on the floor", these effectively ignoring them. This tests the fix
+ to see that they are now handled. In this test it should report
+ that we have an illegal attribute. */
+
+class T {
+ public:
+ __attribute__ ((garbage1)) void member1(int) {} /* { dg-warning "'garbage1' attribute directive ignored" "" } */
+ void __attribute__ ((garbage2)) member2(int) {} /* { dg-warning "'garbage2' attribute directive ignored" "" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/ms-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/ms-1.C
new file mode 100644
index 000000000..3963b7561
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/ms-1.C
@@ -0,0 +1,17 @@
+
+// MS allows more things to be pointers to member functions
+// { dg-options "-fms-extensions" }
+
+struct X
+{
+ void Foo (X *);
+ void Bar ();
+};
+
+void Quux (void (X::*) ());
+
+void X::Foo (X *ptr) // { dg-message "candidate" }
+{
+ Quux (Foo); // { dg-error "no matches" }
+ Quux (Bar);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv1.C
new file mode 100644
index 000000000..4eedbff7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv1.C
@@ -0,0 +1,132 @@
+/* Test case to check if Multiversioning works. */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2 -fPIC" } */
+
+#include <assert.h>
+
+/* Default version. */
+int foo (); // Extra declaration that is merged with the second one.
+int foo () __attribute__ ((target("default")));
+/* The other versions of foo. Mix up the ordering and
+ check if the dispatching does it in the order of priority. */
+/* Check combination of target attributes. */
+int foo () __attribute__ ((target("arch=corei7,popcnt")));
+/* The target operands in this declaration and the definition are re-ordered.
+ This should still work. */
+int foo () __attribute__ ((target("ssse3,avx2")));
+
+/* Check for all target attributes for which dispatchers are available. */
+/* Check arch= */
+int foo () __attribute__((target("arch=core2")));
+int foo () __attribute__((target("arch=corei7")));
+int foo () __attribute__((target("arch=atom")));
+/* Check ISAs */
+int foo () __attribute__((target("avx")));
+int foo () __attribute__ ((target("arch=core2,sse4.2")));
+/* Check more arch=. */
+int foo () __attribute__((target("arch=amdfam10")));
+int foo () __attribute__((target("arch=bdver1")));
+int foo () __attribute__((target("arch=bdver2")));
+
+int (*p)() = &foo;
+int main ()
+{
+ int val = foo ();
+ assert (val == (*p)());
+
+ /* Check in the exact same order in which the dispatching
+ is expected to happen. */
+ if (__builtin_cpu_is ("bdver1"))
+ assert (val == 1);
+ else if (__builtin_cpu_is ("bdver2"))
+ assert (val == 2);
+ else if (__builtin_cpu_supports ("avx2")
+ && __builtin_cpu_supports ("ssse3"))
+ assert (val == 3);
+ else if (__builtin_cpu_supports ("avx"))
+ assert (val == 4);
+ else if (__builtin_cpu_is ("corei7")
+ && __builtin_cpu_supports ("popcnt"))
+ assert (val == 5);
+ else if (__builtin_cpu_is ("corei7"))
+ assert (val == 6);
+ else if (__builtin_cpu_is ("amdfam10h"))
+ assert (val == 7);
+ else if (__builtin_cpu_is ("core2")
+ && __builtin_cpu_supports ("sse4.2"))
+ assert (val == 8);
+ else if (__builtin_cpu_is ("core2"))
+ assert (val == 9);
+ else if (__builtin_cpu_is ("atom"))
+ assert (val == 10);
+ else
+ assert (val == 0);
+
+ return 0;
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("arch=corei7,popcnt")))
+foo ()
+{
+ return 5;
+}
+int __attribute__ ((target("avx2,ssse3")))
+foo ()
+{
+ return 3;
+}
+
+int __attribute__ ((target("arch=core2")))
+foo ()
+{
+ return 9;
+}
+
+int __attribute__ ((target("arch=corei7")))
+foo ()
+{
+ return 6;
+}
+
+int __attribute__ ((target("arch=atom")))
+foo ()
+{
+ return 10;
+}
+
+int __attribute__ ((target("avx")))
+foo ()
+{
+ return 4;
+}
+
+int __attribute__ ((target("arch=core2,sse4.2")))
+foo ()
+{
+ return 8;
+}
+
+int __attribute__ ((target("arch=amdfam10")))
+foo ()
+{
+ return 7;
+}
+
+int __attribute__ ((target("arch=bdver1")))
+foo ()
+{
+ return 1;
+}
+
+int __attribute__ ((target("arch=bdver2")))
+foo ()
+{
+ return 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv10.C
new file mode 100644
index 000000000..5dfe36372
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv10.C
@@ -0,0 +1,12 @@
+// { dg-do assemble { target i?86-*-* x86_64-*-* } }
+// { dg-options "" }
+
+__attribute__((target ("popcnt"), used))
+void foo (void)
+{
+}
+
+__attribute__((target ("popcnt","avx"), used))
+void foo (void)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv11.C
new file mode 100644
index 000000000..1f5c576f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv11.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-msse2" }
+
+int foo () __attribute__ ((target("default")));
+int foo () __attribute__ ((target("sse2")));
+
+int
+main ()
+{
+ return foo ();
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("sse2")))
+foo ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12-aux.cc
new file mode 100644
index 000000000..611c679bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12-aux.cc
@@ -0,0 +1,10 @@
+// Test case to check if multiversioning works as expected when the versions
+// are defined in different files. Auxiliary file for mv12.C.
+
+#include "mv12.h"
+
+__attribute__ ((target ("sse4.2")))
+int foo ()
+{
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.C
new file mode 100644
index 000000000..8b2e42340
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.C
@@ -0,0 +1,22 @@
+// Test case to check if multiversioning works as expected when the versions
+// are defined in different files.
+
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-ifunc "" }
+// { dg-options "-O2" }
+// { dg-additional-sources "mv12-aux.cc" }
+
+#include "mv12.h"
+
+int main ()
+{
+ if (__builtin_cpu_supports ("sse4.2"))
+ return foo () - 1;
+ return foo ();
+}
+
+__attribute__ ((target ("default")))
+int foo ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.h
new file mode 100644
index 000000000..650358d83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv12.h
@@ -0,0 +1,4 @@
+// Header file used by mv12.C and mv12-aux.cc.
+
+int foo () __attribute__ ((target ("default")));
+int foo () __attribute__ ((target ("sse4.2")));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv13.C
new file mode 100644
index 000000000..5674d19c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv13.C
@@ -0,0 +1,18 @@
+// Test case to check if multiversioning functions that are extern "C"
+// generates errors.
+
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+
+extern "C"
+__attribute__ ((target ("default")))
+int foo () // { dg-message "previously defined here" }
+{
+ return 0;
+}
+
+extern "C"
+__attribute__ ((target ("sse4.2")))
+int foo () // { dg-error "redefinition" }
+{
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv14.C
new file mode 100644
index 000000000..e36e08d50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv14.C
@@ -0,0 +1,40 @@
+/* Test case to check if Multiversioning works. */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2 -fPIC" } */
+
+#include <assert.h>
+
+/* Default version. */
+int foo (); // Extra declaration that is merged with the second one.
+int foo () __attribute__ ((target("default")));
+
+int foo () __attribute__ ((target("arch=corei7")));
+
+int (*p)() = &foo;
+int main ()
+{
+ int val = foo ();
+ assert (val == (*p)());
+
+ /* Check in the exact same order in which the dispatching
+ is expected to happen. */
+ if (__builtin_cpu_is ("corei7"))
+ assert (val == 5);
+ else
+ assert (val == 0);
+
+ return 0;
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("arch=corei7")))
+foo ()
+{
+ return 5;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv15.C
new file mode 100644
index 000000000..42e39d24c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv15.C
@@ -0,0 +1,40 @@
+/* Test case to check if Multiversioning works. */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2 -fPIC" } */
+
+#include <assert.h>
+
+/* Default version. */
+int foo (); // Extra declaration that is merged with the second one.
+int foo () __attribute__ ((target("default")));
+
+int foo () __attribute__ ((target("arch=nehalem")));
+
+int (*p)() = &foo;
+int main ()
+{
+ int val = foo ();
+ assert (val == (*p)());
+
+ /* Check in the exact same order in which the dispatching
+ is expected to happen. */
+ if (__builtin_cpu_is ("corei7"))
+ assert (val == 5);
+ else
+ assert (val == 0);
+
+ return 0;
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("arch=nehalem")))
+foo ()
+{
+ return 5;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv16.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv16.C
new file mode 100644
index 000000000..8992bfc6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv16.C
@@ -0,0 +1,65 @@
+// Test that dispatching can choose the right multiversion
+// for Intel CPUs with the same internal GCC processor id
+// but slighly different sets of x86 extensions.
+
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-ifunc "" }
+// { dg-options "-O2" }
+
+#include <assert.h>
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("arch=nehalem")))
+foo ()
+{
+ return 4;
+}
+
+int __attribute__ ((target("arch=westmere")))
+foo ()
+{
+ return 5;
+}
+
+int __attribute__ ((target("arch=sandybridge")))
+foo ()
+{
+ return 8;
+}
+
+int __attribute__ ((target("arch=ivybridge")))
+foo ()
+{
+ return 9;
+}
+
+int __attribute__ ((target("arch=haswell")))
+foo ()
+{
+ return 12;
+}
+
+int main ()
+{
+ int val = foo ();
+
+ if (__builtin_cpu_is ("nehalem"))
+ assert (val == 4);
+ else if (__builtin_cpu_is ("westmere"))
+ assert (val == 5);
+ else if (__builtin_cpu_is ("sandybridge"))
+ assert (val == 8);
+ else if (__builtin_cpu_is ("ivybridge"))
+ assert (val == 9);
+ else if (__builtin_cpu_is ("haswell"))
+ assert (val == 12);
+ else
+ assert (val == 0);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv2.C
new file mode 100644
index 000000000..869e99b4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv2.C
@@ -0,0 +1,118 @@
+/* Test case to check if Multiversioning chooses the correct
+ dispatching order when versions are for various ISAs. */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2" } */
+
+#include <assert.h>
+
+/* Default version. */
+int foo () __attribute__ ((target ("default")));
+/* The dispatch checks should be in the exact reverse order of the
+ declarations below. */
+int foo () __attribute__ ((target ("mmx")));
+int foo () __attribute__ ((target ("sse")));
+int foo () __attribute__ ((target ("sse2")));
+int foo () __attribute__ ((target ("sse3")));
+int foo () __attribute__ ((target ("ssse3")));
+int foo () __attribute__ ((target ("sse4.1")));
+int foo () __attribute__ ((target ("sse4.2")));
+int foo () __attribute__ ((target ("popcnt")));
+int foo () __attribute__ ((target ("avx")));
+int foo () __attribute__ ((target ("avx2")));
+
+int main ()
+{
+ int val = foo ();
+
+ if (__builtin_cpu_supports ("avx2"))
+ assert (val == 1);
+ else if (__builtin_cpu_supports ("avx"))
+ assert (val == 2);
+ else if (__builtin_cpu_supports ("popcnt"))
+ assert (val == 3);
+ else if (__builtin_cpu_supports ("sse4.2"))
+ assert (val == 4);
+ else if (__builtin_cpu_supports ("sse4.1"))
+ assert (val == 5);
+ else if (__builtin_cpu_supports ("ssse3"))
+ assert (val == 6);
+ else if (__builtin_cpu_supports ("sse3"))
+ assert (val == 7);
+ else if (__builtin_cpu_supports ("sse2"))
+ assert (val == 8);
+ else if (__builtin_cpu_supports ("sse"))
+ assert (val == 9);
+ else if (__builtin_cpu_supports ("mmx"))
+ assert (val == 10);
+ else
+ assert (val == 0);
+
+ return 0;
+}
+
+int __attribute__ ((target("default")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target("mmx")))
+foo ()
+{
+ return 10;
+}
+
+int __attribute__ ((target("sse")))
+foo ()
+{
+ return 9;
+}
+
+int __attribute__ ((target("sse2")))
+foo ()
+{
+ return 8;
+}
+
+int __attribute__ ((target("sse3")))
+foo ()
+{
+ return 7;
+}
+
+int __attribute__ ((target("ssse3")))
+foo ()
+{
+ return 6;
+}
+
+int __attribute__ ((target("sse4.1")))
+foo ()
+{
+ return 5;
+}
+
+int __attribute__ ((target("sse4.2")))
+foo ()
+{
+ return 4;
+}
+
+int __attribute__ ((target("popcnt")))
+foo ()
+{
+ return 3;
+}
+
+int __attribute__ ((target("avx")))
+foo ()
+{
+ return 2;
+}
+
+int __attribute__ ((target("avx2")))
+foo ()
+{
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv3.C
new file mode 100644
index 000000000..ec2aa1ffe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv3.C
@@ -0,0 +1,36 @@
+/* Test case to check if a call to a multiversioned function
+ is replaced with a direct call to the particular version when
+ the most specialized version's target attributes match the
+ caller.
+
+ In this program, foo is multiversioned but there is no default
+ function. This is an error if the call has to go through a
+ dispatcher. However, the call to foo in bar can be replaced
+ with a direct call to the popcnt version of foo. Hence, this
+ test should pass. */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2" } */
+
+
+int __attribute__ ((target ("sse")))
+foo ()
+{
+ return 1;
+}
+int __attribute__ ((target ("popcnt")))
+foo ()
+{
+ return 0;
+}
+
+int __attribute__ ((target ("popcnt")))
+bar ()
+{
+ return foo ();
+}
+
+int main ()
+{
+ return bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv4.C
new file mode 100644
index 000000000..ff1cc2f63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv4.C
@@ -0,0 +1,24 @@
+/* Test case to check if the compiler generates an error message
+ when the default version of a multiversioned function is absent
+ and its pointer is taken. */
+
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2" } */
+
+int __attribute__ ((target ("sse")))
+foo ()
+{
+ return 1;
+}
+int __attribute__ ((target ("popcnt")))
+foo ()
+{
+ return 0;
+}
+
+int main ()
+{
+ int (*p)() = &foo; /* { dg-error "use of multiversioned function without a default" {} } */
+ return (*p)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv5.C
new file mode 100644
index 000000000..fd62eee01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv5.C
@@ -0,0 +1,25 @@
+/* Test case to check if multiversioned functions are still generated if they are
+ marked comdat with inline keyword. */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2" } */
+
+
+/* Default version. */
+inline int __attribute__ ((target ("default")))
+foo ()
+{
+ return 0;
+}
+
+inline int __attribute__ ((target ("popcnt")))
+foo ()
+{
+ return 0;
+}
+
+int main ()
+{
+ return foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv6.C
new file mode 100644
index 000000000..227306599
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv6.C
@@ -0,0 +1,28 @@
+/* Test to check if member version multiversioning works correctly. */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-march=x86-64" } */
+
+class Foo
+{
+ public:
+ /* Default version of foo. */
+ __attribute__ ((target("default")))
+ int foo ()
+ {
+ return 0;
+ }
+ /* corei7 version of foo. */
+ __attribute__ ((target("arch=corei7")))
+ int foo ()
+ {
+ return 0;
+ }
+};
+
+int main ()
+{
+ Foo f;
+ return f.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv7.C
new file mode 100644
index 000000000..64c04fac6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv7.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "" }
+
+__attribute__((target ("default")))
+void foo (void) // { dg-message "previously defined here" }
+{
+}
+
+__attribute__((target (128)))
+void foo (void) // { dg-error "(not a string|redefinition)" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv8.C
new file mode 100644
index 000000000..2e98dd7ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv8.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "" }
+
+__attribute__((target (11,12)))
+void foo (void) // { dg-error "not a string" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/mv9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv9.C
new file mode 100644
index 000000000..c59651e10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/mv9.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "" }
+
+void foo ();
+void foo () __attribute__((target ("sse4")));
+void foo () __attribute__((target ("default"))); // { dg-message "previous declaration" }
+void foo () // { dg-error "attribute for multi-versioned" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-1.C
new file mode 100644
index 000000000..e41ebbefc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "" }
+
+// Verify that asm and the GNU extension typeof are recognized as
+// keywords.
+
+int asm; // { dg-error "before .asm." }
+int typeof; // { dg-error "expected" "expected" }
+// { dg-error "multiple types" "multiple" { target *-*-* } 8 }
+// { dg-error "declaration" "declaration" { target *-*-* } 8 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-2.C
new file mode 100644
index 000000000..fa614d8e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-asm-2.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-fno-asm" }
+
+// Verify that the keyword asm and the GNU extension typeof are not
+// recognized as keywords when using -fno-asm. Having -fno-asm affect
+// a standard C++ keyword seems strange, but that is existing
+// behaviour. If that behaviour changes, this test should change.
+
+int asm; // { dg-bogus "before .asm." }
+int typeof; // { dg-bogus "before .typeof." }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C
new file mode 100644
index 000000000..8dbbd5f34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-fno-gnu-keywords" }
+
+// Verify that the keyword asm is recognized and that the GNU
+// extension typeof is not recognized as a keyword when using
+// -fno-gnu-keywords.
+
+int asm; // { dg-error "before .asm." }
+int typeof; // { dg-bogus "before .typeof." }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/offsetof1.C
new file mode 100644
index 000000000..1468c0a7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/offsetof1.C
@@ -0,0 +1,21 @@
+// PR c++/27601
+// Origin: Patrik Hägglund <patrik.hagglund@bredband.net>
+// { dg-do compile }
+
+struct bar {
+ static int foo;
+ static int baz();
+};
+
+int a = __builtin_offsetof(bar, foo); // { dg-error "static data member" }
+int av = __builtin_offsetof(volatile bar, foo); // { dg-error "static data member" }
+int b = __builtin_offsetof(bar, baz); // { dg-error "member function" }
+int b0 = __builtin_offsetof(bar, baz[0]); // { dg-error "function" }
+int bv0 = __builtin_offsetof(volatile bar, baz[0]); // { dg-error "function" }
+int c = __builtin_offsetof(bar, ~bar); // { dg-error "member function" }
+
+typedef int I;
+enum E { };
+
+int d = __builtin_offsetof(I, ~I); // { dg-error "destructor" }
+int e = __builtin_offsetof(E, ~E); // { dg-error "destructor" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/oper1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/oper1.C
new file mode 100644
index 000000000..7f97d73a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/oper1.C
@@ -0,0 +1,19 @@
+// { dg-do run }
+
+// Copyright 2002 Free Software Foundation
+// Contributed by Jason Merrill <jason@redhat.com>
+
+// Make sure the GNU extension of accepting dropping cv-qualifiers for
+// the implicit this argument does not kick in when taking the address
+// of an object, since this extension would change the meaning of a
+// well-defined program.
+
+struct A {
+ A* operator&() { return 0; }
+};
+
+int main ()
+{
+ const A a = {};
+ return (&a == 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed10.C
new file mode 100644
index 000000000..c4bbb1462
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed10.C
@@ -0,0 +1,14 @@
+// PR c++/13983, c++/17519
+// The typedef and the array were causing us to miss that A<int> is
+// a packed type.
+
+template <class T>
+struct A {
+ A();
+} __attribute__((packed));
+
+typedef A<int> Ai;
+
+struct B {
+ Ai a[2];
+} __attribute__((packed));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed11.C
new file mode 100644
index 000000000..e75845d93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed11.C
@@ -0,0 +1,13 @@
+// PR c++/26670
+
+struct nonpod {
+ nonpod();
+};
+
+struct nonpod_pack {
+ nonpod n; // { dg-warning "ignoring packed attribute" }
+} __attribute__ ((packed));
+
+struct nonpod_pack2 {
+ nonpod_pack p; // { dg-warning "ignoring packed attribute" }
+} __attribute__ ((packed));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed2.C
new file mode 100644
index 000000000..66f156bac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed2.C
@@ -0,0 +1,35 @@
+// PR c++/10091
+
+// Original synopsis
+// Bug: We were dying because in general, B::a doesn't have enough
+// alignment for us to take its address. But if the B is C::b, it does
+// have enough alignment, and we should be able to determine that.
+
+// This only failed on STRICT_ALIGNMENT targets (i.e. not i686)
+
+// July 2003
+// packing of non-pods is now only allowed if the non-pod is itself
+// packed. Also only such pods can be reference bound to non-consts
+
+struct A {
+ int i;
+
+ A();
+ A(const A&);
+ A& operator=(const A&);
+} __attribute__ ((packed));
+
+struct B {
+ A a;
+} __attribute__ ((packed));
+
+struct C {
+ B b;
+ int j;
+};
+
+void f (A&);
+void g (C& c)
+{
+ f (c.b.a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed3.C
new file mode 100644
index 000000000..880b5d9b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed3.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com>
+
+// Packed fields are unsuitable for direct reference binding.
+
+struct Unpacked { int i; };
+
+void Ref (int &p);
+void Ref (Unpacked &p);
+
+struct __attribute__ ((packed)) Packed
+{
+ char c;
+ int i;
+ Unpacked u;
+};
+
+void Foo (Packed &p)
+{
+ Ref (p.i); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } }
+ Ref (p.u.i); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } }
+ Ref (p.u); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed4.C
new file mode 100644
index 000000000..e5e5e2c08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed4.C
@@ -0,0 +1,77 @@
+// { dg-do run { target { ! default_packed } } }
+// { dg-options "-w" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com>
+
+// Packed fields are unsuitable for direct reference binding.
+
+struct Unpacked { int i; };
+
+int ConstRef (int const &p, int const *ptr, int v)
+{
+ if (p != v)
+ return 1;
+ if (&p == ptr)
+ return 2;
+ return 0;
+}
+
+int ConstRef (Unpacked const &p, Unpacked const *ptr, int v)
+{
+ if (p.i != v)
+ return 1;
+ if (&p == ptr)
+ return 2;
+ return 0;
+}
+
+int Val (int p, int v)
+{
+ if (p != v)
+ return 1;
+ return 0;
+}
+int Val (Unpacked p, int v)
+{
+ if (p.i != v)
+ return 1;
+ return 0;
+}
+
+struct __attribute__ ((packed)) Packed
+{
+ char c;
+ int i;
+ Unpacked u;
+ char t;
+};
+
+int Foo (Packed &p, int i, int ui)
+{
+ int r;
+
+ if ((r = Val (p.i, i)))
+ return r;
+ if ((r = Val (p.u.i, ui)))
+ return r + 2;
+ if ((r = Val (p.u, ui)))
+ return r + 4;
+
+ if ((r = ConstRef (p.i, &p.i, i)))
+ return r + 6;
+
+ return 0;
+}
+
+int main ()
+{
+ Packed p;
+
+ p.c = 0x12;
+ p.i = 0x3456789a;
+ p.u.i = 0xbcdef00f;
+ p.t = 0xed;
+
+ return Foo (p, 0x3456789a, 0xbcdef00f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed5.C
new file mode 100644
index 000000000..caf14d89c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed5.C
@@ -0,0 +1,16 @@
+// PR c++/14173
+
+struct A;
+
+void foo(const A&);
+
+struct A
+{
+ A(const A&);
+};
+
+struct B
+{
+ A a;
+ A bar() { return a; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed6.C
new file mode 100644
index 000000000..6a176b624
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed6.C
@@ -0,0 +1,78 @@
+// PR c++/15209
+// { dg-options "-w" }
+
+__extension__ typedef __SIZE_TYPE__ size_t;
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+
+typedef unsigned int uint32_t;
+__extension__ typedef unsigned long long int uint64_t;
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+
+struct MAGIC {u8 magic[8];} __attribute__ ((packed));
+struct PACKETTYPE {u8 type[16];} __attribute__ ((packed));
+
+
+typedef u16 leu16;
+typedef u32 leu32;
+typedef u64 leu64;
+
+class MD5Hash
+{
+public:
+
+ MD5Hash(void) {};
+
+ void *print(void) const;
+ MD5Hash(const MD5Hash &other);
+ MD5Hash& operator=(const MD5Hash &other);
+
+public:
+ u8 hash[16];
+};
+
+struct PACKET_HEADER
+{
+
+ MAGIC magic;
+ leu64 length;
+ MD5Hash hash;
+ MD5Hash setid;
+ PACKETTYPE type;
+} __attribute__ ((packed));
+
+
+struct MAINPACKET
+{
+ PACKET_HEADER header;
+
+ leu64 blocksize;
+ leu32 recoverablefilecount;
+ MD5Hash fileid[0];
+
+
+} __attribute__ ((packed));
+
+struct CriticalPacket
+{
+ u8 *packetdata;
+ size_t packetlength;
+};
+
+class MainPacket : public CriticalPacket
+{
+ const MD5Hash& SetId(void) const;
+
+ u64 blocksize;
+ u32 totalfilecount;
+ u32 recoverablefilecount;
+};
+
+inline const MD5Hash& MainPacket::SetId(void) const
+{
+ return ((const MAINPACKET*)packetdata)->header.setid;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed7.C
new file mode 100644
index 000000000..e2f74e026
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed7.C
@@ -0,0 +1,15 @@
+// PR c++/14124
+// A packed enum uses the minimal underlying type.
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do run }
+
+enum XXX { xyzzy = 3 } __attribute__((packed));
+
+int main()
+{
+ int enumsize = sizeof(xyzzy);
+ return (enumsize == 1) ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed8.C
new file mode 100644
index 000000000..91ee8b3ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed8.C
@@ -0,0 +1,24 @@
+// PR c++/18378
+// NOTE: This test assumes packed structure layout differs from unpacked
+// structure layout. This isn't true, e.g., with the default
+// arm-none-elf options.
+// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } }
+
+class A
+{
+public:
+ int i;
+
+ A() {}
+ A(const A& a) { i = a.i; }
+};
+
+class B
+{
+ A a __attribute__((packed)); // { dg-warning "attribute ignored" "" { target default_packed } }
+
+public:
+ B() {}
+ A GetA() { return a; } // { dg-error "" "" { target { ! default_packed } } }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/packed9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed9.C
new file mode 100644
index 000000000..ba5d4ab04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/packed9.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Apr 2005 <nathan@codesourcery.com>
+
+// DR21166. unnecessary error on packed char
+
+struct s1 {
+ char c1;
+} __attribute__((packed));
+
+char&
+f(struct s1 *s)
+{
+ return s->c1;
+}
+
+char *
+g(struct s1 *s)
+{
+ return &s->c1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.C
new file mode 100644
index 000000000..29b1d17d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.C
@@ -0,0 +1,6 @@
+// Test for PR c++/17577.
+
+/* { dg-do compile } */
+
+#include "pr17577.h"
+#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.h b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.h
new file mode 100644
index 000000000..6ff0addb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr17577.h
@@ -0,0 +1,2 @@
+// Test for PR c++/17577.
+#pragma interface
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr27019.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr27019.C
new file mode 100644
index 000000000..c96d51c14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr27019.C
@@ -0,0 +1,11 @@
+
+// { dg-do compile }
+// { dg-options "" }
+
+struct A
+{
+ int i;
+ int z[1];
+};
+
+A a = { z:{} }; // { dg-message "unimplemented" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr28291.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr28291.C
new file mode 100644
index 000000000..1b3b9f40a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr28291.C
@@ -0,0 +1,13 @@
+
+// Test to make sure we do not ICE on this invalid program.
+
+// { dg-do compile }
+// { dg-options "" }
+
+struct A
+{
+ static int i;
+ int j;
+};
+
+A a = { i:0 }; // { dg-error "non-static data member" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr34829.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr34829.C
new file mode 100644
index 000000000..d588b5b2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr34829.C
@@ -0,0 +1,22 @@
+// Test for PR c++/34829
+// Placement new should be ok for non-aggregate Java types.
+
+// { dg-do compile }
+// { dg-options "" }
+
+extern "Java"
+{
+ typedef __java_byte jbyte;
+}
+
+typedef __SIZE_TYPE__ size_t;
+
+void *operator new (size_t, void *m)
+{
+ return m;
+}
+
+jbyte *f(void *memory)
+{
+ return new (memory) jbyte;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr47213.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr47213.C
new file mode 100644
index 000000000..193007e83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr47213.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility-ms-compat" }
+#include <typeinfo>
+
+template < typename T > void
+bar ()
+{
+ typeid (T);
+}
+
+void
+foo ()
+{
+ bar < int () > ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr53605.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr53605.C
new file mode 100644
index 000000000..0b902dd84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr53605.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Avoid -pedantic-error default
+// { dg-options "" }
+
+template <bool lhs_is_null_literal>
+class EqHelper {
+public:
+ template <typename T1, typename T2>
+ static int Compare( const T1& expected,
+ const T2& actual);
+};
+void foo(){
+ static const int kData[] = {};
+ ::EqHelper<false>::Compare(kData, "abc");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr56790-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr56790-1.C
new file mode 100644
index 000000000..ae465fa3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr56790-1.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ccp1" } */
+/* { dg-prune-output "changes the ABI" } */
+
+typedef long vec __attribute__ ((vector_size (2 * sizeof (long))));
+
+vec f (void)
+{
+ vec a = { 5, 7 };
+ vec b = { 11, 13 };
+ vec m = { -1, 0 };
+ return m ? a : b;
+}
+
+/* { dg-final { scan-tree-dump "{ 5, 13 }" "ccp1" } } */
+/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57362.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57362.C
new file mode 100644
index 000000000..71c53d376
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57362.C
@@ -0,0 +1,198 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+
+__attribute__((target("default")))
+int foo(void) { return 1; }
+__attribute__((target("128bit-long-double")))
+int foo(void) { return 1; }
+__attribute__((target("80387")))
+int foo(void) { return 1; }
+__attribute__((target("96bit-long-double")))
+int foo(void) { return 1; }
+__attribute__((target("long-double-80")))
+int foo(void) { return 1; }
+__attribute__((target("long-double-64")))
+int foo(void) { return 1; }
+__attribute__((target("accumulate-outgoing-args")))
+int foo(void) { return 1; }
+__attribute__((target("align-double")))
+int foo(void) { return 1; }
+__attribute__((target("align-stringops")))
+int foo(void) { return 1; }
+__attribute__((target("fancy-math-387")))
+int foo(void) { return 1; }
+__attribute__((target("force-drap")))
+int foo(void) { return 1; }
+__attribute__((target("fp-ret-in-387")))
+int foo(void) { return 1; }
+__attribute__((target("hard-float")))
+int foo(void) { return 1; }
+__attribute__((target("ieee-fp")))
+int foo(void) { return 1; }
+__attribute__((target("inline-all-stringops")))
+int foo(void) { return 1; }
+__attribute__((target("inline-stringops-dynamically")))
+int foo(void) { return 1; }
+__attribute__((target("intel-syntax")))
+int foo(void) { return 1; }
+__attribute__((target("ms-bitfields")))
+int foo(void) { return 1; }
+__attribute__((target("no-align-stringops")))
+int foo(void) { return 1; }
+__attribute__((target("no-fancy-math-387")))
+int foo(void) { return 1; }
+__attribute__((target("no-push-args")))
+int foo(void) { return 1; }
+__attribute__((target("no-red-zone")))
+int foo(void) { return 1; }
+__attribute__((target("omit-leaf-frame-pointer")))
+int foo(void) { return 1; }
+__attribute__((target("pc32")))
+int foo(void) { return 1; }
+__attribute__((target("pc64")))
+int foo(void) { return 1; }
+__attribute__((target("pc80")))
+int foo(void) { return 1; }
+__attribute__((target("push-args")))
+int foo(void) { return 1; }
+__attribute__((target("red-zone")))
+int foo(void) { return 1; }
+__attribute__((target("rtd")))
+int foo(void) { return 1; }
+__attribute__((target("soft-float")))
+int foo(void) { return 1; }
+__attribute__((target("sseregparm")))
+int foo(void) { return 1; }
+__attribute__((target("stackrealign")))
+int foo(void) { return 1; }
+__attribute__((target("stack-arg-probe")))
+int foo(void) { return 1; }
+__attribute__((target("tls-direct-seg-refs")))
+int foo(void) { return 1; }
+__attribute__((target("vect8-ret-in-mem")))
+int foo(void) { return 1; }
+__attribute__((target("recip")))
+int foo(void) { return 1; }
+__attribute__((target("cld")))
+int foo(void) { return 1; }
+__attribute__((target("vzeroupper")))
+int foo(void) { return 1; }
+__attribute__((target("dispatch-scheduler")))
+int foo(void) { return 1; }
+__attribute__((target("prefer-avx128")))
+int foo(void) { return 1; }
+__attribute__((target("32")))
+int foo(void) { return 1; }
+__attribute__((target("64")))
+int foo(void) { return 1; }
+__attribute__((target("x32")))
+int foo(void) { return 1; }
+__attribute__((target("mmx")))
+int foo(void) { return 1; }
+__attribute__((target("3dnow")))
+int foo(void) { return 1; }
+__attribute__((target("3dnowa")))
+int foo(void) { return 1; }
+__attribute__((target("sse")))
+int foo(void) { return 1; }
+__attribute__((target("sse2")))
+int foo(void) { return 1; }
+__attribute__((target("sse3")))
+int foo(void) { return 1; }
+__attribute__((target("ssse3")))
+int foo(void) { return 1; }
+__attribute__((target("sse4.1")))
+int foo(void) { return 1; }
+__attribute__((target("sse4.2")))
+int foo(void) { return 1; }
+__attribute__((target("sse4")))
+int foo(void) { return 1; }
+__attribute__((target("no-sse4")))
+int foo(void) { return 1; }
+__attribute__((target("sse5")))
+int foo(void) { return 1; }
+__attribute__((target("avx")))
+int foo(void) { return 1; }
+__attribute__((target("avx2")))
+int foo(void) { return 1; }
+__attribute__((target("fma")))
+int foo(void) { return 1; }
+__attribute__((target("sse4a")))
+int foo(void) { return 1; }
+__attribute__((target("fma4")))
+int foo(void) { return 1; }
+__attribute__((target("xop")))
+int foo(void) { return 1; }
+__attribute__((target("lwp")))
+int foo(void) { return 1; }
+__attribute__((target("abm")))
+int foo(void) { return 1; }
+__attribute__((target("popcnt")))
+int foo(void) { return 1; }
+__attribute__((target("bmi")))
+int foo(void) { return 1; }
+__attribute__((target("bmi2")))
+int foo(void) { return 1; }
+__attribute__((target("lzcnt")))
+int foo(void) { return 1; }
+__attribute__((target("hle")))
+int foo(void) { return 1; }
+__attribute__((target("rdseed")))
+int foo(void) { return 1; }
+__attribute__((target("prfchw")))
+int foo(void) { return 1; }
+__attribute__((target("adx")))
+int foo(void) { return 1; }
+__attribute__((target("fxsr")))
+int foo(void) { return 1; }
+__attribute__((target("xsave")))
+int foo(void) { return 1; }
+__attribute__((target("xsaveopt")))
+int foo(void) { return 1; }
+__attribute__((target("tbm")))
+int foo(void) { return 1; }
+__attribute__((target("cx16")))
+int foo(void) { return 1; }
+__attribute__((target("sahf")))
+int foo(void) { return 1; }
+__attribute__((target("movbe")))
+int foo(void) { return 1; }
+__attribute__((target("crc32")))
+int foo(void) { return 1; }
+__attribute__((target("aes")))
+int foo(void) { return 1; }
+__attribute__((target("pclmul")))
+int foo(void) { return 1; }
+__attribute__((target("sse2avx")))
+int foo(void) { return 1; }
+__attribute__((target("fsgsbase")))
+int foo(void) { return 1; }
+__attribute__((target("rdrnd")))
+int foo(void) { return 1; }
+__attribute__((target("f16c")))
+int foo(void) { return 1; }
+__attribute__((target("fentry")))
+int foo(void) { return 1; }
+__attribute__((target("8bit-idiv")))
+int foo(void) { return 1; }
+__attribute__((target("avx256-split-unaligned-load")))
+int foo(void) { return 1; }
+__attribute__((target("avx256-split-unaligned-store")))
+int foo(void) { return 1; }
+__attribute__((target("rtm")))
+int foo(void) { return 1; }
+//---------------
+
+#include <stdio.h>
+ int main (void)
+ {
+ int result;
+ result = foo();
+ printf("Result is %d\n", result);
+ return result;
+ }
+
+/* { dg-prune-output "attribute.* is unknown" } */
+/* { dg-prune-output "missing 'target' attribute*" } */
+/* { dg-prune-output "redefinition of 'int foo" } */
+/* { dg-prune-output "No dispatcher found for" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57509.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57509.C
new file mode 100644
index 000000000..b89d9094d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57509.C
@@ -0,0 +1,15 @@
+/* { dg-do compile { target c++11 } } */
+
+template <bool> struct enable_if {};
+template <> struct enable_if<true> {typedef void type;};
+template <class T> void f (T& v) { v = __builtin_shuffle (v, v); }
+template <class T> void g (T const&) {}
+template <class T> auto g (T const& x) -> typename enable_if<sizeof(__builtin_shuffle(x,x))!=2>::type {}
+typedef int v4i __attribute__((vector_size(4*sizeof(int))));
+typedef float v4f __attribute__((vector_size(4*sizeof(float))));
+int main(){
+ v4i a = {1,2,3,0};
+ f(a);
+ v4f b = {1,2,3,0};
+ g(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57548.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57548.C
new file mode 100644
index 000000000..1cc728d29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57548.C
@@ -0,0 +1,25 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-ifunc "" } */
+
+int fum (); // Extra declaration that is merged with the second one.
+int fum () __attribute__ ((target("default")));
+
+
+int fum () __attribute__((target( "mmx")));
+int fum () __attribute__((target( "popcnt")));
+int fum () __attribute__((target( "sse")));
+int fum () __attribute__((target( "sse2")));
+int fum () __attribute__((target( "sse3")));
+int fum () __attribute__((target( "ssse3")));
+int fum () __attribute__((target( "sse4.1")));
+int fum () __attribute__((target( "sse4.2")));
+int fum () __attribute__((target( "avx")));
+int fum () __attribute__((target( "avx2")));
+
+int fum () __attribute__((target("arch=core2")));
+int fum () __attribute__((target("arch=corei7")));
+int fum () __attribute__((target("arch=atom")));
+
+int (*p)() = &fum;
+
+int j = fum();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57735.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57735.C
new file mode 100644
index 000000000..0eb95006d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr57735.C
@@ -0,0 +1,145 @@
+/* { dg-do compile { target arm*-*-* } } */
+/* { dg-options "-march=armv5te -marm -mtune=xscale -mfloat-abi=soft -O1" } */
+
+typedef unsigned int size_t;
+__extension__
+typedef long long int int64_t;
+namespace WTF {
+ template<typename T> class RefPtr {
+ public:
+ inline T* operator->() const { return m_ptr; }
+ T* m_ptr;
+ };
+}
+using WTF::RefPtr;
+namespace JSC {
+ class ExecState;
+ class JSString;
+ typedef int64_t EncodedJSValue;
+ class JSValue {
+ public:
+ static EncodedJSValue encode(JSValue);
+ JSString* toString(ExecState*) const;
+ };
+}
+typedef unsigned char LChar;
+ typedef short unsigned int UChar;
+namespace WTF {
+ template<typename T, size_t inlineCapacity = 0>
+ class Vector {
+ public:
+ template<typename U> bool tryAppend(const U*, size_t);
+ };
+}
+using WTF::Vector;
+namespace WTF {
+template<typename CharType> inline bool isASCIIDigit(CharType c)
+{
+}
+template<typename CharType> inline bool isASCIIHexDigit(CharType c)
+{
+ return isASCIIDigit(c) || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f');
+}
+ class StringImpl;
+}
+using WTF::StringImpl;
+namespace WTF {
+class StringImpl {
+public:
+ unsigned length() const { return m_length; }
+ unsigned m_length;
+};
+}
+namespace JSC {
+ class Register {
+ };
+class UString {
+public:
+ unsigned length() const
+ {
+ return m_impl->length();
+ }
+ const LChar* characters8() const
+ {
+ }
+ RefPtr<StringImpl> m_impl;
+};
+ class ExecState : private Register {
+ public:
+ JSValue argument(size_t argument)
+ {
+ }
+ };
+ class JSCell {
+ };
+ class JSString : public JSCell {
+ public:
+ const UString& value(ExecState*) const;
+ };
+class JSStringBuilder {
+public:
+ void append(const UChar u)
+ {
+ m_okay &= buffer16.tryAppend(&u, 1);
+ }
+ Vector<UChar, 64> buffer16;
+ bool m_okay;
+};
+template <typename T>
+class Lexer {
+public:
+ static unsigned char convertHex(int c1, int c2);
+};
+}
+namespace WTF {
+namespace Unicode {
+ int UTF8SequenceLength(char);
+ int decodeUTF8Sequence(const char*);
+}
+}
+using namespace WTF;
+using namespace Unicode;
+namespace JSC {
+template <typename CharType>
+static JSValue decode(ExecState* exec, const CharType* characters, int length, const char* doNotUnescape, bool strict)
+{
+ JSStringBuilder builder;
+ int k = 0;
+ UChar u = 0;
+ while (k < length) {
+ const CharType* p = characters + k;
+ CharType c = *p;
+ if (c == '%') {
+ int charLen = 0;
+ if (k <= length - 3 && isASCIIHexDigit(p[1]) && isASCIIHexDigit(p[2])) {
+ const char b0 = Lexer<CharType>::convertHex(p[1], p[2]);
+ const int sequenceLen = UTF8SequenceLength(b0);
+ if (sequenceLen && k <= length - sequenceLen * 3) {
+ charLen = sequenceLen * 3;
+ char sequence[5];
+ if (charLen != 0) {
+ const int character = decodeUTF8Sequence(sequence);
+ if (character < 0 || character >= 0x110000)
+ charLen = 0;
+ else if (character >= 0x10000) {
+ builder.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10)));
+ } else
+ u = static_cast<UChar>(character);
+ }
+ }
+ }
+ }
+ }
+}
+static JSValue decode(ExecState* exec, const char* doNotUnescape, bool strict)
+{
+ UString str = exec->argument(0).toString(exec)->value(exec);
+ return decode(exec, str.characters8(), str.length(), doNotUnescape, strict);
+}
+EncodedJSValue globalFuncDecodeURI(ExecState* exec)
+{
+ static const char do_not_unescape_when_decoding_URI[] =
+ "#$&+,/:;=?@";
+ return JSValue::encode(decode(exec, do_not_unescape_when_decoding_URI, true));
+}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr58834.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr58834.C
new file mode 100644
index 000000000..029303331
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr58834.C
@@ -0,0 +1,5 @@
+template<typename> void foo()
+{
+ int i __attribute__((vector_size(2*sizeof(int))));
+ (void) __builtin_shuffle(i, i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59378.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59378.C
new file mode 100644
index 000000000..19d06b593
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59378.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+typedef int v4si __attribute__ ((vector_size (4*sizeof(int))));
+template<int C>
+void traverse(v4si& bounds){
+ v4si m = {0,1,2,3};
+ bounds = __builtin_shuffle(bounds, m);
+}
+template void traverse<0>(v4si&);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59706.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59706.C
new file mode 100644
index 000000000..b82b45e2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pr59706.C
@@ -0,0 +1,21 @@
+// PR middle-end/59706
+// { dg-do compile }
+
+extern struct S s;
+struct T { T (); ~T (); int t; } t;
+
+void
+foo ()
+{
+ #pragma GCC ivdep
+ while (s) // { dg-error "could not convert" }
+ ;
+}
+
+void
+bar ()
+{
+ #pragma GCC ivdep
+ while (t) // { dg-error "could not convert" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pragmaweak1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pragmaweak1.C
new file mode 100644
index 000000000..68bf3fce2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pragmaweak1.C
@@ -0,0 +1,9 @@
+// PR c++/25999
+// { dg-final { scan-assembler-not "_Z3Foov" } }
+
+extern "C" {
+ void Foo();
+}
+#pragma weak Random_Symbol
+void Foo() { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty1.C
new file mode 100644
index 000000000..06608ae30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty1.C
@@ -0,0 +1,67 @@
+// PR c++/6794
+// Test whether __PRETTY_FUNCTION__ works in templates, functions and
+// in initializers at global scope
+// { dg-do compile }
+// { dg-options "" }
+
+extern "C" void __assert_fail (const char *, const char *,
+ unsigned int, const char *)
+ throw() __attribute__((noreturn));
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+#define str(expr) #expr
+#define assert(expr) \
+ ((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \
+ __PRETTY_FUNCTION__), 0))
+
+int __attribute__((noinline))
+foo (void)
+{
+ return 1;
+}
+
+template<class T> int
+bar (T)
+{
+ return (assert (foo ()), 1);
+}
+
+template<> int
+bar<int> (int)
+{
+ return (assert (foo ()), 2);
+}
+
+int a = (assert (foo ()), 1);
+int b = (assert (foo ()), 2);
+
+int
+main ()
+{
+ double c = 1.0;
+ unsigned char *d = 0;
+ int e = (assert (foo ()), 3);
+
+ bar (c);
+ bar (d);
+ bar (e);
+}
+
+namespace N
+{
+ int f = (assert (foo ()), 4);
+}
+
+void __attribute__((noinline))
+__assert_fail (const char *cond, const char *file, unsigned int line,
+ const char *pretty) throw ()
+{
+ abort ();
+}
+
+// { dg-final { scan-assembler "int bar\\(T\\).*with T = int" } }
+// { dg-final { scan-assembler "top level" } }
+// { dg-final { scan-assembler "int main\\(\\)" } }
+// { dg-final { scan-assembler "int bar\\(T\\).*with T = double" } }
+// { dg-final { scan-assembler "int bar\\(T\\).*with T = unsigned char\*" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty2.C
new file mode 100644
index 000000000..0c05da9b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty2.C
@@ -0,0 +1,61 @@
+// PR c++/6794
+// Test whether __PRETTY_FUNCTION__ works in templates, functions and
+// in initializers at global scope
+// { dg-do run }
+// { dg-options "" }
+
+extern "C" void __assert_fail (const char *, const char *,
+ unsigned int, const char *)
+ throw() __attribute__((noreturn));
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+#define str(expr) #expr
+#define assert(expr) \
+ ((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \
+ __PRETTY_FUNCTION__), 0))
+
+int __attribute__((noinline))
+foo (void)
+{
+ return 1;
+}
+
+template<class T> int
+bar (T)
+{
+ return (assert (foo ()), 1);
+}
+
+template<> int
+bar<int> (int)
+{
+ return (assert (foo ()), 2);
+}
+
+int a = (assert (foo ()), 1);
+int b = (assert (foo ()), 2);
+
+int
+main ()
+{
+ double c = 1.0;
+ unsigned char *d = 0;
+ int e = (assert (foo ()), 3);
+
+ bar (c);
+ bar (d);
+ bar (e);
+}
+
+namespace N
+{
+ int f = (assert (foo ()), 4);
+}
+
+void __attribute__((noinline))
+__assert_fail (const char *cond, const char *file, unsigned int line,
+ const char *pretty) throw ()
+{
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty3.C
new file mode 100644
index 000000000..01b14579a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/pretty3.C
@@ -0,0 +1,19 @@
+// PR c++/16630
+// { dg-do compile }
+// { dg-options "" }
+extern "C" int printf (const char*, ...);
+
+template <class T>
+struct B { typedef T X; };
+
+template <class U>
+struct D
+{
+ const char* foo (typename B<U>::X) { return __PRETTY_FUNCTION__; }
+};
+
+int main ()
+{
+ printf ("%s\n", D<int>().foo (0));
+}
+// { dg-final { scan-assembler "const char\\* D<U>::foo\\(typename B<U>::X\\)" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/restrict1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/restrict1.C
new file mode 100644
index 000000000..049af1fa4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/restrict1.C
@@ -0,0 +1,7 @@
+// PR c++/6392
+// { dg-do compile }
+
+struct A
+{
+ int* __restrict__ data[10];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany1.C
new file mode 100644
index 000000000..e80fe4fd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany1.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target i?86-pc-cygwin } }
+// { dg-do compile { target i?86-*-mingw* x86_64-*-mingw* } }
+
+// Check that selectany attribute puts symbols into link-once sections.
+
+// { dg-final { scan-assembler "\.section\t\.data\\\$foo\[^\n\]*\n\t\.linkonce discard" } }
+// { dg-final { scan-assembler "\.section\t\.data\\\$x\[^\n\]*\n\t\.linkonce discard" } }
+
+__declspec (selectany) int foo = 1;
+
+class X
+{
+private:
+ int m_i;
+public:
+ X(int i): m_i(i){}
+ ~X(){}
+};
+
+__declspec(selectany) X x(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany2.C
new file mode 100644
index 000000000..278b32d2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/selectany2.C
@@ -0,0 +1,30 @@
+// { dg-do compile { target i?86-pc-cygwin } }
+// { dg-do compile { target i?86-*-mingw* x86_64-*-mingw* } }
+
+// Check for errors with invalid usage of selectany attribute.
+
+extern int foo;
+__declspec (selectany) int foo = 1; // OK
+
+struct d
+{
+ static int foo;
+};
+__declspec (selectany) int d::foo = 1; // OK
+
+struct f
+{
+ int i;
+};
+__declspec (selectany) struct f F= {1}; // OK
+
+__declspec (selectany) int boo; //{ dg-error "selectany" }
+
+__declspec (selectany) static int bar = 1; // { dg-error "selectany" }
+int use_bar = bar; // Avoid defined but not used warning.
+
+int baz()
+{
+ __declspec (selectany) int foo = 1; // { dg-error "selectany" }
+ return foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/sizeof-complit.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/sizeof-complit.C
new file mode 100644
index 000000000..6cf6d4e1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/sizeof-complit.C
@@ -0,0 +1,5 @@
+// PR c++/18126
+// { dg-options "" }
+
+struct s { int a; int b; };
+char x[((sizeof (struct s){ 1, 2 }) == sizeof (struct s)) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/spe1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/spe1.C
new file mode 100644
index 000000000..8b1e630ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/spe1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single -O0" } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+
+typedef int v2si __attribute__ ((vector_size (8)));
+
+/* The two specializations must be considered different. */
+template <class T> class X { };
+template <> class X<__ev64_opaque__> { };
+template <> class X<v2si> { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/static1.C
new file mode 100644
index 000000000..9298b1d57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/static1.C
@@ -0,0 +1,18 @@
+// PR c++/23699
+// { dg-options "" }
+
+template<typename _CharT > class basic_string;
+typedef basic_string<char> string;
+template<typename _CharT>
+struct basic_string
+{
+ static const int npos = -1;
+};
+template<typename _CharT>
+const int basic_string<_CharT>::npos;
+
+extern template class basic_string<char>;
+struct A
+{
+ static const long npos = string::npos;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr1.C
new file mode 100644
index 000000000..fe9f3c3aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr1.C
@@ -0,0 +1,53 @@
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com>
+
+// make sure statement expressions work properly
+
+// { dg-do run }
+// { dg-options "" }
+
+extern "C" int printf (char const *, ...);
+extern "C" void abort ();
+
+static unsigned order[] =
+{
+ 1, 101, 2, 102,
+ 3, 4, 104, 103,
+ 5, 6, 105, 106,
+ 7, 107, 8, 408, 9, 109, 108,
+ 10, 11, 110, 411, 12, 112, 111,
+ 13, 113,
+ 14, 214, 114, 114,
+ 0
+};
+
+static unsigned point;
+
+static void Check (unsigned t, unsigned i, void const *ptr, char const *name)
+{
+ printf ("%d %d %p %s\n", t, i, ptr, name);
+
+ if (order[point++] != i + t)
+ abort ();
+}
+
+template <int I> struct A
+{
+ A () { Check (0, I, this, __PRETTY_FUNCTION__); }
+ ~A () { Check (100, I, this, __PRETTY_FUNCTION__); }
+ A (A const &) { Check (200, I, this, __PRETTY_FUNCTION__); }
+ A &operator= (A const &) { Check (300, I, this, __PRETTY_FUNCTION__); }
+ void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); }
+};
+
+int main ()
+{
+ ({A<1> (); A<2> (); ;});
+ ({A<3> (), A<4> (); ;});
+ ({A<5> (), A<6> ();});
+ ({A <7> (); A<8> (); }).Foo (), A<9> ();
+ ({A <10> (), A<11> (); }).Foo (), A<12> ();
+ ({A<13> a; a; ; });
+ ({A<14> a; a; });
+ Check (0, 0, 0, "end");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr10.C
new file mode 100644
index 000000000..f7c5f8f59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr10.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } " */
+/* { dg-options "" } */
+
+void foo(int i)
+{
+ (i ? 1 : 2) = ({ X; }); /* { dg-error "" } */
+}
+
+struct A
+{
+ ~A ();
+ void foo()
+ {
+ delete this = ({ X; }); /* { dg-error "" } */
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr11.C
new file mode 100644
index 000000000..8b5c5f847
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr11.C
@@ -0,0 +1,15 @@
+// PR c++/31337
+// { dg-options "" }
+
+struct A
+{
+ int i[0];
+ A();
+ A(const A&);
+ ~A();
+};
+
+void foo()
+{
+ A a = ({ A(); });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr12.C
new file mode 100644
index 000000000..c35f41b0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr12.C
@@ -0,0 +1,7 @@
+// PR c++/29000
+// { dg-options "" }
+
+template<int> int foo()
+{
+ return ({foo;})==0; // { dg-error "insufficient context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr13.C
new file mode 100644
index 000000000..978da1584
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr13.C
@@ -0,0 +1,9 @@
+// PR c++/35747
+// { dg-do compile }
+// { dg-options "" }
+
+void
+foo ()
+{
+ ({ i; ({ i; }); 0; }); // { dg-error "was not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr14.C
new file mode 100644
index 000000000..5f3ff0ddc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr14.C
@@ -0,0 +1,12 @@
+// PR c++/51714
+
+template <typename T>
+void Foo()
+{
+ true || !__extension__ ({ int verbose = 2; verbose <= 3; });
+}
+
+int main()
+{
+ Foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr15.C
new file mode 100644
index 000000000..83a831cdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr15.C
@@ -0,0 +1,7 @@
+// PR c++/59097
+// { dg-options "" }
+
+void foo()
+{
+ int x[({ return; })]; // { dg-error "non-integral" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr2.C
new file mode 100644
index 000000000..5301103d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr2.C
@@ -0,0 +1,51 @@
+// { dg-do run }
+// { dg-options "" }
+
+extern "C" int printf (char const *, ...);
+extern "C" void abort ();
+
+// There are two alternate legal renderings.
+static unsigned int alt1[] = { 11, 10, 21, 110, 111, 121 };
+static unsigned int alt2[] = { 10, 11, 21, 111, 110, 121 };
+
+static unsigned int pointer = 0;
+static unsigned int *which;
+
+static void Check (unsigned t, unsigned i, void const *ptr, char const *name)
+{
+ printf ("%d %d %p %s\n", t, i, ptr, name);
+
+ if (pointer > sizeof(alt1)/sizeof(alt1[0]))
+ abort ();
+ if (pointer == 0)
+ {
+ if (t + i == alt1[0])
+ which = &alt1[0];
+ else if (t + i == alt2[0])
+ which = &alt2[0];
+ else
+ abort ();
+ }
+ else if (t + i != which[pointer])
+ abort ();
+ pointer++;
+}
+
+struct A
+{
+ int I;
+
+ A (int i) : I(i) { Check (0, I, this, __PRETTY_FUNCTION__); }
+ ~A () { Check (100, I, this, __PRETTY_FUNCTION__); }
+ A (A const &a) : I(a.I) { Check (200, I, this, __PRETTY_FUNCTION__); }
+ A &operator= (A const &a)
+ { I = a.I; Check (300, I, this, __PRETTY_FUNCTION__); return *this; }
+ void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); }
+ A operator+ (A const &a) const
+ { return A(I + a.I); }
+};
+
+int main ()
+{
+ ({ A(10) + A(11); });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr3.C
new file mode 100644
index 000000000..9a3205c08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr3.C
@@ -0,0 +1,9 @@
+// PR c++/16112
+// { dg-options "" }
+
+struct A
+{
+ A();
+};
+
+A foo() { return ({ A(); }); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr4.C
new file mode 100644
index 000000000..a37c33ae0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr4.C
@@ -0,0 +1,8 @@
+// PR c++/20147
+// { dg-do compile }
+// { dg-options "" }
+
+void foo()
+{
+ ({x;}); // { dg-error "was not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr5.C
new file mode 100644
index 000000000..fc84981ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr5.C
@@ -0,0 +1,15 @@
+// PR c++/21440
+// { dg-options "" }
+
+struct Foo {
+ ~Foo();
+ int i;
+};
+
+void bar() {
+ Foo foo = ({
+ Foo bletch;
+ bletch.i = 0;
+ bletch;
+ });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr6.C
new file mode 100644
index 000000000..d2518a64a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr6.C
@@ -0,0 +1,11 @@
+// { dg-do run }
+// { dg-options "" }
+
+int a[128];
+
+int main() {
+ // Check that array-to-pointer conversion occurs in a
+ // statement-expression.
+ if (sizeof (({ a; })) != sizeof (int *))
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr7.C
new file mode 100644
index 000000000..87ca39b56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr7.C
@@ -0,0 +1,14 @@
+// PR c++/24686
+// { dg-options "" }
+
+struct A
+{
+ ~A();
+};
+bool h(int, const A&);
+int f();
+int i;
+void g()
+{
+ i && (A(), ({ static int l = f(); l; }));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr8.C
new file mode 100644
index 000000000..8e5d0ddcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr8.C
@@ -0,0 +1,28 @@
+// PR c++/27115
+
+// { dg-do run }
+// { dg-options "" }
+
+struct A
+{
+ int i;
+ A (int j) : i(j) {}
+ A (const A &j) : i(j.i) {}
+ A& operator= (const A &j) { i = j.i; return *this; }
+};
+
+A foo(int j)
+{
+ return ({ j ? A(1) : A(0); });
+}
+
+int main()
+{
+ return foo(1).i-1;
+}
+
+void foo2()
+{
+ A b = ({ A a(1); a; });
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr9.C
new file mode 100644
index 000000000..4963e10e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr9.C
@@ -0,0 +1,8 @@
+// PR c++/28899
+// { dg-options "" }
+
+void f()
+{
+ unsigned l, l1;
+ l1 = l = ({ unsigned __v; __v; });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/strncpy-chk1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/strncpy-chk1.C
new file mode 100644
index 000000000..ebafc9988
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/strncpy-chk1.C
@@ -0,0 +1,32 @@
+// PR c++/40502
+// { dg-do compile }
+// { dg-options "-O2" }
+// { dg-skip-if "packed attribute missing for struct A" { "epiphany-*-*" } { "*" } { "" } }
+
+struct A { char x[12], y[35]; };
+struct B { char z[50]; };
+
+inline void
+foo (char *dest, const char *__restrict src, __SIZE_TYPE__ n)
+{
+ __builtin___strncpy_chk (dest, src, n, __builtin_object_size (dest, 0)); // { dg-warning "will always overflow" }
+}
+
+void bar (const char *, int);
+
+inline void
+baz (int i)
+{
+ char s[128], t[32];
+ bar (s, 0);
+ bar (t, i);
+ A a;
+ B b;
+ foo (a.y, b.z, 36);
+}
+
+void
+test ()
+{
+ baz (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-1.C
new file mode 100644
index 000000000..e4d6dff61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-1.C
@@ -0,0 +1,40 @@
+// Validate that the __sync builtins are overloaded properly.
+// { dg-do compile }
+// { dg-options "-Werror" }
+
+#define TEST1(TYPE, BUILTIN) \
+void t_##TYPE##BUILTIN(TYPE *p) \
+{ \
+ __typeof(BUILTIN(p, 1)) *pp; \
+ pp = p; \
+}
+
+#define TEST2(BUILTIN) \
+ TEST1(int, BUILTIN) \
+ TEST1(long, BUILTIN)
+
+TEST2(__sync_fetch_and_add)
+TEST2(__sync_fetch_and_sub)
+TEST2(__sync_fetch_and_or)
+TEST2(__sync_fetch_and_and)
+TEST2(__sync_fetch_and_xor)
+TEST2(__sync_fetch_and_nand)
+
+TEST2(__sync_add_and_fetch)
+TEST2(__sync_sub_and_fetch)
+TEST2(__sync_or_and_fetch)
+TEST2(__sync_and_and_fetch)
+TEST2(__sync_xor_and_fetch)
+TEST2(__sync_nand_and_fetch)
+
+TEST2(__sync_lock_test_and_set)
+
+#define TEST3(TYPE) \
+void t_##TYPE##__sync_val_compare_and_swap(TYPE *p) \
+{ \
+ __typeof(__sync_val_compare_and_swap(p, 1, 2)) *pp; \
+ pp = p; \
+}
+
+TEST3(int)
+TEST3(long)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-2.C
new file mode 100644
index 000000000..5695684c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-2.C
@@ -0,0 +1,58 @@
+// Validate that the __sync builtins are overloaded properly in templates.
+// { dg-do compile }
+// { dg-options "-Werror" }
+
+
+#define TEST1(BUILTIN) \
+template<typename T> \
+void f##BUILTIN(T *p) \
+{ \
+ __typeof(BUILTIN(p, 1)) *pp; \
+ pp = p; \
+}
+
+TEST1(__sync_fetch_and_add)
+TEST1(__sync_fetch_and_sub)
+TEST1(__sync_fetch_and_or)
+TEST1(__sync_fetch_and_and)
+TEST1(__sync_fetch_and_xor)
+TEST1(__sync_fetch_and_nand)
+
+TEST1(__sync_add_and_fetch)
+TEST1(__sync_sub_and_fetch)
+TEST1(__sync_or_and_fetch)
+TEST1(__sync_and_and_fetch)
+TEST1(__sync_xor_and_fetch)
+TEST1(__sync_nand_and_fetch)
+
+TEST1(__sync_lock_test_and_set)
+
+template<typename T>
+void f__sync_val_compare_and_swap(T *p)
+{
+ __typeof(__sync_val_compare_and_swap(p, 1, 2)) *pp;
+ pp = p;
+}
+
+#define TEST2(TYPE) \
+void h_##TYPE () \
+{ \
+ TYPE x; \
+ f__sync_fetch_and_add (&x); \
+ f__sync_fetch_and_sub (&x); \
+ f__sync_fetch_and_or (&x); \
+ f__sync_fetch_and_and (&x); \
+ f__sync_fetch_and_xor (&x); \
+ f__sync_fetch_and_nand (&x); \
+ f__sync_add_and_fetch (&x); \
+ f__sync_sub_and_fetch (&x); \
+ f__sync_or_and_fetch (&x); \
+ f__sync_and_and_fetch (&x); \
+ f__sync_xor_and_fetch (&x); \
+ f__sync_nand_and_fetch (&x); \
+ f__sync_lock_test_and_set (&x); \
+ f__sync_val_compare_and_swap (&x); \
+}
+
+TEST2(int)
+TEST2(long)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-3.C
new file mode 100644
index 000000000..99faac7bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-3.C
@@ -0,0 +1,21 @@
+// PR debug/41801
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+
+struct T
+{
+ void
+ foo () volatile
+ {
+ __sync_lock_release (&t);
+ __sync_synchronize ();
+ }
+ bool t;
+};
+
+int
+main ()
+{
+ T t = { false };
+ t.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-4.C
new file mode 100644
index 000000000..24bc66399
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/sync-4.C
@@ -0,0 +1,121 @@
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-require-effective-target sync_long_long_runtime } */
+/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
+
+/* Verify that the builtin functions are correctly marked as trapping
+ when using -fnon-call-exceptions. */
+
+#include <stdlib.h>
+#include <signal.h>
+
+typedef int ditype __attribute__ ((mode (DI)));
+
+#define FN(IDX, RET, CALL) \
+static RET f ## IDX (void *p) __attribute__ ((noinline)); \
+static RET \
+f ## IDX (void *p) \
+{ \
+ return CALL; \
+} \
+static void \
+t ## IDX () \
+{ \
+ try \
+ { \
+ f ## IDX(0); \
+ } \
+ catch (...) \
+ { \
+ return; \
+ } \
+ abort(); \
+}
+
+FN(1, ditype, (__sync_fetch_and_add((ditype*)p, 1)))
+FN(2, ditype, (__sync_fetch_and_sub((ditype*)p, 1)))
+FN(3, ditype, (__sync_fetch_and_or((ditype*)p, 1)))
+FN(4, ditype, (__sync_fetch_and_and((ditype*)p, 1)))
+FN(5, ditype, (__sync_fetch_and_xor((ditype*)p, 1)))
+FN(6, ditype, (__sync_fetch_and_nand((ditype*)p, 1)))
+
+FN( 7, ditype, (__sync_add_and_fetch((ditype*)p, 1)))
+FN( 8, ditype, (__sync_sub_and_fetch((ditype*)p, 1)))
+FN( 9, ditype, (__sync_or_and_fetch((ditype*)p, 1)))
+FN(10, ditype, (__sync_and_and_fetch((ditype*)p, 1)))
+FN(11, ditype, (__sync_xor_and_fetch((ditype*)p, 1)))
+FN(12, ditype, (__sync_nand_and_fetch((ditype*)p, 1)))
+
+FN(13, bool, (__sync_bool_compare_and_swap((ditype*)p, 1, 2)))
+FN(14, ditype, (__sync_val_compare_and_swap((ditype*)p, 1, 2)))
+
+FN(15, ditype, (__sync_lock_test_and_set((ditype*)p, 1)))
+FN(16, void, (__sync_lock_release((ditype*)p)))
+
+FN(17, bool, (__atomic_test_and_set((ditype*)p, __ATOMIC_SEQ_CST)))
+FN(18, void, (__atomic_clear((ditype*)p, __ATOMIC_SEQ_CST)))
+
+FN(19, void, (__atomic_exchange((ditype*)p, (ditype*)0, (ditype*)0, __ATOMIC_SEQ_CST)))
+FN(20, ditype, (__atomic_exchange_n((ditype*)p, 1, 2)))
+
+FN(21, void, (__atomic_load((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST)))
+FN(22, ditype, (__atomic_load_n((ditype*)p, __ATOMIC_SEQ_CST)))
+
+FN(23, bool, (__atomic_compare_exchange((ditype*)p, (ditype*)0, (ditype*)0, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)))
+FN(24, bool, (__atomic_compare_exchange_n((ditype*)p, (ditype*)0, 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)))
+
+FN(25, void, (__atomic_store((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST)))
+FN(26, void, (__atomic_store_n((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+
+FN(27, ditype, (__atomic_add_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(28, ditype, (__atomic_sub_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(29, ditype, (__atomic_and_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(30, ditype, (__atomic_nand_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(31, ditype, (__atomic_xor_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(32, ditype, (__atomic_or_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+
+FN(33, ditype, (__atomic_fetch_add((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(34, ditype, (__atomic_fetch_sub((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(35, ditype, (__atomic_fetch_and((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(36, ditype, (__atomic_fetch_nand((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(37, ditype, (__atomic_fetch_xor((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+FN(38, ditype, (__atomic_fetch_or((ditype*)p, 1, __ATOMIC_SEQ_CST)))
+
+static void
+handler(int)
+{
+ sigset_t clear;
+
+ sigfillset (&clear);
+ sigprocmask (SIG_UNBLOCK, &clear, NULL);
+ throw 0;
+}
+
+int
+main ()
+{
+ signal (SIGSEGV, handler);
+ signal (SIGBUS, handler);
+
+ t1();
+ t2();
+ t3();
+ t4();
+ t5();
+ t6();
+ t7();
+ t8();
+ t9();
+ t10();
+ t11();
+ t12();
+ t13();
+ t14();
+ t15();
+ t16();
+ t17();
+ t18();
+ t19();
+ t20();
+
+ exit(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar1.C
new file mode 100644
index 000000000..0d2d3f5f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar1.C
@@ -0,0 +1,12 @@
+// PR c++/52248
+// { dg-options "-ftime-report" }
+// { dg-prune-output "wall" }
+// { dg-prune-output "times" }
+// { dg-prune-output "TOTAL" }
+// { dg-prune-output "checks" }
+
+void
+foo ()
+{
+ goto lab; // { dg-error "not defined" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar2.C
new file mode 100644
index 000000000..74c4fc8cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/timevar2.C
@@ -0,0 +1,14 @@
+// PR c++/57524
+// { dg-options "-ftime-report" }
+// { dg-prune-output "wall" }
+// { dg-prune-output "times" }
+// { dg-prune-output "TOTAL" }
+// { dg-prune-output "checks" }
+
+namespace detail {
+namespace indirect_traits {}
+using namespace indirect_traits;
+void fn1() {
+using namespace detail;
+}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr1.C
new file mode 100644
index 000000000..16a32ce6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr1.C
@@ -0,0 +1,23 @@
+// PR c++/24260
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+#define stdcall __attribute__((stdcall))
+
+struct T {
+ template <class S>
+ static int stdcall func(int arg1, int arg2);
+};
+
+template <class S>
+int stdcall T::func(int arg1, int arg2)
+{
+ return arg1+arg2;
+}
+
+struct dummy {};
+
+void xx()
+{
+ int (stdcall *ptr2)(int,int) = &T::func<dummy>;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr2.C
new file mode 100644
index 000000000..4fd651d6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr2.C
@@ -0,0 +1,18 @@
+// PR c++/17743
+
+template <unsigned Len, unsigned Align>
+struct aligned_storage
+{
+ typedef char type[Len] __attribute__((aligned((Align))));
+};
+
+template<typename T>
+struct X
+{
+ typename aligned_storage<sizeof(T),__alignof(T)>::type data;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof (X<double>) == __alignof (double)> dummy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr3.C
new file mode 100644
index 000000000..f8d3c1620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr3.C
@@ -0,0 +1,42 @@
+// PR c++/17743
+
+template<typename T>
+struct X {
+ typedef char layout_type[sizeof(T)]
+ __attribute ((aligned(__alignof(double))));
+ layout_type data;
+};
+
+template<typename T>
+struct Y {
+ typedef char layout_type[sizeof(T)]
+ __attribute ((aligned(__alignof(T))));
+ layout_type data;
+};
+
+template<typename T>
+struct Z {
+ typedef char layout_type[sizeof(T)]
+ __attribute ((aligned(__alignof(T))));
+ struct Z2 {
+ layout_type data;
+ } in;
+};
+
+template<typename T>
+struct A;
+
+template <typename T>
+struct A<T*> {
+ typedef char layout_type[sizeof(T)]
+ __attribute ((aligned(__alignof(T))));
+ layout_type data;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof(X<double>) == __alignof(double)> d1;
+StaticAssert<__alignof(Y<double>) == __alignof(double)> d2;
+StaticAssert<__alignof(Z<double>) == __alignof(double)> d3;
+StaticAssert<__alignof(A<double*>) == __alignof(double)> d4;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr4.C
new file mode 100644
index 000000000..3d5c6b7d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr4.C
@@ -0,0 +1,19 @@
+// PR c++/7586
+// { dg-do run }
+
+template<typename T>
+int f()
+{
+ typedef unsigned char type[sizeof (T)]
+ __attribute((aligned(__alignof(T))));
+
+ return __alignof (type);
+}
+
+int main()
+{
+ if (f<int>() == __alignof (int))
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr5.C
new file mode 100644
index 000000000..30138d44a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr5.C
@@ -0,0 +1,33 @@
+// PR c++/19407
+// { dg-do run }
+
+typedef float global_vector_type __attribute__((vector_size(16)));
+
+template <class T> struct A
+{
+ typedef T type;
+};
+
+template < typename Val > struct S
+{
+ typedef typename A<Val>::type vector_type __attribute__((vector_size(16)));
+ typedef Val vector_type2 __attribute__((vector_size(16)));
+ int pr_size() { return sizeof(vector_type); }
+ int pr_size2() { return sizeof(vector_type2); }
+};
+
+int main()
+{
+ if (sizeof (S<float>::vector_type) != sizeof (global_vector_type))
+ return 1;
+ if (sizeof (S<float>::vector_type2) != sizeof (global_vector_type))
+ return 2;
+
+ S<float> x;
+ if (x.pr_size() != sizeof (global_vector_type))
+ return 3;
+ if (x.pr_size2() != sizeof (global_vector_type))
+ return 4;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr6.C
new file mode 100644
index 000000000..17f23fe34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr6.C
@@ -0,0 +1,12 @@
+// Don't crash on an unknown attribute.
+
+struct foo {
+ template <class T>
+ void __attribute__((leafify)) bar() {} // { dg-warning "ignored" }
+};
+
+void bar(void)
+{
+ foo f;
+ f.bar<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr7.C
new file mode 100644
index 000000000..ee6c41847
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr7.C
@@ -0,0 +1,11 @@
+// PR c++/33620
+
+template <typename T>
+struct __attribute__((visibility("default"))) List {};
+
+int bar(List<int> args);
+bool test(const List<int> &);
+
+int i = bar(List<int>());
+
+bool test(const List<int> &) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr8.C
new file mode 100644
index 000000000..4b8707aa5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr8.C
@@ -0,0 +1,8 @@
+// PR c++/28560
+
+template<typename> struct A {};
+
+template<int> struct B;
+
+template<int N> struct C :
+ A<typename B<N>::X __attribute__((unused))> {}; // { dg-warning "attribute" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr9.C
new file mode 100644
index 000000000..090257a5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/tmplattr9.C
@@ -0,0 +1,26 @@
+// PR c++/34937, 34962
+// { dg-require-weak "" }
+// { dg-options "" }
+
+struct A
+{
+ static const int i;
+};
+
+template<int> void foo()
+{
+ int x[A::i] __attribute((vector_size(8)));
+}
+
+template<int> struct B
+{
+ enum { a, b = a };
+ void bar(B<b>) __attribute((weak));
+};
+
+void f()
+{
+ foo<0>();
+ B<0> b;
+ b.bar (B<B<0>::b>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/traits1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/traits1.C
new file mode 100644
index 000000000..24099e53c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/traits1.C
@@ -0,0 +1,4 @@
+// PR c++/58504
+
+template<bool = __has_nothrow_assign(void)> struct A {};
+A<> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/transparent-union.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/transparent-union.C
new file mode 100644
index 000000000..123156361
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/transparent-union.C
@@ -0,0 +1,5 @@
+// PR c++/53761
+
+typedef union { // { dg-error "type transparent" }
+ double x;
+} __attribute__(( __transparent_union__ )) example_t;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typedef-init.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typedef-init.C
new file mode 100644
index 000000000..153303d21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typedef-init.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension. However,
+ it's been broken since GCC 3.0 (caused ICE) and we have now removed
+ the extension. See PR c/7353.
+
+ For cases A and C, C++ issues a warning in addition to the error,
+ since this construct appears to be a case of implicit int
+ (forbidden in std. C++) until we get to the equals sign. */
+
+/* Case A: just the bare name = initializer. */
+
+typedef A = 0; /* { dg-error "does not name a type" "A" } */
+A a; /* { dg-error "does not name a type" "A error cascade" } */
+
+/* Case B: with a type also. */
+
+typedef int B = 0; /* { dg-error "initialized" "B" } */
+B b; /* { dg-error "does not name a type" "B error cascade" } */
+
+/* C and D are the same as A and B, but wrapped in a structure;
+ field declarations go by a different code path in C++ (ick). */
+
+struct S {
+ typedef C = 0; /* { dg-error "does not name a type" "C" } */
+ C c; /* { dg-error "" "C error cascade" } */
+
+ typedef int D = 0; /* { dg-error "initialized" "D" } */
+ D d; /* { dg-bogus "" "D error cascade" } */
+};
+
+template<int> void foo()
+{
+ typedef int i = 0; /* { dg-error "is initialized" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typename1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typename1.C
new file mode 100644
index 000000000..cb9f4a7fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typename1.C
@@ -0,0 +1,7 @@
+// PR c++/6255
+// { dg-options "-fpermissive -w" }
+
+template <class T> struct A { typedef int X; };
+template <class T> struct B { typedef A<T> Y; void f (typename Y::X); };
+template <class T, class T1, class T2, class T3> struct C : public B<T> { void g (typename B<T>::Y::X); };
+template class B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof1.C
new file mode 100644
index 000000000..a3c13c8ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof1.C
@@ -0,0 +1,21 @@
+// Test typeof template argument substitution
+
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+// { dg-options "" }
+
+template <class T> struct A {
+ void f() {}
+ void g(T* t) {
+ A<typeof(t)> a;
+ a.f();
+ }
+};
+
+int main()
+{
+ A<int> a;
+ int b;
+ a.g(&b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof10.C
new file mode 100644
index 000000000..614538527
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof10.C
@@ -0,0 +1,11 @@
+// PR c++/20552
+// Origin: Ivan Godard <igodard@pacbell.net>
+
+template<int> struct A
+{
+ void foo()
+ {
+ typedef int T; // { dg-message "previous" }
+ typedef __typeof__(*this) T; // { dg-error "conflicting" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof11.C
new file mode 100644
index 000000000..757bcdea4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof11.C
@@ -0,0 +1,18 @@
+// PR c++/37920
+
+template<typename T> T& ensure_obj(const T&);
+template <typename T>
+void func2(T& t)
+{
+ typedef __typeof__(ensure_obj(t)) ttt;
+ struct ttt1
+ {
+ ttt1( ttt arg0 ){}
+ } tttt ( t );
+}
+int main()
+{
+ double d = 5;
+ func2(d);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof2.C
new file mode 100644
index 000000000..3c5112fd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof2.C
@@ -0,0 +1,29 @@
+// Test typeof with __asm redirection
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" {
+ extern int foo1;
+ extern int foo1 __asm ("bar1");
+ int foo1 = 1;
+
+ extern int foo2 (int);
+ extern int foo2 (int) __asm ("bar2");
+ int foo2 (int x)
+ {
+ return x;
+ }
+
+ extern int foo3;
+ extern __typeof (foo3) foo3 __asm ("bar3");
+ int foo3 = 1;
+
+ extern int foo4 (int);
+ extern __typeof (foo4) foo4 __asm ("bar4");
+ int foo4 (int x)
+ {
+ return x;
+ }
+}
+
+// { dg-final { scan-assembler-not "foo" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof3.C
new file mode 100644
index 000000000..cf78c7c61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof3.C
@@ -0,0 +1,4 @@
+double f(double);
+float f(float);
+void h(typeof(f) g) {} // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof4.C
new file mode 100644
index 000000000..2f4237035
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "" }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9459: typeof in return type of template function
+
+void foo (int) {}
+void foo (double) {}
+
+template <typename C>
+typeof(foo(1))
+bar () { return foo(1); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof5.C
new file mode 100644
index 000000000..d1ee4f718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof5.C
@@ -0,0 +1,8 @@
+// { dg-options "" }
+
+int foo;
+
+template <class T> struct Base {};
+
+template <class T>
+struct Derived : public Base<typeof(foo)> {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof6.C
new file mode 100644
index 000000000..ef75f255c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof6.C
@@ -0,0 +1,17 @@
+// { dg-options "" }
+
+template <class T>
+void test1() {
+ int x = 0;
+ const typeof(x) & t1 = x+0;
+}
+
+void test2() {
+ int x = 0;
+ const typeof(x) & t1 = x+0;
+}
+
+int main() {
+ test1<int>();
+ test2 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof7.C
new file mode 100644
index 000000000..6c426931b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof7.C
@@ -0,0 +1,6 @@
+// PR c++/13635
+// { dg-options "" }
+
+template<int n> class X {template<class Y> typeof(Y::y) foo();};
+X<0> x;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof8.C
new file mode 100644
index 000000000..8e6523484
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof8.C
@@ -0,0 +1,12 @@
+// PR c++/14116
+// Any use of typeof in a templete was causing an ICE.
+// { dg-options "" }
+
+struct vector { typedef int iterator; };
+vector read_queue;
+template <class T> void f(){
+ typedef typeof (read_queue) read_queue_t;
+ read_queue_t::iterator it;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof9.C
new file mode 100644
index 000000000..1547c0f2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/typeof9.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Origin: gcc-bug@vogtner.de
+
+// PR c++/14106: ICE with typeof of function template.
+
+template<class T>
+void j (T i)
+{
+}
+
+template<typename T>
+void instanciate () {
+ static void (*fp) (T) = j;
+ __typeof__ (j) *p; // { dg-error "unknown|invalid" }
+}
+template void instanciate<float>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C
new file mode 100644
index 000000000..ecc5ec224
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C
@@ -0,0 +1,76 @@
+// PR c++/39475
+
+struct I; // { dg-error "forward declaration" }
+struct C { };
+
+bool nas1 = __has_nothrow_assign(I); // { dg-error "incomplete type" }
+bool nas2 = __has_nothrow_assign(C[]);
+bool nas3 = __has_nothrow_assign(I[]); // { dg-error "incomplete type" }
+bool nas4 = __has_nothrow_assign(void);
+bool nas5 = __has_nothrow_assign(const void);
+
+bool tas1 = __has_trivial_assign(I); // { dg-error "incomplete type" }
+bool tas2 = __has_trivial_assign(C[]);
+bool tas3 = __has_trivial_assign(I[]); // { dg-error "incomplete type" }
+bool tas4 = __has_trivial_assign(void);
+bool tas5 = __has_trivial_assign(const void);
+
+bool nco1 = __has_nothrow_constructor(I); // { dg-error "incomplete type" }
+bool nco2 = __has_nothrow_constructor(C[]);
+bool nco3 = __has_nothrow_constructor(I[]); // { dg-error "incomplete type" }
+bool nco4 = __has_nothrow_constructor(void);
+bool nco5 = __has_nothrow_constructor(const void);
+
+bool tco1 = __has_trivial_constructor(I); // { dg-error "incomplete type" }
+bool tco2 = __has_trivial_constructor(C[]);
+bool tco3 = __has_trivial_constructor(I[]); // { dg-error "incomplete type" }
+bool tco4 = __has_trivial_constructor(void);
+bool tco5 = __has_trivial_constructor(const void);
+
+bool ncp1 = __has_nothrow_copy(I); // { dg-error "incomplete type" }
+bool ncp2 = __has_nothrow_copy(C[]);
+bool ncp3 = __has_nothrow_copy(I[]); // { dg-error "incomplete type" }
+bool ncp4 = __has_nothrow_copy(void);
+bool ncp5 = __has_nothrow_copy(const void);
+
+bool tcp1 = __has_trivial_copy(I); // { dg-error "incomplete type" }
+bool tcp2 = __has_trivial_copy(C[]);
+bool tcp3 = __has_trivial_copy(I[]); // { dg-error "incomplete type" }
+bool tcp4 = __has_trivial_copy(void);
+bool tcp5 = __has_trivial_copy(const void);
+
+bool vde1 = __has_virtual_destructor(I); // { dg-error "incomplete type" }
+bool vde2 = __has_virtual_destructor(C[]);
+bool vde3 = __has_virtual_destructor(I[]); // { dg-error "incomplete type" }
+bool vde4 = __has_virtual_destructor(void);
+bool vde5 = __has_virtual_destructor(const void);
+
+bool tde1 = __has_trivial_destructor(I); // { dg-error "incomplete type" }
+bool tde2 = __has_trivial_destructor(C[]);
+bool tde3 = __has_trivial_destructor(I[]); // { dg-error "incomplete type" }
+bool tde4 = __has_trivial_destructor(void);
+bool tde5 = __has_trivial_destructor(const void);
+
+bool abs1 = __is_abstract(I); // { dg-error "incomplete type" }
+bool abs2 = __is_abstract(C[]);
+bool abs3 = __is_abstract(I[]); // { dg-error "incomplete type" }
+bool abs4 = __is_abstract(void);
+bool abs5 = __is_abstract(const void);
+
+bool pod1 = __is_pod(I); // { dg-error "incomplete type" }
+bool pod2 = __is_pod(C[]);
+bool pod3 = __is_pod(I[]); // { dg-error "incomplete type" }
+bool pod4 = __is_pod(void);
+bool pod5 = __is_pod(const void);
+
+bool emp1 = __is_empty(I); // { dg-error "incomplete type" }
+bool emp2 = __is_empty(C[]);
+bool emp3 = __is_empty(I[]); // { dg-error "incomplete type" }
+bool emp4 = __is_empty(void);
+bool emp5 = __is_empty(const void);
+
+bool pol1 = __is_polymorphic(I); // { dg-error "incomplete type" }
+bool pol2 = __is_polymorphic(C[]);
+bool pol3 = __is_polymorphic(I[]); // { dg-error "incomplete type" }
+bool pol4 = __is_polymorphic(void);
+bool pol5 = __is_polymorphic(const void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type1.C
new file mode 100644
index 000000000..999cd9f35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+struct B { };
+union U { };
+
+template<typename T>
+ struct underlying_type
+ { typedef __underlying_type(T) type; }; // { dg-error "not an enumeration" }
+
+__underlying_type(int) i1; // { dg-error "not an enumeration|invalid" }
+__underlying_type(A) i2; // { dg-error "expected|type" }
+__underlying_type(B) i3; // { dg-error "not an enumeration|invalid" }
+__underlying_type(U) i4; // { dg-error "not an enumeration|invalid" }
+
+underlying_type<int>::type i5;
+underlying_type<A>::type i6; // { dg-error "not declared|template|expected" }
+underlying_type<B>::type i7;
+underlying_type<U>::type i8;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type10.C
new file mode 100644
index 000000000..66ba02e99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type10.C
@@ -0,0 +1,31 @@
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+enum E1 : unsigned { E1_en = 1 };
+enum E2 : char { E2_en = 1 };
+enum class E3 { a = -1 };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+template<typename T>
+ struct underlying_type
+ { typedef __underlying_type(T) type; };
+
+template<typename T>
+ void
+ test(T t, typename underlying_type<T>::type v)
+ {
+ assert( t == T(v) );
+ }
+
+int main()
+{
+ test(E1::E1_en, 1);
+ test(E2::E2_en, 1);
+ test(E3::a, -1);
+ test(E4::c, 1);
+ test(E5::a, -1);
+ test(E6::c, __LONG_MAX__);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type11.C
new file mode 100644
index 000000000..72ee434bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type11.C
@@ -0,0 +1,3 @@
+// PR c++/51414
+
+__underlying_type(int[1]) i; // { dg-error "int \\\[1\\\]|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type2.C
new file mode 100644
index 000000000..0e4519876
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+enum E1 { };
+enum E2 { a = -1, b = 1 };
+enum E3 { c = __LONG_MAX__ };
+
+__underlying_type(E1) e1 = 0;
+__underlying_type(E2) e2 = b;
+__underlying_type(E3) e3 = __LONG_MAX__;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type3.C
new file mode 100644
index 000000000..1209171f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type3.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T1, typename T2>
+ struct is_same
+ { static const bool value = false; };
+
+template<typename T>
+ struct is_same<T, T>
+ { static const bool value = true; };
+
+enum E1 : unsigned { };
+enum E2 : char { };
+enum class E3 { };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+__underlying_type(E1) i1 = __INT_MAX__ * 2U + 1;
+__underlying_type(E2) i2 = (char(-1) < 0
+ ? __SCHAR_MAX__
+ : __SCHAR_MAX__ * 2U + 1);
+__underlying_type(E3) i3 = __INT_MAX__;
+__underlying_type(E4) i4 = __SCHAR_MAX__ * 2U + 1;
+__underlying_type(E5) i5 = int(E5::b);
+__underlying_type(E6) i6 = __LONG_MAX__;
+
+static_assert(is_same<__underlying_type(E1), unsigned>::value, "Error");
+static_assert(is_same<__underlying_type(E2), char>::value, "Error");
+static_assert(is_same<__underlying_type(E3), int>::value, "Error");
+static_assert(is_same<__underlying_type(E4), unsigned char>::value, "Error");
+static_assert(is_same<__underlying_type(E5), int>::value, "Error");
+static_assert(is_same<__underlying_type(E6), long>::value, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type4.C
new file mode 100644
index 000000000..b80ed5769
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type4.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+#include <tr1/type_traits>
+
+using namespace std::tr1;
+
+enum E1 { };
+enum E2 { a = -1, b = 1 };
+enum E3 { c = __LONG_MAX__ };
+
+typedef __underlying_type(E1) UTE1;
+typedef __underlying_type(E2) UTE2;
+typedef __underlying_type(E3) UTE3;
+
+template<typename T>
+ struct underlying_type
+ { typedef __underlying_type(T) type; };
+
+int test1[is_same<underlying_type<E1>::type, UTE1>::value ? 1 : -1];
+int test2[is_same<underlying_type<E2>::type, UTE2>::value ? 1 : -1];
+int test3[is_same<underlying_type<E3>::type, UTE3>::value ? 1 : -1];
+
+int test4[is_integral<underlying_type<E1>::type>::value ? 1 : -1];
+int test5[is_integral<underlying_type<E2>::type>::value ? 1 : -1];
+int test6[is_integral<underlying_type<E3>::type>::value ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type5.C
new file mode 100644
index 000000000..aad53006e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type5.C
@@ -0,0 +1,42 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T1, typename T2>
+ struct is_same
+ { static const bool value = false; };
+
+template<typename T>
+ struct is_same<T, T>
+ { static const bool value = true; };
+
+enum E1 : unsigned { };
+enum E2 : char { };
+enum class E3 { };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+typedef __underlying_type(E1) UTE1;
+typedef __underlying_type(E2) UTE2;
+typedef __underlying_type(E3) UTE3;
+typedef __underlying_type(E4) UTE4;
+typedef __underlying_type(E5) UTE5;
+typedef __underlying_type(E6) UTE6;
+
+template<typename T>
+ struct underlying_type
+ { typedef __underlying_type(T) type; };
+
+static_assert(is_same<underlying_type<E1>::type, UTE1>::value, "Error");
+static_assert(is_same<underlying_type<E2>::type, UTE2>::value, "Error");
+static_assert(is_same<underlying_type<E3>::type, UTE3>::value, "Error");
+static_assert(is_same<underlying_type<E4>::type, UTE4>::value, "Error");
+static_assert(is_same<underlying_type<E5>::type, UTE5>::value, "Error");
+static_assert(is_same<underlying_type<E6>::type, UTE6>::value, "Error");
+
+static_assert(is_same<underlying_type<E1>::type, unsigned>::value, "Error");
+static_assert(is_same<underlying_type<E2>::type, char>::value, "Error");
+static_assert(is_same<underlying_type<E3>::type, int>::value, "Error");
+static_assert(is_same<underlying_type<E4>::type,
+ unsigned char>::value, "Error");
+static_assert(is_same<underlying_type<E5>::type, int>::value, "Error");
+static_assert(is_same<underlying_type<E6>::type, long>::value, "Error");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type6.C
new file mode 100644
index 000000000..91be4d5d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type6.C
@@ -0,0 +1,30 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T1, typename T2>
+ struct is_same
+ { static const bool value = false; };
+
+template<typename T>
+ struct is_same<T, T>
+ { static const bool value = true; };
+
+enum E1 : unsigned { };
+enum E2 : char { };
+enum class E3 { };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+template<typename T, typename U,
+ typename V = __underlying_type(T)>
+ struct test
+ {
+ static_assert(is_same<U, V>::value, "Error");
+ };
+
+template class test<E1, unsigned>;
+template class test<E2, char>;
+template class test<E3, int>;
+template class test<E4, unsigned char>;
+template class test<E5, int>;
+template class test<E6, long>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type7.C
new file mode 100644
index 000000000..2d6ec5179
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type7.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+
+enum E1 : unsigned { E1_en = 1 };
+enum E2 : char { E2_en = 1 };
+enum class E3 { a = -1 };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+template<typename T>
+ void
+ test(T, __underlying_type(T)) // { dg-message "sorry, unimplemented: mangling" }
+ { }
+
+int main()
+{
+ test(E1::E1_en, 1);
+ test(E2::E2_en, 1);
+ test(E3::a, -1);
+ test(E4::c, 1);
+ test(E5::a, -1);
+ test(E6::c, __LONG_MAX__);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type8.C
new file mode 100644
index 000000000..95e76fa24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type8.C
@@ -0,0 +1,45 @@
+// { dg-do compile { target c++11 } }
+
+enum E1 : unsigned { E1_en = 1 };
+enum E2 : char { E2_en = 1 };
+enum class E3 { a = -1 };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+template<typename T1, typename T2>
+ struct is_same
+ { static const bool value = false; };
+
+template<typename T>
+ struct is_same<T, T>
+ { static const bool value = true; };
+
+template<typename>
+ struct underlying_type;
+
+template<typename T, typename U>
+ void
+ test(T, U, typename underlying_type<T>::type);
+
+template<typename T>
+ struct underlying_type
+ { typedef __underlying_type(T) type; };
+
+template<typename T, typename U>
+ void
+ test(T, U, typename underlying_type<T>::type)
+ {
+ static_assert(is_same<typename underlying_type<T>::type, U>::value,
+ "Error");
+ }
+
+int main()
+{
+ test(E1::E1_en, unsigned(), 1);
+ test(E2::E2_en, char(), 1);
+ test(E3::a, int(), -1);
+ test(E4::c, (unsigned char)(1), 1);
+ test(E5::a, int(), -1);
+ test(E6::c, long(), __LONG_MAX__);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type9.C
new file mode 100644
index 000000000..2c564560e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/underlying_type9.C
@@ -0,0 +1,29 @@
+// { dg-do compile { target c++11 } }
+
+template<typename T1, typename T2>
+ struct is_same
+ { static const bool value = false; };
+
+template<typename T>
+ struct is_same<T, T>
+ { static const bool value = true; };
+
+enum E1 : unsigned { };
+enum E2 : char { };
+enum class E3 { };
+enum class E4 : unsigned char { c = 1 };
+enum class E5 : int { a = -1, b = 1 };
+enum class E6 : long { c = __LONG_MAX__ };
+
+template<typename T, typename U>
+ struct test
+ {
+ static_assert(is_same<T, U>::value, "Error");
+ };
+
+test<__underlying_type(E1), unsigned> t1;
+test<__underlying_type(E2), char> t2;
+test<__underlying_type(E3), int> t3;
+test<__underlying_type(E4), unsigned char> t4;
+test<__underlying_type(E5), int> t5;
+test<__underlying_type(E6), long> t6;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-1.C
new file mode 100644
index 000000000..fdf6aebb1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-1.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+extern "C" {
+
+typedef int UOW;
+struct ABC {
+ UOW UOW;
+};
+
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-2.C
new file mode 100644
index 000000000..79c1913f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-2.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall -fms-extensions" } */
+
+typedef int UOW;
+struct ABC {
+ UOW UOW;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-3.C
new file mode 100644
index 000000000..a2c224021
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-3.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+typedef int UOW; /* { dg-error "" } */
+struct ABC {
+ UOW UOW; /* { dg-error "" } */
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-4.C
new file mode 100644
index 000000000..21ed04a88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/uow-4.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall -pedantic" } */
+
+extern "C" {
+
+typedef int UOW; /* { dg-error "" } */
+struct ABC {
+ UOW UOW; /* { dg-error "" } */
+};
+
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C
new file mode 100644
index 000000000..2ce774abc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C
@@ -0,0 +1,36 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t/char32_t string literals. */
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-fshort-wchar" } */
+
+const char s_0[] = "ab";
+const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
+const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
+const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+
+const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_1[] = u"ab";
+const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */
+
+const char16_t s16_4[0] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_5[1] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_6[2] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_7[3] = u"ab";
+const char16_t s16_8[4] = u"ab";
+
+const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_2[] = U"ab";
+const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */
+
+const char32_t s32_4[0] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_5[1] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_6[2] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_7[3] = U"ab";
+const char32_t s32_8[4] = U"ab";
+
+const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_3[] = L"ab";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array.C
new file mode 100644
index 000000000..21e438693
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-array.C
@@ -0,0 +1,36 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t/char32_t string literals. */
+/* { dg-do compile { target c++11 } } */
+// { dg-options "" }
+
+const char s_0[] = "ab";
+const char s_1[] = u"ab"; /* { dg-error "from wide string" } */
+const char s_2[] = U"ab"; /* { dg-error "from wide string" } */
+const char s_3[] = L"ab"; /* { dg-error "from wide string" } */
+
+const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char16_t s16_1[] = u"ab";
+const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */
+
+const char16_t s16_4[0] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_5[1] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_6[2] = u"ab"; /* { dg-error "chars is too long" } */
+const char16_t s16_7[3] = u"ab";
+const char16_t s16_8[4] = u"ab";
+
+const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */
+const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const char32_t s32_2[] = U"ab";
+const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */
+
+const char32_t s32_4[0] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_5[1] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_6[2] = U"ab"; /* { dg-error "chars is too long" } */
+const char32_t s32_7[3] = U"ab";
+const char32_t s32_8[4] = U"ab";
+
+const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */
+const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */
+const wchar_t sw_3[] = L"ab";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat.C
new file mode 100644
index 000000000..4079b8387
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat.C
@@ -0,0 +1,21 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test unsupported concatenation of char16_t/char32_t* string literals. */
+/* { dg-do compile { target c++11 } } */
+
+const void *s0 = u"a" "b";
+const void *s1 = "a" u"b";
+const void *s2 = u"a" U"b"; /* { dg-error "non-standard concatenation" } */
+const void *s3 = U"a" u"b"; /* { dg-error "non-standard concatenation" } */
+const void *s4 = u"a" L"b"; /* { dg-error "non-standard concatenation" } */
+const void *s5 = L"a" u"b"; /* { dg-error "non-standard concatenation" } */
+const void *s6 = u"a" u"b";
+const void *s7 = U"a" "b";
+const void *s8 = "a" U"b";
+const void *s9 = U"a" L"b"; /* { dg-error "non-standard concatenation" } */
+const void *sa = L"a" U"b"; /* { dg-error "non-standard concatenation" } */
+const void *sb = U"a" U"b";
+const void *sc = L"a" "b";
+const void *sd = "a" L"b";
+const void *se = L"a" L"b";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat2.C
new file mode 100644
index 000000000..0d3fe3303
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-badconcat2.C
@@ -0,0 +1,14 @@
+// Test unsupported concatenation of UTF-8 string literals.
+// { dg-do compile { target c++11 } }
+
+const void *s0 = u8"a" "b";
+const void *s1 = "a" u8"b";
+const void *s2 = u8"a" u8"b";
+const void *s3 = u8"a" u"b"; // { dg-error "non-standard concatenation" }
+const void *s4 = u"a" u8"b"; // { dg-error "non-standard concatenation" }
+const void *s5 = u8"a" U"b"; // { dg-error "non-standard concatenation" }
+const void *s6 = U"a" u8"b"; // { dg-error "non-standard concatenation" }
+const void *s7 = u8"a" L"b"; // { dg-error "non-standard concatenation" }
+const void *s8 = L"a" u8"b"; // { dg-error "non-standard concatenation" }
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cvt.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cvt.C
new file mode 100644
index 000000000..366c3d417
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cvt.C
@@ -0,0 +1,55 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test the char16_t and char32_t promotion rules. */
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-Wall -Wconversion -Wsign-conversion -Wsign-promo" } */
+
+extern void f_c (char);
+extern void fsc (signed char);
+extern void fuc (unsigned char);
+extern void f_s (short);
+extern void fss (signed short);
+extern void fus (unsigned short);
+extern void f_i (int);
+extern void fsi (signed int);
+extern void fui (unsigned int);
+extern void f_l (long);
+extern void fsl (signed long);
+extern void ful (unsigned long);
+extern void f_ll (long long);
+extern void fsll (signed long long);
+extern void full (unsigned long long);
+
+void m(char16_t c0, char32_t c1)
+{
+ f_c (c0); /* { dg-warning "alter its value" } */
+ fsc (c0); /* { dg-warning "alter its value" } */
+ fuc (c0); /* { dg-warning "alter its value" } */
+ f_s (c0); /* { dg-warning "change the sign" } */
+ fss (c0); /* { dg-warning "change the sign" } */
+ fus (c0);
+ f_i (c0);
+ fsi (c0);
+ fui (c0);
+ f_l (c0);
+ fsl (c0);
+ ful (c0);
+ f_ll (c0);
+ fsll (c0);
+ full (c0);
+
+ f_c (c1); /* { dg-warning "alter its value" } */
+ fsc (c1); /* { dg-warning "alter its value" } */
+ fuc (c1); /* { dg-warning "alter its value" } */
+ f_s (c1); /* { dg-warning "alter its value" } */
+ fss (c1); /* { dg-warning "alter its value" } */
+ fus (c1); /* { dg-warning "alter its value" } */
+ f_i (c1); /* { dg-warning "change the sign" } */
+ fsi (c1); /* { dg-warning "change the sign" } */
+ fui (c1);
+ f_l (c1); /* { dg-warning "change the sign" "" { target { llp64 || ilp32 } } } */
+ fsl (c1); /* { dg-warning "change the sign" "" { target { llp64 || ilp32 } } } */
+ ful (c1);
+ f_ll (c1);
+ fsll (c1);
+ full (c1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx0x.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx0x.C
new file mode 100644
index 000000000..221ccf093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx0x.C
@@ -0,0 +1,13 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test parsing of u and U prefixes when also used as macros. */
+/* { dg-do compile { target c++11 } } */
+
+#define u L
+#define U L
+
+const unsigned short c2 = u'a';
+const unsigned long c3 = U'a';
+const void *s0 = u"a";
+const void *s1 = U"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx98.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx98.C
new file mode 100644
index 000000000..365118e39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-cxx98.C
@@ -0,0 +1,27 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t/char32_t in c++98. */
+/* Ensure u and U prefixes are parsed as separate tokens in c++98. */
+/* { dg-do compile } */
+/* { dg-options "-std=c++98" } */
+
+const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */
+const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */
+
+const unsigned short c2 = u'a'; /* { dg-error "not declared" } */
+const unsigned long c3 = U'a'; /* { dg-error "not declared" } */
+
+#define u 1 +
+#define U 2 +
+
+const unsigned short c5 = u'a';
+const unsigned long c6 = U'a';
+
+#undef u
+#undef U
+#define u "a"
+#define U "b"
+
+const void *s0 = u"a";
+const void *s1 = U"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt.C
new file mode 100644
index 000000000..c2b127d5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt.C
@@ -0,0 +1,27 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t/char32_t in default std. */
+/* Ensure u and U prefixes are parsed as separate tokens in default std. */
+/* { dg-do compile } */
+/* { dg-options "-std=c++98" } */
+
+const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */
+const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */
+
+const unsigned short c2 = u'a'; /* { dg-error "not declared" } */
+const unsigned long c3 = U'a'; /* { dg-error "not declared" } */
+
+#define u 1 +
+#define U 2 +
+
+const unsigned short c4 = u'a';
+const unsigned long c5 = U'a';
+
+#undef u
+#undef U
+#define u "a"
+#define U "b"
+
+const void *s0 = u"a";
+const void *s1 = U"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt2.C
new file mode 100644
index 000000000..ab18ef52f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-dflt2.C
@@ -0,0 +1,11 @@
+// In C++0x, the u8 prefix should be parsed as separate tokens.
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+const void *s0 = u8"a"; // { dg-error "was not declared" }
+
+#define u8 "a"
+
+const void *s1 = u8"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C
new file mode 100644
index 000000000..221ccf093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C
@@ -0,0 +1,13 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test parsing of u and U prefixes when also used as macros. */
+/* { dg-do compile { target c++11 } } */
+
+#define u L
+#define U L
+
+const unsigned short c2 = u'a';
+const unsigned long c3 = U'a';
+const void *s0 = u"a";
+const void *s1 = U"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C
new file mode 100644
index 000000000..b3be121e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C
@@ -0,0 +1,27 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t/char32_t in gnu++98. */
+/* Ensure u and U prefixes are parsed as separate tokens in gnu++98. */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu++98" } */
+
+const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */
+const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */
+
+const unsigned short c2 = u'a'; /* { dg-error "not declared" } */
+const unsigned long c3 = U'a'; /* { dg-error "not declared" } */
+
+#define u 1 +
+#define U 2 +
+
+const unsigned short c5 = u'a';
+const unsigned long c6 = U'a';
+
+#undef u
+#undef U
+#define u "a"
+#define U "b"
+
+const void *s0 = u"a";
+const void *s1 = U"a";
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-mangle.C
new file mode 100644
index 000000000..546566f08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-mangle.C
@@ -0,0 +1,13 @@
+// Contributed by Kris Van Hees <kris.van.hees@oracle.com>
+// Test the support for char16_t character constants.
+// { dg-do compile { target c++11 } }
+
+void f0 (char16_t c) {}
+void f1 (char32_t c) {}
+void f2 (char16_t *s) {}
+void f3 (char32_t *s) {}
+
+// { dg-final { scan-assembler "_Z2f0Ds:" } }
+// { dg-final { scan-assembler "_Z2f1Di:" } }
+// { dg-final { scan-assembler "_Z2f2PDs:" } }
+// { dg-final { scan-assembler "_Z2f3PDi:" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-rtti.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-rtti.C
new file mode 100644
index 000000000..202625789
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-rtti.C
@@ -0,0 +1,11 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Ensure that typeinfo data is generated for char16_t/char32_t. */
+/* { dg-do link { target c++11 } } */
+
+#include <typeinfo>
+
+int main(void)
+{
+ typeid(char16_t).name();
+ typeid(char32_t).name();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-type.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-type.C
new file mode 100644
index 000000000..7e1564797
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-type.C
@@ -0,0 +1,15 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Ensure that __CHAR16_TYPE__ and __CHAR32_TYPE__ exist, match the types they
+ are the underlying data type for. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+int main ()
+{
+ if (sizeof (__CHAR16_TYPE__) != sizeof (char16_t))
+ abort();
+ if (sizeof (__CHAR32_TYPE__) != sizeof (char32_t))
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C
new file mode 100644
index 000000000..3503f11a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C
@@ -0,0 +1,6 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Ensure that a typedef to char16_t/char32_t issues an error in c++0x. */
+/* { dg-do compile { target c++11 } } */
+
+typedef short unsigned int char16_t; /* { dg-error "redeclaration" } */
+typedef unsigned int char32_t; /* { dg-error "redeclaration" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C
new file mode 100644
index 000000000..8922856c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C
@@ -0,0 +1,7 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Ensure that a typedef to char16_t/char32_t is fine in c++98. */
+/* { dg-do compile } */
+/* { dg-options "-std=c++98" } */
+
+typedef short unsigned int char16_t;
+typedef unsigned int char32_t;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typespec.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typespec.C
new file mode 100644
index 000000000..aa10b7253
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf-typespec.C
@@ -0,0 +1,24 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Ensure that type specifiers are not allowed for char16_t/char32_t. */
+/* { dg-do compile { target c++11 } } */
+
+signed char16_t c0; /* { dg-error "signed" } */
+signed char32_t c1; /* { dg-error "signed" } */
+unsigned char16_t c2; /* { dg-error "unsigned" } */
+unsigned char32_t c3; /* { dg-error "unsigned" } */
+
+short char16_t c4; /* { dg-error "short" } */
+long char16_t c5; /* { dg-error "long" } */
+short char32_t c6; /* { dg-error "short" } */
+long char32_t c7; /* { dg-error "long" } */
+
+signed short char16_t c8; /* { dg-error "signed" } */
+signed short char32_t c9; /* { dg-error "signed" } */
+signed long char16_t ca; /* { dg-error "signed" } */
+signed long char32_t cb; /* { dg-error "signed" } */
+unsigned short char16_t cc; /* { dg-error "unsigned" } */
+unsigned short char32_t cd; /* { dg-error "unsigned" } */
+unsigned long char16_t ce; /* { dg-error "unsigned" } */
+unsigned long char32_t cf; /* { dg-error "unsigned" } */
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-1.C
new file mode 100644
index 000000000..8754e4d82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-1.C
@@ -0,0 +1,65 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test the support for char16_t character constants. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char16_t c0 = u'a';
+const static char16_t c1 = u'\0';
+const static char16_t c2 = u'\u0024';
+const static char16_t c3 = u'\u2029';
+const static char16_t c4 = u'\u8010';
+
+const static char16_t c5 = 'a';
+const static char16_t c6 = U'a';
+const static char16_t c7 = U'\u2029';
+const static char16_t c8 = U'\u8010';
+const static char16_t c9 = L'a';
+const static char16_t ca = L'\u2029';
+const static char16_t cb = L'\u8010';
+
+#define A 0x0061
+#define D 0x0024
+#define X 0x2029
+#define Y 0x8010
+
+int main ()
+{
+ if (sizeof (u'a') != sizeof (char16_t))
+ abort ();
+ if (sizeof (u'\0') != sizeof (char16_t))
+ abort ();
+ if (sizeof (u'\u0024') != sizeof (char16_t))
+ abort ();
+ if (sizeof (u'\u2029') != sizeof (char16_t))
+ abort ();
+ if (sizeof (u'\u8010') != sizeof (char16_t))
+ abort ();
+
+ if (c0 != A)
+ abort ();
+ if (c1 != 0x0000)
+ abort ();
+ if (c2 != D)
+ abort ();
+ if (c3 != X)
+ abort ();
+ if (c4 != Y)
+ abort ();
+
+ if (c5 != A)
+ abort ();
+ if (c6 != A)
+ abort ();
+ if (c7 != X)
+ abort ();
+ if (c8 != Y)
+ abort ();
+ if (c9 != A)
+ abort ();
+ if (ca != X)
+ abort ();
+ if (cb != Y)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-2.C
new file mode 100644
index 000000000..4951e0344
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-2.C
@@ -0,0 +1,30 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test the support for char16_t* string literals. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char16_t *s0 = u"ab";
+const static char16_t *s1 = u"a\u0024";
+const static char16_t *s2 = u"a\u2029";
+const static char16_t *s3 = u"a\U00064321";
+
+#define A 0x0061
+#define B 0x0062
+#define D 0x0024
+#define X 0x2029
+#define Y1 0xD950
+#define Y2 0xDF21
+
+int main ()
+{
+ if (s0[0] != A || s0[1] != B || s0[2] != 0x0000)
+ abort ();
+ if (s1[0] != A || s1[1] != D || s0[2] != 0x0000)
+ abort ();
+ if (s2[0] != A || s2[1] != X || s0[2] != 0x0000)
+ abort ();
+ if (s3[0] != A || s3[1] != Y1 || s3[2] != Y2 || s3[3] != 0x0000)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-3.C
new file mode 100644
index 000000000..370dcf1dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-3.C
@@ -0,0 +1,47 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test concatenation of char16_t* string literals. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char16_t *s0 = u"a" u"b";
+
+const static char16_t *s1 = u"a" "b";
+const static char16_t *s2 = "a" u"b";
+const static char16_t *s3 = u"a" "\u2029";
+const static char16_t *s4 = "\u2029" u"b";
+const static char16_t *s5 = u"a" "\U00064321";
+const static char16_t *s6 = "\U00064321" u"b";
+
+#define A 0x0061
+#define B 0x0062
+#define X 0x2029
+#define Y1 0xD950
+#define Y2 0xDF21
+
+int main ()
+{
+ if (sizeof ((u"a" u"b")[0]) != sizeof (char16_t))
+ abort ();
+ if (sizeof ((u"a" "b")[0]) != sizeof (char16_t))
+ abort ();
+ if (sizeof (( "a" u"b")[0]) != sizeof (char16_t))
+ abort ();
+
+ if (s0[0] != A || s0[1] != B || s0[2] != 0x0000)
+ abort ();
+
+ if (s1[0] != A || s1[1] != B || s1[2] != 0x0000)
+ abort ();
+ if (s2[0] != A || s2[1] != B || s2[2] != 0x0000)
+ abort ();
+ if (s3[0] != A || s3[1] != X || s3[2] != 0x0000)
+ abort ();
+ if (s4[0] != X || s4[1] != B || s4[2] != 0x0000)
+ abort ();
+ if (s5[0] != A || s5[1] != Y1 || s5[2] != Y2 || s5[3] != 0x0000)
+ abort ();
+ if (s6[0] != Y1 || s6[1] != Y2 || s6[2] != B || s6[3] != 0x0000)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-4.C
new file mode 100644
index 000000000..807b77524
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf16-4.C
@@ -0,0 +1,18 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char16_t character constants. */
+/* { dg-do compile { target c++11 } } */
+
+
+const static char16_t c0 = u''; /* { dg-error "empty character" } */
+const static char16_t c1 = u'ab'; /* { dg-warning "constant too long" } */
+const static char16_t c2 = u'\U00064321'; /* { dg-warning "constant too long" } */
+
+const static char16_t c3 = 'a';
+const static char16_t c4 = U'a';
+const static char16_t c5 = U'\u2029';
+const static char16_t c6 = U'\U00064321'; /* { dg-warning "implicitly truncated" } */
+const static char16_t c7 = L'a';
+const static char16_t c8 = L'\u2029';
+const static char16_t c9 = L'\U00064321'; /* { dg-warning "implicitly truncated" "" { target { 4byte_wchar_t } } 16 } */
+ /* { dg-warning "constant too long" "" { target { ! 4byte_wchar_t } } 16 } */
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-1.C
new file mode 100644
index 000000000..848d3a93b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-1.C
@@ -0,0 +1,42 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test the support for char32_t character constants. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char32_t c0 = U'a';
+const static char32_t c1 = U'\0';
+const static char32_t c2 = U'\u0024';
+const static char32_t c3 = U'\u2029';
+const static char32_t c4 = U'\U00064321';
+
+#define A 0x00000061
+#define D 0x00000024
+#define X 0x00002029
+#define Y 0x00064321
+
+int main ()
+{
+ if (sizeof (U'a') != sizeof (char32_t))
+ abort ();
+ if (sizeof (U'\0') != sizeof (char32_t))
+ abort ();
+ if (sizeof (U'\u0024') != sizeof (char32_t))
+ abort ();
+ if (sizeof (U'\u2029') != sizeof (char32_t))
+ abort ();
+ if (sizeof (U'\U00064321') != sizeof (char32_t))
+ abort ();
+
+ if (c0 != A)
+ abort ();
+ if (c1 != 0x0000)
+ abort ();
+ if (c2 != D)
+ abort ();
+ if (c3 != X)
+ abort ();
+ if (c4 != Y)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-2.C
new file mode 100644
index 000000000..843e9b43e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-2.C
@@ -0,0 +1,29 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test the support for char32_t* string constants. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char32_t *s0 = U"ab";
+const static char32_t *s1 = U"a\u0024";
+const static char32_t *s2 = U"a\u2029";
+const static char32_t *s3 = U"a\U00064321";
+
+#define A 0x00000061
+#define B 0x00000062
+#define D 0x00000024
+#define X 0x00002029
+#define Y 0x00064321
+
+int main ()
+{
+ if (s0[0] != A || s0[1] != B || s0[2] != 0x00000000)
+ abort ();
+ if (s1[0] != A || s1[1] != D || s0[2] != 0x00000000)
+ abort ();
+ if (s2[0] != A || s2[1] != X || s0[2] != 0x00000000)
+ abort ();
+ if (s3[0] != A || s3[1] != Y || s3[2] != 0x00000000)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-3.C
new file mode 100644
index 000000000..f5d1db0d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-3.C
@@ -0,0 +1,46 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Test concatenation of char32_t* string literals. */
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-Wall -Werror" } */
+
+extern "C" void abort (void);
+
+const static char32_t *s0 = U"a" U"b";
+
+const static char32_t *s1 = U"a" "b";
+const static char32_t *s2 = "a" U"b";
+const static char32_t *s3 = U"a" "\u2029";
+const static char32_t *s4 = "\u2029" U"b";
+const static char32_t *s5 = U"a" "\U00064321";
+const static char32_t *s6 = "\U00064321" U"b";
+
+#define A 0x00000061
+#define B 0x00000062
+#define X 0x00002029
+#define Y 0x00064321
+
+int main ()
+{
+ if (sizeof ((U"a" U"b")[0]) != sizeof (char32_t))
+ abort ();
+ if (sizeof ((U"a" "b")[0]) != sizeof (char32_t))
+ abort ();
+ if (sizeof (( "a" U"b")[0]) != sizeof (char32_t))
+ abort ();
+
+ if (s0[0] != A || s0[1] != B || s0[2] != 0x00000000)
+ abort ();
+
+ if (s1[0] != A || s1[1] != B || s1[2] != 0x00000000)
+ abort ();
+ if (s2[0] != A || s2[1] != B || s2[2] != 0x00000000)
+ abort ();
+ if (s3[0] != A || s3[1] != X || s3[2] != 0x00000000)
+ abort ();
+ if (s4[0] != X || s4[1] != B || s4[2] != 0x00000000)
+ abort ();
+ if (s5[0] != A || s5[1] != Y || s5[2] != 0x00000000)
+ abort ();
+ if (s6[0] != Y || s6[1] != B || s6[2] != 0x00000000)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-4.C
new file mode 100644
index 000000000..0b270304a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf32-4.C
@@ -0,0 +1,17 @@
+/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */
+/* Expected errors for char32_t character constants. */
+/* { dg-do compile { target c++11 } } */
+
+const static char32_t c0 = U''; /* { dg-error "empty character" } */
+const static char32_t c1 = U'ab'; /* { dg-warning "constant too long" } */
+const static char32_t c2 = U'\U00064321';
+
+const static char32_t c3 = 'a';
+const static char32_t c4 = u'a';
+const static char32_t c5 = u'\u2029';
+const static char32_t c6 = u'\U00064321'; /* { dg-warning "constant too long" } */
+const static char32_t c7 = L'a';
+const static char32_t c8 = L'\u2029';
+const static char32_t c9 = L'\U00064321'; /* { dg-warning "constant too long" "" { target { ! 4byte_wchar_t } } } */
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-1.C
new file mode 100644
index 000000000..a1a3518a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-1.C
@@ -0,0 +1,45 @@
+// { dg-do run { target c++11 } }
+// { dg-require-iconv "ISO-8859-2" }
+// { dg-options "-fexec-charset=ISO-8859-2" }
+
+const char *str1 = "h\u00e1\U0000010Dky ";
+const char *str2 = "\u010d\u00E1rky\n";
+const char *str3 = u8"h\u00e1\U0000010Dky ";
+const char *str4 = u8"\u010d\u00E1rky\n";
+const char *str5 = "h\u00e1\U0000010Dky " "\u010d\u00E1rky\n";
+const char *str6 = u8"h\u00e1\U0000010Dky " "\u010d\u00E1rky\n";
+const char *str7 = "h\u00e1\U0000010Dky " u8"\u010d\u00E1rky\n";
+#define u8
+const char *str8 = u8"h\u00e1\U0000010Dky " u8"\u010d\u00E1rky\n";
+
+const char latin2_1[] = "\x68\xe1\xe8\x6b\x79\x20";
+const char latin2_2[] = "\xe8\xe1\x72\x6b\x79\n";
+const char utf8_1[] = "\x68\xc3\xa1\xc4\x8d\x6b\x79\x20";
+const char utf8_2[] = "\xc4\x8d\xc3\xa1\x72\x6b\x79\n";
+
+int
+main (void)
+{
+ if (__builtin_strcmp (str1, latin2_1) != 0
+ || __builtin_strcmp (str2, latin2_2) != 0
+ || __builtin_strcmp (str3, utf8_1) != 0
+ || __builtin_strcmp (str4, utf8_2) != 0
+ || __builtin_strncmp (str5, latin2_1, sizeof (latin2_1) - 1) != 0
+ || __builtin_strcmp (str5 + sizeof (latin2_1) - 1, latin2_2) != 0
+ || __builtin_strncmp (str6, utf8_1, sizeof (utf8_1) - 1) != 0
+ || __builtin_strcmp (str6 + sizeof (utf8_1) - 1, utf8_2) != 0
+ || __builtin_strncmp (str7, utf8_1, sizeof (utf8_1) - 1) != 0
+ || __builtin_strcmp (str7 + sizeof (utf8_1) - 1, utf8_2) != 0
+ || __builtin_strncmp (str8, utf8_1, sizeof (utf8_1) - 1) != 0
+ || __builtin_strcmp (str8 + sizeof (utf8_1) - 1, utf8_2) != 0)
+ __builtin_abort ();
+ if (sizeof ("a" u8"b"[0]) != 1
+ || sizeof (u8"a" "b"[0]) != 1
+ || sizeof (u8"a" u8"b"[0]) != 1
+ || sizeof ("a" "\u010d") != 3
+ || sizeof ("a" u8"\u010d") != 4
+ || sizeof (u8"a" "\u010d") != 4
+ || sizeof (u8"a" "\u010d") != 4)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-2.C
new file mode 100644
index 000000000..bafe6e835
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/utf8-2.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+const char s0[] = u8"ab";
+const char16_t s1[] = u8"ab"; // { dg-error "from non-wide" }
+const char32_t s2[] = u8"ab"; // { dg-error "from non-wide" }
+const wchar_t s3[] = u8"ab"; // { dg-error "from non-wide" }
+
+const char t0[0] = u8"ab"; // { dg-error "chars is too long" }
+const char t1[1] = u8"ab"; // { dg-error "chars is too long" }
+const char t2[2] = u8"ab"; // { dg-error "chars is too long" }
+const char t3[3] = u8"ab";
+const char t4[4] = u8"ab";
+
+const char u0[0] = u8"\u2160."; // { dg-error "chars is too long" }
+const char u1[1] = u8"\u2160."; // { dg-error "chars is too long" }
+const char u2[2] = u8"\u2160."; // { dg-error "chars is too long" }
+const char u3[3] = u8"\u2160."; // { dg-error "chars is too long" }
+const char u4[4] = u8"\u2160."; // { dg-error "chars is too long" }
+const char u5[5] = u8"\u2160.";
+const char u6[6] = u8"\u2160.";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C
new file mode 100644
index 000000000..b81d0e58d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C
@@ -0,0 +1,145 @@
+// __builtin_va_arg_pack () builtin tests.
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <stdarg.h>
+
+extern "C" void abort (void);
+
+int v1 = 8;
+long int v2 = 3;
+void *v3 = (void *) &v2;
+struct A { char c[16]; } v4 = { "foo" };
+long double v5 = 40;
+char seen[20];
+int cnt;
+
+__attribute__ ((noinline)) int
+foo1 (int x, int y, ...)
+{
+ int i;
+ long int l;
+ void *v;
+ struct A a;
+ long double ld;
+ va_list ap;
+
+ va_start (ap, y);
+ if (x < 0 || x >= 20 || seen[x])
+ abort ();
+ seen[x] = ++cnt;
+ if (y != 6)
+ abort ();
+ i = va_arg (ap, int);
+ if (i != 5)
+ abort ();
+ switch (x)
+ {
+ case 0:
+ i = va_arg (ap, int);
+ if (i != 9 || v1 != 9)
+ abort ();
+ a = va_arg (ap, struct A);
+ if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0)
+ abort ();
+ v = (void *) va_arg (ap, struct A *);
+ if (v != (void *) &v4)
+ abort ();
+ l = va_arg (ap, long int);
+ if (l != 3 || v2 != 4)
+ abort ();
+ break;
+ case 1:
+ ld = va_arg (ap, long double);
+ if (ld != 41 || v5 != ld)
+ abort ();
+ i = va_arg (ap, int);
+ if (i != 8)
+ abort ();
+ v = va_arg (ap, void *);
+ if (v != &v2)
+ abort ();
+ break;
+ case 2:
+ break;
+ default:
+ abort ();
+ }
+ va_end (ap);
+ return x;
+}
+
+__attribute__ ((noinline)) int
+foo2 (int x, int y, ...)
+{
+ long long int ll;
+ void *v;
+ struct A a, b;
+ long double ld;
+ va_list ap;
+
+ va_start (ap, y);
+ if (x < 0 || x >= 20 || seen[x])
+ abort ();
+ seen[x] = ++cnt | 64;
+ if (y != 10)
+ abort ();
+ switch (x)
+ {
+ case 11:
+ break;
+ case 12:
+ ld = va_arg (ap, long double);
+ if (ld != 41 || v5 != 40)
+ abort ();
+ a = va_arg (ap, struct A);
+ if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0)
+ abort ();
+ b = va_arg (ap, struct A);
+ if (__builtin_memcmp (b.c, v4.c, sizeof (b.c)) != 0)
+ abort ();
+ v = va_arg (ap, void *);
+ if (v != &v2)
+ abort ();
+ ll = va_arg (ap, long long int);
+ if (ll != 16LL)
+ abort ();
+ break;
+ case 2:
+ break;
+ default:
+ abort ();
+ }
+ va_end (ap);
+ return x + 8;
+}
+
+__attribute__ ((noinline)) int
+foo3 (void)
+{
+ return 6;
+}
+
+extern inline __attribute__ ((always_inline, gnu_inline)) int
+bar (int x, ...)
+{
+ if (x < 10)
+ return foo1 (x, foo3 (), 5, __builtin_va_arg_pack ());
+ return foo2 (x, foo3 () + 4, __builtin_va_arg_pack ());
+}
+
+int
+main (void)
+{
+ if (bar (0, ++v1, v4, &v4, v2++) != 0)
+ abort ();
+ if (bar (1, ++v5, 8, v3) != 1)
+ abort ();
+ if (bar (2) != 2)
+ abort ();
+ if (bar (v1 + 2) != 19)
+ abort ();
+ if (bar (v1 + 3, v5--, v4, v4, v3, 16LL) != 20)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C
new file mode 100644
index 000000000..c5d3e2ac5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int bar (int, const char *, int, ...);
+int baz (int, const char *, long int);
+
+extern inline __attribute__((always_inline)) int
+f2 (int y, ...)
+{
+ return bar (y, "", __builtin_va_arg_pack ()); /* { dg-error "invalid use of" } */
+}
+
+extern inline __attribute__((always_inline)) int
+f3 (int y, ...)
+{
+ return bar (y, "", 5, __builtin_va_arg_pack ());
+}
+
+extern inline __attribute__((always_inline)) int
+f4 (int y, ...)
+{
+ return bar (y, "", 4, __builtin_va_arg_pack (), 6); /* { dg-error "invalid use of" } */
+}
+
+extern inline __attribute__((always_inline)) int
+f5 (int y, ...)
+{
+ return baz (y, "", __builtin_va_arg_pack ()); /* { dg-error "invalid use of" } */
+}
+
+extern inline __attribute__((always_inline)) int
+f6 (int y, ...)
+{
+ return __builtin_va_arg_pack (); /* { dg-error "invalid use of" } */
+}
+
+int
+test (void)
+{
+ int a = f2 (5, "a", 6);
+ a += f3 (6, "ab", 17LL);
+ a += f4 (7, 1, 2, 3);
+ a += f5 (8, 7L);
+ a += f6 (9);
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C
new file mode 100644
index 000000000..d3c84091b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C
@@ -0,0 +1,122 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <stdarg.h>
+
+extern "C" int error_open_missing_mode (void)
+ __attribute__((__error__ ("open with O_CREAT needs 3 arguments, only 2 were given")));
+extern "C" int warn_open_too_many_arguments (void)
+ __attribute__((__warning__ ("open called with more than 3 arguments")));
+extern "C" void abort (void);
+
+char expected_char;
+
+__attribute__((noinline)) int
+myopen2 (const char *path, int oflag)
+{
+ if (expected_char++ != path[0] || path[1] != '\0')
+ abort ();
+ switch (path[0])
+ {
+ case 'f':
+ if (oflag != 0x2)
+ abort ();
+ break;
+ case 'g':
+ if (oflag != 0x43)
+ abort ();
+ // In real __open_2 this would terminate the program:
+ // open with O_CREAT without third argument.
+ return -6;
+ default:
+ abort ();
+ }
+ return 0;
+}
+
+__attribute__((noinline)) int
+myopenva (const char *path, int oflag, ...)
+{
+ int mode = 0;
+ va_list ap;
+ if ((oflag & 0x40) != 0)
+ {
+ va_start (ap, oflag);
+ mode = va_arg (ap, int);
+ va_end (ap);
+ }
+ if (expected_char++ != path[0] || path[1] != '\0')
+ abort ();
+ switch (path[0])
+ {
+ case 'a':
+ if (oflag != 0x43 || mode != 0644)
+ abort ();
+ break;
+ case 'b':
+ if (oflag != 0x3)
+ abort ();
+ break;
+ case 'c':
+ if (oflag != 0x2)
+ abort ();
+ break;
+ case 'd':
+ if (oflag != 0x43 || mode != 0600)
+ abort ();
+ break;
+ case 'e':
+ if (oflag != 0x3)
+ abort ();
+ break;
+ default:
+ abort ();
+ }
+ return 0;
+}
+
+extern inline __attribute__((always_inline, gnu_inline)) int
+myopen (const char *path, int oflag, ...)
+{
+ if (__builtin_va_arg_pack_len () > 1)
+ warn_open_too_many_arguments ();
+
+ if (__builtin_constant_p (oflag))
+ {
+ if ((oflag & 0x40) != 0 && __builtin_va_arg_pack_len () < 1)
+ {
+ error_open_missing_mode ();
+ return myopen2 (path, oflag);
+ }
+ return myopenva (path, oflag, __builtin_va_arg_pack ());
+ }
+
+ if (__builtin_va_arg_pack_len () < 1)
+ return myopen2 (path, oflag);
+
+ return myopenva (path, oflag, __builtin_va_arg_pack ());
+}
+
+volatile int l0;
+
+int
+main (void)
+{
+ expected_char = 'a';
+ if (myopen ("a", 0x43, 0644))
+ abort ();
+ if (myopen ("b", 0x3, 0755))
+ abort ();
+ if (myopen ("c", 0x2))
+ abort ();
+ if (myopen ("d", l0 + 0x43, 0600))
+ abort ();
+ if (myopen ("e", l0 + 0x3, 0700))
+ abort ();
+ if (myopen ("f", l0 + 0x2))
+ abort ();
+ // Invalid use of myopen, but only detectable at runtime.
+ if (myopen ("g", l0 + 0x43) != -6)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C
new file mode 100644
index 000000000..0d369bdc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C
@@ -0,0 +1,42 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+#include <stdarg.h>
+
+extern int error_open_missing_mode (void)
+ __attribute__((__error__ ("open with O_CREAT needs 3 arguments, only 2 were given")));
+extern int warn_open_too_many_arguments (void)
+ __attribute__((__warning__ ("open called with more than 3 arguments")));
+
+extern int myopen2 (const char *path, int oflag);
+extern int myopenva (const char *path, int oflag, ...);
+
+extern inline __attribute__((always_inline, gnu_inline)) int
+myopen (const char *path, int oflag, ...)
+{
+ if (__builtin_va_arg_pack_len () > 1)
+ warn_open_too_many_arguments (); // { dg-warning "called with more than 3" }
+
+ if (__builtin_constant_p (oflag))
+ {
+ if ((oflag & 0x40) != 0 && __builtin_va_arg_pack_len () < 1)
+ {
+ error_open_missing_mode (); // { dg-error "needs 3 arguments, only 2 were given" }
+ return myopen2 (path, oflag);
+ }
+ return myopenva (path, oflag, __builtin_va_arg_pack ());
+ }
+
+ if (__builtin_va_arg_pack_len () < 1)
+ return myopen2 (path, oflag);
+
+ return myopenva (path, oflag, __builtin_va_arg_pack ());
+}
+
+int
+main (void)
+{
+ myopen ("h", 0x43);
+ myopen ("i", 0x43, 0644, 0655);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg1.C
new file mode 100644
index 000000000..5606128e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/va-arg1.C
@@ -0,0 +1,8 @@
+// PR c++/33462
+
+struct A {};
+
+void foo()
+{
+ ++__builtin_va_arg(0, A); // { dg-error "operand type is 'A'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector1.C
new file mode 100644
index 000000000..c6f0e0409
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector1.C
@@ -0,0 +1,5 @@
+// PR c++/11895
+// This used to ICE in reshape_init.
+// testcase from fnf@ninemoons.com
+
+ __attribute__((vector_size(16))) int a1 = { 100, 200, 300, 400 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector10.C
new file mode 100644
index 000000000..46ea244c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector10.C
@@ -0,0 +1,11 @@
+// PR c++/34914
+// { dg-do compile }
+
+struct A { int __attribute ((vector_size (8))) x; };
+
+void
+foo ()
+{
+ __attribute ((vector_size (8))) int A::*p;
+ p == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector11.C
new file mode 100644
index 000000000..a3213522b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector11.C
@@ -0,0 +1,6 @@
+// PR c++/34913
+
+template<typename T> struct A
+{
+ int x[sizeof(T)] __attribute((vector_size(8)));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector12.C
new file mode 100644
index 000000000..e0b6d2ba6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector12.C
@@ -0,0 +1,4 @@
+// PR c++/34917
+// { dg-do compile }
+
+const int i __attribute ((vector_size (8))) = {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector13.C
new file mode 100644
index 000000000..5160f1121
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector13.C
@@ -0,0 +1,6 @@
+// PR c++/35096
+// { dg-do compile }
+
+typedef const int X __attribute((vector_size(8)));
+extern const int x[] __attribute((vector_size(8)));
+X x[] = { 5 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector14.C
new file mode 100644
index 000000000..8e792108f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector14.C
@@ -0,0 +1,22 @@
+// PR c++/35758
+// { dg-do compile }
+// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// { dg-require-effective-target sse }
+// Ignore warning on some powerpc-linux configurations.
+// { dg-prune-output "non-standard ABI extension" }
+// { dg-prune-output "mangled name" }
+
+#define vector __attribute__((vector_size(16)))
+
+template<int N> vector signed int foo (vector float value) {}
+
+template<int> void foo (float) {}
+
+int
+main ()
+{
+ vector float v;
+ float f;
+ foo<1> (v);
+ foo<1> (f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector15.C
new file mode 100644
index 000000000..7058bf1b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector15.C
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+
+/* Check that we error out when using vector_size on the bool type. */
+
+__attribute__((vector_size(16) )) bool a; /* { dg-error "" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector16.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector16.C
new file mode 100644
index 000000000..7964a881f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector16.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+#define vector __attribute__((vector_size(4*sizeof(int)) ))
+
+vector int a, b, c;
+
+
+/* Test that remainder works for vectors. */
+void f(void)
+{
+ a = b % c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector17.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector17.C
new file mode 100644
index 000000000..eb389be01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector17.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+typedef double __attribute__((vector_size(1024) )) vec;
+
+template <class T>
+void f (T *p)
+{
+ p->~T();
+}
+void g (vec *p)
+{
+ f(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector18.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector18.C
new file mode 100644
index 000000000..402558ef9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector18.C
@@ -0,0 +1,13 @@
+/* { dg-do compile { target c++11 } } */
+
+typedef signed char __attribute__((vector_size(128) )) vec;
+
+template <class A, class B>
+auto f (A *a, B b) -> decltype (*a + b);
+
+void f (...) {}
+
+void g (vec *v, long long l)
+{
+ f (v, l);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector19.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector19.C
new file mode 100644
index 000000000..a41e8d517
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector19.C
@@ -0,0 +1,51 @@
+/* { dg-do compile { target c++11 } } */
+
+typedef double vec __attribute__((vector_size(2*sizeof(double))));
+typedef signed char vec2 __attribute__((vector_size(16)));
+typedef unsigned char vec2u __attribute__((vector_size(16)));
+
+void f (vec *x, vec *y, vec *z)
+{
+ *x = (*y < *z) ? *x : *y;
+}
+
+void g (vec *x, vec *y, vec *z)
+{
+ *x = (*y < *z) ? *x : 42;
+}
+
+void h (vec *x, vec *y, vec *z)
+{
+ *x = (*y < *z) ? 3. : *y;
+}
+
+void i1 (vec *x, vec *y, vec *z)
+{
+ auto c = *y < *z;
+ *x = c ? *x : *y;
+}
+
+void i2 (vec2 *x, vec2 *y, vec2u *z)
+{
+ *x = *y ? *x : *y;
+ *y = *z ? *x : *y;
+}
+
+void j (vec2 *x, vec2 *y, vec2 *z, vec *t)
+{
+ *x = (*y < *z) ? *x : 4.2; /* { dg-error "" } */
+ *y = (*x < *z) ? 2.5 : *y; /* { dg-error "" } */
+ *t = *t ? *t : *t; /* { dg-error "" } */
+ *z = (*x < *z) ? '1' : '0';
+}
+
+template <class A, class B>
+auto k (A *a, B b) -> decltype (*a ? *a : b);
+
+void k (...) {}
+
+void l (vec2 *v, double x)
+{
+ k (v, x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector2.C
new file mode 100644
index 000000000..c1737dbb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector2.C
@@ -0,0 +1,12 @@
+// PR c++/23337; caused an ICE in component_ref_field_offset
+// { dg-options "" }
+// { dg-options "-mmmx" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+// { dg-prune-output "mangled name" }
+typedef int vec __attribute__ ((vector_size (8)));
+extern int bar (vec);
+int
+foo (int i)
+{
+ vec a[] = { (vec) { 0, i }, (vec) { 4, 5 } };
+ return bar (a[0]) + bar (a[1]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector20.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector20.C
new file mode 100644
index 000000000..2199a22e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector20.C
@@ -0,0 +1,6 @@
+/* { dg-do compile { target c++11 } } */
+
+typedef long vec __attribute__((vector_size (2 * sizeof (long))));
+constexpr vec v = { 3, 4 };
+constexpr vec s = v + v;
+constexpr vec w = __builtin_shuffle (v, v);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector21.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector21.C
new file mode 100644
index 000000000..71634c327
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector21.C
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-gimple" } */
+
+typedef int vec __attribute__ ((vector_size (4 * sizeof (int))));
+
+void f1 (vec *x)
+{
+ *x = (*x >= 0) ? *x : -*x;
+}
+void f2 (vec *x)
+{
+ *x = (0 < *x) ? *x : -*x;
+}
+void g1 (vec *x)
+{
+ *x = (*x < 0) ? -*x : *x;
+}
+void g2 (vec *x)
+{
+ *x = (0 > *x) ? -*x : *x;
+}
+void h (vec *x, vec *y)
+{
+ *x = (*x < *y) ? *y : *x;
+}
+void i (vec *x, vec *y)
+{
+ *x = (*x < *y) ? *x : *y;
+}
+void j (vec *x, vec *y)
+{
+ *x = (*x < *y) ? *x : *x;
+}
+
+/* { dg-final { scan-tree-dump-times "ABS_EXPR" 4 "gimple" } } */
+/* { dg-final { scan-tree-dump "MIN_EXPR" "gimple" } } */
+/* { dg-final { scan-tree-dump "MAX_EXPR" "gimple" } } */
+/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector22.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector22.C
new file mode 100644
index 000000000..7c0279c68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector22.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-gimple" } */
+
+typedef unsigned vec __attribute__((vector_size(4*sizeof(int))));
+
+/* Disabled after PR57286
+void f(vec*a,vec*b){
+ *a=(*a)?-1:(*b<10);
+ *b=(*b)?(*a<10):0;
+}
+*/
+void g(vec*a,vec*b){
+ *a=(*a)?(*a<*a):-1;
+ *b=(*b)?-1:(*b<*b);
+}
+void h(vec*a){
+ *a=(~*a==5);
+}
+
+/* { dg-final { scan-tree-dump-not "~" "gimple" } } */
+/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector23.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector23.C
new file mode 100644
index 000000000..461d8a9e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector23.C
@@ -0,0 +1,28 @@
+/* { dg-do compile { target c++1y } } */
+/* { dg-options "-Wsign-conversion" } */
+// Ignore warning on some powerpc-linux configurations.
+// { dg-prune-output "non-standard ABI extension" }
+// Ignore warning on Linux/x86
+// { dg-prune-output "changes the ABI" }
+
+typedef double vecd __attribute__((vector_size(4*sizeof(double))));
+typedef float vecf __attribute__((vector_size(8*sizeof(float))));
+typedef long vecl __attribute__((vector_size(4*sizeof(long))));
+typedef short vecs __attribute__((vector_size(8*sizeof(short))));
+typedef char vecc __attribute__((vector_size(16*sizeof(char))));
+
+auto f(vecf*a,float d,long long i){
+ return (*a<0)?d:i; // { dg-error "truncation" }
+}
+auto g(vecc*a){
+ return (*a<0)?3LL:42UL; // { dg-error "inferred scalar type" }
+}
+auto h(vecd*a){
+ return (*a<0)?'a':'c'; // { dg-error "inferred scalar type \[^\\n\]*double" }
+}
+auto i(vecc*a){
+ return (*a<0)?1:0.; // { dg-error "inferred scalar type" }
+}
+auto j(vecl*a,long i,unsigned long k){
+ return (*a<0)?i:k; // { dg-warning "may change the sign" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector24.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector24.C
new file mode 100644
index 000000000..3eca7fb0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector24.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+typedef long vec __attribute__((vector_size(2*sizeof(long))));
+constexpr vec v = { 33, 42 };
+constexpr auto l0 = v[0];
+constexpr auto l1 = v[1];
+static_assert(l0==33,"Fail");
+static_assert(l1==42,"Fail");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector25.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector25.C
new file mode 100644
index 000000000..6c1f5d098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector25.C
@@ -0,0 +1,6 @@
+volatile int i __attribute__((vector_size(8)));
+
+void foo()
+{
+ i += i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector26.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector26.C
new file mode 100644
index 000000000..1d7a1e471
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector26.C
@@ -0,0 +1,9 @@
+// PR c++/59633
+// In C++98, the definition of bar is an error. In C++11, bar implicitly
+// gets internal linkage.
+// { dg-options "-mmmx" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+typedef enum { e } T __attribute__((vector_size(8)));
+static void foo(T t) {}
+void bar (T t) {} // { dg-error "no linkage" "" { target { ! c++11 } } }
+// { dg-final { scan-assembler-not "globl\[ \t]*_Z3bar" { target c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector27.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector27.C
new file mode 100644
index 000000000..288e13c55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector27.C
@@ -0,0 +1,7 @@
+// PR c++/58845
+
+void foo()
+{
+ int v __attribute__((vector_size(8)));
+ v = v || v; // { dg-bogus "" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector3.C
new file mode 100644
index 000000000..1a67cf76a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector3.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+// PR c++/28302
+
+int __attribute__((vector_size(8))) x;
+
+void foo()
+{
+ ~x;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector4.C
new file mode 100644
index 000000000..e14578489
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector4.C
@@ -0,0 +1,6 @@
+/* { dg-options "" } */
+/* { dg-do compile } */
+// Testing if we can do a new of a vector
+// PR C++/28450
+
+void* q = new int __attribute__((vector_size(8))) ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector5.C
new file mode 100644
index 000000000..68f711fe2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector5.C
@@ -0,0 +1,8 @@
+// PR c++/30022
+// { dg-do compile }
+
+void foo()
+{
+ int __attribute__((vector_size(8))) v;
+ v = 1/v;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector6.C
new file mode 100644
index 000000000..9caf8c2f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector6.C
@@ -0,0 +1,12 @@
+// { dg-options "" }
+// { dg-do compile }
+// C++/30016, we were allowing conversion between vector types
+// and union types which is invalid.
+
+typedef float __v_4F __attribute__ ((vector_size (16)));
+typedef union {__v_4F v; float a[4];} __v4F;
+void f(void)
+{
+ __v_4F b;
+ (reinterpret_cast<__v4F>(b).a)[1] = 1; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector7.C
new file mode 100644
index 000000000..cd259b1a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector7.C
@@ -0,0 +1,8 @@
+// { dg-options "" }
+// { dg-do compile }
+// PR C++/31721 and PR 14217
+// the attribute vector_size would change a reference type into a pointer type which was wrong.
+
+#define vector __attribute__((__vector_size__(16) ))
+vector int b;
+vector int &a = b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector8.C
new file mode 100644
index 000000000..5f9f9561d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector8.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Check for application of |, ^, and & on vector types. */
+#define vector __attribute__((vector_size(16) ))
+
+vector float a;
+vector int a1;
+vector float b;
+vector int b1;
+
+int f(void)
+{
+ a = a | b; /* { dg-error "" } */
+ a = a & b; /* { dg-error "" } */
+ a = a ^ b; /* { dg-error "" } */
+ a1 = a1 | b1;
+ a1 = a1 & b1;
+ a1 = a1 ^ b1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vector9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector9.C
new file mode 100644
index 000000000..52b3f1714
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vector9.C
@@ -0,0 +1,10 @@
+// PR c++/34891
+
+typedef float v4f __attribute__((vector_size(8)));
+typedef int v4i __attribute__((vector_size(8)));
+
+void foo()
+{
+ v4f v;
+ !(v4i)v; // { dg-error "v4i|argument" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon1.C
new file mode 100644
index 000000000..16647b228
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon1.C
@@ -0,0 +1,10 @@
+// PR c++/21581
+// Test for anonymous namespace internal linkage
+
+// { dg-do compile }
+// { dg-final { scan-assembler-not "globl.*_ZN.*1fEv" } }
+
+namespace
+{
+ int f() { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon10.C
new file mode 100644
index 000000000..8c79631b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon10.C
@@ -0,0 +1,44 @@
+// http://bugzilla.redhat.com/411871
+// { dg-do compile }
+
+extern "C" int printf (const char *, ...);
+
+struct E
+{
+ template <typename T> E (const volatile T&);
+ template <typename T> E (T&);
+ char x[64];
+};
+
+template<typename T> struct D
+{
+ static E foo (E, ...);
+ static int foo (T, int);
+};
+
+template<typename T, typename U> struct C
+{
+ static T ca;
+ static const int value = sizeof (D<U>::foo (ca, 0)) == sizeof (int);
+};
+
+struct A
+{
+ int a;
+};
+
+namespace
+{
+ struct B
+ {
+ int a;
+ };
+}
+
+int bar (void)
+{
+ C<A, int> a;
+ C<B, int> b;
+
+ return a.value + b.value;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon11.C
new file mode 100644
index 000000000..dfb4f12bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon11.C
@@ -0,0 +1,13 @@
+// PR c++/55877
+// { dg-final { scan-assembler-not "\\.local" } }
+
+typedef struct {
+ typedef enum { X, Y } A;
+ typedef struct { } B;
+ struct C { };
+} D;
+
+D d;
+D::A a;
+D::B b;
+D::C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon2.C
new file mode 100644
index 000000000..1d8e479b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon2.C
@@ -0,0 +1,11 @@
+// Test for propagation of anonymous namespace internal linkage
+
+// { dg-do compile }
+// { dg-final { scan-assembler-not "globl.*_Z1fv" } }
+
+namespace
+{
+ struct A { };
+}
+
+A f () { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon3.C
new file mode 100644
index 000000000..9def559d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon3.C
@@ -0,0 +1,16 @@
+// PR c++/31187
+// Bug: the repeated declaration was confusing the compiler into
+// thinking that foo1 had language internal linkage.
+
+class foo { };
+
+namespace
+{
+ extern foo foo1;
+ foo foo1;
+}
+
+template< foo * >
+class bar { };
+
+bar< &foo1 > bar1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon4.C
new file mode 100644
index 000000000..6d5d58ec3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon4.C
@@ -0,0 +1,16 @@
+// PR c++/31903
+// Test for anonymous namespace internal linkage, for typeinfo
+
+// { dg-do compile }
+// { dg-final { scan-assembler-not "globl.*_ZTIN*3fooE" } }
+
+#include <typeinfo>
+namespace
+{
+ class foo
+ {
+ virtual void bar();
+ };
+}
+
+const std::type_info &X = typeid(foo);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon5.C
new file mode 100644
index 000000000..d069eeab6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon5.C
@@ -0,0 +1,8 @@
+// PR c++/32596
+// { dg-do compile }
+
+namespace
+{
+ template<class T> inline void char_less(void) { }
+ template<> inline void char_less<char>(void) { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon6.C
new file mode 100644
index 000000000..c55432add
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon6.C
@@ -0,0 +1,30 @@
+// PR c++/33094
+// { dg-final { scan-assembler "1BIiE1cE" } }
+// { dg-final { scan-assembler-not "globl.*1BIiE1cE" } }
+// { dg-final { scan-assembler-not "comdat" } }
+// { dg-final { scan-assembler-not "weak" } }
+// { dg-final { scan-assembler-not "1AIiE1cE" } }
+
+// Test that B<int>::c is emitted as an internal symbol, and A<int>::c is
+// not emitted.
+
+namespace
+{
+ template <typename T>
+ class A
+ {
+ virtual T f1() { return c; }
+ static const T c = 0;
+ };
+
+ template <typename T>
+ class B
+ {
+ __attribute__ ((__used__)) static const T c = 0;
+ };
+
+ template <typename T> const T B<T>::c;
+
+ template class A<int>;
+ template class B<int>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon7.C
new file mode 100644
index 000000000..0c42ea866
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon7.C
@@ -0,0 +1,23 @@
+// PR c++/34094
+// { dg-do compile }
+
+namespace
+{
+ struct A {
+ static int bar ();
+ static int i; // { dg-error "used, but not defined" "" { xfail *-*-* } }
+ static int j;
+ static int k;
+ static int l;
+ static const int m = 16;
+ static const int n = 17;
+ };
+ int A::j = 4;
+ int A::k;
+ const int A::m;
+}
+
+int foo (void)
+{
+ return A::i + A::j + A::k + A::m + A::n + A::bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon8.C
new file mode 100644
index 000000000..b8507497d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon8.C
@@ -0,0 +1,33 @@
+// PR c++/34213
+// { dg-do compile }
+
+template <void (*fn) ()>
+void call () // { dg-message "note" }
+{
+ fn ();
+}
+
+namespace
+{
+ struct B1
+ {
+ static void fn1 () {}
+ static void fn4 ();
+ };
+ void fn3 () {}
+ void B1::fn4 () {}
+ static void fn5 () {}
+}
+
+int main ()
+{
+ struct B2
+ {
+ static void fn2 () {}
+ };
+ call<&B1::fn1> ();
+ call<&B2::fn2> (); // { dg-error "linkage|no matching" }
+ call<&fn3> ();
+ call<&B1::fn4> ();
+ call<&fn5> (); // { dg-error "linkage|no matching" "" { target { ! c++11 } } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon9.C
new file mode 100644
index 000000000..bb752253b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/anon9.C
@@ -0,0 +1,11 @@
+// PR c++/34238
+// { dg-do compile }
+
+namespace
+{
+ template <typename T = int> struct A
+ {
+ static const bool a = true;
+ };
+}
+struct A<> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm1.C
new file mode 100644
index 000000000..2c2e3d066
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm1.C
@@ -0,0 +1,30 @@
+// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } }
+// { dg-require-dll "" }
+// { dg-options "-fvisibility=hidden" }
+// Most class data should be exported.
+// { dg-final { scan-not-hidden "_ZTV1S" } }
+// { dg-final { scan-not-hidden "_ZTI1S" } }
+// { dg-final { scan-not-hidden "_ZTS1S" } }
+// { dg-final { scan-not-hidden "_ZTV1U" } }
+// { dg-final { scan-not-hidden "_ZTT1U" } }
+// { dg-final { scan-not-hidden "_ZTI1U" } }
+// { dg-final { scan-not-hidden "_ZTS1U" } }
+// The construction vtable should be hidden.
+// { dg-final { scan-hidden "_ZTC1U0_1T" } }
+
+struct S {
+ virtual void f();
+};
+
+void S::f() {
+}
+
+struct T : public virtual S {
+ virtual void g();
+};
+
+struct U : public virtual T {
+ virtual void h();
+};
+
+void U::h() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm2.C
new file mode 100644
index 000000000..7eed18d7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target arm*-*-*eabi* arm*-*-symbianelf* } }
+// Class data should be exported.
+// { dg-final { scan-not-hidden "_ZTV1S" } }
+// { dg-final { scan-not-hidden "_ZTI1S" } }
+// { dg-final { scan-not-hidden "_ZTS1S" } }
+
+struct S {
+ virtual void f();
+};
+
+void S::f() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm3.C
new file mode 100644
index 000000000..9be7082ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/arm3.C
@@ -0,0 +1,36 @@
+// { dg-do compile { target arm*-*-*eabi* } }
+// { dg-require-dll "" }
+// { dg-options "-fvisibility=hidden" }
+
+/* From ARM C++ ABI \S 3.2.5.5:
+
+ A class should be exported unless explicitly tagged otherwise.
+
+ This admonition applies even on DLL-based systems where hidden
+ visibility is the default. We want -fvisibility=hidden to behave
+ identically to the situation where hidden visibility is the
+ hard-wired default. So, both A and B are exported classes.
+
+ Furthermore:
+
+ If CAG symbol Y names one of the impedimenta associated with an
+ exported class X:
+
+ ...
+
+ * Otherwise, if X has no key function:
+
+ - Y is exported from ... each DLL that refers to X and uses Y.
+
+ So, the type-info and virtual-table symbols associated with A and B
+ must be exported. */
+
+// { dg-final { scan-not-hidden "_ZTI1A" } }
+// { dg-final { scan-not-hidden "_ZTS1A" } }
+// { dg-final { scan-not-hidden "_ZTV1B" } }
+// { dg-final { scan-not-hidden "_ZTI1B" } }
+// { dg-final { scan-not-hidden "_ZTS1B" } }
+
+struct A {};
+struct B : virtual public A {};
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/assign1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/assign1.C
new file mode 100644
index 000000000..b25999e8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/assign1.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "_ZN1DaSERKS_" } } */
+
+struct B {
+ B& operator=(const B&);
+};
+
+struct __attribute__((visibility("hidden"))) D : public B {
+ // The implicit assignment operator should be hidden.
+};
+
+__attribute__((visibility("hidden"))) D d1;
+__attribute__((visibility("hidden"))) D d2;
+
+void f() {
+ d1 = d2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/class1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/class1.C
new file mode 100644
index 000000000..792fc7891
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/class1.C
@@ -0,0 +1,22 @@
+// PR c++/26905
+// Init should not be hidden, so calling it should use the PLT.
+
+// { dg-options "-fpic" }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-skip-if "" { *-*-darwin* } { "*" } { "" } }
+// { dg-require-visibility "" }
+// { dg-require-effective-target fpic }
+// { dg-final { scan-assembler "InitEv@PLT" } }
+
+#pragma GCC visibility push(hidden)
+struct __attribute__ ((visibility ("default"))) nsINIParser
+{
+ static void Init();
+};
+
+__attribute__ ((visibility ("default")))
+void
+CheckCompatibility(void)
+{
+ nsINIParser::Init();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C
new file mode 100644
index 000000000..ed38ebefe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C
@@ -0,0 +1,19 @@
+/* Test that -fvisibility-inlines-hidden doesn't affect static variables. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-not-hidden "_ZZN3foo7my_funcEvE1x" } } */
+
+struct foo
+{
+ int my_func() {
+ static int x;
+ return x++;
+ }
+};
+
+int t()
+{
+ foo f;
+ return f.my_func();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C
new file mode 100644
index 000000000..50885a798
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-not-hidden "_ZN1IIiE3fooEv" } } */
+/* { dg-final { scan-not-hidden "_ZN1OIiE3fooEv" } } */
+/* { dg-final { scan-hidden "_ZN1S3fooEv" } } */
+
+template <class T>
+struct O {
+ static inline void foo() { }
+};
+
+template void O<int>::foo();
+
+template <class T>
+struct I {
+ static inline void foo() { }
+};
+
+extern template void I<int>::foo();
+
+struct S {
+ static inline void foo() { }
+};
+
+void bar() {
+ I<int>::foo();
+ O<int>::foo();
+ S::foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-4.C
new file mode 100644
index 000000000..ebce2ba5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-4.C
@@ -0,0 +1,37 @@
+/* PR c++/30066: Test that -fvisibility-inlines-hidden affects functions. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-hidden "_Z3barv" } } */
+/* { dg-final { scan-not-hidden "_ZZ3barvE1n" } } */
+/* { dg-final { scan-not-hidden "_Z3fooIiEvv" } } */
+/* { dg-final { scan-hidden "_Z3fooIvEvv" } } */
+/* { dg-final { scan-hidden "_ZZN1A5innerEvE1n" } } */
+
+inline int * bar()
+{
+ static int n;
+ return &n;
+}
+
+template <class T>
+inline void foo() { }
+
+template void foo<int>();
+
+namespace A __attribute__ ((visibility ("hidden")))
+{
+ inline int * inner()
+ {
+ static int n;
+ return &n;
+ }
+}
+
+int main(void)
+{
+ bar();
+ foo<void>();
+ A::inner();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C
new file mode 100644
index 000000000..2ee8f0767
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C
@@ -0,0 +1,18 @@
+/* Test that -fvisibility-inlines-hidden affects class members. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-inlines-hidden" } */
+/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */
+
+class Foo
+{
+public:
+ void method() { }
+};
+
+int main(void)
+{
+ Foo f;
+ f.method();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C
new file mode 100644
index 000000000..685cd1309
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C
@@ -0,0 +1,12 @@
+/* Test that -fvisibility does not override class member specific settings. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-not-hidden "methodEv" } } */
+
+class __attribute__ ((visibility ("default"))) Foo
+{
+ void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C
new file mode 100644
index 000000000..4b4b54d5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C
@@ -0,0 +1,12 @@
+/* Test that -fvisibility does not override class member specific settings. */
+/* { dg-do compile } */
+/* { dg-require-visibility "internal" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-not-hidden "Foo.methodEv" } } */
+
+class Foo
+{
+ __attribute__ ((visibility ("internal"))) void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C
new file mode 100644
index 000000000..4358d25a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C
@@ -0,0 +1,12 @@
+/* Test that -fvisibility affects class members. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */
+
+class Foo
+{
+ void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/guard1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/guard1.C
new file mode 100644
index 000000000..5290e2f8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/guard1.C
@@ -0,0 +1,29 @@
+// { dg-options "-fvisibility=hidden" }
+// { dg-require-visibility "" }
+// { dg-final { scan-not-hidden "_ZGVZN5otherclEvE4s_cd" } }
+
+extern "C" int printf (const char *, ...);
+
+#define DLLEXPORT __attribute__ ((visibility("default")))
+
+struct class_data
+{
+ int apple;
+ class_data() { printf("non trivial ctor\n"); }
+};
+
+struct DLLEXPORT other
+{
+ class_data* operator ()()
+ {
+ static class_data s_cd;
+ return &s_cd;
+ }
+};
+
+int main()
+{
+ other aFoo;
+ aFoo();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/local1.C
new file mode 100644
index 000000000..7a04db601
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/local1.C
@@ -0,0 +1,25 @@
+// PR c++/19238
+// Test that hidden visibility on an inline function is inherited by static
+// local variables and local classes.
+
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_Z1fv" } }
+// { dg-final { scan-hidden "_ZZ1fvE1i" } }
+// { dg-final { scan-hidden "_ZZ1fvEN1A1fEv" } }
+
+__attribute ((visibility ("hidden"))) inline int
+f()
+{
+ static int i = 2;
+ struct A
+ {
+ void f () { }
+ } a;
+ a.f();
+ return i;
+}
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C
new file mode 100644
index 000000000..45eb641b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C
@@ -0,0 +1,11 @@
+/* Test that setting visibility for class member functions works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */
+
+class __attribute__ ((visibility ("hidden"))) Foo
+{
+ void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C
new file mode 100644
index 000000000..bce2aac55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C
@@ -0,0 +1,28 @@
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility-ms-compat" } */
+
+/* { dg-final { scan-not-hidden "_ZTI1S" } } */
+/* { dg-final { scan-hidden "_ZTI1T" } } */
+/* { dg-final { scan-not-hidden "_ZTI1U" } } */
+/* { dg-final { scan-not-hidden "_ZN1U6hide_4Ev" } } */
+
+class S {
+ virtual void hide_2();
+} hide_1;
+
+void S::hide_2() {
+}
+
+class __attribute__((visibility("hidden"))) T {
+ virtual void hide_4();
+} hide_3;
+
+void T::hide_4() {
+}
+
+class __attribute__((visibility("default"))) U {
+ virtual void hide_4();
+};
+
+void U::hide_4() {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace1.C
new file mode 100644
index 000000000..b7773dc9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace1.C
@@ -0,0 +1,30 @@
+// PR c++/21764
+// Test for namespace visibility attribute semantics.
+
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_ZN3foo1fEv" } }
+// { dg-final { scan-hidden "_ZN3foo1gEv" } }
+// { dg-final { scan-hidden "_ZN3foo1A1mEv" } }
+// { dg-final { scan-hidden "_ZN3foo1tIiEEvv" } }
+// { dg-final { scan-not-hidden "_ZN3foo1hEv" } }
+
+namespace foo __attribute ((visibility ("hidden")))
+{
+ int f() { }
+ void g();
+ template <typename T> void t() { }
+ class A
+ {
+ void m ();
+ };
+}
+
+namespace foo
+{
+ void h() {}
+}
+
+void foo::g() { t<int> (); }
+
+void foo::A::m() { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace2.C
new file mode 100644
index 000000000..96c5b0953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace2.C
@@ -0,0 +1,20 @@
+// PR c++/32470
+
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-hidden "_ZN4Test4testEv" } }
+
+namespace std __attribute__((__visibility__("default"))) {
+ template<typename _CharT>
+ class basic_streambuf
+ {
+ friend void getline();
+ };
+ extern template class basic_streambuf<char>;
+}
+
+class Test
+{
+ void test();
+};
+void Test::test() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace3.C
new file mode 100644
index 000000000..a07abdcd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/namespace3.C
@@ -0,0 +1,6 @@
+// PR c++/41774
+// { dg-do compile }
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+#pragma GCC visibility pop // { dg-warning "no matching push for" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/new1.C
new file mode 100644
index 000000000..ec201cbc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/new1.C
@@ -0,0 +1,13 @@
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-not-hidden "_Znwj" } }
+
+void f() {
+ new int;
+}
+
+void *g();
+
+void *operator new(__SIZE_TYPE__) {
+ return g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/noPLT.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/noPLT.C
new file mode 100644
index 000000000..38af05fd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/noPLT.C
@@ -0,0 +1,20 @@
+/* Test that -fvisibility=hidden prevents PLT. */
+/* { dg-do compile { target fpic } } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fPIC -fvisibility=hidden" } */
+/* { dg-final { scan-assembler-not "methodEv@PLT|indirect_symbol.*methodEv" } } */
+
+class Foo
+{
+public:
+ void method();
+};
+
+void Foo::method() { }
+
+int main(void)
+{
+ Foo f;
+ f.method();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/overload-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/overload-1.C
new file mode 100644
index 000000000..d841c53fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/overload-1.C
@@ -0,0 +1,9 @@
+/* Test that visibility of function parameters propagates to an undecorated
+ function. */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "_Z3fooP8a_struct" } } */
+
+struct __attribute__((visibility("hidden"))) a_struct;
+
+void foo(a_struct * p)
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
new file mode 100644
index 000000000..c13161d3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
@@ -0,0 +1,14 @@
+/* Test that #pragma GCC visibility does not override class member specific settings. */
+/* { dg-do compile } */
+/* { dg-require-visibility "internal" } */
+/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* } } } } } */
+/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */
+
+#pragma GCC visibility push(hidden)
+class __attribute__ ((visibility ("internal"))) Foo
+{
+ void method();
+};
+#pragma GCC visibility pop
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
new file mode 100644
index 000000000..25e9ceac0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
@@ -0,0 +1,14 @@
+/* Test that #pragma GCC visibility does not override class member specific settings. */
+/* { dg-do compile } */
+/* { dg-require-visibility "internal" } */
+/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* } } } } } */
+/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */
+
+#pragma GCC visibility push(hidden)
+class Foo
+{
+ __attribute__ ((visibility ("internal"))) void method();
+};
+#pragma GCC visibility pop
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma.C
new file mode 100644
index 000000000..98384c9c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/pragma.C
@@ -0,0 +1,13 @@
+/* Test that #pragma GCC visibility affects class members. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */
+
+#pragma GCC visibility push(hidden)
+class Foo
+{
+ void method();
+};
+#pragma GCC visibility pop
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/prop1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/prop1.C
new file mode 100644
index 000000000..f4574820d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/prop1.C
@@ -0,0 +1,23 @@
+// Test for propagation of visibility through template arguments
+
+// { dg-do compile }
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_Z1fIN1N1AEEvT_" } }
+// { dg-final { scan-hidden "_Z1hIXadL_ZN1N1iEEEEvv" } }
+
+namespace N __attribute ((__visibility__ ("hidden")))
+{
+ struct A { };
+ int i;
+}
+
+template <class T> void f (T) { }
+template <int *I> void h() { }
+
+void g()
+{
+ N::A a;
+ f(a);
+ h<&N::i>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/redecl1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/redecl1.C
new file mode 100644
index 000000000..b53335ef5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/redecl1.C
@@ -0,0 +1,7 @@
+// Test that we complain about redeclaration with different visibility
+
+struct __attribute((visibility("hidden"))) B;
+struct __attribute((visibility("default"))) B; // { dg-error "visibility" }
+
+__attribute ((visibility ("hidden"))) void f(); // { dg-warning "previous" }
+__attribute ((visibility ("default"))) void f(); // { dg-warning "visibility" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C
new file mode 100644
index 000000000..4ec9479a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C
@@ -0,0 +1,20 @@
+// PR c++/18925
+// { dg-do compile { target ia64-*-linux* } }
+// { dg-options "-fPIC -fvisibility=hidden" }
+// { dg-final { scan-assembler-not "gprel" } }
+
+class __attribute__ ((visibility("default"))) Type
+{
+ private:
+ static long _staticTypeCount;
+ public:
+ Type() { _staticTypeCount++; }
+ ~Type();
+};
+
+long Type::_staticTypeCount = 0;
+
+Type::~Type()
+{
+ _staticTypeCount--;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C
new file mode 100644
index 000000000..e745caa5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C
@@ -0,0 +1,11 @@
+/* Test that setting visibility for static class member functions works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */
+
+class __attribute__ ((visibility ("hidden"))) Foo
+{
+ static void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian1.C
new file mode 100644
index 000000000..864ab2bb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian1.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target arm*-*-symbianelf* } }
+// Class data should not be exported.
+// { dg-final { scan-hidden "_ZTV2K3" } }
+// But the constructor and destructor should be exported.
+// { dg-final { scan-not-hidden "_ZN2K3C2Ev" } }
+// { dg-final { scan-not-hidden "_ZN2K3D0Ev" } }
+
+class __declspec(notshared) K3 {
+public:
+ __declspec(dllimport) K3();
+ __declspec(dllimport) virtual ~K3();
+ virtual int m1();
+};
+
+__declspec(dllexport)
+ K3::K3(){}
+
+__declspec(dllexport)
+ K3::~K3(){}
+
+int K3::m1() { return 1; }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian2.C
new file mode 100644
index 000000000..767f0b54e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/symbian2.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target arm*-*-symbianelf* } }
+// Class data should not be exported.
+// { dg-final { scan-hidden "_ZTI1A" } }
+// { dg-final { scan-hidden "_ZTS1A" } }
+// { dg-final { scan-hidden "_ZTV1B" } }
+// { dg-final { scan-hidden "_ZTI1B" } }
+// { dg-final { scan-hidden "_ZTS1B" } }
+
+struct A {};
+struct B : virtual public A {};
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template1.C
new file mode 100644
index 000000000..c5cee0d4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template1.C
@@ -0,0 +1,35 @@
+// PR c++/19134
+// -fvisibility-inlines-hidden doesn't apply to non-inline specializations
+
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility-inlines-hidden" }
+// { dg-final { scan-not-hidden "_ZN1AIiE3fooEv" } }
+// { dg-final { scan-not-hidden "_ZN1AIiE3barEv" } }
+// { dg-final { scan-hidden "_ZN1AIlE3fooEv" } }
+// { dg-final { scan-hidden "_ZN1AIlE3barEv" } }
+// { dg-final { scan-hidden "_ZN1AIcE3barEv" } }
+
+template<class T>
+struct A {
+ void foo() {};
+ __attribute ((visibility ("hidden"))) void bar();
+};
+
+// This has default visibility.
+template<> void A<int>::foo() {}
+
+// This has hidden visibility because of -fvisibility-inlines-hidden.
+template<> inline void A<long>::foo() {}
+// Force the inline out.
+void f () { A<long> a; a.foo(); }
+
+// This has default visibility.
+template<> __attribute ((visibility ("default"))) void A<int>::bar() {}
+
+// This inherits hidden visibility from its template.
+template<> void A<long>::bar() { }
+
+// This also has hidden visibility; #pragma vis doesn't affect class members.
+#pragma GCC visibility push(default)
+template<> void A<char>::bar() { }
+#pragma GCC visibility pop
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template10.C
new file mode 100644
index 000000000..492623334
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template10.C
@@ -0,0 +1,16 @@
+// PR c++/51930
+// { dg-require-visibility "" }
+// { dg-options -fvisibility=hidden }
+// { dg-final { scan-not-hidden "_Z8testfuncI3fooEvv" } }
+
+struct foo { };
+
+template<typename T>
+__attribute__ ((visibility("default")))
+void testfunc();
+
+template<typename T> void testfunc() { }
+
+template
+__attribute__ ((visibility("default")))
+void testfunc<foo>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template11.C
new file mode 100644
index 000000000..fb47fe2af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template11.C
@@ -0,0 +1,20 @@
+// PR c++/51930
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-not-hidden "_ZN13template_testI4testE8functionEv" } }
+
+struct test { };
+
+template<typename T>
+struct template_test
+{
+ __attribute__((visibility("default")))
+ void function();
+};
+
+template<typename T>
+void template_test<T>::function() { }
+
+template
+struct __attribute__((visibility("default")))
+template_test<test>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template12.C
new file mode 100644
index 000000000..b9219d528
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template12.C
@@ -0,0 +1,13 @@
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-not-hidden "_ZN1aI1bE1cE" } }
+
+template <class T> class __attribute__((visibility("default"))) a
+{
+public:
+ /* A */ static int c;
+};
+
+class __attribute__((visibility("default"))) b : a <b> {};
+
+template<> /* B */ int a<b>::c = 0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template2.C
new file mode 100644
index 000000000..8db96db56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template2.C
@@ -0,0 +1,35 @@
+// PR c++/27000
+// Implicitly instantiated templates should not be affected by
+// #pragma visibility.
+
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-not-hidden "_ZN1SIiED1Ev" } } */
+/* { dg-final { scan-not-hidden "_ZN1SIiEC1ERKi" } } */
+
+template <class T>
+struct S
+{
+ S (const T &);
+ ~S ();
+ T t;
+};
+
+template <class T>
+S<T>::S (const T &x)
+{
+ t = x;
+}
+
+template <class T>
+S<T>::~S ()
+{
+}
+
+#pragma GCC visibility push(hidden)
+struct U
+{
+ S<int> s;
+ U () : s (6) { }
+} u;
+#pragma GCC visibility pop
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template3.C
new file mode 100644
index 000000000..69cb6caba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template3.C
@@ -0,0 +1,22 @@
+// PR c++/17470
+// Test that we can give visibility to explicit template instantiations
+
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_ZN1AIlE1fEl" } }
+// { dg-final { scan-hidden "_ZN1AIiE1fEi" } }
+// { dg-final { scan-not-hidden "_ZN1AIcE1fEc" } }
+// { dg-final { scan-hidden "_Z8identityIdET_S0_" } }
+// { dg-final { scan-not-hidden "_Z8identityIiET_S0_" } }
+
+template <class T> T identity(T t) { return t; }
+template __attribute__((visibility("hidden"))) double identity(double);
+template int identity(int);
+
+
+template <class T> struct A { void f (T); };
+template <class T> void A<T>::f (T) { }
+template struct __attribute ((visibility ("hidden"))) A<int>;
+template<> struct __attribute ((visibility ("hidden"))) A<long> { void f(long); };
+// inherits hidden visibility from its class
+void A<long>::f (long) { }
+template struct A<char>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template4.C
new file mode 100644
index 000000000..add63a593
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template4.C
@@ -0,0 +1,39 @@
+// Test for explicit visibility on template vs. #pragma vis at explicit
+// instantiation/specialization point for plain function templates.
+
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_Z3fooIdEvT_" } }
+// { dg-final { scan-hidden "_Z3fooIlEvT_" } }
+// { dg-final { scan-hidden "_Z3fooIcEvT_" } }
+// { dg-final { scan-hidden "_Z3fooIiEvT_" } }
+// { dg-final { scan-not-hidden "_Z3fooIfEvT_" } }
+// { dg-final { scan-not-hidden "_Z3fooIsEvT_" } }
+
+// { dg-final { scan-hidden "_Z3barIdEvT_" } }
+// { dg-final { scan-hidden "_Z3barIlEvT_" } }
+// { dg-final { scan-hidden "_Z3barIiEvT_" } }
+// { dg-final { scan-hidden "_Z3barIcEvT_" } }
+// { dg-final { scan-not-hidden "_Z3barIfEvT_" } }
+// { dg-final { scan-not-hidden "_Z3barIsEvT_" } }
+
+#pragma GCC visibility push(hidden)
+template <class T> void bar(T) { }
+#pragma GCC visibility pop
+template void bar (long);
+template<> void bar (double) { }
+template __attribute ((visibility ("default"))) void bar (short);
+template<> __attribute ((visibility ("default"))) void bar (float) { }
+#pragma GCC visibility push(default)
+template<> void bar(char) { }
+template void bar(int);
+#pragma GCC visibility pop
+
+template <class T> __attribute ((visibility ("hidden"))) void foo(T) { }
+template void foo (long);
+template<> void foo (double) { }
+template __attribute ((visibility ("default"))) void foo (short);
+template<> __attribute ((visibility ("default"))) void foo (float) { }
+#pragma GCC visibility push(default)
+template<> void foo(char) { }
+template void foo(int);
+#pragma GCC visibility pop
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template6.C
new file mode 100644
index 000000000..7892a46e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template6.C
@@ -0,0 +1,17 @@
+// Test for explicit visibility taking precedence
+
+// { dg-require-visibility "" }
+// { dg-final { scan-not-hidden "_ZN1AIiE1fEv" } }
+
+template <class T> struct A
+{
+ // This attribute takes precedence over...
+ __attribute ((visibility ("default"))) void f ();
+};
+
+template <class T>
+void A<T>::f ()
+{ }
+
+// ...this attribute.
+template struct __attribute ((visibility ("hidden"))) A<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template7.C
new file mode 100644
index 000000000..5197fb1c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template7.C
@@ -0,0 +1,29 @@
+// PR c++/35688
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+
+// { dg-final { scan-hidden "_ZN1s6vectorI1AEC1Ev" } }
+// { dg-final { scan-hidden "_ZN1s3fooI1AEEvT_" } }
+
+namespace s __attribute__((visibility("default"))) {
+ template <class T>
+ class vector {
+ public:
+ vector() { }
+ };
+ template <class T>
+ void foo(T t) {
+ }
+}
+
+class A {
+public:
+ A() { }
+};
+
+s::vector<A> v;
+
+int main() {
+ A a;
+ s::foo(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template8.C
new file mode 100644
index 000000000..e491882e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template8.C
@@ -0,0 +1,26 @@
+// PR c++/35688
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+
+// { dg-final { scan-hidden "_Z1gI1BEvT_" } }
+// { dg-final { scan-hidden "_Z1gI1AI1BEEvT_" } }
+
+// Test that template argument visibility takes priority even over an
+// explicit visibility attribute on a template.
+
+template <class T>
+struct __attribute ((visibility ("default"))) A { };
+template <class T>
+void g(T) __attribute ((visibility ("default")));
+
+struct B { };
+
+template <class T>
+void g(T)
+{ }
+
+int main()
+{
+ g(B());
+ g(A<B>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template9.C
new file mode 100644
index 000000000..5a1b7396e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/template9.C
@@ -0,0 +1,15 @@
+// PR c++/51813
+// { dg-require-visibility "" }
+// { dg-options -fvisibility=hidden }
+// { dg-final { scan-not-hidden "_ZN1N1fI1AEEvT" } }
+
+struct A { };
+namespace N __attribute((visibility("default"))) {
+ template <class T> void f(T) { }
+ extern template void f(A);
+}
+
+int main()
+{
+ N::f(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C
new file mode 100644
index 000000000..99dfc1cd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C
@@ -0,0 +1,19 @@
+// PR c++/26984
+// lazily generated typeinfos should not be affected by #pragma vis, but
+// they should be affected by the visibility of the type they describe.
+
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility-inlines-hidden" }
+// { dg-final { scan-not-hidden "_ZTIPPi" } }
+// { dg-final { scan-not-hidden "_ZTSPPi" } }
+// { dg-final { scan-hidden "_ZTIP1A" } }
+// { dg-final { scan-hidden "_ZTSP1A" } }
+
+#include <typeinfo>
+
+#pragma GCC visibility push(hidden)
+const std::type_info* t = &(typeid(int **));
+struct A { };
+#pragma GCC visibility pop
+
+const std::type_info* t2 = &(typeid(A *));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C
new file mode 100644
index 000000000..54f541d85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C
@@ -0,0 +1,23 @@
+// PR c++/35368
+// { dg-require-visibility "" }
+
+#pragma GCC visibility push (hidden)
+
+struct A
+{
+ A();
+ virtual ~A() { }
+};
+
+A::A()
+{
+}
+
+void foo(A *a)
+{
+ delete a;
+}
+
+// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__class_type_infoE" } }
+// { dg-final { scan-hidden "_ZTI1A" } }
+// { dg-final { scan-hidden "_ZTV1A" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C
new file mode 100644
index 000000000..5102b6492
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C
@@ -0,0 +1,24 @@
+// PR c++/35368
+// { dg-require-visibility "" }
+
+#pragma GCC visibility push (hidden)
+
+#include <typeinfo>
+
+const std::type_info& info1 = typeid(int []);
+const std::type_info& info2 = typeid(int);
+enum E { e = 0 };
+const std::type_info& info3 = typeid(E);
+struct S { S (); };
+const std::type_info& info4 = typeid(S);
+const std::type_info& info5 = typeid(int *);
+
+// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__array_type_infoE" } }
+// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv116__enum_type_infoE" } }
+// { dg-final { scan-hidden "_ZTI1S" } }
+// { dg-final { scan-hidden "_ZTS1S" } }
+// { dg-final { scan-hidden "info1" } }
+// { dg-final { scan-hidden "info2" } }
+// { dg-final { scan-hidden "info3" } }
+// { dg-final { scan-hidden "info4" } }
+// { dg-final { scan-hidden "info5" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/virtual.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/virtual.C
new file mode 100644
index 000000000..770600368
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/virtual.C
@@ -0,0 +1,17 @@
+/* Test that setting visibility for class affects virtual table, VTT and
+ type_info name and node. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "ZTV3Foo" } } */
+/* { dg-final { scan-hidden "ZTT3Foo" } } */
+/* { dg-final { scan-hidden "ZTS3Foo" } } */
+/* { dg-final { scan-hidden "ZTI3Foo" } } */
+
+struct A { };
+
+class __attribute__ ((visibility ("hidden"))) Foo: virtual public A
+{
+ virtual void method();
+};
+
+void Foo::method() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C
new file mode 100644
index 000000000..8ea270bf8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C
@@ -0,0 +1,8 @@
+/* Test visibility attribute on function definition. */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "_Z3foov" } } */
+
+void
+__attribute__((visibility ("hidden")))
+foo()
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C
new file mode 100644
index 000000000..312d32309
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C
@@ -0,0 +1,19 @@
+// { dg-require-visibility "" }
+// { dg-require-dll "" }
+
+extern void __attribute__((dllimport, visibility("hidden")))
+ f1(); // { dg-error "visibility" }
+extern void __attribute__((visibility("hidden"), dllimport))
+ f2(); // { dg-error "visibility" }
+extern void __attribute__((dllexport, visibility("hidden")))
+ f3(); // { dg-error "visibility" }
+extern void __attribute__((visibility("hidden"), dllexport))
+ f4(); // { dg-error "visibility" }
+extern void __attribute__((visibility("default"), dllimport))
+ f5();
+extern void __attribute__((dllimport, visibility("default")))
+ f6();
+extern void __attribute__((visibility("default"), dllexport))
+ f7();
+extern void __attribute__((dllexport, visibility("default")))
+ f8();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C
new file mode 100644
index 000000000..78f40c62b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C
@@ -0,0 +1,18 @@
+// PR target/39175
+// { dg-do compile }
+// { dg-require-visibility "" }
+// { dg-options "-O2 -fvisibility=hidden -fpic" { target fpic } }
+
+__attribute__((noinline)) int
+foo (int x)
+{
+ return x;
+}
+
+int foo (int x);
+
+int
+bar (int x)
+{
+ return foo (x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C
new file mode 100644
index 000000000..26272abb1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C
@@ -0,0 +1,7 @@
+/* Test that visibility attribute on declaration extends to definition. */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "_Z3foov" } } */
+
+void __attribute__((visibility ("hidden"))) foo();
+
+void foo() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C
new file mode 100644
index 000000000..e4f499fcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C
@@ -0,0 +1,7 @@
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C
new file mode 100644
index 000000000..f67659587
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C
@@ -0,0 +1,8 @@
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int __attribute__ ((visibility ("hidden")))
+xyzzy;
+
+int xyzzy = 5;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C
new file mode 100644
index 000000000..592529e66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C
@@ -0,0 +1,11 @@
+/* Test visibility attribute on definition of a function that has
+ already had a forward declaration. */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "_Z3foov" } } */
+
+void foo();
+
+void
+ __attribute__((visibility ("hidden")))
+foo()
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C
new file mode 100644
index 000000000..0fecf6b74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C
@@ -0,0 +1,10 @@
+/* Test visibility attribute on definition of global variable that has
+ already had a forward declaration. */
+/* { dg-require-visibility "" }
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int xyzzy;
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C
new file mode 100644
index 000000000..ae4589397
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C
@@ -0,0 +1,11 @@
+/* Test warning from conflicting visibility specifications. */
+/* { dg-require-visibility "protected" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int
+__attribute__((visibility ("hidden")))
+xyzzy; /* { dg-warning "previous declaration here" "" } */
+
+int
+__attribute__((visibility ("protected")))
+xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C
new file mode 100644
index 000000000..f0139b362
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C
@@ -0,0 +1,56 @@
+// Test that a definition marked with dllexport has default
+// visibility.
+// { dg-require-visibility "" }
+// { dg-require-dll "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-not-hidden "_ZN1A1fEv" } }
+// { dg-final { scan-not-hidden "_Z1gv" } }
+// { dg-final { scan-not-hidden "_Z1hv" } }
+// { dg-final { scan-not-hidden "_ZN1BC1Ev" } }
+// { dg-final { scan-not-hidden "_ZN1BC2Ev" } }
+// { dg-final { scan-not-hidden "_ZN1BD0Ev" } }
+// { dg-final { scan-not-hidden "_ZN1BD1Ev" } }
+// { dg-final { scan-not-hidden "_ZN1BD2Ev" } }
+// { dg-final { scan-not-hidden "_ZN1B1iEv" } }
+// { dg-final { scan-not-hidden "_ZN1B1jEv" } }
+// { dg-final { scan-not-hidden "_ZN1A1a" } }
+// { dg-final { scan-not-hidden "_ZN1B1b" } }
+// { dg-final { scan-not-hidden "k" } }
+// { dg-final { scan-not-hidden "l" } }
+
+struct __declspec(dllexport) A {
+ void f();
+ static int a;
+};
+
+void A::f() {}
+
+int A::a;
+
+__declspec(dllexport) void g() {}
+
+__declspec(dllexport) void h();
+void h() {}
+
+struct B {
+ B();
+ __declspec(dllexport) virtual ~B();
+ void i();
+ __declspec(dllexport) void j();
+ __declspec(dllexport) static int b;
+};
+
+__declspec(dllexport) B::B() {}
+
+B::~B() {}
+
+__declspec(dllexport) void B::i() {}
+
+void B::j() {}
+
+int B::b;
+
+__declspec(dllexport) int k;
+
+__declspec(dllexport) extern int l;
+int l;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C
new file mode 100644
index 000000000..06b5a17e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C
@@ -0,0 +1,29 @@
+// Test that dllimport'd functions have default visibility.
+// { dg-require-visibility "" }
+// { dg-require-dll "" }
+// { dg-options "-fvisibility=hidden" }
+// { dg-final { scan-not-hidden "_Z2f1v" } }
+// { dg-final { scan-not-hidden "_ZN1S2f3Ev" } }
+
+extern void __attribute__((dllimport)) f1();
+void f2() {
+ f1();
+}
+
+struct __attribute__((visibility("hidden")) S1 {
+ __attribute__((dllimport)) void f3();
+};
+
+void f4() {
+ S1 s1;
+ s1.f3();
+}
+
+struct S2 {
+ __attribute__((dllimport)) void f5();
+};
+
+void f6() {
+ S2 s2;
+ s2.f5();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn2.C
new file mode 100644
index 000000000..475179fd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn2.C
@@ -0,0 +1,16 @@
+// Complain when a class is specified with greater visibility than one of
+// its members' types or bases.
+
+// { dg-require-visibility "" }
+
+namespace N __attribute ((__visibility__ ("hidden")))
+{
+ struct A { };
+}
+
+struct B // { dg-warning "visibility" }
+{
+ N::A a;
+};
+
+struct C: public N::A { }; // { dg-warning "visibility" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn3.C
new file mode 100644
index 000000000..d1d3ba486
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn3.C
@@ -0,0 +1,26 @@
+// Tests for various visibility mismatch situations.
+
+// { dg-require-visibility "" }
+
+// { dg-final { scan-not-hidden "_ZN1A1fEv" } }
+
+struct __attribute ((visibility ("hidden"))) A
+{
+ // This is OK, A::f gets default visibility.
+ __attribute ((visibility ("default"))) void f ();
+};
+
+void A::f() { }
+
+// This gets a warning because B objects might rely
+// on hidden symbols from A.
+struct B // { dg-warning "visibility" }
+{
+ A a;
+};
+
+// This one has explicit visibility, so it doesn't get a warning.
+struct __attribute ((visibility ("default"))) C
+{
+ A a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn4.C
new file mode 100644
index 000000000..33e6f6785
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn4.C
@@ -0,0 +1,10 @@
+// Warn if we try to give an instantiation visibility after it's already
+// been instantiated.
+
+// { dg-require-visibility "" }
+
+template <class T> struct A { void f (T); };
+template <class T> void A<T>::f (T) { }
+
+A<double> ad;
+template struct __attribute ((visibility ("hidden"))) A<double>; // { dg-warning "already defined" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn5.C
new file mode 100644
index 000000000..63538e5ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/visibility/warn5.C
@@ -0,0 +1,11 @@
+// PR c++/40145
+// { dg-do compile }
+// { dg-require-visibility "" }
+// { dg-options "-fvisibility=hidden" }
+
+struct EditorInternalCommand { };
+
+static void createCommandMap()
+{
+ struct CommandEntry { EditorInternalCommand command; };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla1.C
new file mode 100644
index 000000000..55ae5c8af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+// Crash tests from PR middle-end/6994. See also gcc.dg/vla-2.c.
+// A::A is acceptable extended C++ (VLA types brought over from C99);
+// B::B is not, but is closely related to acceptable extended C, though
+// not to acceptable C99.
+
+class A { A (int); };
+
+A::A (int i)
+{
+ int ar[1][i]; // { dg-error "array" }
+
+ ar[0][0] = 0;
+}
+
+class B { B (int); };
+
+B::B (int i)
+{
+ struct S {
+ int ar[1][i]; // { dg-error "array" }
+ } s;
+
+ s.ar[0][0] = 0; // { dg-prune-output "no member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla10.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla10.C
new file mode 100644
index 000000000..17cdb2f9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla10.C
@@ -0,0 +1,32 @@
+// PR c++/48446
+// { dg-options "" }
+
+template<typename T>
+struct A
+{
+ ~A ();
+ T *operator-> () const;
+};
+
+struct B
+{
+ typedef A <B> P;
+ static P foo (int);
+};
+
+struct C
+{
+ typedef A<C> P;
+ static const int c = 80;
+};
+
+C::P bar ();
+
+void
+baz ()
+{
+ char z[bar ()->c];
+ {
+ B::P m = B::foo (sizeof (z));
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla11.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla11.C
new file mode 100644
index 000000000..e448be325
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla11.C
@@ -0,0 +1,9 @@
+// Test that auto works with VLAs.
+// { dg-do compile { target c++11 } }
+// { dg-options "" { target { ! c++1y } } }
+
+void bar(int n)
+{
+ float loc2[n];
+ auto&& range = loc2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla12.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla12.C
new file mode 100644
index 000000000..bca836507
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla12.C
@@ -0,0 +1,28 @@
+// VLA sizeof test
+// { dg-do compile }
+// { dg-options "" }
+
+int
+f1 (int i)
+{
+ char a[sizeof (i) + 6 + i];
+ char b[sizeof (a) + 1];
+ return sizeof (b);
+}
+
+int
+f2 (int i)
+{
+ char a[sizeof (i) + 6 + i];
+ char b[sizeof (a)];
+ return sizeof (b);
+}
+
+int
+f3 (int i)
+{
+ char a[sizeof (i) + 6 + i];
+ char b[sizeof (i) + i];
+ char c[sizeof (a) + sizeof (b) + 7];
+ return sizeof (c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla13.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla13.C
new file mode 100644
index 000000000..719c35b16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla13.C
@@ -0,0 +1,8 @@
+// PR c++/54583
+// { dg-options "-Wunused-value" }
+
+void fred()
+{
+ int n=10;
+ double (*x)[n];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla2.C
new file mode 100644
index 000000000..3e83c8b3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9708. We unified a VLA size as a constant. Then issued bogus
+// errors.
+
+template <unsigned int N>
+char* begin(char (&a) [N] ); // { dg-message "note" }
+
+void bar(int i)
+{
+ char d[i] ;
+
+ begin(d); // { dg-error "no matching function" "" }
+ // { dg-message "(candidate|valid template argument)" "candidate note" { target *-*-* } 17 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla3.C
new file mode 100644
index 000000000..329cc7dde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla3.C
@@ -0,0 +1,24 @@
+// PR c++/28903
+// { dg-options "" }
+
+template <class>
+struct View
+{
+ int n;
+};
+template <class ViewA>
+struct ViewDom : View<ViewA>
+{
+ using View<ViewA>::n;
+ ViewDom();
+};
+template <class ViewA>
+ViewDom<ViewA>::ViewDom()
+{
+ char a[n];
+}
+void element( )
+{
+ ViewDom<int> a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla4.C
new file mode 100644
index 000000000..90e416067
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla4.C
@@ -0,0 +1,21 @@
+// PR c++/29318
+// { dg-options "" }
+
+#include <typeinfo>
+
+void f(int i) {
+ try {
+ int a[i];
+ throw &a; // { dg-error "int \\(\\*\\)\\\[i\\\]" }
+ } catch (int (*)[i]) { // { dg-error "variable size" }
+ }
+}
+
+int main()
+{
+ int i = 5;
+ int va[i];
+ const std::type_info& info(typeid(&va)); // { dg-error "variable size" }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla5.C
new file mode 100644
index 000000000..ca5830917
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla5.C
@@ -0,0 +1,10 @@
+// PR c++/37417
+// Testcase by Martin Michlmayr <tbm@cyrius.com>
+// { dg-do compile }
+// { dg-options "-O" }
+
+void
+test (int a)
+{
+ new (char[a]); // { dg-warning "parentheses" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla6.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla6.C
new file mode 100644
index 000000000..83011f2f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla6.C
@@ -0,0 +1,18 @@
+// PR c++/28879
+// { dg-options "" }
+
+struct A
+{
+ int i;
+ A(): i(1) {}
+};
+
+template<int> void foo()
+{
+ int x[A().i];
+}
+
+void f()
+{
+ foo<1>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla7.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla7.C
new file mode 100644
index 000000000..5246f9c8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla7.C
@@ -0,0 +1,30 @@
+// PR c++/40013
+// { dg-options "" }
+
+template <class T>
+struct A
+{
+ struct B
+ {
+ struct
+ {
+ int fn () { return 0; }
+ } b;
+ };
+ void test ();
+};
+
+template <class T>
+void
+A <T>::test ()
+{
+ B a;
+ int vla[a.b.fn ()];
+}
+
+int
+main ()
+{
+ A <char> a;
+ a.test ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla8.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla8.C
new file mode 100644
index 000000000..9e2d6bdad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla8.C
@@ -0,0 +1,15 @@
+// PR c++/42387
+// { dg-options "" }
+
+template<class PF>
+struct AvlTreeIter
+{
+ int Num();
+
+ AvlTreeIter()
+ {
+ new (void* [Num()]); // { dg-warning "parentheses" }
+ }
+};
+
+AvlTreeIter<int> a; // { dg-message "from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla9.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla9.C
new file mode 100644
index 000000000..c58edbc9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla9.C
@@ -0,0 +1,38 @@
+// PR c++/43555
+// { dg-options "" }
+// { dg-do run }
+
+extern "C" void * malloc (__SIZE_TYPE__);
+extern "C" int printf (const char *, ...);
+extern "C" void abort(void);
+
+int nx,ny;
+
+void f(double *x1d,int choice)
+{
+ double (*x2d)[nx][ny]=(double(*)[nx][ny])x1d;
+ unsigned long delta;
+// (*x2d)[0][0]=123; // <- this line affects the result
+ if (choice!=0)
+ {
+ delta=&(*x2d)[1][0]-x1d;
+ }
+ else
+ {
+ delta=&(*x2d)[1][0]-x1d;
+ }
+ printf("Choice: %d, Delta: %ld\n",choice,delta);
+ if (delta != ny)
+ abort ();
+}
+
+int main()
+{
+ double *data;
+ nx=100;
+ ny=100;
+ data=(double*)malloc(nx*ny*sizeof(double));
+ f(data,0);
+ f(data,1);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm1.C
new file mode 100644
index 000000000..9cb6c38be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm1.C
@@ -0,0 +1,13 @@
+// { dg-options "" }
+
+template <class T> struct A {};
+
+struct B {
+ static const int s;
+ A<int[s]> a; // { dg-error "array|template" }
+};
+
+const int B::s=16;
+
+B b;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm2.C
new file mode 100644
index 000000000..3a0b33526
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vlm2.C
@@ -0,0 +1,13 @@
+// { dg-options "" }
+
+int n;
+
+struct Y
+{
+ void f () {
+ typedef int X[n];
+ struct Z {
+ X x; // { dg-error "variably modified" }
+ };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/weak1.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak1.C
new file mode 100644
index 000000000..b7a448f37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak1.C
@@ -0,0 +1,13 @@
+// Test for #pragma weak where the weak alias symbol isn't declared,
+// although the symbol it is an alias for is defined in the
+// translation unit. Bug 7544.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-require-alias "" }
+// { dg-options "-fno-common" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } }
+
+#pragma weak bar1 = foo1
+extern "C" void foo1 (void) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/weak2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak2.C
new file mode 100644
index 000000000..1bf2ddcb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak2.C
@@ -0,0 +1,17 @@
+// Test for #pragma weak with declaration not at file scope.
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } }
+
+#pragma weak _Z3foov
+
+int
+main (void)
+{
+ extern int foo (void);
+ if (&foo)
+ return foo ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/weak3.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak3.C
new file mode 100644
index 000000000..360821acc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak3.C
@@ -0,0 +1,17 @@
+// PR c++/20961
+// Test for #pragma weak and __attribute__((weak)) being used together.
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } }
+
+int foo ();
+#pragma weak foo
+
+int
+__attribute__((weak))
+foo ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/weak4.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak4.C
new file mode 100644
index 000000000..5b3cce05c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak4.C
@@ -0,0 +1,9 @@
+// PR c++/52759
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "" }
+#pragma weak foo
+template <typename T>
+struct A { };
+template <typename T>
+void bar (A<T> &);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/weak5.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak5.C
new file mode 100644
index 000000000..f2924a0b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/weak5.C
@@ -0,0 +1,12 @@
+// PR c++/36107
+// { dg-do assemble }
+// { dg-require-weak "" }
+
+class Test {
+ public:
+ Test() __attribute__((weak));
+};
+
+void test() {
+ Test test;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/fstack-protector-strong.C b/gcc-4.9/gcc/testsuite/g++.dg/fstack-protector-strong.C
new file mode 100644
index 000000000..a4f0f8163
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/fstack-protector-strong.C
@@ -0,0 +1,35 @@
+/* Test that stack protection is done on chosen functions. */
+
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fstack-protector-strong" } */
+
+class A
+{
+public:
+ A() {}
+ ~A() {}
+ void method();
+ int state;
+};
+
+/* Frame address exposed to A::method via "this". */
+int
+foo1 ()
+{
+ A a;
+ a.method ();
+ return a.state;
+}
+
+/* Possible destroying foo2's stack via &a. */
+int
+global_func (A& a);
+
+/* Frame address exposed to global_func. */
+int foo2 ()
+{
+ A a;
+ return global_func (a);
+}
+
+/* { dg-final { scan-assembler-times "stack_chk_fail" 2 } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/func-args-1.C b/gcc-4.9/gcc/testsuite/g++.dg/func-args-1.C
new file mode 100644
index 000000000..4b2efd83d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/func-args-1.C
@@ -0,0 +1,53 @@
+/* Test messages for wrong number of arguments to function. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f0(void); /* { dg-message "note: declared here" } */
+void f1(int); /* { dg-message "note: declared here" } */
+void f1v(int, ...); /* { dg-message "note: declared here" } */
+void f2(int, int); /* { dg-message "note: declared here" } */
+void f2v(int, int, ...); /* { dg-message "note: declared here" } */
+
+struct s {
+ void (*f0)(void);
+ void (*f1)(int);
+ void (*f1v)(int, ...);
+ void (*f2)(int, int);
+ void (*f2v)(int, int, ...);
+} x;
+
+void
+g (int a)
+{
+ f0();
+ x.f0();
+ f0(a); /* { dg-error "too many arguments to function" } */
+ x.f0(a); /* { dg-error "too many arguments to function" } */
+ f0(a, a); /* { dg-error "too many arguments to function" } */
+ x.f0(a, a); /* { dg-error "too many arguments to function" } */
+ f1(); /* { dg-error "too few arguments to function" } */
+ x.f1(); /* { dg-error "too few arguments to function" } */
+ f1(a);
+ x.f1(a);
+ f1(a, a); /* { dg-error "too many arguments to function" } */
+ x.f1(a, a); /* { dg-error "too many arguments to function" } */
+ f1v(); /* { dg-error "too few arguments to function" } */
+ x.f1v(); /* { dg-error "too few arguments to function" } */
+ f1v(a);
+ x.f1v(a);
+ f1v(a, a);
+ x.f1v(a, a);
+ f2(a); /* { dg-error "too few arguments to function" } */
+ x.f2(a); /* { dg-error "too few arguments to function" } */
+ f2(a, a);
+ x.f2(a, a);
+ f2(a, a, a); /* { dg-error "too many arguments to function" } */
+ x.f2(a, a, a); /* { dg-error "too many arguments to function" } */
+ f2v(a); /* { dg-error "too few arguments to function" } */
+ x.f2v(a); /* { dg-error "too few arguments to function" } */
+ f2v(a, a);
+ x.f2v(a, a);
+ f2v(a, a, a);
+ x.f2v(a, a, a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-1.C
new file mode 100644
index 000000000..c279b1452
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-1.C
@@ -0,0 +1,313 @@
+/* Check that execution counts and branch probabilities for various C
+ constructs are reported correctly by gcov. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+extern "C" void abort (void);
+
+int do_something (int i)
+{
+ return i;
+}
+
+/* Check static inline functions. */
+
+int unref_val;
+
+static inline int
+unreferenced (int i, int j)
+{
+ return i - j;
+}
+
+static inline int
+uncalled (int i, int j)
+{
+ return i * j;
+}
+
+static inline int
+called (int i, int j)
+{
+ return i + j; /* count(1) */
+}
+
+void
+call_unref ()
+{
+ if (unref_val) /* count(1) */
+ unref_val = uncalled (1, 2);
+ unref_val = called (unref_val, 4); /* count(1) */
+}
+
+
+/* Check for loops. */
+
+int for_val1;
+int for_val2;
+int for_temp;
+
+int
+test_for1 (int n)
+{
+ int i;
+ for_temp = 1; /* count(3) */
+ for (i = 0; i < n; i++) /* branch(25) */
+ /* branch(end) */
+ for_temp++; /* count(9) */
+ return for_temp; /* count(3) */
+}
+
+int
+test_for2 (int m, int n, int o)
+{
+ int i, j, k;
+ for_temp = 1; /* count(6) */
+ for (i = 0; i < n; i++) /* branch(30) */
+ /* branch(end) */
+ for (j = 0; j < m; j++) /* branch(32) */
+ /* branch(end) */
+ for (k = 0; k < o; k++) /* branch(27) */
+ /* branch(end) */
+ for_temp++; /* count(81) */
+ return for_temp; /* count(6) */
+}
+
+int
+call_for ()
+{
+ for_val1 += test_for1 (0);
+ for_val1 += test_for1 (2);
+ for_val1 += test_for1 (7);
+
+ for_val2 += test_for2 (0, 0, 0);
+ for_val2 += test_for2 (1, 0, 0);
+ for_val2 += test_for2 (1, 3, 0);
+ for_val2 += test_for2 (1, 3, 1);
+ for_val2 += test_for2 (3, 1, 5);
+ for_val2 += test_for2 (3, 7, 3);
+}
+
+/* Check the use of goto. */
+
+int goto_val;
+
+int
+test_goto1 (int f)
+{
+ /* branch(50) */
+ if (f) /* count(2) */
+ /* branch(end) */
+ goto lab1; /* count(1) */
+ return 1; /* count(1) */
+lab1:
+ return 2; /* count(1) */
+}
+
+int
+test_goto2 (int f)
+{
+ int i;
+ /* branch(7) */
+ for (i = 0; i < 10; i++) /* count(15) */
+ /* branch(end) */
+ if (i == f) goto lab2; /* count(14) */
+ return 4; /* count(1) */
+lab2:
+ return 8; /* count(1) */
+}
+
+void
+call_goto ()
+{
+ goto_val += test_goto1 (0);
+ goto_val += test_goto1 (1);
+ goto_val += test_goto2 (3);
+ goto_val += test_goto2 (30);
+}
+
+/* Check nested if-then-else statements. */
+
+int ifelse_val1;
+int ifelse_val2;
+int ifelse_val3;
+
+int
+test_ifelse1 (int i, int j)
+{
+ int result = 0;
+ /* branch(40) */
+ if (i) /* count(5) */
+ /* branch(0) */
+ if (j) /* count(3) */
+ /* branch(end) */
+ result = do_something (4); /* count(3) */
+ else
+ result = do_something (1024);
+ else
+ /* branch(50) */
+ if (j) /* count(2) */
+ /* branch(end) */
+ result = do_something (1); /* count(1) */
+ else
+ result = do_something (2); /* count(1) */
+ /* branch(80) */
+ if (i > j) /* count(5) */
+ /* branch(end) */
+ result = do_something (result*2); /* count(1) */
+ /* branch(80) */
+ if (i > 10) /* count(5) */
+ /* branch(100) */
+ if (j > 10) /* count(1) */
+ /* branch(end) */
+ result = do_something (result*4); /* count(1) */
+ return result; /* count(5) */
+}
+
+int
+test_ifelse2 (int i)
+{
+ int result = 0;
+ /* branch(83) */
+ if (!i) /* count(6) */
+ /* branch(end) */
+ result = do_something (1); /* count(1) */
+ /* branch(100) */
+ if (i == 1) /* count(6) */
+ /* branch(end) */
+ result = do_something (1024);
+ /* branch(50) */
+ if (i == 2) /* count(6) */
+ /* branch(end) */
+ result = do_something (2); /* count(3) */
+ /* branch(67) */
+ if (i == 3) /* count(6) */
+ /* branch(end) */
+ return do_something (8); /* count(2) */
+ /* branch(100) */
+ if (i == 4) /* count(4) */
+ /* branch(end) */
+ return do_something (2048);
+ return result; /* count(4) */
+}
+
+int
+test_ifelse3 (int i, int j)
+{
+ int result = 1;
+ /* branch(27 50 75) */
+ if (i > 10 && j > i && j < 20) /* count(11) */
+ /* branch(end) */
+ result = do_something (16); /* count(1) */
+ /* branch(55) */
+ if (i > 20) /* count(11) */
+ /* branch(60) */
+ if (j > i) /* count(5) */
+ /* branch(50) */
+ if (j < 30) /* count(2) */
+ /* branch(end) */
+ result = do_something (32); /* count(1) */
+ /* branch(9 10 89) */
+ if (i == 3 || j == 47 || i == j) /* count(11) */
+ /* branch(end) */
+ result = do_something (64); /* count(3) */
+ return result; /* count(11) */
+}
+
+void
+call_ifelse ()
+{
+ ifelse_val1 += test_ifelse1 (0, 2);
+ ifelse_val1 += test_ifelse1 (0, 0);
+ ifelse_val1 += test_ifelse1 (1, 2);
+ ifelse_val1 += test_ifelse1 (10, 2);
+ ifelse_val1 += test_ifelse1 (11, 11);
+
+ ifelse_val2 += test_ifelse2 (0);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (2);
+ ifelse_val2 += test_ifelse2 (3);
+ ifelse_val2 += test_ifelse2 (3);
+
+ ifelse_val3 += test_ifelse3 (11, 19);
+ ifelse_val3 += test_ifelse3 (25, 27);
+ ifelse_val3 += test_ifelse3 (11, 22);
+ ifelse_val3 += test_ifelse3 (11, 10);
+ ifelse_val3 += test_ifelse3 (21, 32);
+ ifelse_val3 += test_ifelse3 (21, 20);
+ ifelse_val3 += test_ifelse3 (1, 2);
+ ifelse_val3 += test_ifelse3 (32, 31);
+ ifelse_val3 += test_ifelse3 (3, 0);
+ ifelse_val3 += test_ifelse3 (0, 47);
+ ifelse_val3 += test_ifelse3 (65, 65);
+}
+
+/* Check switch statements. */
+
+int switch_val, switch_m;
+
+int
+test_switch (int i, int j)
+{
+ int result = 0; /* count(5) */
+
+ /* branch(20 0 60 20) */
+ switch (i) /* count(5) */
+ /* branch(end) */
+ {
+ case 1:
+ result = do_something (2); /* count(1) */
+ break;
+ case 2:
+ result = do_something (1024);
+ break;
+ case 3:
+ case 4:
+ /* branch(67) */
+ if (j == 2) /* count(3) */
+ /* branch(end) */
+ return do_something (4); /* count(1) */
+ result = do_something (8); /* count(2) */
+ break;
+ default:
+ result = do_something (32); /* count(1) */
+ switch_m++; /* count(1) */
+ break;
+ }
+ return result; /* count(4) */
+}
+
+void
+call_switch ()
+{
+ switch_val += test_switch (1, 0);
+ switch_val += test_switch (3, 0);
+ switch_val += test_switch (3, 2);
+ switch_val += test_switch (4, 0);
+ switch_val += test_switch (16, 0);
+ switch_val += switch_m;
+}
+
+int
+main()
+{
+ call_for ();
+ call_goto ();
+ call_ifelse ();
+ call_switch ();
+ call_unref ();
+ if ((for_val1 != 12)
+ || (for_val2 != 87)
+ || (goto_val != 15)
+ || (ifelse_val1 != 31)
+ || (ifelse_val2 != 23)
+ || (ifelse_val3 != 246)
+ || (switch_val != 55)
+ || (unref_val != 4))
+ abort ();
+ return 0;
+}
+
+/* { dg-final { run-gcov branches { -b gcov-1.C } } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-10.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-10.C
new file mode 100644
index 000000000..4c91be94e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-10.C
@@ -0,0 +1,20 @@
+/* Ensure PIC sequence used for comdat functions */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fpic" } */
+/* { dg-do run { target native } } */
+/* { dg-require-effective-target fpic } */
+
+inline int __attribute__ ((noinline)) Foo ()
+{
+ static int x[1];
+
+ return x[0]++; /* count (1) */
+}
+
+int main ()
+{
+ Foo (); /* count (1) */
+ return 0; /* count (1) */
+}
+
+/* { dg-final { run-gcov gcov-10.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-11.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-11.C
new file mode 100644
index 000000000..fa0890206
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-11.C
@@ -0,0 +1,42 @@
+/* Check that unexecuted exception processing regions are shown
+ distinct from unexecuted normal regions. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+void Baz (int i)
+{
+ if (i)
+ throw 1;
+}
+
+void Boz () throw ()
+{
+}
+
+int main ()
+{
+ try
+ {
+ Baz (0); /* count (1) */
+ Baz (0); /* count (1) */
+ }
+ catch (...)
+ {
+ Boz (); /* count (=====) */
+ }
+
+ try
+ {
+ Baz (1); /* count (1) */
+ Baz (0); /* count (#####) */
+ }
+ catch (...)
+ {
+ Boz (); /* count (1) */
+ }
+
+ return 0; /* count (1) */
+}
+
+/* { dg-final { run-gcov gcov-11.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-12.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-12.C
new file mode 100644
index 000000000..c4708e407
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-12.C
@@ -0,0 +1,21 @@
+/* PR 51113 */
+/* { dg-options "-fprofile-arcs -ftest-coverage -fpic" } */
+/* { dg-do run { target native } } */
+/* { dg-additional-sources "gcovpart-12b.C" } */
+
+struct Foo {
+ Foo ()
+ {} /* count(1) */
+ virtual void Func () /* count(#####) */
+ {} /* count(#####) */
+};
+
+int main ()
+{
+ Foo b;
+
+ return 0; /* count (1) */
+}
+
+/* { dg-final { run-gcov gcov-12.C } } */
+/* { dg-final { run-gcov gcovpart-12b.C { xfail *-*-* } } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-13.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-13.C
new file mode 100644
index 000000000..c262a71f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-13.C
@@ -0,0 +1,39 @@
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+void Baz (int i)
+{
+ if (i)
+ throw 1;
+}
+
+void Boz () throw ()
+{
+}
+
+int main ()
+{
+ try
+ {
+ Baz (0); /* count(1) */
+ Baz (0); /* count(1) */
+ }
+ catch (...)
+ {
+ Boz (); /* count(=====) */
+ }
+
+ try
+ {
+ Baz (1); /* count(1) */
+ Baz (0); /* count(#####) */
+ }
+ catch (...)
+ {
+ Boz (); /* count(1) */
+ }
+
+ return 0; /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-13.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-14.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-14.C
new file mode 100644
index 000000000..8f8e3882d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-14.C
@@ -0,0 +1,16 @@
+/* { dg-options "-fprofile-arcs -ftest-coverage -Ofast" } */
+/* { dg-do run { target native } } */
+
+#include <iostream>
+
+void __attribute__ ((noinline))
+ Out (std::ostream &out, double x)
+{ out << x << std::endl; } /* count(1) */
+
+int main ()
+{
+ Out (std::cout, 1.5); /* count(1) */
+ return 0;
+}
+
+/* { dg-final { run-gcov gcov-14.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-2.C
new file mode 100644
index 000000000..66d8af39b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-2.C
@@ -0,0 +1,32 @@
+/* Verify line coverage counts for simple member functions. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+class C {
+public:
+ C()
+ {
+ i = 0; /* count(1) */
+ }
+ ~C() {}
+ void seti (int j)
+ {
+ i = j; /* count(1) */
+ }
+private:
+ int i;
+};
+
+void foo()
+{
+ C c; /* count(1) */
+ c.seti (1); /* count(1) */
+}
+
+int main()
+{
+ foo(); /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-2.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.C
new file mode 100644
index 000000000..aff063a4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.C
@@ -0,0 +1,17 @@
+/* Check that gcov doesn't abort when a static object is defined
+ within a header file. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+#include "gcov-3.h"
+
+extern int foo();
+
+int
+main ()
+{
+ return foo(); /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-3.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.h b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.h
new file mode 100644
index 000000000..1c7ca00dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-3.h
@@ -0,0 +1,31 @@
+/* Leave unused lines for at least the length of the including source file. */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct T {
+ int i;
+ T() { i = 0; }
+};
+
+T t;
+
+int foo()
+{
+ return t.i; /* count(1) */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-4.C
new file mode 100644
index 000000000..2f83ff1be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-4.C
@@ -0,0 +1,41 @@
+/* Check that execution counts and branch probabilities for various C
+ constructs are reported correctly by gcov. */
+
+#include <stdio.h>
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fno-exceptions" } */
+/* { dg-do run { target native } } */
+
+class foo {
+public:
+ foo() { printf("foo()\n"); };
+ ~foo() { printf("~foo()\n"); };
+ void method(void) { printf("method()\n"); };
+};
+
+int func(int i, int j) __attribute__((noinline));
+
+int func(int i, int j){
+ if (j) {
+ printf("unreachable\n");
+ return 3;
+ }
+
+ foo f;
+
+ if (i == 1) {
+ f.method();
+ f.method();
+ } else {
+ f.method();
+ printf("unreachable\n");
+ return 2; /* count(#####) */
+ }
+ f.method();
+ return 0;
+}
+
+int main() {
+ return func(1, 0);
+}
+/* { dg-final { run-gcov gcov-4.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-5.C
new file mode 100644
index 000000000..9ada41802
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-5.C
@@ -0,0 +1,50 @@
+/* Check that execution counts for template functions
+ are reported correctly by gcov. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fno-inline" } */
+/* { dg-do run { target native } } */
+
+class A {
+ int count;
+ public:
+ A(int c) { count = c; }
+ void func(void) { printf("func\n"); }
+ bool done(void) {
+ return (count == 0) ? true : (count-- != 0);
+ }
+ void run(void) { abort(); }
+};
+
+//typedef A T;
+template<class T>
+void WithoutBrace(T *a) {
+ while (!a->done())
+ a->run(); /* count(#####) */
+} /* count(1) */
+
+template<class T>
+void WithBrace(T *a)
+{
+ while (!a->done())
+ {
+ a->run(); /* count(#####) */
+ }
+} /* count(1) */
+
+A *func(A *a)
+{
+ WithoutBrace(a);
+ WithBrace(a);
+ return a;
+}
+
+int main() {
+ A a(0);
+ func(&a);
+ return 0;
+}
+
+/* { dg-final { run-gcov gcov-5.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-6.C
new file mode 100644
index 000000000..53a2b20bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-6.C
@@ -0,0 +1,29 @@
+// PR gcov-profile/34609
+// { dg-do compile }
+// { dg-options "-O -ftest-coverage" }
+
+struct A
+{
+ int i;
+ int &get () { return i; }
+};
+
+inline A foo ()
+{
+ A a;
+ a.get ();
+ return a;
+}
+
+inline A bar ()
+{
+ return foo ();
+}
+
+void baz ()
+{
+ A a;
+ a = bar ();
+}
+
+// { dg-final { cleanup-coverage-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-7.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-7.C
new file mode 100644
index 000000000..db3e95a07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-7.C
@@ -0,0 +1,28 @@
+/* Check that Exception handler specification is not
+ mapped to the curly braces below the function
+ declaration. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+struct foo
+{
+ foo () throw (int)
+ { /* count (-) */
+ throw (1);
+ }
+};
+
+int main ()
+{
+ try
+ {
+ foo f;
+ }
+ catch ( ...)
+ {
+ return 0;
+ }
+}
+
+/* { dg-final { run-gcov gcov-7.C } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-8.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-8.C
new file mode 100644
index 000000000..7acab4672
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov-8.C
@@ -0,0 +1,35 @@
+/* Verify that intermediate coverage format can be generated for simple code. */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+class C {
+public:
+ C()
+ {
+ i = 0;
+ }
+ ~C() {}
+ void seti (int j)
+ {
+ if (j > 0)
+ i = j;
+ else
+ i = 0;
+ }
+private:
+ int i;
+};
+
+void foo()
+{
+ C c;
+ c.seti (1);
+}
+
+int main()
+{
+ foo();
+}
+
+/* { dg-final { run-gcov intermediate { -i -b gcov-8.C } } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov.exp b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov.exp
new file mode 100644
index 000000000..892baa827
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcov.exp
@@ -0,0 +1,44 @@
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Gcov test driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib gcov.exp
+
+global GXX_UNDER_TEST
+
+# Find gcov in the same directory as $GXX_UNDER_TEST.
+if { ![is_remote host] && [string match "*/*" [lindex $GXX_UNDER_TEST 0]] } {
+ set GCOV [file dirname [lindex $GXX_UNDER_TEST 0]]/gcov
+} else {
+ set GCOV gcov
+}
+
+# Initialize harness.
+dg-init
+
+# Delete old .gcda files.
+set files [glob -nocomplain gcov-*.gcda]
+if { $files != "" } {
+ eval "remote_file build delete $files"
+}
+
+# Main loop.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] ""
+
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcovpart-12b.C b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcovpart-12b.C
new file mode 100644
index 000000000..6a1f981f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gcov/gcovpart-12b.C
@@ -0,0 +1,5 @@
+struct Foo {
+ Foo () {}
+ virtual void Func () /* count(-) { xfail *-*-* } */
+ {} /* count(-) { xfail *-*-* } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-14.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-14.C
new file mode 100644
index 000000000..ae1eb50dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-14.C
@@ -0,0 +1,19 @@
+// PR middle-end/45423
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+bool *baz (), atomicvar;
+
+int
+foo (void)
+{
+ #pragma omp atomic
+ (*baz ())--; // { dg-error "invalid use of Boolean" }
+ #pragma omp atomic
+ --(*baz ()); // { dg-error "invalid use of Boolean" }
+ #pragma omp atomic
+ atomicvar--; // { dg-error "invalid use of Boolean" }
+ #pragma omp atomic
+ --atomicvar; // { dg-error "invalid use of Boolean" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-5.C
new file mode 100644
index 000000000..b277ebf3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-5.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+
+int x;
+const int y = 0;
+int bar(void);
+
+void f1(void)
+{
+ #pragma omp atomic
+ x %= 2; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ x = x + 1;
+ #pragma omp atomic
+ x = 1; /* { dg-error "invalid form" } */
+ #pragma omp atomic
+ ++y; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y--; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y += 1; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ bar(); /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ bar() += 1; /* { dg-error "lvalue required" } */
+ #pragma omp atomic a /* { dg-error "expected end of line" } */
+ x++;
+ #pragma omp atomic
+ ; /* { dg-error "expected primary-expression" } */
+ #pragma omp atomic
+ #pragma omp atomic /* { dg-error "not allowed" } */
+ ;
+ /* Check that we didn't get stuck on the pragma eol marker. */
+ undef; /* { dg-error "" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-6.C
new file mode 100644
index 000000000..52ac40f2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/atomic-6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-w -fopenmp" }
+
+int x[10], z;
+double y[10];
+
+void f1(void)
+{
+ #pragma omp atomic
+ x[z] /= y[z];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-1.C
new file mode 100644
index 000000000..10ca553f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-1.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp barrier
+}
+
+void f2(bool p)
+{
+ if (p)
+ {
+ #pragma omp barrier
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-2.C
new file mode 100644
index 000000000..1d929d26d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/barrier-2.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+void f1(void)
+{
+ #pragma omp barrier a // { dg-error "expected end of line" }
+}
+
+void f3(bool p)
+{
+ if (p)
+ #pragma omp barrier // { dg-error "compound statements" }
+} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-0.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-0.C
new file mode 100644
index 000000000..86af0404a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-0.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-omplower" }
+
+void bar();
+void foo()
+{
+ #pragma omp critical
+ bar ();
+ #pragma omp master
+ bar ();
+ #pragma omp single
+ bar ();
+ #pragma omp for
+ for (int i = 0; i < 10; ++i)
+ bar ();
+ #pragma omp sections
+ { bar(); }
+ #pragma omp parallel
+ bar ();
+ #pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ bar ();
+ #pragma omp parallel sections
+ {
+ {
+ bar ();
+ bar ();
+ }
+ #pragma omp section
+ bar ();
+ }
+}
+
+// { dg-final { scan-tree-dump-times "terminate" 10 "omplower" } }
+// { dg-final { cleanup-tree-dump "omplower" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-1.C
new file mode 100644
index 000000000..d2b86645a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-1.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+void foo()
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp parallel
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp parallel
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp parallel
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+}
+
+// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 }
+// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-10.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-10.C
new file mode 100644
index 000000000..b273c1f29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-10.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i)
+ {
+ #pragma omp parallel
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+ switch (i)
+ {
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; } // { dg-error "jump|enters" }
+ }
+ switch (i)
+ {
+ #pragma omp critical
+ { case 2:; } // { dg-error "jump|enters" }
+ }
+ switch (i)
+ {
+ #pragma omp master
+ { case 3:; } // { dg-error "jump|enters" }
+ }
+ switch (i)
+ {
+ #pragma omp sections
+ { case 4:; // { dg-error "jump|enters" }
+ #pragma omp section
+ { case 5:; } // { dg-error "jump|enters" }
+ }
+ }
+ switch (i)
+ {
+ #pragma omp ordered
+ { default:; } // { dg-error "jump|enters" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-11.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-11.C
new file mode 100644
index 000000000..c2800061b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-11.C
@@ -0,0 +1,19 @@
+/* PR c++/24516 */
+/* { dg-do compile } */
+
+void
+bar (int *p)
+{
+ int m;
+#pragma omp parallel for
+ for (m = 0; m < 1000; ++m)
+ switch (p[m])
+ {
+ case 1:
+ p[m] = 2;
+ break;
+ default:
+ p[m] = 3;
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-2.C
new file mode 100644
index 000000000..17d98d845
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-2.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ break; // { dg-error "break" }
+
+ bad1: // { dg-error "jump to label" }
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ {
+ bad2: ; // { dg-error "jump|enters OpenMP" }
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ for (j = 0; j < 10; ++j)
+ if (i == j)
+ break;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ continue;
+}
+
+// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 14 }
+// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 16 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-3.C
new file mode 100644
index 000000000..ff2817528
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-3.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+extern int test(int);
+void foo()
+{
+ int i;
+
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp sections
+ {
+ continue; // { dg-error "invalid exit" }
+ }
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ { bad1: ; } // { dg-error "jump to label" }
+ #pragma omp section
+ goto bad1; // { dg-error "from here|enters OpenMP" }
+ }
+
+ #pragma omp sections
+ {
+ goto bad2; // { dg-error "from here" }
+ }
+ bad2:; // { dg-error "jump|exits OpenMP" }
+
+ goto bad3; // { dg-error "from here" }
+ #pragma omp sections
+ {
+ bad3: ; // { dg-error "jump|enters OpenMP" }
+ }
+
+ #pragma omp sections
+ {
+ {
+ goto ok1;
+ ok1:;
+ }
+
+ #pragma omp section
+ for (i = 0; i < 10; ++i)
+ if (test(i))
+ break;
+ else
+ continue;
+
+ #pragma omp section
+ switch (i)
+ {
+ case 0:
+ break;
+ default:
+ test(i);
+ }
+ }
+}
+
+// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 21 }
+// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 26 }
+// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 30 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-4.C
new file mode 100644
index 000000000..815d36b2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-4.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp critical
+ {
+ return; // { dg-error "invalid exit" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-5.C
new file mode 100644
index 000000000..391f8b660
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-5.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp master
+ {
+ goto bad1; // { dg-error "from here" }
+ }
+
+ #pragma omp master
+ {
+ bad1: // { dg-error "jump|exits OpenMP" }
+ return; // { dg-error "invalid exit" }
+ }
+}
+
+// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-6.C
new file mode 100644
index 000000000..fa4c5eab5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-6.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp ordered
+ {
+ return; // { dg-error "invalid exit" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-7.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-7.C
new file mode 100644
index 000000000..802b3b3a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-7.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp for
+ for (j = ({ continue; 0; }); // { dg-error "invalid exit" }
+ j < ({ continue; 10; }); // { dg-error "invalid exit" }
+ j += ({ continue; 1; })) // { dg-error "invalid exit" }
+ continue;
+
+ #pragma omp for
+ for (j = ({ break; 0; }); // { dg-error "invalid exit" }
+ j < ({ break; 10; }); // { dg-error "invalid exit" }
+ j += ({ break; 1; })) // { dg-error "invalid exit" }
+ break; // { dg-error "break" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-8.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-8.C
new file mode 100644
index 000000000..177acaa28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-8.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// PR 24451
+
+int foo()
+{
+ int i;
+
+ #pragma omp parallel for
+ for (i = 0; i < 10; ++i)
+ return 0; // { dg-error "invalid exit" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-9.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-9.C
new file mode 100644
index 000000000..8012e5a7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/block-9.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i)
+ {
+ #pragma omp parallel
+ { case 0:; } // { dg-error "jump|enters" }
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; } // { dg-error "jump|enters" }
+ #pragma omp critical
+ { case 2:; } // { dg-error "jump|enters" }
+ #pragma omp master
+ { case 3:; } // { dg-error "jump|enters" }
+ #pragma omp sections
+ { case 4:; // { dg-error "jump|enters" }
+ #pragma omp section
+ { case 5:; } // { dg-error "jump|enters" }
+ }
+ #pragma omp ordered
+ { default:; } // { dg-error "jump|enters" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-1.C
new file mode 100644
index 000000000..76683ecf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-1.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+struct T
+{
+ int n;
+
+ void test();
+};
+
+void T::test()
+{
+ #pragma omp parallel private(n) // { dg-error "T::n" }
+ n = 1;
+
+ #pragma omp parallel shared(n) // { dg-error "T::n" }
+ n = 1;
+
+ #pragma omp parallel firstprivate(n) // { dg-error "T::n" }
+ n = 1;
+
+ #pragma omp sections lastprivate(n) // { dg-error "T::n" }
+ { n = 1; }
+
+ #pragma omp parallel reduction(+:n) // { dg-error "T::n" }
+ n = 1;
+
+ #pragma omp single copyprivate(n) // { dg-error "T::n" }
+ n = 1;
+
+ #pragma omp parallel copyin(n) // { dg-error "T::n" }
+ n = 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-2.C
new file mode 100644
index 000000000..450419ad6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-2.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+struct A { int a; };
+struct B { B(); };
+struct C { C(); C(const C&); };
+struct D { D& operator=(const D&); };
+
+class E { private: E(); public: E(int); }; // { dg-error "private" }
+class F { private: F(const F&); public: F(); }; // { dg-error "private" }
+class G { private: G& operator=(const G&); }; // { dg-error "private" }
+
+void bar();
+void foo()
+{
+ A a; B b; C c; D d; E e(0); F f; G g;
+
+ #pragma omp parallel shared(a, b, c, d, e, f, g)
+ bar();
+
+ #pragma omp parallel private(a, b, c, d, f, g)
+ bar();
+ #pragma omp parallel private(e) // { dg-error "context" }
+ bar();
+
+ #pragma omp parallel firstprivate(a, b, c, d, e, g)
+ bar();
+ #pragma omp parallel firstprivate(f) // { dg-error "context" }
+ bar();
+
+ #pragma omp parallel sections lastprivate(a, b, d, c, f)
+ { bar(); }
+ #pragma omp parallel sections lastprivate(e) // { dg-error "context" }
+ { bar(); }
+ #pragma omp parallel sections lastprivate(g) // { dg-error "context" }
+ { bar(); }
+ #pragma omp parallel sections firstprivate(e) lastprivate(e)
+ { bar(); }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-3.C
new file mode 100644
index 000000000..1a20440d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-3.C
@@ -0,0 +1,94 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+#define p parallel
+
+extern void bar (void);
+extern char q[]; // { dg-error "has incomplete type" }
+int t;
+#pragma omp threadprivate (t)
+
+void
+foo (int x)
+{
+ char *pp;
+ struct S { int i; int j; } s;
+ char a[32];
+ double d;
+ int i;
+ const int c = 8;
+#pragma omp p shared (x, x) // { dg-error "more than once" }
+ ;
+#pragma omp p private (x) private (x) // { dg-error "more than once" }
+ ;
+#pragma omp p shared (x) firstprivate (x) // { dg-error "more than once" }
+ ;
+#pragma omp p firstprivate (x, x) // { dg-error "more than once" }
+ ;
+#pragma omp p for shared (x) lastprivate (x) // { dg-error "more than once" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for private (x) lastprivate (x) // { dg-error "more than once" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for lastprivate (x, x) // { dg-error "more than once" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp single private (x) copyprivate (x) // { dg-error "more than once" }
+ ;
+#pragma omp p shared (bar) // { dg-error "is not a variable" }
+ ;
+#pragma omp p private (bar) // { dg-error "is not a variable" }
+ ;
+#pragma omp p firstprivate (bar) // { dg-error "is not a variable" }
+ ;
+#pragma omp p reduction (+:pp) // { dg-error "user defined reduction not found for" }
+ ;
+#pragma omp p reduction (*:s) // { dg-error "user defined reduction not found for" }
+ ;
+#pragma omp p reduction (-:a) // { dg-error "has invalid type for" }
+ ;
+ d = 0;
+#pragma omp p reduction (*:d)
+ ;
+#pragma omp p reduction (|:d) // { dg-error "user defined reduction not found for" }
+ ;
+#pragma omp p reduction (&&:d) // { dg-error "user defined reduction not found for" }
+ ;
+#pragma omp p copyin (d) // { dg-error "must be 'threadprivate'" }
+ ;
+#pragma omp p copyin (x) // { dg-error "must be 'threadprivate'" }
+ ;
+#pragma omp p for firstprivate (x) lastprivate (x)
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p private (q) // { dg-error "unspecified bounds" }
+ ;
+#pragma omp p firstprivate (q) // { dg-error "unspecified bounds" }
+ ;
+#pragma omp p for lastprivate (q) // { dg-error "unspecified bounds" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p shared (t) // { dg-error "predetermined 'threadprivate'" }
+ ;
+#pragma omp p private (t) // { dg-error "predetermined 'threadprivate'" }
+ ;
+#pragma omp p firstprivate (t) // { dg-error "predetermined 'threadprivate'" }
+ ;
+#pragma omp p for lastprivate (t) // { dg-error "predetermined 'threadpriv" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:t) // { dg-error "predetermined 'threadprivate'" }
+ ;
+#pragma omp p shared (c) // { dg-error "predetermined 'shared'" }
+ ;
+#pragma omp p private (c) // { dg-error "predetermined 'shared'" }
+ ;
+#pragma omp p firstprivate (c)
+ ;
+#pragma omp p for lastprivate (c) // { dg-error "predetermined 'shared'" }
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:c) // { dg-error "predetermined 'shared'" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-4.C
new file mode 100644
index 000000000..06b91e8a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/clause-4.C
@@ -0,0 +1,23 @@
+// PR c/34506
+// { dg-do compile }
+
+#define p parallel
+
+void
+foo (int x)
+{
+#pragma omp p num_threads (4) if (1) private (x)
+ ;
+#pragma omp p num_threads(4)if(1)private(x)
+ ;
+#pragma omp p num_threads (4), if (1) , private (x)
+ ;
+#pragma omp p num_threads(4),if(1),private(x)
+ ;
+#pragma omp p, num_threads (4), if (1), private (x) // { dg-error "clause before" }
+ ;
+#pragma omp p num_threads (4), if (1), private (x), // { dg-error "clause before" }
+ ;
+#pragma omp p num_threads (4), , if (1), private (x) // { dg-error "clause before" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/copyin-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/copyin-1.C
new file mode 100644
index 000000000..117f82f81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/copyin-1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int i, j;
+
+#pragma omp threadprivate (i)
+
+void bar(void);
+void foo(void)
+{
+ int k;
+ extern int l;
+ extern int m;
+
+#pragma omp threadprivate (m)
+
+ #pragma omp parallel copyin(i)
+ bar();
+ #pragma omp parallel copyin(j) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(k) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(l) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(m)
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-1.C
new file mode 100644
index 000000000..bdc7bad7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-1.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp critical
+ bar(0);
+
+ /* Note that "name" is in its own namespace, thus this foo is not
+ the same as the function. */
+ #pragma omp critical(foo)
+ {
+ bar(1);
+ bar(2);
+ }
+
+ #pragma omp critical
+ #pragma omp critical(foo)
+ bar(3);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_critical_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_end" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_end" 2 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-2.C
new file mode 100644
index 000000000..37c9c2414
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/critical-2.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+void f1(void)
+{
+ #pragma omp critical a // { dg-error "expected" }
+ ;
+ #pragma omp critical ( // { dg-error "expected identifier" }
+ ;
+ #pragma omp critical (a // { dg-error "expected .\\)." }
+ ;
+ #pragma omp critical (a b) // { dg-error "expected .\\)." }
+} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-1.C
new file mode 100644
index 000000000..4b2812fb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-1.C
@@ -0,0 +1,243 @@
+// Test parsing of #pragma omp declare simd
+// { dg-do compile }
+
+#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) \
+ linear (c : 4) simdlen (8) notinbranch
+#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a \
+ : 4) simdlen (4) inbranch
+int f1 (int a, int *b, int c);
+
+#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+int f2 (int a, int *b, int c)
+{
+ return a + *b + c;
+}
+
+#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+template <typename T>
+T f3 (int a, int *b, T c);
+
+template <>
+int f3 (int, int *, int);
+
+#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) notinbranch simdlen (4)
+template <typename T>
+int f4 (int a, int *b, T c)
+{
+ return a + *b + c;
+}
+
+template <>
+int f4 (int, int *, int);
+
+template <typename T>
+int f5 (int a, int *b, T c);
+
+#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+template <>
+int f5 (int a, int *b, int c);
+
+template <int N>
+int f6 (int a, int *b, int c);
+
+#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) inbranch simdlen (4)
+template <>
+int f6<3> (int a, int *b, int c);
+
+#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (long long)) linear (c : 4) simdlen (8)
+__extension__
+long long f7 (long long a, long long *b, long long c);
+
+#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) notinbranch simdlen (8)
+extern "C"
+int f8 (int a, int *b, int c);
+
+extern "C"
+{
+ #pragma omp declare simd
+ int f9 (int a, int *b, int c);
+}
+
+namespace N1
+{
+ namespace N2
+ {
+ #pragma omp declare simd simdlen (2) aligned (b : sizeof (long long) * 2)
+ __extension__ long long
+ f10 (long long *b)
+ {
+ return *b;
+ }
+ }
+}
+
+struct A
+{
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ int f11 (int a, int *b, int c);
+
+ #pragma omp declare simd
+ template <int N>
+ int f12 (int a, int *b, int c);
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) notinbranch simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) inbranch
+ static int f13 (int a, int *b, int c);
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ int f14 (int a, int *b, int c) { return a + *b + c; }
+
+ #pragma omp declare simd
+ template <int N>
+ int f15 (int a, int *b, int c) { return a + *b + c; }
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ static int f16 (int a, int *b, int c) { return a + *b + c; }
+};
+
+template <>
+int A::f12<2> (int, int *, int);
+
+template <>
+int A::f15<2> (int, int *, int);
+
+template <typename T>
+struct B
+{
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) notinbranch
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) inbranch
+ int f17 (int a, int *b, int c);
+
+ #pragma omp declare simd
+ template <int N>
+ int f18 (int a, int *b, int c);
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ static int f19 (int a, int *b, int c);
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ int f20 (int a, int *b, int c) { return a + *b + c; }
+
+ #pragma omp declare simd
+ template <int N>
+ int f21 (int a, int *b, int c) { return a + *b + c; }
+
+ #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
+ #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4)
+ static int f22 (int a, int *b, int c) { return a + *b + c; }
+
+ template <int N>
+ int f23 (int, int *, int);
+
+ template <int N>
+ static int f24 (int, int *, int);
+
+ template <int N>
+ int f25 (int, int *, int);
+
+ template <int N>
+ static int f26 (int, int *, int);
+};
+
+B <int> b;
+
+template <>
+template <>
+int B<int>::f18<0> (int, int *, int);
+
+template <>
+template <>
+int B<int>::f21<9> (int, int *, int);
+
+#pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) uniform (a, c)
+template <>
+template <>
+int B<int>::f23<7> (int a, int *b, int c);
+
+#pragma omp declare simd simdlen (4) aligned (b : 8 * sizeof (int)) linear (a, c : 2)
+template <>
+template <>
+int B<int>::f24<-1> (int a, int *b, int c);
+
+#pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) uniform (a, c)
+template <>
+template <>
+int B<int>::f25<7> (int a, int *b, int c)
+{
+ return a + *b + c;
+}
+
+#pragma omp declare simd simdlen (4) aligned (b : 8 * sizeof (int)) linear (a, c : 2)
+template <>
+template <>
+int B<int>::f26<-1> (int a, int *b, int c)
+{
+ return a + *b + c;
+}
+
+int
+f27 (int x)
+{
+ #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+ extern int f28 (int a, int *b, int c);
+ {
+ x++;
+ #pragma omp declare simd simdlen (4) linear (c)
+ extern int f29 (int a, int *b, int c);
+ }
+ return x;
+}
+
+#pragma omp declare simd simdlen (16)
+int
+f30 (int x)
+{
+ #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+ extern int f31 (int a, int *b, int c);
+ return x;
+}
+
+template <int N>
+struct C
+{
+ #pragma omp declare simd simdlen (N) aligned (b : N * sizeof (int)) linear (c : N) notinbranch
+ int f32 (int a, int *b, int c);
+};
+
+C <2> c;
+
+int
+f33 (int x)
+{
+ if (x)
+ #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+ extern int f34 (int a, int *b, int c);
+ while (x < 10)
+ #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+ extern int f35 (int a, int *b, int c);
+ return x;
+}
+
+#pragma omp declare simd simdlen (N)
+template <int N>
+int f36 (int);
+
+struct D
+{
+ int d;
+ #pragma omp declare simd simdlen (N) linear (a : sizeof (a) + sizeof (d) + sizeof (this) + sizeof (this->d))
+ template <int N>
+ int f37 (int a);
+ int e;
+};
+
+void
+f38 (D &d)
+{
+ d.f37 <16> (6);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-2.C
new file mode 100644
index 000000000..a6151015b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/declare-simd-2.C
@@ -0,0 +1,98 @@
+// Test parsing of #pragma omp declare simd
+// { dg-do compile }
+
+#pragma omp declare simd
+int a; // { dg-error "not immediately followed by function declaration or definition" }
+
+#pragma omp declare simd
+int fn1 (int a), fn2 (int a); // { dg-error "not immediately followed by a single function declaration or definition" }
+
+#pragma omp declare simd
+int b, fn3 (int a); // { dg-error "not immediately followed by function declaration or definition" }
+
+#pragma omp declare simd linear (a)
+int fn4 (int a), c; // { dg-error "not immediately followed by function declaration or definition" }
+
+#pragma omp declare simd
+extern "C" // { dg-error "not immediately followed by function declaration or definition" }
+{
+ int fn5 (int a);
+}
+
+#pragma omp declare simd // { dg-error "not immediately followed by function declaration or definition" }
+namespace N1
+{
+ int fn6 (int a);
+}
+
+#pragma omp declare simd simdlen (4)
+struct A
+{ // { dg-error "not immediately followed by function declaration or definition" }
+ int fn7 (int a);
+};
+
+#pragma omp declare simd
+template <typename T>
+struct B
+{ // { dg-error "not immediately followed by function declaration or definition" }
+ int fn8 (int a);
+};
+
+struct C
+{
+#pragma omp declare simd // { dg-error "not immediately followed by function declaration or definition" }
+ public: // { dg-error "expected unqualified-id before" }
+ int fn9 (int a);
+};
+
+int t;
+
+#pragma omp declare simd
+#pragma omp declare simd
+#pragma omp threadprivate(t) // { dg-error "not immediately followed by function declaration or definition" }
+int fn10 (int a);
+
+#pragma omp declare simd inbranch notinbranch // { dg-error "clause is incompatible with" }
+int fn11 (int);
+
+struct D
+{
+ int d;
+ #pragma omp declare simd simdlen (N) linear (a : sizeof (e) + sizeof (this->e)) // { dg-error "was not declared" }
+ template <int N>
+ int fn12 (int a);
+ int e;
+};
+
+#pragma omp declare simd aligned (a, b, c, d)
+int fn13 (int *a, int b[64], int *&c, int (&d)[64]);
+
+#pragma omp declare simd aligned (a) // { dg-error "neither a pointer nor an array" }
+int fn14 (int a);
+
+#pragma omp declare simd aligned (b) // { dg-error "neither a pointer nor an array" }
+int fn14 (int &b);
+
+#pragma omp declare simd aligned (c) // { dg-error "neither a pointer nor an array" }
+int fn14 (float c);
+
+#pragma omp declare simd aligned (d) // { dg-error "neither a pointer nor an array" }
+int fn14 (double &d);
+
+#pragma omp declare simd aligned (e) // { dg-error "neither a pointer nor an array" }
+int fn14 (D e);
+
+#pragma omp declare simd linear(a:7) uniform(a) // { dg-error "appears more than once" }
+int f15 (int a);
+#pragma omp declare simd linear(a) linear(a) // { dg-error "appears more than once" }
+int f16 (int a);
+#pragma omp declare simd linear(a) linear(a:7) // { dg-error "appears more than once" }
+int f17 (int a);
+#pragma omp declare simd linear(a:6) linear(a:6)// { dg-error "appears more than once" }
+int f18 (int a);
+#pragma omp declare simd uniform(a) uniform(a) // { dg-error "appears more than once" }
+int f19 (int a);
+#pragma omp declare simd uniform(a) aligned (a: 32)
+int f20 (int *a);
+
+// { dg-error "has no member" "" { target *-*-* } 61 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-1.C
new file mode 100644
index 000000000..33027de55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-1.C
@@ -0,0 +1,70 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+extern int a[][10], a2[][10];
+int b[10], c[10][2], d[10], e[10], f[10];
+int b2[10], c2[10][2], d2[10], e2[10], f2[10];
+int k[10], l[10], m[10], n[10], o;
+int *p;
+void bar (void);
+int t[10];
+#pragma omp threadprivate (t)
+
+template <int N>
+void
+foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
+ int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9])
+{
+ #pragma omp task depend(out: t[2:5])
+ ;
+ #pragma omp task depend(inout: k[0.5:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(in: l[:7.5f]) // { dg-error "length \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(out: m[p:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(inout: n[:p]) // { dg-error "length \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(in: o[2:5]) // { dg-error "does not have pointer or array type" }
+ ;
+ #pragma omp task depend(out: a[:][2:4]) // { dg-error "array type length expression must be specified" }
+ ;
+ #pragma omp task depend(in: d[11:]) // { dg-error "low bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: e[:11]) // { dg-error "length \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" }
+ ;
+ #pragma omp task depend(out: i[:1][11:]) // { dg-error "low bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(in: j[3:4][:10]) // { dg-error "length \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: j[30:10][5:5]) // { dg-error "high bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: a2[:3][2:4])
+ ;
+ #pragma omp task depend(inout: b2[0:])
+ ;
+ #pragma omp task depend(inout: c2[:3][1:1])
+ ;
+ #pragma omp task depend(in: d2[9:])
+ ;
+ #pragma omp task depend(out: e2[:10])
+ ;
+ #pragma omp task depend(out: f2[1:9])
+ ;
+ #pragma omp task depend(in: g2[:2][2:4])
+ ;
+ #pragma omp task depend(in: h2[2:2][0:])
+ ;
+ #pragma omp task depend(inout: h2[:1][:3])
+ ;
+ #pragma omp task depend(out: i2[:1][9:])
+ ;
+ #pragma omp task depend(in: j2[3:4][:9])
+ ;
+ #pragma omp task depend(out: j2[30:10][5:4])
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-2.C
new file mode 100644
index 000000000..c3f19658c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/depend-2.C
@@ -0,0 +1,87 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+extern int a[][10], a2[][10];
+int b[10], c[10][2], d[10], e[10], f[10];
+int b2[10], c2[10][2], d2[10], e2[10], f2[10];
+int k[10], l[10], m[10], n[10], o;
+int *p;
+void bar (void);
+int t[10];
+#pragma omp threadprivate (t)
+
+template <int N>
+void
+foo (int g[3][10], int h[4][8], int i[2][10], int j[][9],
+ int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9])
+{
+ #pragma omp task depend(in: bar[2:5]) // { dg-error "is not a variable" }
+ ;
+ #pragma omp task depend(out: t[2:5])
+ ;
+ #pragma omp task depend(inout: k[0.5:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(in: l[:7.5f]) // { dg-error "length \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(out: m[p:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(inout: n[:p]) // { dg-error "length \[^\n\r]* of array section does not have integral type" }
+ ;
+ #pragma omp task depend(in: o[2:5]) // { dg-error "does not have pointer or array type" }
+ ;
+ #pragma omp task depend(out: a[:][2:4]) // { dg-error "array type length expression must be specified" }
+ ;
+ #pragma omp task depend(inout: b[-1:]) // { dg-error "negative low bound in array section" }
+ ;
+ #pragma omp task depend(inout: c[:-3][1:1]) // { dg-error "negative length in array section" }
+ ;
+ #pragma omp task depend(in: d[11:]) // { dg-error "low bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: e[:11]) // { dg-error "length \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" }
+ ;
+ #pragma omp task depend(in: h[2:2][-1:]) // { dg-error "negative low bound in array section" }
+ ;
+ #pragma omp task depend(inout: h[:1][:-3]) // { dg-error "negative length in array section" }
+ ;
+ #pragma omp task depend(out: i[:1][11:]) // { dg-error "low bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(in: j[3:4][:10]) // { dg-error "length \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: j[30:10][5:5]) // { dg-error "high bound \[^\n\r]* above array section size" }
+ ;
+ #pragma omp task depend(out: a2[:3][2:4])
+ ;
+ #pragma omp task depend(inout: b2[0:])
+ ;
+ #pragma omp task depend(inout: c2[:3][1:1])
+ ;
+ #pragma omp task depend(in: d2[9:])
+ ;
+ #pragma omp task depend(out: e2[:10])
+ ;
+ #pragma omp task depend(out: f2[1:9])
+ ;
+ #pragma omp task depend(in: g2[:2][2:4])
+ ;
+ #pragma omp task depend(in: h2[2:2][0:])
+ ;
+ #pragma omp task depend(inout: h2[:1][:3])
+ ;
+ #pragma omp task depend(out: i2[:1][9:])
+ ;
+ #pragma omp task depend(in: j2[3:4][:9])
+ ;
+ #pragma omp task depend(out: j2[30:10][5:4])
+ ;
+}
+
+void
+baz (int g[3][10], int h[4][8], int i[2][10], int j[][9],
+ int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9])
+{
+ foo<0> (g, h, i, j, g2, h2, i2, j2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-1.C
new file mode 100644
index 000000000..3c6a34bff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-1.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp flush
+}
+
+int x;
+
+void f2(bool p)
+{
+ int z;
+ if (p)
+ {
+ #pragma omp flush (x)
+ }
+ else
+ {
+ #pragma omp flush (x, z, p)
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_synchronize" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-2.C
new file mode 100644
index 000000000..a5c0df89c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/flush-2.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+void f1(void)
+{
+ #pragma omp flush a // { dg-error "expected" }
+ #pragma omp flush ( // { dg-error "expected" }
+ #pragma omp flush (b // { dg-error "declared|expected" }
+ #pragma omp flush (c d) // { dg-error "declared|expected" }
+ #pragma omp flush (e) // { dg-error "declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-1.C
new file mode 100644
index 000000000..f8bb9d547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-1.C
@@ -0,0 +1,49 @@
+// { dg-do compile }
+
+extern void baz(int);
+void foo (int j, int k)
+{
+ int i;
+
+ /* Valid loops. */
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i <= 10; i+=4)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i > 0; i = i - 1)
+ baz (j);
+
+ #pragma omp for
+ for (i = j; i >= k; i--)
+ baz (i);
+
+ // Malformed parallel loops.
+ #pragma omp for
+ i = 0; // { dg-error "for statement expected" }
+ for ( ; i < 10; )
+ {
+ baz (i);
+ i++;
+ }
+
+ #pragma omp for
+ for (i = 0; ; i--) // { dg-error "missing controlling predicate" }
+ {
+ if (i >= 10)
+ break; // { dg-error "break" }
+ baz (i);
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10 && j > 4; i-=3) // { dg-error "invalid controlling predicate" }
+ baz (i);
+
+ #pragma omp for
+ for (i = 0; i < 10; i-=3, j+=2) // { dg-error "invalid increment expression" }
+ baz (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-10.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-10.C
new file mode 100644
index 000000000..f21404249
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-10.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-11.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-11.C
new file mode 100644
index 000000000..d15576d2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-11.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+extern void baz (int);
+
+void foo (int j, int k)
+{
+ #pragma omp for
+ for (int l = j; l < k; l++)
+ baz (l);
+
+ #pragma omp for
+ for (int i = 0, m = 0; m < 10; m++) // { dg-error "" }
+ baz (m);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-12.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-12.C
new file mode 100644
index 000000000..98318d7d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-12.C
@@ -0,0 +1,12 @@
+int foo (void)
+{
+ int i, a;
+
+ a = 30;
+
+ #pragma omp parallel for lastprivate (a)
+ for (i = 0; i < 10; i++)
+ a = a + i;
+
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-13.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-13.C
new file mode 100644
index 000000000..16e971f19
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-13.C
@@ -0,0 +1,18 @@
+// At one point in development, a typo disabled the remapping of the
+// for iteration variable as private.
+
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-lower" }
+
+extern void bar(int);
+void foo(void)
+{
+ int i;
+
+#pragma omp parallel for default(none)
+ for (i = 0; i < 10; i++)
+ bar(i);
+}
+
+// { dg-final { scan-tree-dump-times "omp_data_o" 0 "lower" } }
+// { dg-final { cleanup-tree-dump "lower" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-14.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-14.C
new file mode 100644
index 000000000..fb2641370
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-14.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+extern void foo (int *);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1, j = 6, k = 8;
+#pragma omp parallel shared(d) private(i) num_threads (4)
+ {
+ i = 4;
+#pragma omp for lastprivate(j)
+ for (j = 1; j <= k; j++)
+ printf ("%s %d %d %d %p %g\n", "Hello, World!", i, j, k, &j, d);
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-15.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-15.C
new file mode 100644
index 000000000..25eea2ad2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-15.C
@@ -0,0 +1,35 @@
+// PR c++/24512
+// { dg-do compile }
+
+template<typename T> void foo ()
+{
+#pragma omp for
+ for (int i = 0; i < 10; i++);
+
+#pragma omp for
+ for (int i = 0; i < 10; i++);
+
+#pragma omp for
+ for (T j = 0; j < 10; j++);
+
+#pragma omp for
+ for (T j = 0; j < 10; j++);
+
+#pragma omp parallel for
+ for (int k = 0; k < 10; k++);
+
+#pragma omp parallel for
+ for (int k = 0; k < 10; k++);
+
+#pragma omp parallel for
+ for (T l = 0; l < 10; l++);
+
+#pragma omp parallel for
+ for (T l = 0; l < 10; l++);
+}
+
+void bar ()
+{
+ foo<int> ();
+ foo<long> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-16.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-16.C
new file mode 100644
index 000000000..dbbed8fe5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-16.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+template<typename T>
+void foo ()
+{
+#pragma omp for
+ for (unsigned int i = 0; i < 10; i++);
+#pragma omp for
+ for (int j = 0; ; j++); // { dg-error "missing controlling predicate" }
+#pragma omp for
+ for (int k = 0; k == 1; k++); // { dg-error "invalid controlling predicate" }
+#pragma omp for
+ for (int l = 0; l < 10; ); // { dg-error "missing increment expression" }
+#pragma omp for
+ for (int m = 0; m < 10; m *= 3); // { dg-error "invalid increment expression" }
+#pragma omp for
+ for (T n = 0; ; n++); // { dg-error "missing controlling predicate" }
+#pragma omp for
+ for (T o = 0; o == 1; o++); // Error here is emitted only during
+ // instantiation
+#pragma omp for
+ for (T p = 0; p < 10; ); // { dg-error "missing increment expression" }
+#pragma omp for
+ for (T q = 0; q < 10; q *= 3); // Error here is emitted only during
+ // instantiation
+}
+
+void bar ()
+{
+#pragma omp for
+ for (int m = 0; m < 10; m *= 3); // { dg-error "invalid increment expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-17.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-17.C
new file mode 100644
index 000000000..9634e59c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-17.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ long n = 10;
+ int i;
+#pragma omp for
+ for (i=0; i < n; ++i) ;
+#pragma omp for
+ for (i=0; n > i; ++i) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-18.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-18.C
new file mode 100644
index 000000000..0a5052674
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-18.C
@@ -0,0 +1,67 @@
+// { dg-do compile }
+extern int bar (int);
+
+void
+foo (void)
+{
+ int j, k = 1, l = 30, m = 4;
+ long int o = 4;
+ long long int p = 0;
+#pragma omp for
+ for (j = k; j <= l; j += m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += bar (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + bar (m - 1))
+ ;
+#pragma omp for
+ for (j = ({ int n; n = k; n; }); j <= l; j++)
+ ;
+#pragma omp for
+ for (j = k; j <= ({ int n; n = l; n; }); j++)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += ({ int n; n = 1; n; }))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += m + 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + 1 + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + m + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o + p)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o + p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o + p)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-19.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-19.C
new file mode 100644
index 000000000..7da74a780
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-19.C
@@ -0,0 +1,41 @@
+// PR c++/38348
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+const char *p = "abcde";
+
+template <typename T>
+void
+f1 (void)
+{
+#pragma omp for
+ for (void *q = (void *)p; q < (void *) (p + 4); q++) // { dg-warning "forbids incrementing a pointer of type" }
+ ;
+}
+
+template <typename T>
+void
+f2 (void)
+{
+#pragma omp for
+ for (const char *q = p; q < p + 4; q++)
+ ;
+}
+
+template <typename T>
+void
+f3 (void)
+{
+#pragma omp for
+ for (T q = T (p); q < T (p + 4); q++) // { dg-warning "forbids incrementing a pointer of type" }
+ ;
+}
+
+int
+main (void)
+{
+ f1 <int> (); // { dg-message "required from here" }
+ f2 <int> ();
+ f3 <const char *> ();
+ f3 <void *> (); // { dg-message "required from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-2.C
new file mode 100644
index 000000000..37e5929af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-2.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ int i;
+
+ #pragma omp for nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for nowait nowait /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered ordered /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-20.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-20.C
new file mode 100644
index 000000000..7b57b16b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-20.C
@@ -0,0 +1,16 @@
+// PR c++/60146
+// { dg-do compile }
+// { dg-options -fopenmp }
+
+int foo() { return 0; }
+
+template<typename T> void bar()
+{
+#pragma omp parallel for
+ for (T i = foo(); i < 8; ++i) {}
+}
+
+void baz()
+{
+ bar<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-3.C
new file mode 100644
index 000000000..fcf5a2c1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-3.C
@@ -0,0 +1,62 @@
+// { dg-do compile }
+
+int bar ();
+
+void foo()
+{
+ int i;
+
+ #pragma omp for schedule // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule static // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static )
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( foo ) // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 ) nowait // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1, 1 ) nowait // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 + 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1.0 ) // { dg-error "integral" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime, bar ()) // { dg-error "does not take" }
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-4.C
new file mode 100644
index 000000000..fb6994ea2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-4.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-5.C
new file mode 100644
index 000000000..5912a4e55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-5.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-6.C
new file mode 100644
index 000000000..100ee2c8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-6.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-7.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-7.C
new file mode 100644
index 000000000..10763dc59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-7.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(static) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-8.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-8.C
new file mode 100644
index 000000000..1bc66c49a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-8.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-9.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-9.C
new file mode 100644
index 000000000..af99e216e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/for-9.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/gomp.exp b/gcc-4.9/gcc/testsuite/g++.dg/gomp/gomp.exp
new file mode 100644
index 000000000..bcb9ae385
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/gomp.exp
@@ -0,0 +1,35 @@
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+if ![check_effective_target_fopenmp] {
+ return
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+g++-dg-runtest [lsort [concat \
+ [find $srcdir/$subdir *.C] \
+ [find $srcdir/c-c++-common/gomp *.c]]] "-fopenmp"
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-1.C
new file mode 100644
index 000000000..b04610d2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+#define N 10
+
+extern void bar(void);
+void foo(void)
+{
+ #pragma omp parallel num_threads(N)
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-2.C
new file mode 100644
index 000000000..75d6490cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+#define p parallel
+#define s(x) shared(x##1, x##2)
+#define d(x) default(x)
+
+void bar(int, int, int, int);
+void foo(void)
+{
+ int a1, a2, b1, b2;
+
+ #pragma omp p s(a) s(b) d(none)
+ bar(a1, a2, b1, b2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-3.C
new file mode 100644
index 000000000..3606db566
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-3.C
@@ -0,0 +1,26 @@
+// PR preprocessor/27746
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-omplower" }
+
+#define omp FOO
+#define p parallel
+#define omp_parallel _Pragma ("omp parallel")
+#define omp_p _Pragma ("omp p")
+
+void bar (void);
+
+void
+foo (void)
+{
+ #pragma omp parallel
+ bar ();
+ #pragma omp p
+ bar ();
+ omp_parallel
+ bar ();
+ omp_p
+ bar ();
+}
+
+// { dg-final { scan-tree-dump-times "#pragma omp parallel" 4 "omplower" } }
+// { dg-final { cleanup-tree-dump "omplower" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-4.C
new file mode 100644
index 000000000..9fc45b143
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/macro-4.C
@@ -0,0 +1,29 @@
+// PR preprocessor/27746
+// { dg-do compile }
+// { dg-options "-fopenmp -Wunknown-pragmas" }
+
+#define p _Pragma ("omp parallel")
+#define omp_p _Pragma ("omp p")
+
+void bar (void);
+
+void
+foo (void)
+{
+#pragma omp p // { dg-warning "ignoring #pragma omp _Pragma" }
+ bar ();
+ omp_p // { dg-warning "ignoring #pragma omp _Pragma" }
+ bar ();
+}
+
+#define parallel serial
+#define omp_parallel _Pragma ("omp parallel")
+
+void
+baz (void)
+{
+#pragma omp parallel // { dg-warning "ignoring #pragma omp serial" }
+ bar ();
+ omp_parallel // { dg-warning "ignoring #pragma omp serial" }
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-1.C
new file mode 100644
index 000000000..2681c216a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-1.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+
+ #pragma omp master
+ {
+ bar(1);
+ bar(2);
+ }
+
+ /* Yes, this is legal -- structured-block contains statement contains
+ openmp-construct contains master-construct. */
+ #pragma omp master
+ #pragma omp master
+ #pragma omp master
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-2.C
new file mode 100644
index 000000000..053206627
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp master asdf /* { dg-error "expected" } */
+ #pragma omp master
+} /* { dg-error "expected" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-3.C
new file mode 100644
index 000000000..37966106d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/master-3.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+}
+
+/* { dg-final { scan-tree-dump-times "omp_get_thread_num" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/method-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/method-1.C
new file mode 100644
index 000000000..3d8235656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/method-1.C
@@ -0,0 +1,18 @@
+/* PR c++/24513 */
+/* { dg-do compile } */
+
+struct S
+{
+ void foo (int *p)
+ {
+#pragma omp parallel for
+ for (int i = 0; i < 1000; ++i)
+ p[i]=0;
+ }
+ void bar ()
+ {
+#pragma omp master
+ j = 2;
+ }
+ int j;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-1.C
new file mode 100644
index 000000000..e8e057a61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-1.C
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp-simd -fdump-tree-original" } */
+
+#pragma omp declare simd
+float bar(float b) {
+ return b*b;
+}
+
+void foo(int n, float *a, float *b)
+{
+ int i;
+#pragma omp simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp for simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp distribute simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp distribute parallel for simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp parallel for simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp teams distribute simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp target teams distribute simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp teams distribute parallel for simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+#pragma omp target teams distribute parallel for simd
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+}
+
+/* { dg-final { scan-tree-dump-times "pragma omp simd" 9 "original" } } */
+/* { dg-final { scan-tree-dump-not "omp for" "original" } } */
+/* { dg-final { scan-tree-dump-not "omp distribute" "original" } } */
+/* { dg-final { scan-tree-dump-not "omp teams" "original" } } */
+/* { dg-final { scan-tree-dump-not "omp target" "original" } } */
+/* { dg-final { scan-tree-dump-not "omp parallel" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-2.C
new file mode 100644
index 000000000..ad9b441f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/openmp-simd-2.C
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp-simd -fdump-tree-original" } */
+
+extern void abort ();
+int a[1024] __attribute__((aligned (32))) = { 1 };
+struct S { int s; };
+#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:int:omp_out += omp_in)
+
+__attribute__((noinline, noclone)) int
+foo (void)
+{
+ int i, u = 0;
+ struct S s, t;
+ s.s = 0; t.s = 0;
+ #pragma omp simd aligned(a : 32) reduction(+:s) reduction(foo:t, u)
+ for (i = 0; i < 1024; i++)
+ {
+ int x = a[i];
+ s.s += x;
+ t.s += x;
+ u += x;
+ }
+ if (t.s != s.s || u != s.s)
+ abort ();
+ return s.s;
+}
+
+
+void bar(int n, float *a, float *b)
+{
+ int i;
+#pragma omp parallel for simd num_threads(4) safelen(64)
+ for (i = 0; i < n ; i++)
+ a[i] = b[i];
+}
+
+/* { dg-final { scan-tree-dump-times "Function void omp declare reduction operator\\+" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "Function void omp declare reduction foo" 2 "original" } } */
+/* { dg-final { scan-tree-dump-times "pragma omp simd reduction\\(u\\) reduction\\(t\\) reduction\\(\\+:s\\) aligned\\(a:32\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "pragma omp simd safelen\\(64\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-not "omp parallel" "original" } } */
+/* { dg-final { scan-tree-dump-not "omp for" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-1.C
new file mode 100644
index 000000000..a1cd7f486
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-1.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp ordered
+ bar(0);
+
+ #pragma omp ordered
+ {
+ bar(1);
+ bar(2);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_end" 2 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-2.C
new file mode 100644
index 000000000..6c2b4329c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/ordered-2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp ordered asdf /* { dg-error "expected" } */
+ #pragma omp ordered
+} /* { dg-error "expected" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-1.C
new file mode 100644
index 000000000..c5c233b76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ i++;
+ }
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-2.C
new file mode 100644
index 000000000..68e577766
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-2.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ i++; // { dg-error "not specified" }
+ }
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-3.C
new file mode 100644
index 000000000..633d7ba59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-3.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1;
+#pragma omp parallel shared(d) private(i) num_threads (4 + i)
+ {
+ i = 4;
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-4.C
new file mode 100644
index 000000000..ca06aeef9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-4.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+extern int foo(void);
+extern void bar(void);
+
+int main ()
+{
+ /* Malformed uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () > 10) if (foo () == 3) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ #pragma omp parallel num_threads (3) num_threads (20) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ /* Valid uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () == 10) num_threads (foo ())
+ {
+ bar ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-5.C
new file mode 100644
index 000000000..b8cd174a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/parallel-5.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ int i;
+#pragma omp parallel for nowait /* { dg-error "'nowait'" } */
+ for (i = 0; i < 10; i++)
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr24849.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr24849.C
new file mode 100644
index 000000000..f35643719
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr24849.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+template<typename T> struct Healpix_Map {
+ T *map;
+ int npix_;
+
+ void Import_nograde (const Healpix_Map<T> &orig) {
+#pragma omp parallel
+{
+ int m;
+#pragma omp for schedule (dynamic)
+ for (m=0; m<npix_; ++m) map[m] = orig.map[m];
+}
+ }
+ };
+
+void foo(Healpix_Map<int> &a, Healpix_Map<int> &b) {
+ a.Import_nograde(b);
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25874.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25874.C
new file mode 100644
index 000000000..83573f10a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25874.C
@@ -0,0 +1,25 @@
+// { dg-options "-O -fopenmp" }
+
+int foo();
+
+struct wigner_d
+ {
+ void recurse () {
+ int dd;
+ for (int j=0; j<=1; ++j) {
+#pragma omp parallel
+ dd=5;
+ }
+ }
+ };
+
+template<typename T> void rotate_alm(T arg)
+ {
+ wigner_d rec;
+ rec.recurse();
+#pragma omp parallel
+ foo();
+ }
+
+template void rotate_alm(float arg);
+template void rotate_alm(double arg);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25996.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25996.C
new file mode 100644
index 000000000..6b50ff030
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr25996.C
@@ -0,0 +1,32 @@
+// PR c/25996
+
+void
+test1 (void)
+{
+#pragma omp for
+ for (i = 0; i < 1; ++i); // { dg-error "not declared|expected iteration decl" }
+}
+
+void
+test2 (void)
+{
+ int i;
+#pragma omp for
+ for (i = j; i < 1; ++i); // { dg-error "not declared|expected iteration decl" }
+}
+
+void
+test3 (void)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < j; ++i); // { dg-error "not declared|invalid controlling predicate" }
+}
+
+void
+test4 (void)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < 10; i += j); // { dg-error "not declared|invalid increment expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-1.C
new file mode 100644
index 000000000..8ec543bd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-1.C
@@ -0,0 +1,15 @@
+// PR middle-end/26611
+// { dg-do compile }
+
+void
+foo ()
+{
+#pragma omp parallel
+ try
+ {
+ int q = 1;
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-2.C
new file mode 100644
index 000000000..f95179891
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26611-2.C
@@ -0,0 +1,15 @@
+// PR middle-end/26611
+// { dg-do compile }
+
+void
+foo ()
+{
+#pragma omp parallel
+ try
+ {
+ }
+ catch (...)
+ {
+ int q = 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-1.C
new file mode 100644
index 000000000..17e01b3d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-1.C
@@ -0,0 +1,16 @@
+// PR c++/26690
+// { dg-do compile }
+
+struct A // { dg-message "A::A|candidate expects" }
+{
+ A (int); // { dg-message "note" }
+};
+
+void
+foo ()
+{
+ A a(0);
+#pragma omp parallel private (a) // { dg-error "no matching function" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-2.C
new file mode 100644
index 000000000..ca01a3a59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26690-2.C
@@ -0,0 +1,17 @@
+// PR c++/26690
+// { dg-do compile }
+
+struct A
+{
+ A (int x = 6); // { dg-message "A::A\\(int\\)" }
+ A (long long x = 12LL); // { dg-message "note" }
+};
+
+void
+foo ()
+{
+ A a(6);
+#pragma omp parallel private (a) // { dg-error "call of overloaded" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 14 }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-1.C
new file mode 100644
index 000000000..d24eddbdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-1.C
@@ -0,0 +1,23 @@
+// PR middle-end/26823
+// { dg-do compile }
+
+struct A
+{
+ ~A () {}
+};
+
+struct B
+{
+ A a;
+ B ();
+};
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ B b[1];
+ new int;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-2.C
new file mode 100644
index 000000000..d4747cff5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26823-2.C
@@ -0,0 +1,29 @@
+// PR middle-end/26823
+// { dg-do compile }
+
+struct A
+{
+ ~A () {}
+};
+
+extern void bar ();
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ {
+ A a;
+ bar ();
+ }
+ {
+ A a;
+ bar ();
+ }
+ {
+ A a;
+ bar ();
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26913.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26913.C
new file mode 100644
index 000000000..4f5bb2834
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr26913.C
@@ -0,0 +1,19 @@
+// PR middle-end/26913
+
+struct A
+{
+ ~A () throw ();
+};
+
+void foo (A);
+
+A bar () throw ();
+
+void baz ()
+{
+#pragma omp parallel
+ {
+ A a;
+ foo (bar ());
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27310.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27310.C
new file mode 100644
index 000000000..d921e6af2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27310.C
@@ -0,0 +1,22 @@
+// PR middle-end/27310
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+struct A
+{
+ ~A ();
+};
+
+struct B
+{
+ A a, b;
+};
+
+void
+foo ()
+{
+ A c, d;
+
+#pragma omp parallel
+ B e;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27325.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27325.C
new file mode 100644
index 000000000..05bc481d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27325.C
@@ -0,0 +1,25 @@
+// PR middle-end/27325
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+struct A { A(); ~A(); int i; };
+
+int
+foo ()
+{
+ A a;
+#pragma omp parallel private (a)
+ for (int i = 0; i < 5; ++i)
+ a.i++;
+ return 0;
+}
+
+int
+bar ()
+{
+ A a;
+#pragma omp for private (a)
+ for (int i = 0; i < 5; ++i)
+ a.i++;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-1.C
new file mode 100644
index 000000000..6c26070ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-1.C
@@ -0,0 +1,22 @@
+// PR middle-end/27337
+// { dg-do compile }
+
+struct S
+{
+ S ();
+ ~S ();
+ double &operator* () const;
+};
+
+S
+foo ()
+{
+ int i;
+ S ret;
+
+#pragma omp parallel for
+ for (i = 0; i < 2; i++)
+ *ret += i;
+
+ return ret;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-2.C
new file mode 100644
index 000000000..d1ae4a139
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27337-2.C
@@ -0,0 +1,22 @@
+// PR middle-end/27337
+// { dg-do compile }
+
+struct S
+{
+ S ();
+ ~S ();
+ int i;
+};
+
+S
+foo ()
+{
+ int i;
+ S ret;
+
+#pragma omp parallel for firstprivate (ret) lastprivate (ret)
+ for (i = 0; i < 2; i++)
+ ret.i += i;
+
+ return ret;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27359.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27359.C
new file mode 100644
index 000000000..603898c32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27359.C
@@ -0,0 +1,10 @@
+// PR c++/27359
+// { dg-do compile }
+
+void
+foo ()
+{
+#pragma omp parallel for
+ for (int i; i < 1; ++i) // { dg-error "expected|was not declared" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27415.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27415.C
new file mode 100644
index 000000000..81f0ed5c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27415.C
@@ -0,0 +1,50 @@
+// PR middle-end/27415
+// { dg-do compile }
+
+void
+test1 (void)
+{
+ int i = 0;
+#pragma omp parallel
+#pragma omp for firstprivate (i) // { dg-error "should not be firstprivate" }
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test2 (void)
+{
+ int i = 0;
+#pragma omp parallel for firstprivate (i)
+ for (i = 0; i < 10; i++) // { dg-error "should not be firstprivate" }
+ ;
+}
+
+void
+test3 (void)
+{
+ int i = 0;
+#pragma omp parallel
+#pragma omp for reduction (+:i) // { dg-error "should not be reduction" }
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test4 (void)
+{
+ int i = 0;
+#pragma omp parallel for reduction (*:i)
+ for (i = 0; i < 10; i++) // { dg-error "should not be reduction" }
+ ;
+}
+
+void
+test5 (void)
+{
+ int i = 0;
+#pragma omp parallel firstprivate (i)
+#pragma omp for
+ for (i = 0; i < 10; i++)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27499.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27499.C
new file mode 100644
index 000000000..4e0d5b1a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr27499.C
@@ -0,0 +1,13 @@
+// PR c/27499
+// { dg-do compile }
+
+extern void bar (unsigned int);
+
+void
+foo (void)
+{
+ unsigned int i;
+#pragma omp for
+ for (i = 0; i < 64; ++i)
+ bar (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-1.C
new file mode 100644
index 000000000..efb89ffa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-1.C
@@ -0,0 +1,45 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+static inline void
+foo ()
+{
+#pragma omp parallel
+ for (;;)
+ ;
+}
+
+static inline void
+bar ()
+{
+#pragma omp parallel
+ baz ();
+}
+
+void
+foo1 ()
+{
+ foo ();
+}
+
+void
+foo2 ()
+{
+ foo ();
+}
+
+void
+bar1 ()
+{
+ bar ();
+}
+
+void
+bar2 ()
+{
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-10.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-10.C
new file mode 100644
index 000000000..2e816da7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-10.C
@@ -0,0 +1,24 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// This is invalid code, but we don't emit diagnostics for it, nevertheless
+// we test that we don't ICE on it.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+void
+foo1 ()
+{
+ int i;
+#pragma omp for schedule (static)
+ for (i = 0; i < 2834; i++)
+ throw 0;
+}
+
+void
+foo2 ()
+{
+ int i;
+#pragma omp parallel for schedule (static)
+ for (i = 0; i < 2834; i++)
+ throw 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-2.C
new file mode 100644
index 000000000..0976ca762
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-2.C
@@ -0,0 +1,98 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+void
+foo1 ()
+{
+#pragma omp sections
+ {
+ for (;;)
+ ;
+ }
+}
+
+void
+bar1 ()
+{
+#pragma omp sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ baz ();
+ }
+}
+
+void
+foo2 ()
+{
+#pragma omp sections
+ {
+ ;
+#pragma omp section
+ for (;;)
+ ;
+ }
+}
+
+void
+bar2 ()
+{
+#pragma omp sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ ;
+ }
+}
+
+void
+foo3 ()
+{
+#pragma omp parallel sections
+ {
+ for (;;)
+ ;
+ }
+}
+
+void
+bar3 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ baz ();
+ }
+}
+
+void
+foo4 ()
+{
+#pragma omp parallel sections
+ {
+ ;
+#pragma omp section
+ for (;;)
+ ;
+ }
+}
+
+void
+bar4 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-3.C
new file mode 100644
index 000000000..b98c24e55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-3.C
@@ -0,0 +1,62 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+void
+foo1 ()
+{
+#pragma omp single
+ for (;;);
+}
+
+void
+bar1 ()
+{
+#pragma omp single
+ baz ();
+}
+
+void
+foo2 ()
+{
+#pragma omp master
+ for (;;);
+}
+
+void
+bar2 ()
+{
+#pragma omp master
+ baz ();
+}
+
+void
+foo3 ()
+{
+#pragma omp ordered
+ for (;;);
+}
+
+void
+bar3 ()
+{
+#pragma omp ordered
+ baz ();
+}
+
+void
+foo4 ()
+{
+#pragma omp critical
+ for (;;);
+}
+
+void
+bar4 ()
+{
+#pragma omp critical
+ baz ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-4.C
new file mode 100644
index 000000000..b044fdf70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-4.C
@@ -0,0 +1,44 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+void
+foo1 ()
+{
+ int i;
+#pragma omp for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 ()
+{
+ int i;
+#pragma omp for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 ()
+{
+ int i;
+#pragma omp parallel for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 ()
+{
+ int i;
+#pragma omp parallel for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-5.C
new file mode 100644
index 000000000..cf91dd6dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-5.C
@@ -0,0 +1,44 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+void
+foo1 ()
+{
+ int i;
+#pragma omp for schedule (static)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 ()
+{
+ int i;
+#pragma omp for schedule (static)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 ()
+{
+ int i;
+#pragma omp parallel for schedule (static)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 ()
+{
+ int i;
+#pragma omp parallel for schedule (static)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-6.C
new file mode 100644
index 000000000..6384d0928
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-6.C
@@ -0,0 +1,44 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+extern void baz () __attribute__ ((noreturn));
+
+void
+foo1 ()
+{
+ int i;
+#pragma omp for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 ()
+{
+ int i;
+#pragma omp for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 ()
+{
+ int i;
+#pragma omp parallel for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 ()
+{
+ int i;
+#pragma omp parallel for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-7.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-7.C
new file mode 100644
index 000000000..be7d6ae9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-7.C
@@ -0,0 +1,32 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// This is invalid code, but we don't emit diagnostics for it, nevertheless
+// we test that we don't ICE on it.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+void
+foo ()
+{
+#pragma omp parallel
+ throw 0;
+}
+
+static inline void
+bar ()
+{
+#pragma omp parallel
+ throw 0;
+}
+
+void
+bar1 ()
+{
+ bar ();
+}
+
+void
+bar2 ()
+{
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-8.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-8.C
new file mode 100644
index 000000000..b2a35287d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-8.C
@@ -0,0 +1,94 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// This is invalid code, but we don't emit diagnostics for it, nevertheless
+// we test that we don't ICE on it.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+void
+foo1 ()
+{
+#pragma omp sections
+ {
+ throw 0;
+ }
+}
+
+void
+bar1 ()
+{
+#pragma omp sections
+ {
+#pragma omp section
+ throw 0;
+#pragma omp section
+ throw 0;
+ }
+}
+
+void
+foo2 ()
+{
+#pragma omp sections
+ {
+ ;
+#pragma omp section
+ throw 0;
+ }
+}
+
+void
+bar2 ()
+{
+#pragma omp sections
+ {
+#pragma omp section
+ throw 0;
+#pragma omp section
+ ;
+ }
+}
+
+void
+foo3 ()
+{
+#pragma omp parallel sections
+ {
+ throw 0;
+ }
+}
+
+void
+bar3 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ throw 0;
+#pragma omp section
+ throw 0;
+ }
+}
+
+void
+foo4 ()
+{
+#pragma omp parallel sections
+ {
+ ;
+#pragma omp section
+ throw 0;
+ }
+}
+
+void
+bar4 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ throw 0;
+#pragma omp section
+ ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-9.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-9.C
new file mode 100644
index 000000000..b66a24729
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr29965-9.C
@@ -0,0 +1,34 @@
+// PR middle-end/29965
+// Test that OpenMP construct bodies which never return don't cause ICEs.
+// This is invalid code, but we don't emit diagnostics for it, nevertheless
+// we test that we don't ICE on it.
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+void
+foo1 ()
+{
+#pragma omp single
+ throw 0;
+}
+
+void
+foo2 ()
+{
+#pragma omp master
+ throw 0;
+}
+
+void
+foo3 ()
+{
+#pragma omp ordered
+ throw 0;
+}
+
+void
+foo4 ()
+{
+#pragma omp critical
+ throw 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30494.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30494.C
new file mode 100644
index 000000000..3f2d12058
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30494.C
@@ -0,0 +1,30 @@
+// PR middle-end/30494
+// { dg-do compile }
+
+int
+foo (int n)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < 6; i++)
+ {
+ int v[n], w[n * 3 + i];
+ v[0] = 1;
+ w[0] = 2;
+ }
+ return 0;
+}
+
+int
+bar (int n)
+{
+ int i;
+#pragma parallel omp for
+ for (i = 0; i < 6; i++)
+ {
+ int v[n], w[n * 3 + i];
+ v[0] = 1;
+ w[0] = 2;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30558.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30558.C
new file mode 100644
index 000000000..e4929220b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30558.C
@@ -0,0 +1,41 @@
+// PR tree-optimization/30558
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T> struct F
+{
+ ~F ();
+ F (T);
+ const T &operator[] (unsigned i) const;
+};
+
+template <typename T> F<T> foo (const F<T> &x)
+{
+ return F<T> (x[1]);
+}
+
+struct G
+{
+ G () { bar (2); }
+ F<int> &operator () (F<int> x);
+ void bar (int);
+};
+
+int
+main ()
+{
+ try
+ {
+ G g;
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ {
+ F<int> j (i);
+ F<int> f = g (j);
+ F<int> h = foo (f);
+ }
+ }
+ catch (int &e)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30696.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30696.C
new file mode 100644
index 000000000..8f4f2d968
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr30696.C
@@ -0,0 +1,12 @@
+inline void foo() {}
+
+int main()
+{
+ foo();
+
+#pragma omp parallel for
+ for ( int i=0; i<1; ++i )
+ foo();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31598.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31598.C
new file mode 100644
index 000000000..3ebcead5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31598.C
@@ -0,0 +1,59 @@
+// PR c++/31598
+// { dg-do compile }
+//
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo
+// 16 Apr 2007 <Theodore.Papadopoulo@sophia.inria.fr>
+
+int i;
+template <typename> struct A { A() {} };
+template <typename> struct C { C() { i++; } C(const C &) { i += 2; } };
+struct D { D() {} };
+
+struct M { typedef double E; };
+
+template <typename T>
+struct R
+{
+ R()
+ {
+ typedef A<typename T::E> B;
+ B b;
+ #pragma omp parallel for firstprivate(b) schedule(guided)
+ for (int t = 0; t < 10; ++t)
+ ;
+ }
+};
+
+template <typename T>
+struct S
+{
+ S()
+ {
+ typedef C<typename T::E> B;
+ B b;
+ #pragma omp parallel for firstprivate(b)
+ for (int t = 0; t < 10; ++t)
+ ;
+ }
+};
+
+struct U
+{
+ U()
+ {
+ D b;
+ #pragma omp parallel for firstprivate(b)
+ for (int t = 0; t < 10; ++t)
+ ;
+ }
+};
+
+int
+main ()
+{
+ R<M> r;
+ S<M> s;
+ U u;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31748.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31748.C
new file mode 100644
index 000000000..516978d28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31748.C
@@ -0,0 +1,10 @@
+// PR c++/31748
+
+struct A;
+
+void
+foo ()
+{
+#pragma omp parallel private(A) // { dg-error "struct A.*is not a variable" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31769.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31769.C
new file mode 100644
index 000000000..54945f94e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr31769.C
@@ -0,0 +1,61 @@
+// PR tree-optimization/31769
+// { dg-options "-O2 -fopenmp" }
+// { dg-do compile }
+
+struct B
+{
+ B () {}
+ virtual ~B () {}
+};
+struct C
+{
+ C (int x, int y) {}
+};
+template<typename T, int U>
+struct D
+{
+ D () {}
+ ~D () {}
+};
+struct E
+{
+ E () {}
+ ~E () {}
+ D<int, 1> e;
+};
+struct A
+{
+ B *b;
+ A () { b = __null; }
+ ~A () { if (b != __null) delete b; }
+};
+struct F : public A
+{
+ explicit F (int x) { foo (0); }
+ F (const F &x) {}
+ F (F &x, C y) {}
+ F operator () (C x) const
+ {
+ return F (const_cast<F &>(*this), x);
+ }
+ template <typename U> F & operator+= (const U &);
+ void foo (int);
+ E f;
+};
+
+int
+main ()
+{
+ try
+ {
+ F f (10);
+ F g (10);
+ C h (0, 9);
+#pragma omp parallel for
+ for (int i = 0; i < 2; ++i)
+ g += f (h);
+ }
+ catch (int &e)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr32177.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr32177.C
new file mode 100644
index 000000000..55c8483be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr32177.C
@@ -0,0 +1,46 @@
+// PR c++/32177
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+//
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 1 Jun 2007 <Theodore.Papadopoulo@sophia.inria.fr>
+
+struct A
+{
+ A () {}
+ ~A () {}
+ int s () const { return 1; }
+};
+
+void
+f1 ()
+{
+ #pragma omp parallel for
+ for (int i = 1; i <= A ().s (); ++i)
+ ;
+}
+
+void
+f2 ()
+{
+ #pragma omp parallel for
+ for (int i = A ().s (); i <= 20; ++i)
+ ;
+}
+
+void
+f3 ()
+{
+ #pragma omp parallel for
+ for (int i = 1; i <= 20; i += A ().s ())
+ ;
+}
+
+void
+f4 ()
+{
+ int i;
+ #pragma omp parallel for
+ for (i = A ().s (); i <= 20; i++)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33333.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33333.C
new file mode 100644
index 000000000..ea5079b5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33333.C
@@ -0,0 +1,19 @@
+// PR middle-end/33333
+// { dg-do compile }
+
+struct A
+{
+ int n;
+ void foo ();
+};
+
+void
+A::foo ()
+{
+ try
+ {
+ #pragma omp parallel for
+ for (int i = 0; i < n; ++i)
+ ;
+ } catch (...) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-1.C
new file mode 100644
index 000000000..62900bf65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-1.C
@@ -0,0 +1,19 @@
+// PR c++/33372
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T>
+void f ()
+{
+ extern T n ();
+#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" }
+ ;
+#pragma omp parallel for schedule(static, n)
+ for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" }
+ ;
+}
+
+void g ()
+{
+ f<int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-2.C
new file mode 100644
index 000000000..cce7ecc74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-2.C
@@ -0,0 +1,19 @@
+// PR c++/33372
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T>
+void f ()
+{
+ T n = 6;
+#pragma omp parallel num_threads(n)
+ ;
+#pragma omp parallel for schedule(static, n)
+ for (int i = 0; i < 10; i++)
+ ;
+}
+
+void g ()
+{
+ f<int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-3.C
new file mode 100644
index 000000000..8220f3c5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33372-3.C
@@ -0,0 +1,19 @@
+// PR c++/33372
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T>
+void f ()
+{
+ T n = 6;
+#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" }
+ ;
+#pragma omp parallel for schedule(static, n)
+ for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" }
+ ;
+}
+
+void g ()
+{
+ f<double> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33890.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33890.C
new file mode 100644
index 000000000..1710b928e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr33890.C
@@ -0,0 +1,34 @@
+// PR c++/33890
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ int x;
+ A () : x (0) {}
+ int & getX ();
+};
+
+template <int> void
+foo ()
+{
+ A a;
+
+#pragma omp for
+ for (int i = a.getX (); i < 10; ++i)
+ ;
+#pragma omp for
+ for (int i = 0; i < a.getX (); ++i)
+ ;
+ a.x = 1;
+#pragma omp for
+ for (int i = 0; i < 10; i += a.getX ())
+ ;
+}
+
+void
+bar ()
+{
+ foo <0> ();
+ foo <1> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34607.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34607.C
new file mode 100644
index 000000000..f032aa45d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34607.C
@@ -0,0 +1,18 @@
+// PR c++/34607
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+void
+foo ()
+{
+#pragma omp for
+ for (int i =; i < 2; ++i) // { dg-error "expected primary-expression" }
+ ;
+#pragma omp for
+ for (T i = 54; i < 56; i++) // { dg-error "was not declared|expected" }
+ ;
+ T j; // { dg-error "was not declared|expected" }
+#pragma omp for
+ for (j = 1; j < 3; j++) // { dg-error "was not declared|expected" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34608.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34608.C
new file mode 100644
index 000000000..759ab3fca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34608.C
@@ -0,0 +1,19 @@
+// PR middle-end/34608
+// { dg-do compile }
+// { dg-options "-ftest-coverage -fopenmp" }
+
+struct A
+{
+ ~A () throw ();
+};
+
+void foo (A);
+
+void
+bar ()
+{
+#pragma omp parallel
+ foo (A ());
+}
+
+// { dg-final { cleanup-coverage-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34694.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34694.C
new file mode 100644
index 000000000..c225e1545
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34694.C
@@ -0,0 +1,15 @@
+// PR middle-end/34694
+// { dg-do compile }
+// { dg-options "-O -fopenmp -Wall" }
+
+int i;
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ int j; // { dg-message "note: 'j' was declared here" }
+ i = j; // { dg-warning "is used uninitialized" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34964.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34964.C
new file mode 100644
index 000000000..a02faa2a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr34964.C
@@ -0,0 +1,6 @@
+// PR c++/34964
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+char x[] = 0; // { dg-error "initializer" }
+#pragma omp threadprivate (x)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35028.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35028.C
new file mode 100644
index 000000000..ef7ba07de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35028.C
@@ -0,0 +1,19 @@
+// PR c++/35028
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ A ();
+ A (const A &, ...);
+ ~A ();
+ A operator++ (int);
+};
+
+void
+foo ()
+{
+ A a;
+ #pragma omp parallel firstprivate (a)
+ a++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35078.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35078.C
new file mode 100644
index 000000000..1f0d9ec7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35078.C
@@ -0,0 +1,20 @@
+// PR c++/35078
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template<int> void
+foo ()
+{
+#pragma omp parallel for
+ for (int& i = 0; i < 10; ++i) // { dg-error "invalid type for iteration variable" }
+ ;
+}
+
+void
+bar ()
+{
+ int j = 0;
+#pragma omp parallel for
+ for (int& i = j; i < 10; ++i) // { dg-error "invalid type for iteration variable" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35099.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35099.C
new file mode 100644
index 000000000..6c793a3f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35099.C
@@ -0,0 +1,39 @@
+// PR middle-end/35099
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+struct A
+{
+ ~A () throw ();
+ void foo ();
+};
+
+struct B
+{
+ B () { A ().foo (); }
+};
+
+void
+bar ()
+{
+#pragma omp parallel
+ {
+ #pragma omp single
+ B ();
+ #pragma omp for
+ for (int i = 0; i < 2; ++i)
+ B ();
+ }
+}
+
+void
+baz ()
+{
+#pragma omp parallel
+ {
+ #pragma omp single
+ B ();
+ #pragma omp single
+ B ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35158.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35158.C
new file mode 100644
index 000000000..9577cd236
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35158.C
@@ -0,0 +1,14 @@
+// PR c++/35158
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+int main(int argc, char *argv[])
+{
+#pragma omp parallel for
+ for (int i(0) ; // { dg-error "parenthesized initialization is not allowed in OpenMP 'for' loop" }
+ i < 10 ;
+ i++)
+ ;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35244.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35244.C
new file mode 100644
index 000000000..022f9d0a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35244.C
@@ -0,0 +1,30 @@
+// PR c++/35244
+// { dg-do compile }
+// { dg-require-effective-target tls }
+// { dg-options "-fopenmp" }
+
+int v1;
+namespace N1
+{
+ int v2;
+}
+namespace N2
+{
+ int v3;
+}
+using N1::v2;
+using namespace N2;
+struct A;
+typedef int i;
+#pragma omp threadprivate (i) // { dg-error "is not file, namespace or block scope variable" }
+#pragma omp threadprivate (A) // { dg-error "is not file, namespace or block scope variable" }
+#pragma omp threadprivate (v1, v2, v3)
+
+void foo ()
+{
+ static int v4;
+ {
+ static int v5;
+#pragma omp threadprivate (v4, v5)
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35328.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35328.C
new file mode 100644
index 000000000..718283b59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35328.C
@@ -0,0 +1,31 @@
+// PR c++/35328
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ ~A ()(); // { dg-error "declared as function returning a function" }
+};
+struct B
+{
+ B ()(); // { dg-error "declared as function returning a function" }
+};
+struct C
+{
+ C ();
+ C (const C &)(); // { dg-error "declared as function returning a function" }
+};
+
+void
+foo ()
+{
+ A a;
+ B b;
+ C c;
+ #pragma omp parallel firstprivate (a)
+ ;
+ #pragma omp parallel private (b)
+ ;
+ #pragma omp parallel firstprivate (c)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35337.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35337.C
new file mode 100644
index 000000000..2e9ca6b20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35337.C
@@ -0,0 +1,20 @@
+// PR c++/35337
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A { };
+
+void
+foo ()
+{
+#pragma omp parallel firstprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" }
+ ;
+}
+
+void
+bar ()
+{
+#pragma omp for lastprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" }
+ for (int i = 0; i < 10; i++)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35364.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35364.C
new file mode 100644
index 000000000..da60d5deb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35364.C
@@ -0,0 +1,50 @@
+// PR target/35364
+// { dg-do compile }
+// { dg-options "-O2 -fopenmp" }
+
+template <typename T>
+struct E
+{
+ E ();
+ ~E ();
+};
+
+template <typename T, typename U>
+struct C
+{
+ C (const U &y) : u (y) {}
+ ~C () {}
+ const U &u;
+};
+
+template <typename T, typename U = E<T> >
+struct B : public C<T, U>
+{
+ B (int x, const T &z = T (), const U &y = U ()) : C<T, U> (y) {}
+ ~B () {}
+};
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ B<double> x (1);
+ }
+#pragma omp for
+ for (int i = 0; i < 10; i++)
+ {
+ B<int> x (i);
+ }
+#pragma omp sections
+ {
+#pragma omp section
+ {
+ B<int> x (6);
+ }
+ }
+#pragma omp single
+ {
+ B<int> x (16);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35751.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35751.C
new file mode 100644
index 000000000..0b6cded59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr35751.C
@@ -0,0 +1,34 @@
+// PR c/35751
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+void
+foo (int i)
+{
+ extern int a[i]; // { dg-error "storage size of" }
+ static int b[i]; // { dg-error "storage size of" }
+
+#pragma omp parallel
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel shared (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel private (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel firstprivate (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36237.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36237.C
new file mode 100644
index 000000000..29c7adc8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36237.C
@@ -0,0 +1,25 @@
+// PR c++/36237
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ ~A ();
+};
+
+struct B
+{
+ B (const A &x = A ()) : a (x) { }
+ A a;
+};
+
+B var;
+
+void bar ();
+
+void
+foo ()
+{
+ #pragma omp parallel private (var)
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36790.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36790.C
new file mode 100644
index 000000000..07e8b1052
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr36790.C
@@ -0,0 +1,23 @@
+// PR middle-end/36790
+// { dg-do compile }
+// { dg-options "-fopenmp -O2" }
+
+void
+foo (bool b)
+{
+}
+
+void
+bar (bool b)
+{
+ foo (b);
+ #pragma omp task default (shared)
+ b = false;
+}
+
+int
+main ()
+{
+ bar (false);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37189.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37189.C
new file mode 100644
index 000000000..31d95f2d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37189.C
@@ -0,0 +1,27 @@
+// PR c++/37189
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct S
+{
+ S () {}
+ S (S const &) {}
+};
+
+struct T
+{
+ S s;
+};
+
+void
+bar (T &)
+{
+}
+
+int
+foo ()
+{
+ T t;
+ #pragma omp task
+ bar (t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37346.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37346.C
new file mode 100644
index 000000000..b6619edc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37346.C
@@ -0,0 +1,15 @@
+// PR c++/37346
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ A ();
+ int i;
+};
+
+A::A ()
+{
+#pragma omp critical
+ i++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37533.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37533.C
new file mode 100644
index 000000000..4cbf25620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr37533.C
@@ -0,0 +1,50 @@
+// PR c++/37533
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template<int>
+void
+f1 ()
+{
+#pragma omp parallel for
+ for (int i = ""; i < 4; ++i) // { dg-error "invalid conversion from" }
+ ;
+}
+
+template<int>
+void
+f2 ()
+{
+ int i;
+#pragma omp parallel for
+ for (i = ""; i < 4; ++i) // { dg-error "invalid conversion from" }
+ ;
+}
+
+template<typename T>
+void
+f3 ()
+{
+#pragma omp parallel for
+ for (T i = ""; i < 4; ++i) // { dg-error "invalid conversion from" }
+ ;
+}
+
+template<typename T>
+void
+f4 ()
+{
+ T i;
+#pragma omp parallel for
+ for (i = ""; i < 4; ++i) // { dg-error "invalid conversion from" }
+ ;
+}
+
+void
+bar ()
+{
+ f1<0> (); // { dg-message "required from here" }
+ f2<1> (); // { dg-message "required from here" }
+ f3<int> (); // { dg-message "required from here" }
+ f4<int> (); // { dg-message "required from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38633.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38633.C
new file mode 100644
index 000000000..99b879573
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38633.C
@@ -0,0 +1,14 @@
+// PR middle-end/38633
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ struct A { int i; } j;
+ j.i = 6;
+ j.i++;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38639.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38639.C
new file mode 100644
index 000000000..834a03a4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr38639.C
@@ -0,0 +1,17 @@
+// PR c++/38639
+// { dg-do compile { target c++11 } }
+// { dg-options "-fopenmp" }
+
+template<int> void
+foo ()
+{
+#pragma omp parallel for
+ for (auto i = i = 0; i<4; ++i) // { dg-error "incomplete|unable|invalid|auto" }
+ ;
+}
+
+void
+bar ()
+{
+ foo<0> (); // { dg-message "required from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-1.C
new file mode 100644
index 000000000..8563e684f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-1.C
@@ -0,0 +1,95 @@
+// PR c/39495
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+#define INT_MIN (-__INT_MAX__ - 1)
+#define INT_MAX __INT_MAX__
+#define UINT_MAX (2U * __INT_MAX__ + 1)
+
+int
+foo (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN + 1; i--)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i >= INT_MIN + 1; i--)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN; i--)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX - 1; i++)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i <= INT_MAX - 1; i++)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX; i++)
+ ;
+#pragma omp for
+ for (u = 6; u > 1; u--)
+ ;
+#pragma omp for
+ for (u = 6; u >= 1; u--)
+ ;
+#pragma omp for
+ for (u = 6; u > 0; u--)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX - 1; u++)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u++)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX; u++)
+ ;
+}
+
+int
+bar (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN + 1; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i >= INT_MIN + 1; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX - 1; i += 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i <= INT_MAX - 1; i += 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX; i += 2)
+ ;
+#pragma omp for
+ for (u = 6; u > 1; u -= 2)
+ ;
+#pragma omp for
+ for (u = 6; u >= 1; u -= 2)
+ ;
+#pragma omp for
+ for (u = 6; u > 0; u -= 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX - 1; u += 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u += 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX; u += 2)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-2.C
new file mode 100644
index 000000000..c0b4d5dbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr39495-2.C
@@ -0,0 +1,39 @@
+// PR c/39495
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+#define INT_MIN (-__INT_MAX__ - 1)
+#define INT_MAX __INT_MAX__
+#define UINT_MAX (2U * __INT_MAX__ + 1)
+
+int
+foo (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i != INT_MIN; i--) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i == INT_MIN; i--) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i != INT_MAX; i++) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i == INT_MAX; i++) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (u = 6; u != 0; u--) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (u = 6; u == 0; u--) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u != UINT_MAX; u++) // { dg-error "invalid controlling predicate" }
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u == UINT_MAX; u++) // { dg-error "invalid controlling predicate" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41429.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41429.C
new file mode 100644
index 000000000..7de41b846
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41429.C
@@ -0,0 +1,5 @@
+// PR middle-end/41429
+// { dg-do compile { target fpic } }
+// { dg-options "-fopenmp -O2 -fpic" }
+
+#include "pr37189.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41967.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41967.C
new file mode 100644
index 000000000..0eb489e8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr41967.C
@@ -0,0 +1,17 @@
+// PR c++/41967
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+int
+foo ()
+{
+ int sum = 0;
+#pragma omp for collapse(2)
+ for (int i = 0; i < 5; ++i)
+ {
+ for (int j = 0; j < 5; ++j)
+ ++sum;
+ ++sum; // { dg-error "collapsed loops not perfectly nested" }
+ }
+ return sum;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr42234.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr42234.C
new file mode 100644
index 000000000..9245b6c68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr42234.C
@@ -0,0 +1,19 @@
+// PR c++/42234
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+extern int foo (void);
+
+void
+bar (int x)
+{
+ #pragma omp critical
+ {
+ int j;
+ for (j = 0; j < foo (); j++)
+ ;
+ if (0)
+ if (x >= 4)
+ ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr47963.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr47963.C
new file mode 100644
index 000000000..7c94e6422
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr47963.C
@@ -0,0 +1,11 @@
+// PR c/47963
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+void
+foo (float n)
+{
+ int A[n][n]; // { dg-error "has non-integral type" }
+#pragma omp parallel private(A)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48632.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48632.C
new file mode 100644
index 000000000..afa8b1893
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48632.C
@@ -0,0 +1,22 @@
+// PR c++/48632
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template<typename T>
+void
+foo (T *x, T *y, unsigned z)
+{
+#pragma omp parallel for
+ for (T *p = x; p < y; p += z)
+ ;
+#pragma omp parallel for
+ for (T *p = y; p > x; p -= z)
+ ;
+}
+
+int
+main ()
+{
+ char buf[10];
+ foo (&buf[0], &buf[9], 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48716.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48716.C
new file mode 100644
index 000000000..2dccad2d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr48716.C
@@ -0,0 +1,24 @@
+// PR c/48716
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+int
+main (void)
+{
+ #pragma omp parallel default(none)
+ {
+ static int s;
+ int t = 0;
+ #pragma omp atomic
+ s++;
+ t++;
+ }
+ #pragma omp task default(none)
+ {
+ static int s;
+ int t = 0;
+ #pragma omp atomic
+ s++;
+ t++;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-1.C
new file mode 100644
index 000000000..307210fe1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-1.C
@@ -0,0 +1,28 @@
+// PR c++/49223
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <int N>
+struct V
+{
+ V () {}
+ ~V () {}
+};
+
+template <int N>
+struct S
+{
+ void foo ()
+ {
+ V <0> v;
+ #pragma omp parallel private (v)
+ ;
+ }
+};
+
+void
+bar (void)
+{
+ S <0> s;
+ s.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-2.C
new file mode 100644
index 000000000..95397733e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr49223-2.C
@@ -0,0 +1,16 @@
+// PR c++/49223
+// { dg-do compile }
+// { dg-require-effective-target tls }
+// { dg-options "-fopenmp" }
+
+struct S; // { dg-error "forward declaration" }
+extern __thread struct S s; // { dg-error "has incomplete type" }
+struct T;
+extern __thread struct T t;
+
+void
+foo ()
+{
+ #pragma omp parallel copyin (s)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51360.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51360.C
new file mode 100644
index 000000000..2e634248a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51360.C
@@ -0,0 +1,34 @@
+// PR c/51360
+// { dg-do compile }
+// { dg-options "-Wunused -W -fopenmp" }
+
+template <typename T>
+void
+foo (T a, T b, T c, T d)
+{
+ T m, n, o, p, i;
+ m = 6;
+ n = 1;
+ o = 5;
+ p = 1;
+ a = 6;
+ b = 1;
+ c = 5;
+ d = 1;
+ #pragma omp parallel for num_threads (m) if (n) schedule (static, o)
+ for (i = 0; i < 10; i++)
+ ;
+ #pragma omp parallel for num_threads (a) if (b) schedule (static, c)
+ for (i = 0; i < 10; i++)
+ ;
+ #pragma omp task final (p)
+ ;
+ #pragma omp task final (d)
+ ;
+}
+
+void
+bar ()
+{
+ foo (0, 0, 0, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51669.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51669.C
new file mode 100644
index 000000000..d5294dded
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr51669.C
@@ -0,0 +1,32 @@
+// PR c++/51669
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T> const T & min (const T &, const T &);
+
+void
+f1 ()
+{
+#pragma omp parallel num_threads (min (4, 5))
+ ;
+}
+
+struct A { A (); ~A (); };
+int foo (const A &);
+
+void
+f2 ()
+{
+ int i;
+#pragma omp parallel if (foo (A ())) num_threads (foo (A ()))
+ ;
+#pragma omp task if (foo (A ())) final (foo (A ()))
+ ;
+#pragma omp for schedule (static, foo (A ()))
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp parallel for schedule (static, foo (A ())) \
+ if (foo (A ())) num_threads (foo (A ()))
+ for (i = 0; i < 10; i++)
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr56217.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr56217.C
new file mode 100644
index 000000000..03dfc5f18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr56217.C
@@ -0,0 +1,14 @@
+// PR middle-end/56217
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct S { int *p; S (); S (S &); };
+
+S
+foo ()
+{
+ S s;
+ #pragma omp task shared (s)
+ s.p = 0;
+ return s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58567.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58567.C
new file mode 100644
index 000000000..35a5bb027
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58567.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+/* PR c++/58567 - was ICEing before */
+
+template<typename T> void foo()
+{
+ #pragma omp parallel for
+ for (typename T::X i = 0; i < 100; ++i) /* { dg-error "'int' is not a class, struct, or union type|expected iteration declaration or initialization" } */
+ ;
+}
+
+void bar()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58702.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58702.C
new file mode 100644
index 000000000..5bab86118
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58702.C
@@ -0,0 +1,10 @@
+// PR c++/58702
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+void foo()
+{
+ x; // { dg-error "was not declared" }
+#pragma omp parallel for reduction(+:x)
+ for (int i = 0; i < 10; ++i) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58874.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58874.C
new file mode 100644
index 000000000..be3f53e44
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr58874.C
@@ -0,0 +1,14 @@
+// PR c++/58874
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+ template<int> struct B
+ {
+ #pragma omp declare reduction (x : int : omp_out |= omp_in)
+ };
+};
+
+#pragma omp declare reduction (y : long : omp_out |= omp_in) \
+ initializer (omp_priv = 0)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59150.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59150.C
new file mode 100644
index 000000000..103edb649
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59150.C
@@ -0,0 +1,25 @@
+// PR middle-end/59150
+// { dg-do compile }
+// { dg-options "-O -fopenmp-simd -fno-tree-ccp -fno-tree-copy-prop -fno-tree-dce" }
+
+#pragma omp declare reduction (foo: int: omp_out += omp_in) initializer (omp_priv = 0)
+
+int
+foo ()
+{
+ int i, v, &u = v;
+ #pragma omp simd reduction (foo:u)
+ for (i = 0; i < 1024; i++)
+ u = i;
+ return u;
+}
+
+int
+bar ()
+{
+ int i, v, &u = v;
+ #pragma omp simd reduction (foo:u) safelen(1)
+ for (i = 0; i < 1024; i++)
+ u = i;
+ return u;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59297.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59297.C
new file mode 100644
index 000000000..330ed2e00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr59297.C
@@ -0,0 +1,25 @@
+// PR c++/59297
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T>
+struct A
+{
+ ~A ();
+ const T &operator[] (int) const;
+};
+
+struct B
+{
+ int &operator () (A <int>);
+};
+
+void
+foo (B &x, int &z)
+{
+ A<A<int> > y;
+ #pragma omp atomic
+ x (y[0]) += 1;
+ #pragma omp atomic
+ z += x(y[1]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/predetermined-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/predetermined-1.C
new file mode 100644
index 000000000..dd09855de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/predetermined-1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A { int i; A (); ~A (); };
+struct B { int i; };
+struct C { int i; mutable int j; C (); ~C (); };
+
+template <typename T> void bar (const T *);
+
+const A a;
+const C c;
+
+const A foo (const A d, const C e)
+{
+ const A f;
+ const B b = { 4 };
+ A g;
+ #pragma omp parallel default (none)
+ bar (&a);
+ #pragma omp parallel default (none)
+ bar (&b);
+ #pragma omp parallel default (none) // { dg-error "enclosing parallel" }
+ bar (&c); // { dg-error "not specified" }
+ #pragma omp parallel default (none)
+ bar (&d);
+ #pragma omp parallel default (none) // { dg-error "enclosing parallel" }
+ bar (&e); // { dg-error "not specified" }
+ #pragma omp parallel default (none)
+ bar (&f);
+ #pragma omp parallel default (none) // { dg-error "enclosing parallel" }
+ bar (&g); // { dg-error "not specified" }
+ return f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/private-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/private-1.C
new file mode 100644
index 000000000..09f15e396
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/private-1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A { int i; A (); ~A (); };
+struct B { int i; };
+struct C { int i; mutable int j; C (); ~C (); };
+
+template <typename T> void bar (const T *);
+
+const A a;
+const C c;
+
+const A foo (const A d, const C e)
+{
+ const A f;
+ const B b = { 4 };
+ A g;
+ #pragma omp parallel private (a) // { dg-error "predetermined" }
+ bar (&a);
+ #pragma omp parallel private (b) // { dg-error "predetermined" }
+ bar (&b);
+ #pragma omp parallel private (c)
+ bar (&c);
+ #pragma omp parallel private (d) // { dg-error "predetermined" }
+ bar (&d);
+ #pragma omp parallel private (e)
+ bar (&e);
+ #pragma omp parallel private (f) // { dg-error "predetermined" }
+ bar (&f);
+ #pragma omp parallel private (g)
+ bar (&g);
+ return f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-1.C
new file mode 100644
index 000000000..43704908e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-1.C
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void f1(void)
+{
+ #pragma omp sections nowait
+ {
+ bar (1);
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
+
+void f2(void)
+{
+ #pragma omp sections
+ {
+ #pragma omp section
+ {
+ bar (1);
+ bar (1);
+ }
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-2.C
new file mode 100644
index 000000000..aabdfaf80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-2.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+void foo(void)
+{
+ #pragma omp sections
+ bar (0); // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ } // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ bar (1);
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ bar(2);
+ bar(3); // { dg-error "expected" }
+ bar(4);
+ #pragma omp section
+ bar(5);
+ bar(6); // { dg-error "expected" }
+ bar(7);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-3.C
new file mode 100644
index 000000000..d8fb2a09d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-3.C
@@ -0,0 +1,15 @@
+
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ #pragma omp parallel sections nowait /* { dg-error "'nowait'" } */
+ {
+ #pragma omp section
+ { bar(); }
+ #pragma omp section
+ { bar(); }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-4.C
new file mode 100644
index 000000000..62a2ecddf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sections-4.C
@@ -0,0 +1,13 @@
+/* PR c++/24613 */
+/* { dg-do compile } */
+
+#pragma omp section /* { dg-error "may only be used in" } */
+
+int i;
+
+void
+foo (void)
+{
+ #pragma omp section /* { dg-error "may only be used in" } */
+ i++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-1.C
new file mode 100644
index 000000000..83b818098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-1.C
@@ -0,0 +1,77 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+int thrglobalvar;
+#pragma omp threadprivate (thrglobalvar)
+int globalvar;
+const struct S
+{
+ int x;
+} constvar = { 8 };
+struct T
+{
+ static T t;
+ int i;
+};
+T T::t = { 6 };
+/* const qualified type, but mutable member -> not predetermined. */
+const struct U
+{
+ int x;
+ mutable int y;
+} constmutvar = { 6, 4 };
+
+int
+foo (int x)
+{
+ return x;
+}
+
+int
+bar (int *x)
+{
+ return *x;
+}
+
+int
+baz (U u)
+{
+ return u.x;
+}
+
+int
+main (void)
+{
+ static int thrlocvar;
+#pragma omp threadprivate (thrlocvar)
+ static int locvar;
+ static int *p;
+ int i, j, s, l;
+
+ p = new int;
+ *p = 7;
+ s = 6;
+ l = 0;
+#pragma omp parallel for /* { dg-error "enclosing parallel" } */ \
+ default (none) private (p) shared (s)
+ for (i = 0; i < 64; i++)
+ {
+ int k = foo (0); /* Predetermined - private (automatic var declared */
+ k++; /* in scope of construct). */
+ thrglobalvar++; /* Predetermined - threadprivate. */
+ thrlocvar++; /* Predetermined - threadprivate. */
+ foo (i); /* Predetermined - private (omp for loop variable). */
+ foo (constvar.x); /* Predetermined - shared (const qualified type). */
+ foo (T::t.i); /* Predetermined - shared (static data member). */
+ foo (*p); /* *p predetermined - shared (heap allocated */
+ (*p)++; /* storage). */
+ bar (p); /* Explicitly determined - private. */
+ foo (s); /* Explicitly determined - shared. */
+ globalvar++; /* { dg-error "not specified in" } */
+ locvar++; /* { dg-error "not specified in" } */
+ l++; /* { dg-error "not specified in" } */
+ for (j = 0; j < 2; j++); /* { dg-error "not specified in" } */
+ baz (constmutvar);/* { dg-error "not specified in" } */
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-2.C
new file mode 100644
index 000000000..6145b92fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/sharing-2.C
@@ -0,0 +1,47 @@
+// { dg-do compile }
+
+struct T
+{
+ int i;
+ mutable int j;
+};
+struct S
+{
+ const static int d = 1;
+ const static T e;
+ void foo (int, T);
+};
+
+const int S::d;
+const T S::e = { 2, 3 };
+
+void bar (const int &);
+
+void
+S::foo (const int x, const T y)
+{
+ #pragma omp parallel firstprivate (x)
+ bar (x);
+ #pragma omp parallel firstprivate (d)
+ bar (d);
+ #pragma omp parallel firstprivate (y)
+ bar (y.i);
+ #pragma omp parallel firstprivate (e) // { dg-error "is predetermined" }
+ bar (e.i);
+ #pragma omp parallel shared (x) // { dg-error "is predetermined" }
+ bar (x);
+ #pragma omp parallel shared (d) // { dg-error "is predetermined" }
+ bar (d);
+ #pragma omp parallel shared (e) // { dg-error "is predetermined" }
+ bar (e.i);
+ #pragma omp parallel shared (y)
+ bar (y.i);
+ #pragma omp parallel private (x) // { dg-error "is predetermined" }
+ bar (x);
+ #pragma omp parallel private (d) // { dg-error "is predetermined" }
+ bar (d);
+ #pragma omp parallel private (y)
+ bar (y.i);
+ #pragma omp parallel private (e) // { dg-error "is predetermined" }
+ bar (e.i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/simd-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/simd-1.C
new file mode 100644
index 000000000..c9c2e73bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/simd-1.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+extern int a[1024];
+int (&b)[1024] = a;
+
+struct S { int s; } s, &t = s;
+
+void
+f1 (int &x, float &f, int *&p)
+{
+ int i;
+ #pragma omp simd aligned(x : 32) // { dg-error "neither a pointer nor an array" }
+ for (i = 0; i < 1024; i++)
+ a[i]++;
+ #pragma omp simd aligned(f) // { dg-error "neither a pointer nor an array" }
+ for (i = 0; i < 1024; i++)
+ a[i]++;
+ #pragma omp simd aligned(t : 16) // { dg-error "neither a pointer nor an array" }
+ for (i = 0; i < 1024; i++)
+ a[i]++;
+ #pragma omp simd aligned(a : 8)
+ for (i = 0; i < 1024; i++)
+ a[i]++;
+ #pragma omp simd aligned(b : 8)
+ for (i = 0; i < 1024; i++)
+ b[i]++;
+ #pragma omp simd aligned(p : 8)
+ for (i = 0; i < 1024; i++)
+ a[i]++;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-1.C
new file mode 100644
index 000000000..b6ed4f89c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-1.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+void
+foo (int x)
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp target
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp target
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp target
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+
+ switch (x)
+ {
+ #pragma omp target
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+}
+
+// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-2.C
new file mode 100644
index 000000000..6a14f53cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/target-2.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+void
+foo (int x, int y)
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp target data map(tofrom: y)
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp target data map(tofrom: y)
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp target data map(tofrom: y)
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+
+ switch (x)
+ {
+ #pragma omp target data map(tofrom: y)
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+}
+
+// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/task-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/task-1.C
new file mode 100644
index 000000000..0000e6f1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/task-1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A { A (); ~A (); int i; };
+
+template <typename T> void bar (T &);
+
+const A a;
+
+void foo (A &p)
+{
+ const A &q = a;
+#pragma omp task // { dg-error "has reference type" }
+ bar (p);
+#pragma omp task // { dg-error "has reference type" }
+ bar (q);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/taskgroup-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/taskgroup-1.C
new file mode 100644
index 000000000..dcab0bb64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/taskgroup-1.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+void
+foo (int x)
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp taskgroup
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp taskgroup
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp taskgroup
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+
+ switch (x)
+ {
+ #pragma omp taskgroup
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+}
+
+// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/teams-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/teams-1.C
new file mode 100644
index 000000000..ce40b55ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/teams-1.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+
+void
+foo (int x)
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp target teams
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp target teams
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp target teams
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+
+ switch (x)
+ {
+ #pragma omp target teams
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+}
+
+void
+bar (int x)
+{
+ bad1: // { dg-error "jump to label" }
+ #pragma omp target
+ #pragma omp teams
+ goto bad1; // { dg-error "from here|exits OpenMP" }
+
+ goto bad2; // { dg-error "from here" }
+ #pragma omp target
+ #pragma omp teams
+ {
+ bad2: ; // { dg-error "jump to label|enters OpenMP" }
+ }
+
+ #pragma omp target
+ #pragma omp teams
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+
+ switch (x)
+ {
+ #pragma omp target
+ #pragma omp teams
+ { case 0:; } // { dg-error "jump|enters" }
+ }
+}
+
+// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
+// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 37 }
+// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 39 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-1.C
new file mode 100644
index 000000000..bfe62cb00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int tp1;
+static int tp2;
+extern int tp3;
+
+int tp4 = 1;
+static int tp5 = 1;
+
+#pragma omp threadprivate (tp1, tp2, tp3, tp4, tp5)
+
+#pragma omp threadprivate (undef) // { dg-error "declared" }
+
+int tp6;
+int foo(void) { return tp6; }
+
+#pragma omp threadprivate (tp6) // { dg-error "after first use" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-2.C
new file mode 100644
index 000000000..80275f908
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-2.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+extern char buf[];
+#pragma omp threadprivate (buf) /* { dg-error "has incomplete type" } */
+
+void
+foo (void)
+{
+ int i;
+#pragma omp threadprivate (i) /* { dg-error "automatic variable" } */
+ i = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-3.C
new file mode 100644
index 000000000..c710b6d18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-3.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+#define thr threadprivate
+
+int i;
+#pragma omp thr (i)
+namespace N
+{
+ int j;
+#pragma omp thr (j)
+};
+struct S
+{
+ static int s;
+#pragma omp thr (s)
+};
+
+int S::s = 5;
+
+int
+foo ()
+{
+ static int k;
+#pragma omp thr (k)
+ return k++ + S::s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-4.C
new file mode 100644
index 000000000..f6c039e3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-4.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+#define thr threadprivate
+
+struct S
+{
+ static int s;
+};
+struct T : public S
+{
+ static int t;
+#pragma omp thr (s) // { dg-error "directive not in" }
+};
+
+#pragma omp thr (T::t) // { dg-error "directive not in" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-5.C
new file mode 100644
index 000000000..3679593af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-5.C
@@ -0,0 +1,12 @@
+// The reference temp should be TLS, not normal data.
+// { dg-require-effective-target c++11 }
+// { dg-final { scan-assembler-not "\\.data" { target tls_native } } }
+
+extern int&& ir;
+#pragma omp threadprivate (ir)
+int&& ir = 42;
+
+void f()
+{
+ ir = 24;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-template1.C
new file mode 100644
index 000000000..5865ce3d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-template1.C
@@ -0,0 +1,13 @@
+// { dg-require-effective-target tls }
+
+template <class T> struct B
+{
+ T t;
+};
+
+class A {
+ static B<int> b;
+#pragma omp threadprivate(b)
+};
+
+B<int> A::b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap1.C
new file mode 100644
index 000000000..91c9f8631
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap1.C
@@ -0,0 +1,13 @@
+// If we can see the definition at the use site, we don't need to bother
+// with a wrapper.
+
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler-not "_ZTW1i" } }
+
+int i = 42;
+#pragma omp threadprivate (i)
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap2.C
new file mode 100644
index 000000000..7aa13711c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap2.C
@@ -0,0 +1,16 @@
+// If we can't see the definition at the use site, but it's in this translation
+// unit, we build a wrapper but don't bother with an init function.
+
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler "_ZTW1i" } }
+// { dg-final { scan-assembler-not "_ZTH1i" } }
+
+extern int i;
+#pragma omp threadprivate (i)
+
+int main()
+{
+ return i - 42;
+}
+
+int i = 42;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap3.C
new file mode 100644
index 000000000..dd4b900e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap3.C
@@ -0,0 +1,15 @@
+// If we can't see the definition at all, we need to assume there might be
+// an init function.
+
+// { dg-require-alias "" }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler "_ZTW1i" } }
+// { dg-final { scan-assembler "_ZTH1i" } }
+
+extern int i;
+#pragma omp threadprivate (i)
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap4.C
new file mode 100644
index 000000000..59a568390
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrap4.C
@@ -0,0 +1,14 @@
+// We don't need to call the wrapper through the PLT; we can use a separate
+// copy per shared object.
+
+// { dg-require-effective-target tls }
+// { dg-do compile { target c++11 } }
+// { dg-options "-fPIC" }
+// { dg-final { scan-assembler-not "_ZTW1i@PLT" { target i?86-*-* x86_64-*-* } } }
+
+extern thread_local int i;
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrapper-cse.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrapper-cse.C
new file mode 100644
index 000000000..af2de2f1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tls-wrapper-cse.C
@@ -0,0 +1,18 @@
+// Test for CSE of the wrapper function: we should only call it once
+// for the two references to ir.
+// { dg-options "-fopenmp -O -fno-inline" }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler-times "call *_ZTW2ir" 1 { xfail *-*-* } } }
+
+// XFAILed until the back end supports a way to mark a function as cseable
+// though not pure.
+
+int f() { return 42; }
+
+int ir = f();
+#pragma omp threadprivate (ir)
+
+int main()
+{
+ return ir + ir - 84;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C
new file mode 100644
index 000000000..ff1e3632d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+int check;
+
+template<typename T> void foo()
+{
+ #pragma omp atomic
+ check |= sizeof(T);
+}
+
+template<typename T> void bar(T *x, T y)
+{
+ #pragma omp atomic
+ *x += y;
+}
+
+void test ()
+{
+ int i;
+ long l;
+
+ foo<char>();
+ foo<short>();
+ bar(&i, 4);
+ bar(&l, 8L);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C
new file mode 100644
index 000000000..c27f20193
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+struct S { int x; } s;
+
+// Make sure we detect errors on non-type-dependent things
+// even when the templates are never instantiated.
+template<typename T> void f1()
+{
+ #pragma omp atomic
+ s += 1; // { dg-error "invalid" }
+}
+
+template<typename T> void f2(float *f)
+{
+ #pragma omp atomic
+ *f |= 1; // { dg-error "invalid|evaluation" }
+}
+
+// Here the rhs is dependent, but not type dependent.
+template<typename T> void f3(float *f)
+{
+ #pragma omp atomic
+ *f |= sizeof (T); // { dg-error "invalid|evaluation" }
+}
+
+// And the converse, no error here because we're never fed a T.
+template<typename T> void f4(T *t)
+{
+ #pragma omp atomic
+ *t += 1;
+}
+
+// Here we'll let it go, because the rhs is type dependent and
+// we can't properly instantiate the statement, and we do most
+// of the semantic analysis concurrent with that.
+template<typename T> void f5(float *f)
+{
+ #pragma omp atomic
+ *f |= (T)sizeof(T); // { dg-error "invalid|evaluation" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C
new file mode 100644
index 000000000..60567d910
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C
@@ -0,0 +1,25 @@
+// PR c++/24735
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-gimple" }
+
+template <int> void f1 ()
+{
+ #pragma omp barrier
+}
+
+template <int> void f2 (bool p)
+{
+ if (p)
+ {
+ #pragma omp barrier
+ }
+}
+
+void f3 ()
+{
+ f1<0> ();
+ f2<0> (true);
+}
+
+// { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-1.C
new file mode 100644
index 000000000..e036e6447
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo(int);
+void foo(long);
+
+template<typename T> void bar()
+{
+ #pragma omp for
+ for (T i = 0; i < 10; ++i)
+ foo(i);
+}
+
+void test()
+{
+ bar<int>();
+ bar<long>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-2.C
new file mode 100644
index 000000000..a3bb6ccd4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-2.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+void foo(int);
+
+template<int A, int B, int C> void bar()
+{
+ #pragma omp for
+ for (int i = A; i < B; i += C)
+ foo(i);
+}
+
+void test()
+{
+ bar<0, 10, 2>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-3.C
new file mode 100644
index 000000000..0cafd9628
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-for-3.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+void foo(int);
+
+template<typename T> void bar()
+{
+ #pragma omp parallel for
+ for (typename T::T i = 0; i < T::N; ++i)
+ foo(i);
+}
+
+struct A
+{
+ typedef int T;
+ static T N;
+};
+
+struct B
+{
+ typedef long T;
+ static T N;
+};
+
+void test()
+{
+ bar<A>();
+ bar<B>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-master-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-master-1.C
new file mode 100644
index 000000000..cf22e1c3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-master-1.C
@@ -0,0 +1,30 @@
+// PR c++/24734
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-gimple" }
+
+int i;
+
+template <int> void f1 ()
+{
+ #pragma omp ordered
+ i++;
+}
+
+template <int> void f2 (bool p)
+{
+ if (p)
+ {
+ #pragma omp master
+ i++;
+ }
+}
+
+void f3 ()
+{
+ f1<0> ();
+ f2<0> (true);
+}
+
+// { dg-final { scan-tree-dump-times "#pragma omp ordered" 1 "gimple" } }
+// { dg-final { scan-tree-dump-times "#pragma omp master" 1 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C
new file mode 100644
index 000000000..886d07e21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+int check;
+
+template<typename T> void foo()
+{
+ check |= sizeof(T);
+}
+
+template<typename T>
+void bar(void)
+{
+ #pragma omp parallel if (0)
+ foo<T>();
+}
+
+int main()
+{
+ bar<char>();
+ bar<short>();
+ if (check != (sizeof(char) | sizeof(short)))
+ __builtin_trap ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C
new file mode 100644
index 000000000..93e076047
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+template<typename T>
+struct S
+{
+ T n;
+ void test();
+ void work();
+};
+
+template<typename T>
+void S<T>::test()
+{
+ #pragma omp parallel num_threads(n) // { dg-error "must be integral" }
+ work();
+}
+
+template struct S<int>;
+template struct S<long>;
+template struct S<float>; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-1.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-1.C
new file mode 100644
index 000000000..10c1c8dab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-1.C
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+namespace N1
+{
+ #pragma omp declare reduction (| : long int : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (+ : char : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ typedef short T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (* : _Complex double : omp_out *= omp_in)// { dg-error "predeclared arithmetic type" }
+}
+namespace N2
+{
+ template <typename T1, typename T2, typename T3, typename T4>
+ struct S
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "predeclared arithmetic type" }
+ };
+ S<long int, char, short, _Complex double> s;
+ template <typename T1, typename T2, typename T3, typename T4>
+ int foo ()
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" }
+ #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "predeclared arithmetic type" }
+ return 0;
+ }
+ int x = foo <long int, char, short, _Complex double> ();
+}
+namespace N3
+{
+ void bar ();
+ #pragma omp declare reduction (| : __typeof (bar) : omp_out |= omp_in)// { dg-error "function or array type" }
+ #pragma omp declare reduction (+ : char () : omp_out += omp_in) // { dg-error "function or array type" }
+ typedef short T;
+ #pragma omp declare reduction (min : T[2] : omp_out += omp_in) // { dg-error "function or array type" }
+ #pragma omp declare reduction (baz : char & : omp_out *= omp_in) // { dg-error "reference type" }
+}
+namespace N4
+{
+ void bar ();
+ template <typename T1, typename T2, typename T3, typename T4>
+ struct S
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "function or array type" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "function or array type" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "function or array type" }
+ #pragma omp declare reduction (baz : T4 : omp_out *= omp_in) // { dg-error "function or array type" }
+ };
+ S<__typeof (bar), char (), short [3], char []> s;
+ template <typename T1, typename T2, typename T3, typename T4>
+ int foo ()
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "function or array type" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "function or array type" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "function or array type" }
+ #pragma omp declare reduction (baz : T4 : omp_out *= omp_in) // { dg-error "function or array type" }
+ return 0;
+ }
+ int x = foo <__typeof (bar), char (), short[], char [2]> ();
+}
+namespace N5
+{
+ template <typename T>
+ struct S
+ {
+ #pragma omp declare reduction (baz : T : omp_out *= omp_in) // { dg-error "reference type" }
+ };
+ S<char &> s;
+ template <typename T>
+ int foo ()
+ {
+ #pragma omp declare reduction (baz : T : omp_out *= omp_in) // { dg-error "reference type" }
+ return 0;
+ }
+ int x = foo <char &> ();
+}
+namespace N6
+{
+ struct A { int a; A () : a (0) {} };
+ #pragma omp declare reduction (| : const A : omp_out.a |= omp_in.a) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (+ : __const A : omp_out.a += omp_in.a) // { dg-error "const, volatile or __restrict" }
+ typedef volatile A T;
+ #pragma omp declare reduction (min : T : omp_out.a += omp_in.a) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (* : A *__restrict : omp_out->a *= omp_in->a)// { dg-error "const, volatile or __restrict" }
+}
+namespace N7
+{
+ struct A { int a; A () : a (0) {} };
+ template <typename T1, typename T2, typename T3, typename T4>
+ struct S
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "const, volatile or __restrict" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "const, volatile or __restrict" }
+ };
+ S<const A, __const A, volatile A, A *__restrict> s;
+ template <typename T1, typename T2, typename T3, typename T4>
+ int foo ()
+ {
+ #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "const, volatile or __restrict" }
+ typedef T3 T;
+ #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "const, volatile or __restrict" }
+ #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "const, volatile or __restrict" }
+ return 0;
+ }
+ int x = foo <const A, __const A, volatile A, A *__restrict> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-2.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-2.C
new file mode 100644
index 000000000..48451c4fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-2.C
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct W { int w; W () : w (0) {} W (int x) : w (x) {} };
+namespace N1
+{
+ int v;
+ #pragma omp declare reduction (foo : long int : omp_out |= v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : char : omp_out = v) // { dg-error "combiner refers to variable" }
+ typedef short T;
+ #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : int : v *= omp_in) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" }
+}
+namespace N2
+{
+ int v;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ struct S
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out = v) // { dg-error "combiner refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T4 : v *= omp_in) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" }
+ };
+ S<long int, char, short, _Complex double, W> s;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ int foo ()
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out = v) // { dg-error "combiner refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T4 : v *= omp_in) // { dg-error "combiner refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" }
+ return 0;
+ }
+ int x = foo <long int, char, short, _Complex double, W> ();
+}
+namespace N3
+{
+ int v;
+ #pragma omp declare reduction (foo : long int : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : char : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" }
+ typedef short T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : _Complex double : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" }
+}
+namespace N4
+{
+ int v;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ struct S
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" }
+ };
+ S<long int, char, short, _Complex double, W> s;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ int foo ()
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" }
+ return 0;
+ }
+ int x = foo <long int, char, short, _Complex double, W> ();
+}
+template <typename T>
+void init (T &, int &);
+template <typename T>
+void initializer (T, int &);
+namespace N5
+{
+ int v;
+ #pragma omp declare reduction (foo : long int : omp_out |= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : char : omp_out += omp_in) initializer (initializer (&omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+ typedef short T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : _Complex double : omp_out *= omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+}
+namespace N6
+{
+ int v;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ struct S
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (initializer (&omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+ };
+ S<long int, char, short, _Complex double, W> s;
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ int foo ()
+ {
+ #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+ typedef T3 T;
+ #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" }
+ #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (initializer (omp_priv, N3::v)) // { dg-error "initializer refers to variable" }
+ return 0;
+ }
+ int x = foo <long int, char, short, _Complex double, W> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-3.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-3.C
new file mode 100644
index 000000000..9fc6f4082
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-3.C
@@ -0,0 +1,191 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct S { int s; S () : s (0) {} S (int x) : s (x) {} ~S () {} };
+struct T { int t; T () : t (0) {} T (int x) : t (x) {} ~T () {} };
+
+#pragma omp declare reduction (+: ::S: omp_out.s += omp_in.s)
+#pragma omp declare reduction (*: S: omp_out.s *= omp_in.s) \
+ initializer (omp_priv (1))
+#pragma omp declare reduction (foo: S: omp_out.s += omp_in.s)
+
+void
+f1 ()
+{
+ S s, s2;
+ T t;
+ #pragma omp declare reduction (+: T: omp_out.t += omp_in.t)
+ #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2)
+ s.s = 1, t.t = 1, s2.s = 2;
+ #pragma omp parallel reduction (::operator +: s)
+ s.s = 1;
+ #pragma omp parallel reduction (+: s)
+ s.s = 1;
+}
+
+template <int N>
+int
+f2 ()
+{
+ S s, s2;
+ T t;
+ #pragma omp declare reduction (+: T: omp_out.t += omp_in.t)
+ #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2)
+ s.s = 1, t.t = 1, s2.s = 2;
+ #pragma omp parallel reduction (::operator +: s)
+ s.s = 1;
+ #pragma omp parallel reduction (+: s)
+ s.s = 1;
+ return 0;
+}
+
+int x = f2<0> ();
+
+void bar (S &);
+
+void
+f3 ()
+{
+ #pragma omp declare reduction (foo: S: omp_out.s += omp_in.s) initializer (bar (omp_priv))
+ #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) initializer (bar (omp_orig)) // { dg-error "one of the initializer call arguments should be" }
+}
+
+template <typename T>
+int
+f4 ()
+{
+ #pragma omp declare reduction (foo: T: omp_out.s += omp_in.s) initializer (bar (omp_priv))
+ #pragma omp declare reduction (bar: T: omp_out.s += omp_in.s) initializer (bar (omp_orig)) // { dg-error "one of the initializer call arguments should be" }
+ return 0;
+}
+
+int y = f4 <S> ();
+
+namespace N1
+{
+ #pragma omp declare reduction (+: ::S: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ void
+ f5 ()
+ {
+ #pragma omp declare reduction (f5: S: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (f5: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ }
+}
+
+namespace N2
+{
+ struct U
+ {
+ #pragma omp declare reduction (bar: S: omp_out.s *= omp_in.s) // { dg-error "with" }
+ #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" }
+ };
+}
+
+namespace N3
+{
+ #pragma omp declare reduction (+: ::S: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (+: T: omp_out.t += omp_in.t)
+ #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (n3: long: omp_out += omp_in) // { dg-message "previous" }
+ #pragma omp declare reduction (n3: long int: omp_out += omp_in) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (n3: short unsigned: omp_out += omp_in)
+ #pragma omp declare reduction (n3: short int: omp_out += omp_in)
+ void
+ f6 ()
+ {
+ #pragma omp declare reduction (f6: T: omp_out.t += omp_in.t)
+ #pragma omp declare reduction (f6: S: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (f6: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (f6: long: omp_out += omp_in) // { dg-message "previous" }
+ #pragma omp declare reduction (f6: long int: omp_out += omp_in) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (f6: short unsigned: omp_out += omp_in)
+ #pragma omp declare reduction (f6: short int: omp_out += omp_in)
+ }
+}
+
+namespace N4
+{
+ struct U
+ {
+ #pragma omp declare reduction (bar: T: omp_out.t += omp_in.t)
+ #pragma omp declare reduction (bar: S: omp_out.s *= omp_in.s) // { dg-error "with" }
+ #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" }
+ #pragma omp declare reduction (bar: long: omp_out += omp_in) // { dg-error "with" }
+ #pragma omp declare reduction (bar: long int: omp_out += omp_in) // { dg-error "cannot be overloaded" }
+ #pragma omp declare reduction (bar: short unsigned: omp_out += omp_in)
+ #pragma omp declare reduction (bar: short int: omp_out += omp_in)
+ };
+}
+
+namespace N5
+{
+ template <typename T>
+ int
+ f7 ()
+ {
+ #pragma omp declare reduction (f7: T: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (f7: T: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ return 0;
+ }
+ int x = f7 <S> ();
+ template <typename T>
+ struct U
+ {
+ #pragma omp declare reduction (bar: T: omp_out.s *= omp_in.s) // { dg-error "with" }
+ #pragma omp declare reduction (bar: T: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" }
+ };
+ U<S> u;
+}
+
+namespace N6
+{
+ template <typename U>
+ int
+ f8 ()
+ {
+ #pragma omp declare reduction (f8: T: omp_out.t += omp_in.t)
+ #pragma omp declare reduction (f8: U: omp_out.s *= omp_in.s) // { dg-message "previous" }
+ #pragma omp declare reduction (f8: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (f8: long: omp_out += omp_in) // { dg-message "previous" }
+ #pragma omp declare reduction (f8: long int: omp_out += omp_in) // { dg-error "redeclaration of" }
+ #pragma omp declare reduction (f8: short unsigned: omp_out += omp_in)
+ #pragma omp declare reduction (f8: short int: omp_out += omp_in)
+ return 0;
+ }
+ int x = f8 <S> ();
+ template <typename V>
+ struct U
+ {
+ typedef V V2;
+ #pragma omp declare reduction (bar: T: omp_out.t += omp_in.t)
+ #pragma omp declare reduction (bar: V: omp_out.s *= omp_in.s) // { dg-error "with" }
+ #pragma omp declare reduction (bar: V2: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" }
+ #pragma omp declare reduction (bar: long: omp_out += omp_in) // { dg-error "with" }
+ #pragma omp declare reduction (bar: long int: omp_out += omp_in) // { dg-error "cannot be overloaded" }
+ #pragma omp declare reduction (bar: short unsigned: omp_out += omp_in)
+ #pragma omp declare reduction (bar: short int: omp_out += omp_in)
+ };
+ U<S> u;
+}
+
+namespace N7
+{
+ #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) initializer (omp_priv) // { dg-error "invalid initializer clause" }
+ #pragma omp declare reduction (+: T: omp_out.t += omp_in.t) initializer (omp_priv ()) // { dg-error "invalid initializer clause" }
+}
+
+namespace N8
+{
+ struct A { int a; A (); ~A (); };
+ struct B { int b; B (); ~B (); B (int); };
+ struct C : public A, B { int c; C (); ~C (); };
+ #pragma omp declare reduction (+:B:omp_out.b += omp_in.b) initializer (omp_priv (4))
+ void bar (C &);
+ void baz ()
+ {
+ C a;
+ #pragma omp parallel reduction (+:a) // { dg-error "user defined reduction with constructor initializer for base class" }
+ bar (a);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-4.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-4.C
new file mode 100644
index 000000000..f1b388bbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-4.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+struct S; // { dg-error "forward declaration" }
+#pragma omp declare reduction (+:S:omp_out.s += omp_in.s) // { dg-error "invalid use of incomplete type" }
+struct S { int s; S () : s (1) {} };
+#pragma omp declare reduction (*:S:omp_out.s *= omp_in.s)
+
+void
+foo ()
+{
+ S s;
+ #pragma omp parallel reduction (S::~S:s) // { dg-error "invalid reduction-identifier" }
+ s.s = 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-5.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-5.C
new file mode 100644
index 000000000..425f8e95c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-5.C
@@ -0,0 +1,41 @@
+// { dg-do compile }
+
+struct S
+{
+ int s;
+ S () : s (0) {}
+private:
+ #pragma omp declare reduction (+:S:omp_out.s += omp_in.s) // { dg-error "is private" }
+protected:
+ #pragma omp declare reduction (-:S:omp_out.s += omp_in.s) // { dg-error "is protected" }
+};
+
+struct T : public S
+{
+ void foo ()
+ {
+ S s;
+ #pragma omp parallel reduction (S::operator +:s) // { dg-error "within this context" }
+ s.s = 1;
+ S t;
+ #pragma omp parallel reduction (S::operator -:t)
+ t.s = 1;
+ S u;
+ #pragma omp parallel reduction (+:u) // { dg-error "within this context" }
+ u.s = 1;
+ S v;
+ #pragma omp parallel reduction (-:v)
+ v.s = 1;
+ }
+};
+
+void
+foo ()
+{
+ S s;
+ #pragma omp parallel reduction (S::operator +:s) // { dg-error "within this context" }
+ s.s = 1;
+ S t;
+ #pragma omp parallel reduction (S::operator -:t) // { dg-error "within this context" }
+ t.s = 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-6.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-6.C
new file mode 100644
index 000000000..9060c87a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/udr-6.C
@@ -0,0 +1,59 @@
+// { dg-do compile }
+
+struct A { int a; A () : a (0) {} };
+struct B { int b; B () : b (0) {} };
+struct C : public A, B { int c; C () : c (0) {} };
+struct D { int d; D () : d (0) {} };
+struct E { int e; E () : e (0) {} };
+struct F : public D, E { int f; F () : f (0) {} };
+struct G : public C, F { int g; G () : g (0) {} };
+
+#pragma omp declare reduction (+: A : omp_out.a += omp_in.a) // { dg-message "operator" }
+#pragma omp declare reduction (+: B : omp_out.b += omp_in.b) // { dg-message "operator" }
+#pragma omp declare reduction (+: D : omp_out.d += omp_in.d)
+#pragma omp declare reduction (+: E : omp_out.e += omp_in.e)
+#pragma omp declare reduction (+: F : omp_out.f += omp_in.f) // { dg-message "operator" }
+
+void
+f1 ()
+{
+ G g;
+ #pragma omp parallel reduction (+: g) // { dg-error "user defined reduction lookup is ambiguous" }
+ {
+ g.g++;
+ }
+}
+
+#pragma omp declare reduction (*: A : omp_out.a += omp_in.a)
+#pragma omp declare reduction (*: B : omp_out.b += omp_in.b)
+#pragma omp declare reduction (*: D : omp_out.d += omp_in.d)
+#pragma omp declare reduction (*: E : omp_out.e += omp_in.e)
+#pragma omp declare reduction (*: F : omp_out.f += omp_in.f)
+#pragma omp declare reduction (*: G : omp_out.g += omp_in.g)
+
+void
+f2 ()
+{
+ G g;
+ #pragma omp parallel reduction (*: g)
+ {
+ g.g++;
+ }
+}
+
+#pragma omp declare reduction (|: A : omp_out.a += omp_in.a)
+#pragma omp declare reduction (|: B : omp_out.b += omp_in.b)
+#pragma omp declare reduction (|: C : omp_out.c += omp_in.c) // { dg-message "operator" }
+#pragma omp declare reduction (|: D : omp_out.d += omp_in.d)
+#pragma omp declare reduction (|: E : omp_out.e += omp_in.e)
+#pragma omp declare reduction (|: F : omp_out.f += omp_in.f) // { dg-message "operator" }
+
+void
+f3 ()
+{
+ G g;
+ #pragma omp parallel reduction (|: g) // { dg-error "user defined reduction lookup is ambiguous" }
+ {
+ g.g++;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/graphite.exp b/gcc-4.9/gcc/testsuite/g++.dg/graphite/graphite.exp
new file mode 100644
index 000000000..7079634e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/graphite.exp
@@ -0,0 +1,71 @@
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+if ![check_effective_target_fgraphite] {
+ return
+}
+
+# Remove VALUE from LIST_VARIABLE.
+proc lremove {list_variable value} {
+ upvar 1 $list_variable var
+ set idx [lsearch -exact $var $value]
+ set var [lreplace $var $idx $idx]
+}
+
+# The default action for a test is 'compile'. Save current default.
+global dg-do-what-default
+set save-dg-do-what-default ${dg-do-what-default}
+
+# Initialize `dg'.
+dg-init
+
+set wait_to_run_files [lsort [glob -nocomplain $srcdir/$subdir/*.C ] ]
+set scop_files [lsort [glob -nocomplain $srcdir/$subdir/scop-*.C ] ]
+set id_files [lsort [glob -nocomplain $srcdir/$subdir/id-*.C ] ]
+set run_id_files [lsort [glob -nocomplain $srcdir/$subdir/run-id-*.C ] ]
+set interchange_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.C ] ]
+set block_files [lsort [glob -nocomplain $srcdir/$subdir/block-*.C ] ]
+
+# Tests to be compiled.
+set dg-do-what-default compile
+g++-dg-runtest $scop_files "-O2 -fgraphite -fdump-tree-graphite-all"
+g++-dg-runtest $id_files "-O2 -fgraphite-identity -ffast-math"
+
+# Tests to be run.
+set dg-do-what-default run
+g++-dg-runtest $run_id_files "-O2 -fgraphite-identity"
+g++-dg-runtest $interchange_files "-O2 -floop-interchange -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all"
+g++-dg-runtest $block_files "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all"
+
+# The default action for the rest of the files is 'compile'.
+set dg-do-what-default compile
+foreach f $scop_files {lremove wait_to_run_files $f}
+foreach f $id_files {lremove wait_to_run_files $f}
+foreach f $run_id_files {lremove wait_to_run_files $f}
+foreach f $interchange_files {lremove wait_to_run_files $f}
+foreach f $block_files {lremove wait_to_run_files $f}
+g++-dg-runtest $wait_to_run_files " -pedantic-errors"
+
+# Clean up.
+set dg-do-what-default ${save-dg-do-what-default}
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/id-1.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/id-1.C
new file mode 100644
index 000000000..5770e905d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/id-1.C
@@ -0,0 +1,39 @@
+#include <vector>
+
+template <int rank, int dim> class Tensor;
+template <int dim>
+class Tensor<1,dim>
+{
+ public:
+ explicit Tensor (const bool initialize = true);
+ Tensor (const Tensor<1,dim> &);
+ double values[(dim!=0) ? (dim) : 1];
+};
+template <int dim>
+Tensor<1,dim>::Tensor (const Tensor<1,dim> &p)
+{
+ for (unsigned int i=0; i<dim; ++i)
+ values[i] = p.values[i];
+}
+template <int dim>
+class KellyErrorEstimator
+{
+ struct PerThreadData
+ {
+ std::vector<std::vector<std::vector<Tensor<1,dim> > > > psi;
+ PerThreadData (const unsigned int n_solution_vectors,
+ const unsigned int n_components,
+ const unsigned int n_q_points);
+ };
+};
+template <int dim>
+KellyErrorEstimator<dim>::PerThreadData::
+PerThreadData (const unsigned int n_solution_vectors,
+ const unsigned int n_components,
+ const unsigned int n_q_points)
+{
+ for (unsigned int i=0; i<n_solution_vectors; ++i)
+ for (unsigned int qp=0;qp<n_q_points;++qp)
+ psi[i][qp].resize(n_components);
+}
+template class KellyErrorEstimator<3>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr39447.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr39447.C
new file mode 100644
index 000000000..a0d09ec2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr39447.C
@@ -0,0 +1,34 @@
+/* { dg-options "-O2 -fgraphite-identity" } */
+
+struct Point
+{
+ int line, col;
+
+ Point( int l = -1, int c = 0 ) throw() : line( l ), col( c ) {}
+ bool operator==( const Point & p ) const throw()
+ { return ( line == p.line && col == p.col ); }
+ bool operator<( const Point & p ) const throw()
+ { return ( line < p.line || ( line == p.line && col < p.col ) ); }
+};
+
+class Buffer
+{
+public:
+ int characters( const int line ) const throw();
+ int pgetc( Point & p ) const throw();
+ Point eof() const throw() { return Point( 0, 0 ); }
+ bool pisvalid( const Point & p ) const throw()
+ { return ( ( p.col >= 0 && p.col < characters( p.line ) ) || p == eof() );
+ }
+ bool save( Point p1 = Point(), Point p2 = Point() ) const;
+};
+
+bool Buffer::save( Point p1, Point p2 ) const
+{
+ if( !this->pisvalid( p1 ) ) p1 = eof();
+ if( !this->pisvalid( p2 ) ) p2 = eof();
+ for( Point p = p1; p < p2; ) { pgetc( p ); }
+ return true;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41305.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41305.C
new file mode 100644
index 000000000..6a30b0e9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41305.C
@@ -0,0 +1,332 @@
+// { dg-do compile }
+// { dg-options "-O3 -floop-interchange -Wno-conversion-null" }
+
+void __throw_bad_alloc ();
+
+template <typename _Tp> void
+swap (_Tp & __a, _Tp __b)
+{
+ __a = __b;
+}
+
+template <typename _Category> struct iterator
+{
+ typedef _Category iterator_category;
+};
+
+template <typename _Tp> struct allocator
+{
+ typedef __SIZE_TYPE__ size_type;
+ typedef _Tp pointer;
+ pointer allocate (size_type)
+ {
+ __throw_bad_alloc ();
+ return __null;
+ }
+};
+
+template <class T, class = allocator <T> >class unbounded_array;
+template <class T, class = unbounded_array <T> >class vector;
+template <class = int> class scalar_vector;
+template <class IC> struct random_access_iterator_base : public iterator <IC>
+{
+};
+
+template <class X, class> struct promote_traits
+{
+ typedef __typeof__ ((X ())) promote_type;
+};
+
+template <class T> struct scalar_traits
+{
+ typedef T const_reference;
+ typedef T reference;
+};
+
+template <class T> struct type_traits : scalar_traits <T>
+{
+};
+
+struct dense_proxy_tag
+{
+};
+
+template <class> struct iterator_base_traits;
+
+template <> struct iterator_base_traits <dense_proxy_tag>
+{
+ template <class, class> struct iterator_base
+ {
+ typedef random_access_iterator_base <dense_proxy_tag> type;
+ };
+};
+
+template <class I1, class> struct iterator_restrict_traits
+{
+ typedef I1 iterator_category;
+};
+
+template <class> class storage_array
+{
+};
+
+template <class T, class ALLOC> struct unbounded_array : public storage_array <unbounded_array <ALLOC> >
+{
+ typedef typename ALLOC::size_type size_type;
+ typedef T & reference;
+ typedef T *pointer;
+ unbounded_array (size_type size, ALLOC = ALLOC ()) : alloc_ (), size_ (size)
+ {
+ alloc_.allocate (size_);
+ }
+ ~unbounded_array ()
+ {
+ if (size_)
+ for (;;);
+ }
+ size_type
+ size () const
+ {
+ return size_;
+ }
+ reference
+ operator[] (size_type i)
+ {
+ return data_[i];
+ }
+ void
+ swap (unbounded_array & a)
+ {
+ ::swap (size_, a.size_);
+ }
+ ALLOC alloc_;
+ size_type size_;
+ pointer data_;
+};
+
+template <class T1, class T2> struct scalar_binary_functor
+{
+ typedef typename promote_traits <T1, T2>::promote_type result_type;
+};
+
+template <class T1, class T2> struct scalar_plus : public scalar_binary_functor <T1, T2>
+{
+};
+
+template <class T1, class T2> struct scalar_multiplies : public scalar_binary_functor <T1, T2>
+{
+};
+
+template <class T1, class T2> struct scalar_binary_assign_functor
+{
+ typedef typename type_traits <T1>::reference argument1_type;
+ typedef typename type_traits <T2>::const_reference argument2_type;
+};
+
+template <class T1, class T2> struct scalar_assign : public scalar_binary_assign_functor <T1, T2>
+{
+ typedef typename scalar_binary_assign_functor <T1, T2>::argument1_type argument1_type;
+ typedef typename scalar_binary_assign_functor <T1, T2>::argument2_type argument2_type;
+ static const bool computed = false;
+ static void
+ apply (argument1_type t1, argument2_type t2)
+ {
+ t1 = t2;
+ }
+};
+
+template <class E> struct vector_expression
+{
+ typedef E expression_type;
+ const expression_type &
+ operator () () const
+ {
+ return *static_cast <const expression_type *>(this);
+ }
+};
+
+template <class C> class vector_container : public vector_expression <C>
+{
+};
+
+template <class E> struct vector_reference : public vector_expression <vector_reference <E> >
+{
+ typedef typename E::size_type size_type;
+ typename E::const_reference const_reference;
+ typedef E referred_type;
+ vector_reference (referred_type & e) : e_ (e)
+ {
+ }
+ size_type
+ size () const
+ {
+ return expression ().size ();
+ }
+ referred_type &
+ expression () const
+ {
+ return e_;
+ }
+ referred_type &e_;
+};
+
+template <class E1, class E2, class F> struct vector_binary : public vector_expression <vector_binary <E1, E2, F> >
+{
+ typedef E1 expression1_type;
+ typedef E2 expression2_type;
+ typedef typename E1::const_closure_type expression1_closure_type;
+ typedef typename E2::const_closure_type expression2_closure_type;
+ typedef typename promote_traits <typename E1::size_type, typename E2::size_type>::promote_type size_type;
+ typedef typename F::result_type value_type;
+
+ vector_binary (const expression1_type & e1, expression2_type e2) : e1_ (e1), e2_ (e2)
+ {
+ }
+
+ size_type
+ size () const
+ {
+ return e1_.size ();
+ }
+
+ class const_iterator : public iterator_base_traits <typename iterator_restrict_traits <typename E1::const_iterator::iterator_category, const_iterator>::iterator_category>::template iterator_base <const_iterator, value_type>::type
+ {
+ };
+ expression1_closure_type e1_;
+ expression2_closure_type e2_;
+};
+
+template <class E1, class E2, class F> struct vector_binary_traits
+{
+ typedef vector_binary <E1, E2, F> expression_type;
+ typedef expression_type result_type;
+};
+
+template <class E1, class E2> typename vector_binary_traits <E1, E2, scalar_plus <typename E1::value_type, typename E2::value_type> >::result_type
+operator + (vector_expression <E1> &e1, const vector_expression <E2> &e2)
+{
+ typedef typename vector_binary_traits <E1, E2, scalar_plus <typename E1::value_type, typename E2::value_type> >::expression_type expression_type;
+ return expression_type (e1 (), e2 ());
+}
+
+template <class E1, class E2, class F> struct vector_binary_scalar2 : public vector_expression <vector_binary_scalar2 <E1, E2, F> >
+{
+ typedef vector_binary_scalar2 <E1, E2, F> self_type;
+ typedef typename E1::size_type size_type;
+ typedef typename F::result_type value_type;
+ typedef self_type const_closure_type;
+};
+
+template <class E1, class E2, class F> struct vector_binary_scalar2_traits
+{
+ typedef vector_binary_scalar2 <E1, E2, F> result_type;
+};
+
+template <class E1, class T2>
+typename vector_binary_scalar2_traits <E1, T2, scalar_multiplies <typename E1::value_type, T2> >::result_type
+operator * (vector_expression <E1>, T2)
+{
+}
+
+template <class SC> struct vector_assign_traits
+{
+ typedef SC storage_category;
+};
+
+template <template <class, class> class F, class V, class E> void
+indexing_vector_assign (V & v, vector_expression <E>)
+{
+ typedef F <typename V::reference, typename E::value_type> functor_type;
+ typedef typename V::size_type size_type;
+ size_type size (v.size ());
+ for (size_type i; i <size; ++i)
+ functor_type::apply (v (i), (i));
+}
+
+template <template <class, class> class F, class V, class E> void
+vector_assign (V & v, const vector_expression <E> &e, dense_proxy_tag)
+{
+ indexing_vector_assign <F> (v, e);
+}
+
+template <template <class, class> class F, class V, class E> void
+vector_assign (V & v, const vector_expression <E> &e)
+{
+ typedef typename vector_assign_traits <typename V::storage_category>::storage_category storage_category;
+ vector_assign <F> (v, e, storage_category ());
+}
+
+template <class T, class A> struct vector : public vector_container <vector <T> >
+{
+ typedef vector <T> self_type;
+ typedef typename A::size_type size_type;
+ typedef T value_type;
+ typedef typename type_traits <T>::const_reference const_reference;
+ typedef T &reference;
+ typedef A array_type;
+ typedef vector_reference <const self_type> const_closure_type;
+ typedef dense_proxy_tag storage_category;
+ vector (size_type size):vector_container <self_type> (), data_ (size)
+ {
+ }
+ vector (size_type size, value_type):vector_container <self_type> (), data_ (size)
+ {
+ }
+ template <class AE> vector (const vector_expression <AE> &ae) : vector_container <self_type> (), data_ (ae ().size ())
+ {
+ vector_assign <scalar_assign> (*this, ae);
+ }
+ size_type
+ size () const
+ {
+ return data_.size ();
+ }
+ array_type &
+ data ()
+ {
+ return data_;
+ }
+ reference
+ operator () (size_type i)
+ {
+ return data ()[i];
+ }
+ template <class AE> vector operator += (const vector_expression <AE> &ae)
+ {
+ self_type temporary (*this + ae);
+ data_.swap (temporary.data ());
+ return *this;
+ }
+ class const_iterator : public random_access_iterator_base <dense_proxy_tag>
+ {
+ };
+ array_type data_;
+};
+
+template <class T> struct scalar_vector : public vector_container <scalar_vector <> >
+{
+ typedef scalar_vector self_type;
+ typedef __SIZE_TYPE__ size_type;
+ typedef T value_type;
+ typedef T const_reference;
+ typedef vector_reference <self_type> const_closure_type;
+};
+
+void
+bar (vector <double>)
+{
+}
+
+void
+foo (int n_samp)
+{
+ vector <double> xi (n_samp, 0);
+ for (int n = 0; n <n_samp; ++n)
+ {
+ vector <double> cos_w_n (n_samp);
+ xi += cos_w_n * 6.0;
+ }
+ vector <double> cos_wd (n_samp);
+ xi += cos_wd;
+ bar (xi + scalar_vector <> ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41562.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41562.C
new file mode 100644
index 000000000..36b8c275f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr41562.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-loop-distribution -floop-block" } */
+
+typedef struct stSirenEncoder { } *SirenEncoder;
+
+int Siren7_EncodeFrame(SirenEncoder encoder, unsigned char *DataIn, unsigned char *DataOut) {
+ int number_of_regions;
+ static int absolute_region_power_index[28] = {0};
+ static int region_mlt_bit_counts[28] = {0};
+ int dwRes = 0;
+ int region;
+ if (dwRes != 0) return dwRes;
+ for(region = 0; region < number_of_regions; region++)
+ {
+ absolute_region_power_index[region] += 24;
+ region_mlt_bit_counts[region] = 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42130.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42130.C
new file mode 100644
index 000000000..ee31abad0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42130.C
@@ -0,0 +1,19 @@
+/* { dg-options "-O2 -fgraphite-identity -fno-tree-ch" } */
+#include <vector>
+
+using std::vector;
+
+vector<unsigned> & __attribute__((noinline, noclone)) foo(unsigned n)
+{
+ vector<unsigned> *vv = new vector<unsigned>(n, 0u);
+ return *vv;
+}
+
+int main()
+{
+ foo(0);
+ return 0;
+}
+
+/* { dg-do run } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42681.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42681.C
new file mode 100644
index 000000000..4c137ec06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42681.C
@@ -0,0 +1,17 @@
+/* { dg-options "-O1 -fgraphite-identity -fno-loop-block -fno-loop-interchange -fno-loop-strip-mine" } */
+
+typedef __SIZE_TYPE__ size_t;
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+
+struct A {
+ int i, j;
+ A() : i(0) {}
+};
+
+void Init(A *a)
+{
+ for (int i = 0; i < 20; i++) {
+ new (&a[i]) A;
+ a[i].j = 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42930.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42930.C
new file mode 100644
index 000000000..c1150ce93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr42930.C
@@ -0,0 +1,55 @@
+/* { dg-options "-O1 -floop-block" } */
+
+typedef unsigned char byte;
+typedef unsigned int uint;
+typedef unsigned char uint8;
+namespace Common {
+class NonCopyable {
+};
+template<class In, class Out>
+Out copy(In first, In last, Out dst) {
+ while (first != last)
+ *dst++ = *first++;
+}
+template<class T>
+class Array {
+ uint _size;
+ T *_storage;
+public:
+ Array<T>& operator=(const Array<T> &array) {
+ copy(array._storage, array._storage + _size, _storage);
+ }
+};
+}
+namespace Graphics {
+struct PixelFormat {
+ inline PixelFormat() {
+ }
+ inline PixelFormat(byte BytesPerPixel,
+ byte RBits, byte GBits, byte BBits, byte ABits,
+ byte RShift, byte GShift, byte BShift, byte AShift) {
+ }
+};
+};
+namespace Cine {
+static const Graphics::PixelFormat kLowPalFormat(2, 3, 3, 3, 0, 8, 4, 0, 0);
+class Palette {
+public:
+ struct Color {
+ uint8 r, g, b;
+ };
+ Palette(const Graphics::PixelFormat format = Graphics::PixelFormat(), const uint numColors = 0);
+ bool empty() const;
+ bool isValid() const;
+ Common::Array<Color> _colors;
+};
+class FWRenderer : public Common::NonCopyable {
+ Cine::Palette _activePal;
+ void drawCommand();
+};
+void FWRenderer::drawCommand() {
+ if (!_activePal.isValid() || _activePal.empty()) {
+ _activePal = Cine::Palette(kLowPalFormat, 16);
+ }
+}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr43026.C b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr43026.C
new file mode 100644
index 000000000..c88019703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/graphite/pr43026.C
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgraphite-identity" } */
+
+template<typename Tp > class vector { };
+
+template <int rank, int dim> class Tensor;
+
+template <int dim> class Tensor<1,dim> {
+public:
+ Tensor (const Tensor<1,dim> &);
+private:
+ double values[(dim != 0) ? (dim) : 1];
+};
+
+template <int dim>
+#ifdef NOINLINE
+// declaring this noinline prevents the ICE
+__attribute__ ((noinline))
+#endif
+Tensor<1,dim>::Tensor (const Tensor<1,dim> &p)
+{
+ for (unsigned int i = 0; i < dim; ++i)
+ values[i] = p.values[i];
+}
+
+template <int rank, int dim>
+class Tensor {
+ Tensor<rank-1,dim> subtensor[dim];
+};
+
+template <int dim> class Base {
+public:
+ const unsigned int npoints;
+ const unsigned int dofs;
+ const Tensor<2,dim> &s2d (const unsigned int fno,
+ const unsigned int pno) const;
+ void getf2d (vector<Tensor<2,dim> >& d2) const;
+};
+
+template <int dim>
+void Base<dim>:: getf2d
+ (vector<Tensor<2,dim> > &d2) const
+{
+ unsigned int point, sf;
+
+ for (point = 0; point < npoints; ++point)
+ for (sf = 0; sf < dofs; ++sf)
+ Tensor<2,dim> tmp = s2d (sf, point);
+}
+
+template void Base<3>::getf2d (vector<Tensor<2,3> > &) const;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.exp b/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.exp
new file mode 100644
index 000000000..3ff7f2f77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.exp
@@ -0,0 +1,58 @@
+# This harness is for tests that should be run at all optimisation levels.
+
+load_lib g++-dg.exp
+load_lib gcc-gdb-test.exp
+
+# Disable on darwin until radr://7264615 is resolved.
+if { [istarget *-*-darwin*] } {
+ return
+}
+
+if { [istarget "powerpc-ibm-aix*"] } {
+ set torture_execute_xfail "powerpc-ibm-aix*"
+ return
+}
+
+proc check_guality {args} {
+ set result [eval check_compile guality_check executable $args "-g -O0"]
+ set lines [lindex $result 0]
+ set output [lindex $result 1]
+ set ret 0
+ if {[string match "" $lines]} {
+ set execout [g++_load "./$output"]
+ set ret [string match "*1 PASS, 0 FAIL, 0 UNRESOLVED*" $execout]
+ }
+ remote_file build delete $output
+ return $ret
+}
+
+dg-init
+
+global GDB
+if ![info exists ::env(GUALITY_GDB_NAME)] {
+ if [info exists GDB] {
+ set guality_gdb_name "$GDB"
+ } else {
+ set guality_gdb_name "[transform gdb]"
+ }
+ setenv GUALITY_GDB_NAME "$guality_gdb_name"
+}
+
+if {[check_guality "
+ #include \"$srcdir/$subdir/guality.h\"
+ volatile long int varl = 6;
+ int main (int argc, char *argv\[\])
+ {
+ GUALCHKVAL (varl);
+ return 0;
+ }
+"]} {
+ gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] ""
+ gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] ""
+}
+
+if [info exists guality_gdb_name] {
+ unsetenv GUALITY_GDB_NAME
+}
+
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.h b/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.h
new file mode 100644
index 000000000..dd858d28b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/guality/guality.h
@@ -0,0 +1 @@
+#include "../../gcc.dg/guality/guality.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/guality/pr46815.C b/gcc-4.9/gcc/testsuite/g++.dg/guality/pr46815.C
new file mode 100644
index 000000000..41b921995
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/guality/pr46815.C
@@ -0,0 +1,25 @@
+// PR debug/46815
+// { dg-do run }
+// { dg-options "-g" }
+// { dg-skip-if "" { *-*-* } { "*" } { "-O0" } }
+
+struct S
+{
+ int i;
+ S () { i = 42; }
+ virtual void foo (void) {}
+};
+
+S
+bar ()
+{
+ S s;
+ return s; // { dg-final { gdb-test 17 "s.i" "42" } }
+}
+
+int
+main ()
+{
+ S s = bar ();
+ return s.i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/guality/pr55665.C b/gcc-4.9/gcc/testsuite/g++.dg/guality/pr55665.C
new file mode 100644
index 000000000..16c6d2816
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/guality/pr55665.C
@@ -0,0 +1,33 @@
+// PR debug/55655
+// { dg-do run }
+// { dg-options "-g" }
+
+extern "C" void abort ();
+struct A { A (int); int a; };
+
+__attribute__((noinline, noclone)) int
+bar (void)
+{
+ return 40;
+}
+
+__attribute__((noinline, noclone)) void
+foo (int x)
+{
+ __asm volatile ("" : : "r" (x) : "memory");
+}
+
+A::A (int x)
+{
+ static int p = bar ();
+ foo (p); // { dg-final { gdb-test 23 "p" "40" } }
+ a = ++p;
+}
+
+int
+main ()
+{
+ A a (42);
+ if (a.a != 41)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/guality/redeclaration1.C b/gcc-4.9/gcc/testsuite/g++.dg/guality/redeclaration1.C
new file mode 100644
index 000000000..93b0750b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/guality/redeclaration1.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-g" }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+
+volatile int l;
+
+namespace S
+{
+ int i = 24;
+ void __attribute__((noinline))
+ f()
+ {
+ int i = 42;
+ l = i; // { dg-final { gdb-test 14 "i" "42" } }
+ {
+ extern int i;
+ l = i; // { dg-final { gdb-test 17 "i" "24" } }
+ }
+ }
+}
+
+int
+main (void)
+{
+ S::f ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C
new file mode 100644
index 000000000..7f2ec6892
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C
@@ -0,0 +1,19 @@
+// Test that we can access a member from an inaccessible base if it has
+// been promoted with a using-declaration.
+
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+struct B: private A
+{
+ using A::i;
+};
+
+struct C: public B
+{
+ void f () { B::i = 0; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C
new file mode 100644
index 000000000..247799450
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C
@@ -0,0 +1,14 @@
+// Test that a base doesn't get special rights to convert to itself.
+
+struct A {
+ void f ();
+};
+
+struct B: private A { };
+
+B b;
+
+void A::f ()
+{
+ A* ap = &b; // { dg-error "base|inherit" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C
new file mode 100644
index 000000000..1862bfc34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+class __new_alloc {
+public:
+ static void allocate() {}
+};
+
+template <class _Alloc>
+class __debug_alloc : public _Alloc {
+public:
+ static void allocate();
+};
+
+template <class _Alloc>
+void __debug_alloc<_Alloc>::allocate() {
+ _Alloc::allocate();
+}
+
+template class __debug_alloc<__new_alloc>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C
new file mode 100644
index 000000000..33f991b66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C
@@ -0,0 +1,8 @@
+struct Container { int Count(); };
+struct List : private Container {
+ using Container::Count;
+};
+struct INetContentTypeParameterList : private List { void Clear(); };
+void INetContentTypeParameterList::Clear() {
+ Count();//Calling non static but in a non-static method.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C
new file mode 100644
index 000000000..715a4a3b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C
@@ -0,0 +1,4 @@
+struct S { ~S(); };
+struct T : virtual private S {};
+struct U : private T {};
+U u;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C
new file mode 100644
index 000000000..7645c2d5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C
@@ -0,0 +1,15 @@
+// PR c++/28588
+
+class Foo {
+ static void f(); // { dg-error "private" }
+ static void f(int);
+ static void g(); // { dg-error "private" }
+};
+
+void h()
+{
+ Foo foo;
+ void (*f)();
+ f = foo.f; // { dg-error "context" }
+ f = foo.g; // { dg-error "context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C
new file mode 100644
index 000000000..4e2db1479
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C
@@ -0,0 +1,15 @@
+struct B {
+ static void f();
+};
+
+template <typename T>
+struct D : private B {
+ void g() {
+ f();
+ }
+};
+
+void h() {
+ D<int> d;
+ d.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C
new file mode 100644
index 000000000..310b7a01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C
@@ -0,0 +1,25 @@
+// PR c++/29138
+
+class A
+{
+public:
+ int i;
+ class A1
+ {
+ int j;
+ };
+};
+
+class B : private A
+{
+public:
+ A::i; // { dg-warning "deprecated" }
+ A::A1; // { dg-warning "deprecated" }
+};
+
+void
+f ()
+{
+ B b;
+ B::A1 a1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C
new file mode 100644
index 000000000..3596bb598
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C
@@ -0,0 +1,14 @@
+// PR c++/51614
+
+struct A
+{
+ void foo();
+};
+
+struct B : A {};
+struct C : A {};
+
+struct D : B, C
+{
+ D() { A::foo(); } // { dg-error "ambiguous" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C
new file mode 100644
index 000000000..952c6d20f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-pedantic-errors -w" }
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Nov 2001 <nathan@nathan@codesourcery.com>
+
+// PR 164
+// Although a direct base can be inaccessible due to ambiguity, that
+// should not blow up synthesized methods.
+
+struct A {int m;};
+struct B : A {int m;};
+struct C : virtual A, B {int m;};
+struct D : B, C {int m;};
+
+void foo2 ()
+{
+ D d;
+ D e (d);
+
+ e = d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C
new file mode 100644
index 000000000..5c7d812c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Sep 2004 <nathan@codesourcery.com>
+
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// Bug 17620. Bogus duplicate base error.
+
+struct S {};
+
+typedef S B;
+
+struct D1 : B {};
+struct D2 : B {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C
new file mode 100644
index 000000000..313d04242
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C
@@ -0,0 +1,8 @@
+// PR c++/35985
+// { dg-do compile }
+
+template<typename T> struct A : T {}; // { dg-error "struct or class type" }
+
+struct B;
+
+A<void (B::*)()> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C
new file mode 100644
index 000000000..843c72ca3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C
@@ -0,0 +1,10 @@
+// Origin: jason@redhat.com
+// { dg-do compile }
+
+struct A { A(); A(const A&); int i; };
+struct B: public A { };
+
+int f (bool b, A& ar, B& br)
+{
+ return (b?ar:br).i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C
new file mode 100644
index 000000000..e16c489a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C
@@ -0,0 +1,23 @@
+typedef struct _A A;
+typedef struct _A B;
+
+void some_function(B *b);
+
+class AClass {
+
+public:
+ operator A*() { return 0;}
+
+};
+
+class BClass :public AClass {
+
+public:
+ operator B*() { return 0;}
+
+};
+
+int main(int argc, char **argv) {
+ BClass b;
+ some_function(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C
new file mode 100644
index 000000000..fd0083825
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C
@@ -0,0 +1,22 @@
+// PR c++/25895
+// { dg-do run }
+
+class base {
+public:
+ base() {}
+private:
+ int val_;
+};
+
+class derived : public base {
+public:
+ derived() {}
+};
+
+static bool x = true ? (derived*)0 : (base*)0;
+
+int main ()
+{
+ if (x)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C
new file mode 100644
index 000000000..73d8c20f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C
@@ -0,0 +1,31 @@
+// PR 31074
+// Bug: The reference cast wasn't finding the desired static_cast followed by
+// const_cast interpretation.
+
+struct Shape
+{
+ Shape() {}
+ virtual ~Shape() {}
+};
+
+struct Loop
+{
+ Loop() {}
+ virtual ~Loop() {}
+ virtual void func() {}
+};
+
+struct Rect :
+ public Shape,
+ public Loop
+{
+ Rect() {}
+ virtual ~Rect() {}
+};
+
+int main ()
+{
+ const Rect* rect = new Rect();
+ Loop &l = ((Loop&)(*rect));
+ return (&l != (const Loop *)rect);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C
new file mode 100644
index 000000000..978c3e825
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C
@@ -0,0 +1,33 @@
+// PR c++/5607
+
+// { dg-do run }
+
+class A {
+public:
+ virtual A* getThis() { return this; }
+};
+
+class B {
+int a;
+public:
+ virtual B* getThis() { return this; }
+};
+
+class AB : public A, public B {
+public:
+ virtual AB* getThis() { return this; }
+};
+
+int main ()
+{
+ AB* ab = new AB();
+
+ A* a = ab;
+ B* b = ab;
+
+ if (a->getThis() != a
+ || b->getThis() != b)
+ return 1;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C
new file mode 100644
index 000000000..fe5d03c27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12699 ICE with covariancy
+
+struct c1 {
+ virtual void f1() const {}
+};
+
+struct c5 {};
+
+struct c6 : virtual c1 {
+ virtual c5* f33() const {}
+};
+
+struct c13 : virtual c5 { };
+
+struct c17 : virtual c6
+{
+ virtual c13* f33() const {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C
new file mode 100644
index 000000000..acba965f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12700 ICE with covariancy
+
+struct c2 { int i; };
+
+struct c1 {
+ virtual c2& f8() {}
+};
+
+struct c3 : c1, c2 {
+ virtual c2& f8() {}
+};
+
+struct c11 : public c1 {
+ virtual c3& f8() {}
+};
+
+struct c15 : virtual c3 {
+ virtual c2& f8() {}
+};
+
+struct c18 : virtual c11 {
+ virtual c15& f8();
+};
+
+c15& c18::f8() { throw 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C
new file mode 100644
index 000000000..434082abb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Feb 2005<nathan@codesourcery.com>
+
+// PR 20232: ICE on invalid
+
+struct T { };
+
+struct S;
+
+struct B
+{
+ virtual T *Foo (); // { dg-error "overriding" "" }
+};
+
+struct D : B
+{
+ virtual S *Foo (); // { dg-error "invalid covariant" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C
new file mode 100644
index 000000000..af60840c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 May 2005<nathan@codesourcery.com>
+
+// Origin:Andrew Pinski: pinskia@gcc.gnu.org
+// PR 21427: ICE on valid
+
+struct B1 {
+ public:
+ virtual void foo();
+};
+
+struct B2 {
+ public:
+ virtual B2 & bar() = 0;
+};
+
+struct I : public B1, B2 {
+ public:
+ virtual ~I();
+ virtual I & bar();
+};
+
+struct D : public I {
+ virtual ~D();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C
new file mode 100644
index 000000000..13ca877b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com>
+
+// PR 22604
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A;
+
+struct B
+{
+ virtual A* foo(); // { dg-error "overriding" "" }
+};
+
+namespace N
+{
+ struct A : B
+ {
+ virtual A* foo(); // { dg-error "invalid covariant" "" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C
new file mode 100644
index 000000000..4696cc633
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C
@@ -0,0 +1,18 @@
+/* This used to ICE (PR c++/27492) */
+/* { dg-do "compile" } */
+
+struct A {};
+
+class B : A
+{
+ virtual A* foo(); /* { dg-error "overriding" } */
+};
+
+struct C : virtual B
+{
+ virtual C* foo(); /* { dg-error "invalid covariant return type" } */
+};
+
+C* C::foo() { return 0; }
+
+struct D : C {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C
new file mode 100644
index 000000000..de9307e89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C
@@ -0,0 +1,17 @@
+/* PR c++/28253 This used to ICE. */
+/* { dg-do compile } */
+
+struct A
+{
+ virtual A* foo();
+};
+
+struct B : virtual A
+{
+ virtual B* foo(); /* { dg-error "overriding" } */
+};
+
+struct C : B
+{
+ virtual C& foo(); /* { dg-error "conflicting return type" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C
new file mode 100644
index 000000000..b2de15f7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C
@@ -0,0 +1,43 @@
+// PR c++/43120
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct A {
+ int a;
+
+ A(int a_) : a(a_) {}
+
+ A(const A &other) { }
+
+ virtual void dummy() {}
+};
+
+struct B {
+ virtual B *clone() const = 0;
+};
+
+struct C : public virtual B {
+ virtual C *clone() const = 0;
+};
+
+struct E* ep;
+struct E : public A, public C {
+ E(int a_) : A(a_) { ep = this; }
+
+ virtual E *clone() const {
+ if (this != ep)
+ abort();
+ return 0;
+ }
+};
+
+int main() {
+ E *a = new E(123);
+ C *c = a;
+ B *b = a;
+ c->clone();
+ b->clone();
+ delete a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C
new file mode 100644
index 000000000..31e62165e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C
@@ -0,0 +1,41 @@
+// PR c++/47873
+// { dg-do run }
+
+struct Base
+{
+ virtual ~Base(){}
+
+ virtual Base& This() { return *this; }
+};
+
+
+struct Ent : virtual Base
+{
+ void *m_Body;
+
+ Ent& This() { return *this; }
+
+ virtual Ent& body()
+ {
+ return This();
+ }
+
+};
+
+
+struct Msg : virtual Ent
+{
+ Msg()
+ {
+ body();
+ }
+
+ Msg& This() { return *this; }
+};
+
+int main()
+{
+ Msg m;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C
new file mode 100644
index 000000000..22c2b0eb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C
@@ -0,0 +1,14 @@
+// PR c++/46220
+// According to the letter of the standard this is invalid,
+// but that seems like a bug.
+
+class Baz;
+class Foo {
+public:
+ virtual const Baz* getBaz() = 0;
+};
+class Bar : public Foo {
+public:
+ Baz* getBaz();
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C
new file mode 100644
index 000000000..b6d93d6b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C
@@ -0,0 +1,70 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Fixed offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct D : B1, B2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C
new file mode 100644
index 000000000..cf7e196fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C
@@ -0,0 +1,10 @@
+// PR c++/51812
+// { dg-do link }
+
+class Object {
+ virtual Object* clone() const;
+};
+class DNA: virtual public Object {
+ virtual DNA* clone() const {return new DNA(*this);}
+};
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C
new file mode 100644
index 000000000..42cdf8700
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C
@@ -0,0 +1,17 @@
+// PR c++/59645
+
+struct A { virtual ~A(); };
+struct B { virtual ~B(); };
+struct C : A, B {};
+
+struct X
+{
+ virtual B* foo(volatile int);
+};
+
+struct Y : X
+{
+ virtual C* foo(volatile int);
+};
+
+C* Y::foo(volatile int) { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C
new file mode 100644
index 000000000..b7024c455
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C
@@ -0,0 +1,70 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Virtual offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct D : virtual B1, virtual B2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C
new file mode 100644
index 000000000..8f6101b3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C
@@ -0,0 +1,76 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Fixed & virtual offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct Pad1 { virtual ~Pad1 (){}};
+struct Pad2 { virtual ~Pad2 (){}};
+struct Proxy1 : Pad1, B1 {};
+struct Proxy2 : Pad2, B2 {};
+
+struct D : virtual Proxy1, virtual Proxy2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C
new file mode 100644
index 000000000..a46b1bf20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2();
+};
+
+struct c3 : c1
+{
+ virtual c1 &f2();
+};
+
+c1 &c3::f2()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C
new file mode 100644
index 000000000..dc5597153
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2();
+};
+
+struct c3 : virtual c1
+{
+ virtual c1 &f2();
+};
+
+c1 &c3::f2()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C
new file mode 100644
index 000000000..4f0c7f7dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C
@@ -0,0 +1,51 @@
+// { dg-do compile }
+// { dg-prune-output "direct base" }
+// { dg-options "-fdump-class-hierarchy" }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2() volatile;
+};
+
+struct c2
+{
+ int m;
+};
+
+struct c3 : virtual c0, virtual c1, c2
+{
+ virtual c1 &f2() volatile;
+};
+
+struct c4 : virtual c3, virtual c0, virtual c1
+{
+ int m;
+};
+
+struct c6 : c0, c3, c4
+{
+ virtual c1 &f2() volatile;
+};
+
+// f2 appears four times in the c6 vtables:
+// once in c1-in-c3-in-c6 - covariant, virtual base, uses c1 vcall offset and c0 vbase offset
+// { dg-final { scan-tree-dump "24 .*c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "48 .*c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } }
+// once in c3-in-c6 - non-covariant, non-virtual base, calls f2 directly
+// { dg-final { scan-tree-dump "28 .*c6::f2" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "56 .*c6::f2" "class" { target lp64 } } }
+// once in c1-in-c3-in-c4-in-c6 - lost primary
+// { dg-final { scan-tree-dump "80 .*0u" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "160 .*0u" "class" { target lp64 } } }
+// once in c3-in-c4-in-c6 - c3 vcall offset
+// { dg-final { scan-tree-dump "84 .*c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "168 .*c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } }
+
+// { dg-final { cleanup-tree-dump "class" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C
new file mode 100644
index 000000000..33dc43106
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2002 <nathan@codesourcery.com>
+
+// ICE with covariant thunks.
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2 ();
+};
+
+struct c2
+{
+ int m;
+};
+
+struct c3 : virtual c0, virtual c1, c2
+{
+ virtual c1 &f2 ();
+};
+
+c1 &c3::f2 ()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3, virtual c0, virtual c1 {};
+
+struct c8 : virtual c2, virtual c0 {};
+
+struct c12 : virtual c4, virtual c3, virtual c8 {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C
new file mode 100644
index 000000000..62c3a2202
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C
@@ -0,0 +1,32 @@
+// { dg-do link }
+// { dg-options "-w -ansi -pedantic" }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12698. Duplicate covariant thunks emitted.
+
+struct c1 {};
+
+struct c0 {
+ int i;
+ virtual c1& f10() {}
+};
+
+struct c2 : virtual c1, c0 { };
+
+struct c6 : virtual c2, c0 {
+ virtual c2& f10() {}
+};
+
+struct c14 : virtual c2 { };
+
+struct c19 : virtual ::c6 {
+ virtual class ::c14& f10() {}
+};
+
+int main ()
+{
+ c19 obj;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C
new file mode 100644
index 000000000..d5eb7c26a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+union A {};
+
+struct B : A {}; // { dg-error "fails to be a struct or class type" }
+struct B : A {}; // { dg-error "redefinition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C
new file mode 100644
index 000000000..0d82f773e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+struct A {};
+
+struct B : A, A {}; // { dg-error "duplicate base type" }
+struct B : A, A {}; // { dg-error "redefinition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C
new file mode 100644
index 000000000..e6094b04a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C
@@ -0,0 +1,11 @@
+// PR c++/51326
+
+struct A
+{
+ virtual int& foo(); // { dg-error "overriding" }
+};
+
+struct B : A
+{
+ B& foo(); // { dg-error "conflicting return type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C
new file mode 100644
index 000000000..b5b02f101
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C
@@ -0,0 +1,10 @@
+// PR c++/59082
+
+struct A {};
+
+struct B : virtual A, A {}; // { dg-error "duplicate base type" }
+
+A foo(const B &b)
+{
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C
new file mode 100644
index 000000000..1570bf11e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C
@@ -0,0 +1,10 @@
+// PR 12486
+
+struct A { int ma; };
+struct B { };
+
+void foo()
+{
+ B *b;
+ b->A::ma=0; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C
new file mode 100644
index 000000000..7d5e2e5d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C
@@ -0,0 +1,16 @@
+// PR c++/28259
+// { dg-do compile }
+
+struct A
+{
+ virtual A* foo(); // { dg-error "overriding" }
+};
+
+struct B : virtual A; // { dg-error "before" }
+
+struct C : A
+{
+ virtual B* foo(); // { dg-error "invalid covariant" }
+};
+
+B* C::foo() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C
new file mode 100644
index 000000000..0b75b9dfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C
@@ -0,0 +1,11 @@
+//PR c++/27316
+
+struct A {};
+
+struct B : A
+! // { dg-error "token" }
+{};
+
+struct B : A
+! // { dg-error "token" }
+{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C
new file mode 100644
index 000000000..4f6866ed8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C
@@ -0,0 +1,10 @@
+//PR c++/28740
+
+struct A { virtual ~A(); };
+
+struct B : A A {}; // { dg-error "expected|initializer|invalid" }
+
+A foo(const B &b) // { dg-error "" }
+{
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C
new file mode 100644
index 000000000..e38e106b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C
@@ -0,0 +1,14 @@
+// PR c++/48489
+
+struct Base{ };
+
+struct Concrete : Base
+{
+ void setValue();
+};
+
+int main()
+{
+ Concrete d;
+ d.Base::setValue(); // { dg-error "struct Base" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C
new file mode 100644
index 000000000..e63bd3435
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C
@@ -0,0 +1,23 @@
+// PR c++/46807
+// { dg-options -std=c++98 }
+// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial,
+// even though doing overload resolution would mean calling the template
+// constructor. In C++0x, we do overload resolution to determine triviality.
+
+struct A
+{
+ A() {}
+private:
+ template <class T> A(T&);
+};
+
+struct B
+{
+ mutable A a;
+};
+
+int main()
+{
+ B b;
+ B b2(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C
new file mode 100644
index 000000000..3cb196c38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C
@@ -0,0 +1,10 @@
+// PR c++/17121
+
+struct A {
+ virtual ~A() {}
+};
+
+void tsk_tsk()
+{
+ struct B : public A {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C
new file mode 100644
index 000000000..82d812ca2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C
@@ -0,0 +1,16 @@
+// PR c++/17155
+// { dg-do link }
+
+struct A {
+ virtual ~A() {}
+};
+
+
+void tsk_tsk(void)
+{
+ struct B : public A {
+ B(int) {}
+ };
+}
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C
new file mode 100644
index 000000000..b11646422
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C
@@ -0,0 +1,14 @@
+// PR c++/13744 (ice-on-valid-code)
+// Origin: Thom Harp <thomharp@charter.net>
+
+// { dg-do compile }
+
+template<int> void foo()
+{
+ struct A
+ {
+ virtual void bar() { A a(*this); }
+ } a;
+}
+
+template void foo<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C
new file mode 100644
index 000000000..3eb9fe763
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C
@@ -0,0 +1,20 @@
+// { dg-options "-w" }
+
+struct Base {
+ int b;
+
+ Base(int b) : b(b) { }
+};
+
+struct Derived : public Base {
+ Derived(int d) : Base(d) { }
+};
+
+struct Final : public Derived, public Base {
+ Final(int f) : Derived(f), Base(f-1) { }
+};
+
+int main()
+{
+ Final f(5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C
new file mode 100644
index 000000000..041c18abc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+namespace Out {
+ namespace In {
+ }
+}
+
+class Klasse : public Out::In { // { dg-error ".*" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C
new file mode 100644
index 000000000..0908a01b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C
@@ -0,0 +1,15 @@
+// PR c++/5453: Test that we don't assume that the pointer target of a
+// reference is non-null just because we know the reference isn't.
+
+// { dg-do run }
+
+struct V { };
+struct A: virtual public V { };
+
+A* ap;
+A*& apr (ap);
+
+int main ()
+{
+ V* vp = apr;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C
new file mode 100644
index 000000000..6ef669c21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C
@@ -0,0 +1,34 @@
+// Test that conversions to base classes happen when calling
+// operators.
+
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct B1;
+struct B2;
+
+B2* p;
+B1* p2;
+
+struct B1 {
+ virtual void f () {}
+};
+
+struct B2 {
+ int i;
+ bool operator!() { if (this != p) abort (); return true; }
+ operator void*() { if (this != p) abort (); return this; }
+};
+
+struct B3 : public B1, public B2 {
+};
+
+int main () {
+ B3 b;
+ p = (B2*) &b;
+ p2 = (B1*) &b;
+ bool b1 = b;
+ bool b2 = !b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C
new file mode 100644
index 000000000..09407e1b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C
@@ -0,0 +1,22 @@
+typedef int INT_TYPEDEF;
+
+template<class T>
+class TypedIfc
+{
+public:
+ virtual ~TypedIfc() { }
+ virtual operator const T&() const = 0;
+ virtual const T& operator= (const T& t) = 0;
+};
+
+template<class Tnative>
+class NullIfc : public TypedIfc<Tnative>
+{
+public:
+ const Tnative& operator= (const Tnative& t) { return t; }
+ operator const Tnative&() const { return *(Tnative *)0; }
+};
+
+typedef TypedIfc<INT_TYPEDEF> INT_TYPEDEFIfc;
+
+NullIfc<int> i32;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C
new file mode 100644
index 000000000..6f5c9288e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C
@@ -0,0 +1,23 @@
+// PR c++/14688
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+class one
+{
+public:
+ virtual void
+ test(void* value); // { dg-error "overriding" }
+};
+
+class two : public one
+{
+public:
+ void __attribute__((regparm(2)))
+ test(void* value); // { dg-error "conflicting type attributes" }
+};
+
+class three : public one
+{
+public:
+ void __attribute__ ((cdecl))
+ test(void* value); // OK
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C
new file mode 100644
index 000000000..8f8004641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C
@@ -0,0 +1,20 @@
+// { dg-options "-w" }
+
+struct c0 { virtual void f (); };
+struct c1 : public c0 {};
+struct c2 : public c0 {};
+struct c3 : virtual public c0, public c1, public c2 {};
+struct c5 {};
+struct c7 : virtual public c3 {};
+struct c8 : virtual public c1 { virtual void f (); };
+struct c9 {};
+struct c10 : virtual public c8, virtual public c7 {};
+struct c11 : virtual public c5 {};
+struct c12 : virtual public c8, public c7 {};
+struct c13 : public c9, public c3, virtual public c2 {};
+struct c14 : virtual public c1, virtual public c5, virtual public c0,
+ public c2 {};
+struct c15 : public c14, public c12, virtual public c3 {};
+struct c16 : public c12, public c10, public c2 { virtual void f (); };
+struct c17 : virtual public c13, public c15, virtual public c0,
+ virtual public c16 {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C
new file mode 100644
index 000000000..a8edf8485
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C
@@ -0,0 +1,11 @@
+// Regression test for ICE from PR c++/30297.
+
+struct A
+{
+ int i;
+};
+
+extern "C" struct B : A
+{
+ A::i; // { dg-warning "deprecated" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C
new file mode 100644
index 000000000..cc9921e69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C
@@ -0,0 +1,4 @@
+// PR c++/48798
+
+typedef struct A {} const t;
+struct B : t {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C
new file mode 100644
index 000000000..580e9ecd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C
@@ -0,0 +1,9 @@
+// PR c++/57942
+
+template<typename T> struct S { typename T::error type; };
+struct X {};
+void f(S<int>*);
+void f(...);
+void g() { f((X*)0); }
+struct Y;
+void h() { f((Y*)0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C
new file mode 100644
index 000000000..375efc811
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C
@@ -0,0 +1,21 @@
+// PR c++/14803
+// { dg-options "-Werror" }
+
+struct sc_module { int member; };
+
+struct sc_signal_in_if { bool state; };
+
+typedef void (sc_module::*SC_ENTRY_FUNC)();
+
+class sc_clock : public sc_signal_in_if, public sc_module
+{
+public:
+ sc_clock();
+ void posedge_action();
+ SC_ENTRY_FUNC fptr;
+};
+
+sc_clock::sc_clock()
+{
+ fptr = static_cast<SC_ENTRY_FUNC>(&sc_clock::posedge_action);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C
new file mode 100644
index 000000000..a13705576
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C
@@ -0,0 +1,25 @@
+// PR c++/16810
+
+struct C {
+ virtual void f() {}
+};
+
+struct B {virtual ~B() {} };
+
+class D : public B, public C
+{
+public:
+ virtual void f() {}
+};
+
+typedef void ( C::*FP)();
+typedef void ( D::*D_f)();
+
+int main() {
+ D *d = new D();
+ C *c = d;
+
+ const FP fptr = (FP) &D::f;;
+ (d->* (D_f)fptr)();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C
new file mode 100644
index 000000000..0c06c65df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 May 2005 <nathan@codesourcery.com>
+
+// Origin:Andrew Pinski pinskia@gcc.gnu.org
+// PR 21455 bogus error with pointer to member of incomplete
+
+class XMLFile;
+
+typedef bool (XMLFile::*ParserFunctionPtr)();
+
+struct ParserElement
+{
+ ParserFunctionPtr getPreFunc() const { return preFunc; }
+ ParserFunctionPtr getPostFunc() const { return postFunc; }
+ ParserFunctionPtr preFunc;
+ ParserFunctionPtr postFunc;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C
new file mode 100644
index 000000000..ddd3cb332
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C
@@ -0,0 +1,19 @@
+// PR c++/23266
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+void foo0() = 0; // { dg-error "like a variable" }
+virtual void foo1() = 0; // { dg-error "outside class|variable" }
+
+struct A
+{
+ void foo2() = 0; // { dg-error "non-virtual" }
+ static void foo3() = 0; // { dg-error "static member" }
+ virtual static void foo4() = 0; // { dg-error "both virtual and static" }
+ virtual void foo5() = 0; // { dg-error "base class" }
+};
+
+struct B : A
+{
+ static void foo5() = 0; // { dg-error "static member|declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C
new file mode 100644
index 000000000..06d5c9993
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C
@@ -0,0 +1,17 @@
+// PR c++/35007
+
+struct AffEntry
+{
+ union {
+ char base[256];
+ } conds;
+};
+
+struct PfxEntry
+: public AffEntry
+{
+ PfxEntry()
+ {
+ sizeof(conds.base[0]);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C
new file mode 100644
index 000000000..5d34b15d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C
@@ -0,0 +1,9 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Distilled from PR C++/3656
+
+namespace N
+{
+ template<typename> struct X { };
+}
+
+struct A : N::X { }; // { dg-error "expected class-name" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C
new file mode 100644
index 000000000..3bbd05069
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C
@@ -0,0 +1,41 @@
+// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* sparc*-*-* } }
+
+#include <stdarg.h>
+
+extern "C" void abort ();
+
+struct A {
+ virtual void f (int, ...) {}
+ int i;
+};
+
+struct B : virtual public A {
+};
+
+struct C : public B {
+ C ();
+ virtual void f (int, ...);
+};
+
+extern C* cp;
+
+C::C () { cp = this; }
+
+void C::f (int i, ...) {
+ if (this != cp)
+ abort ();
+ va_list ap;
+ if (i != 3)
+ abort ();
+ va_start (ap, i);
+ if (va_arg (ap, int) != 7)
+ abort ();
+ va_end (ap);
+}
+
+C* cp = new C;
+
+int main ()
+{
+ cp->f (3, 7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C
new file mode 100644
index 000000000..702067749
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C
@@ -0,0 +1,60 @@
+/* { dg-options "-mthumb" { target arm*-*-* } } */
+/* { dg-do run } */
+/* { dg-timeout 100 } */
+
+/* PR middle-end/39378 */
+/* Check if the thunk target function is emitted correctly. */
+class B1
+{
+public:
+ virtual int foo1(void);
+ int b1;
+};
+
+class B2
+{
+public:
+ virtual int foo2 (void);
+ int b2;
+};
+
+class D : public B1, public B2
+{
+ int foo1(void);
+ int foo2(void);
+ int d;
+};
+
+int B1::foo1(void)
+{
+ return 3;
+}
+
+int B2::foo2(void)
+{
+ return 4;
+}
+
+int D::foo1(void)
+{
+ return 1;
+}
+
+int D::foo2(void)
+{
+ return 2;
+}
+
+__attribute__((noinline)) int test(B2* bp)
+{
+ return bp->foo2();
+}
+
+int main()
+{
+ B2 *bp = new D();
+ if (test(bp) == 2)
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
new file mode 100644
index 000000000..7009d6c50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C
new file mode 100644
index 000000000..6e3bc329c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C
@@ -0,0 +1,11 @@
+// PR c++/42256
+// { dg-do link }
+// { dg-additional-sources "thunk11-aux.cc" }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h
new file mode 100644
index 000000000..641f40e4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h
@@ -0,0 +1,16 @@
+struct A
+{
+ A () {}
+ virtual ~A () {}
+};
+struct B
+{
+ B () {}
+ virtual ~B () {}
+};
+struct C : public A, public B
+{
+ virtual void foo ();
+ virtual ~C () {};
+};
+inline void C::foo () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C
new file mode 100644
index 000000000..094891c7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C
@@ -0,0 +1,19 @@
+// PR c++/14108
+
+class ClassC {
+public:
+ ~ClassC();
+};
+
+class ClassA {
+ virtual ClassC f();
+};
+
+class ClassB : public virtual ClassA {
+ virtual ClassC f();
+};
+
+ClassC ClassB::f() {
+ return ClassC();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C
new file mode 100644
index 000000000..9787aa9c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C
@@ -0,0 +1,12 @@
+// PR c++/18492
+
+struct X{ ~X(); };
+struct B
+{
+ virtual void a( X ) = 0;
+};
+struct D : public virtual B
+{
+ void a( X );
+};
+void D::a( X ){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C
new file mode 100644
index 000000000..a6e913e59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C
@@ -0,0 +1,23 @@
+// PR c++/21123
+
+struct A
+{
+ A( const A &a);
+ const A& operator=( const A& a);
+};
+
+struct B
+{
+ virtual A f();
+};
+
+struct C : virtual B
+{
+ virtual A f();
+ A a;
+};
+
+A C::f()
+{
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C
new file mode 100644
index 000000000..05dba3638
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C
@@ -0,0 +1,22 @@
+// PR c++/21123
+
+struct A
+{
+ A(const A &a);
+ const A& operator=(const A& a);
+};
+
+struct B
+{
+ virtual A f(A);
+};
+
+struct C : virtual B
+{
+ virtual A f(A);
+};
+
+A C::f(A a)
+{
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C
new file mode 100644
index 000000000..b8e316d08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C
@@ -0,0 +1,16 @@
+// PR c++/26957
+
+struct LongDouble {
+ char ld[16];
+};
+
+struct DynAny {
+ virtual void insert_longdouble(LongDouble value) = 0;
+};
+
+struct TAO_DynCommon : public virtual DynAny {
+ virtual void insert_longdouble (LongDouble value);
+};
+
+void TAO_DynCommon::insert_longdouble (LongDouble value) { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C
new file mode 100644
index 000000000..0e16d8954
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C
@@ -0,0 +1,55 @@
+// { dg-do run }
+
+#include <stdlib.h>
+
+class A
+{
+ int a, b;
+public:
+ virtual void foo (int a, int b, int c, int d);
+};
+
+class B
+{
+ int c, d;
+public:
+ virtual void bar (int a, int b, int c, int d);
+};
+
+class D : public virtual A, public virtual B
+{
+ int e, f;
+};
+
+void A::foo(int a, int b, int c, int d)
+{
+ if (a != 1 || b != 2 || c != 3 || d != 4)
+ abort ();
+}
+
+void B::bar (int a, int b, int c, int d)
+{
+ if (a != 5 || b != 6 || c != 7 || d != 8)
+ abort ();
+}
+
+class C: private D, public virtual A, public virtual B
+{
+public:
+ virtual void foo (int a, int b, int c, int d) { A::foo (a, b, c, d); D::A::foo (a, b, c, d); }
+ virtual void bar (int a, int b, int c, int d) { B::bar (a, b, c, d); D::B::bar (a, b, c, d); }
+};
+
+C c1;
+C *c2 = &c1;
+A *c3 = &c1;
+B *c4 = &c1;
+
+int main()
+{
+ c2->foo (1, 2, 3, 4);
+ c2->bar (5, 6, 7, 8);
+ c3->foo (1, 2, 3, 4);
+ c4->bar (5, 6, 7, 8);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C
new file mode 100644
index 000000000..ef6453568
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C
@@ -0,0 +1,26 @@
+/* PR target/27387
+ We used to generate a non-PIC thunk on thumb even with -fPIC.
+ Make sure that won't happen anymore. */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_thumb1_ok } */
+/* { dg-options "-mthumb -fPIC" } */
+
+struct A {
+ virtual void f ();
+};
+
+struct B {
+ virtual void g ();
+};
+
+struct C : public A, public B {
+ virtual void g();
+};
+
+void
+C::g()
+{
+}
+
+/* { dg-final { scan-assembler "LTHUNKPC" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C
new file mode 100644
index 000000000..9eb9999f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/37095
+// { dg-options "-O" }
+
+struct A
+{
+ virtual A *foo ();
+};
+
+struct B : virtual A
+{
+ virtual B *foo () { return 0; }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C
new file mode 100644
index 000000000..20da08b2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C
@@ -0,0 +1,8 @@
+namespace NS {
+class X {};
+typedef X Y;
+}
+
+struct Base : virtual public NS::Y {
+ Base() : NS::Y() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C
new file mode 100644
index 000000000..794776ecb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C
@@ -0,0 +1,18 @@
+typedef struct {
+ virtual const char *blah() {
+ return "Heya::blah";
+ }
+} Heya;
+
+struct Grok : public Heya {
+ virtual const char *blah() {
+ return "Grok::blah";
+ }
+};
+
+int main() {
+ Grok *g = new Grok();
+ delete g;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C
new file mode 100644
index 000000000..da46096c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C
@@ -0,0 +1,14 @@
+// PR c++/15507
+
+struct A {
+ // empty
+};
+
+struct B : A {
+ int b;
+};
+
+union U {
+ A a;
+ B b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C
new file mode 100644
index 000000000..03c9144e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C
@@ -0,0 +1,34 @@
+// Test that overloading on 'this' quals works with class using-declarations.
+
+// { dg-do link }
+
+struct A {
+ void f() const;
+ void f() {}
+ void g() const {}
+ void g();
+ void h() const;
+ void h();
+ void i() const;
+ void i() {}
+};
+
+struct B: private A {
+ using A::f;
+ using A::g;
+ void h () const {}
+ using A::h;
+ void i () const {}
+ using A::i;
+};
+
+int main()
+{
+ B b1;
+ const B b2 = B();
+
+ b1.f ();
+ b2.g ();
+ b2.h ();
+ b1.i ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C
new file mode 100644
index 000000000..19f06e9cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7919. Methods found via using decls didn't have their this
+// pointers converted to the final base type.
+
+struct Base {
+ int m;
+ protected:
+ void *Return () { return this; }
+};
+
+struct Derived : Base {
+ using Base::Return;
+ virtual ~Derived () {}
+};
+
+int main ()
+{
+ Derived d;
+
+ return static_cast <Base *> (&d) != d.Return ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C
new file mode 100644
index 000000000..d2acf8009
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C
@@ -0,0 +1,19 @@
+class A
+{
+public:
+ typedef int T;
+ int a;
+};
+
+class B : virtual private A
+{
+};
+
+class C : virtual private A, public B
+{
+public:
+ using A::a;
+ using A::T;
+};
+
+C::T x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C
new file mode 100644
index 000000000..4b7a28f0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 20613:uninformative diagnostic
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+struct B {
+ void f();
+};
+
+struct D : B {
+ using B::f; // { dg-message "previous declaration" }
+ using B::f; // { dg-error "redeclaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C
new file mode 100644
index 000000000..b8e51078f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+// PR 19496: Missing error during parsing.
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<int> struct A
+{
+ A::A; // { dg-error "constructor|not a base" }
+};
+
+struct B
+{
+ void f ();
+ using B::f; // { dg-error "not a base" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C
new file mode 100644
index 000000000..1877d671a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+struct A
+{
+ operator int ();
+};
+
+template <typename T> struct TPL : A
+{
+ using A::operator T; // { dg-error "operator float" }
+};
+
+TPL<int> i;
+TPL<float> j; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C
new file mode 100644
index 000000000..de177c91d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C
@@ -0,0 +1,12 @@
+// PR c++/51889
+
+struct A {
+ void f();
+};
+
+template <class T>
+struct B: A
+{
+ using A::f;
+ void f();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C
new file mode 100644
index 000000000..08bcbb143
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C
@@ -0,0 +1,12 @@
+//PR c++/27952
+
+struct A
+{
+ virtual ~A() {}
+};
+
+struct B : A, virtual A {}; // { dg-error "duplicate base|forward declaration" }
+
+struct C : A, B {}; // { dg-error "duplicate base|invalid use" }
+
+C c; // { dg-error "aggregate" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C
new file mode 100644
index 000000000..4cb858b92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C
@@ -0,0 +1,11 @@
+// PR c++/14263
+
+struct A { };
+
+struct B : virtual A { };
+
+int main()
+{
+ A* p = new B;
+ B* q = static_cast<B*>(p); // { dg-error "cannot convert from pointer to base class 'A' to pointer to derived class 'B' because the base is virtual" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C
new file mode 100644
index 000000000..04c241293
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C
@@ -0,0 +1,17 @@
+// PR c++/59031
+// { dg-do compile }
+// { dg-options "-fdump-tree-gimple " }
+class B {
+ public:
+ virtual int add (int a, int b) {return a+ b;}
+};
+
+class D : public B {
+};
+
+int foo (int a, int b) {
+ D d;
+ return d.add(a, b);
+}
+// { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C
new file mode 100644
index 000000000..9769d4ab7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C
@@ -0,0 +1,13 @@
+//PR c++/29022
+
+struct A
+{
+ operator int();
+};
+
+struct B : virtual A, A<0> {}; // { dg-error "token" }
+
+int foo(B &b)
+{
+ return b; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C
new file mode 100644
index 000000000..65ae76c0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C
@@ -0,0 +1,13 @@
+//PR c++/29022
+
+struct A
+{
+ operator int();
+};
+
+struct B : virtual A; // { dg-error "token" }
+
+int foo(B &b)
+{
+ return b; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C
new file mode 100644
index 000000000..5415fdb3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C
@@ -0,0 +1,24 @@
+// PR c++/31027
+
+struct A {};
+
+template<typename T>
+struct C: virtual A {
+ C() {}
+ template<typename T_OTHER> C(const C<T_OTHER>&) {}
+ C func(const class C<long>&) const;
+ operator bool() const;
+};
+
+template<typename T>
+struct D: C<T> {
+ void func2() {
+ C<int>a;
+ a.func(a);
+ }
+};
+
+void func3() {
+ C<int>a;
+ a.func(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C
new file mode 100644
index 000000000..bed0ef3a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C
@@ -0,0 +1,29 @@
+// Test that a synthesized op= can override one from a base.
+// { dg-do run }
+
+struct B;
+
+struct A
+{
+ virtual B& operator=(const B&);
+};
+
+struct B: A
+{
+ B(int i): i(i) { }
+ int i;
+ // implicitly-declared op=
+};
+
+B& A::operator=(const B& b) { return static_cast<B&>(*this); }
+
+int main()
+{
+ B b1 (123);
+ B b2 (0);
+
+ A& ar = b1;
+ ar = b2;
+
+ return b1.i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C
new file mode 100644
index 000000000..f03696993
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C
@@ -0,0 +1,15 @@
+// PR c++/45473
+
+struct A
+{
+ virtual void B ();
+};
+
+struct B : A
+{
+ B ();
+};
+
+struct C : B
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C
new file mode 100644
index 000000000..61f17fe63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C
@@ -0,0 +1,27 @@
+// Origin: PR c++/47666
+// { dg-do compile }
+
+template <typename T>
+struct A
+{
+ int a;
+};
+
+template <typename T>
+struct B : public A <T>
+{
+};
+
+class D : public B <D *>
+{
+ virtual D & operator= (const D &);
+};
+
+class E : virtual public D
+{
+};
+
+class F : public E
+{
+ virtual void foo ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C
new file mode 100644
index 000000000..4f6a119b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C
@@ -0,0 +1,48 @@
+// PR c++/48035
+// { dg-do run }
+
+#include <new>
+#include <cstring>
+#include <cstdlib>
+
+struct A
+{
+ virtual void foo (void) {}
+ virtual ~A () {}
+};
+
+struct B : public A
+{
+ virtual ~B () {}
+};
+
+struct C
+{
+ virtual ~C () {}
+ int c;
+};
+
+struct D : public virtual B, public C
+{
+ virtual ~D () {}
+};
+
+struct E : public virtual D
+{
+ virtual ~E () {}
+};
+
+int
+main ()
+{
+ char *v = new char[sizeof (E) + 16];
+ memset (v, 0x55, sizeof (E) + 16);
+ E *e = new (v) E ();
+ e->~E ();
+
+ for (unsigned i = sizeof (E); i < sizeof (E) + 16; ++i)
+ if (v[i] != 0x55)
+ abort ();
+
+ delete[] v;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C
new file mode 100644
index 000000000..03342646f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C
@@ -0,0 +1,44 @@
+// { dg-do run }
+// PR c++/11750
+
+struct A
+{
+ virtual void f() const { __builtin_abort(); }
+ virtual void g() {}
+};
+
+struct B : virtual A
+{
+ virtual void f() const {}
+ virtual void g() { __builtin_abort(); }
+};
+
+struct C : B, virtual A
+{
+ using A::f;
+ using A::g;
+};
+
+int main()
+{
+ C c;
+ c.f(); // call B::f
+
+ C c2;
+ c2.C::g(); // call A::g
+
+ C* c3 = &c;
+ c3->f(); // call B::f
+
+ C& c4 = c;
+ c4.f(); // call B::f
+
+ C const* c5 = &c;
+ c5->f(); // call B::f
+
+ C** c6 = &c3;
+ (*c6)->f(); // call B::f
+
+ C const& c7 = c;
+ c7.f(); // call B::f
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C
new file mode 100644
index 000000000..48df50ada
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C
@@ -0,0 +1,14 @@
+// PR c++/19299
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+// { dg-do compile }
+
+struct V
+{
+ virtual void foo() = 0;
+};
+
+void bar(V volatile* p)
+{
+ p->V::~V();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/addr-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/addr-const1.C
new file mode 100644
index 000000000..3b4637a41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/addr-const1.C
@@ -0,0 +1,38 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Apr 2003 <nathan@codesourcery.com>
+
+// PR 9881. address-constant-expression not static initialized
+
+struct bar {
+ double p;
+}; // bar
+
+bar v;
+static bool error = false;
+
+struct foo {
+ static double *a;
+ static double *b;
+ static double storage;
+};
+
+struct baz {
+ baz () {
+ if (foo::a != &v.p)
+ error = true;
+ if (foo::b != &foo::storage)
+ error = true;
+ }
+};
+
+baz f; // Get constructor to run before any other non-static initializers
+
+double *foo::a = &(((bar *)(&v))->p);
+double *foo::b = &(((bar *)(&foo::storage))->p);
+double foo::storage = 0.0;
+
+int main() {
+ return error;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr1.C
new file mode 100644
index 000000000..c63f0b02c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr1.C
@@ -0,0 +1,19 @@
+// Test that initializing an aggregate with complex copy constructor
+// and assignment ops doesn't cause cp_expr_size to abort.
+
+struct A
+{
+ A();
+ A(const A&);
+ A& operator=(const A&);
+};
+
+struct B
+{
+ A a;
+};
+
+int main ()
+{
+ B b = { A() };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr10.C
new file mode 100644
index 000000000..e494e20a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr10.C
@@ -0,0 +1,6 @@
+// PR c++/59886
+
+struct A { A (); ~A (); };
+struct B { A b[4]; };
+struct C { B c[5]; };
+const C e = {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr2.C
new file mode 100644
index 000000000..97dbeb619
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr2.C
@@ -0,0 +1,46 @@
+// PR c++/15172
+// { dg-do run }
+
+extern "C" int printf (const char *, ...);
+extern "C" void abort ();
+
+struct A {
+ static A* p;
+
+ A() { p = this; }
+ A(const A&);
+ ~A() { if (this != p) abort (); }
+ void print () { }
+};
+
+A* A::p;
+
+struct B {
+ A a;
+};
+
+B b = { A () };
+
+struct A2 {
+ static A2* p;
+
+ A2() { p = this; }
+ A2(const A2&);
+ ~A2() { if (this != p) abort (); }
+ void print () { }
+};
+
+A2* A2::p;
+
+struct B2 {
+ A2 a2;
+};
+
+int main () {
+ b.a.print ();
+ {
+ B2 b2 = { A2() };
+ b2.a2.print ();
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr3.C
new file mode 100644
index 000000000..3376897e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr3.C
@@ -0,0 +1,16 @@
+// PR c++/18793
+
+struct S {
+ S();
+ S(const S&);
+ void operator=(const S&);
+};
+
+struct X {
+ int a, b, c, d, e;
+ S s;
+};
+
+void foobar () {
+ X x = {0};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr4.C
new file mode 100644
index 000000000..7120e68cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr4.C
@@ -0,0 +1,7 @@
+struct A
+{
+ int i;
+};
+
+A a1 = { 1 }; // ok
+A a2 = { a1 }; // { dg-error "cannot convert" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr5.C
new file mode 100644
index 000000000..c1844f8ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr5.C
@@ -0,0 +1,11 @@
+// Origin PR c++/40239
+// { dg-do compile }
+
+struct B { B() { } private: B(B const&); };
+struct A { int a; B b; };
+
+int
+main()
+{
+ A a = {0};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr6.C
new file mode 100644
index 000000000..98628d255
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr6.C
@@ -0,0 +1,11 @@
+// Origin PR c++/40239
+// { dg-do compile }
+
+struct B { B() { } private: B(B const&); };
+struct A { int a; B b; };
+
+int
+main()
+{
+ A a = {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr7.C
new file mode 100644
index 000000000..bec952c23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr7.C
@@ -0,0 +1,13 @@
+// PR c++/50866
+
+struct A { A(); ~A(); };
+struct B { B(const char *, const A& = A()); ~B(); };
+struct C {
+ B b1, b2;
+};
+void f()
+{
+ C c = {
+ "a","b"
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr8.C
new file mode 100644
index 000000000..7e6edc9ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr8.C
@@ -0,0 +1,19 @@
+// PR c++/51009
+
+struct A
+{
+ ~A();
+};
+
+struct B
+{
+ A a;
+ B(const A& = A());
+};
+
+struct C
+{
+ B b1, b2;
+};
+
+C c = {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/aggr9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr9.C
new file mode 100644
index 000000000..67d829912
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/aggr9.C
@@ -0,0 +1,9 @@
+// PR c++/53661
+
+enum Code {
+ SUCCESS = 0
+};
+
+Code a;
+
+int r[] = {a};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array0.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array0.C
new file mode 100644
index 000000000..235cdf0de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array0.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "" }
+// PR C++/24138
+
+void foo()
+{
+ typedef struct {
+ unsigned char dir;
+ int data[0];
+ } yanito;
+ static const yanito horse = { 1, { 2, 3 } }; // { dg-error "too many" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array1.C
new file mode 100644
index 000000000..5847247c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array1.C
@@ -0,0 +1,26 @@
+// Test that completing an array declared with a typedef doesn't change
+// the typedef.
+
+// { dg-do run }
+
+typedef int iArr[];
+
+const iArr array4={
+ 1, 2, 3, 4
+};
+
+const iArr array3={
+ 1, 2, 3
+};
+
+const iArr array5={
+ 1, 2, 3, 4, 5
+};
+
+int main()
+{
+ if (sizeof (array4)/sizeof (array4[0]) != 4
+ || sizeof (array3)/sizeof (array3[0]) != 3
+ || sizeof (array5)/sizeof (array5[0]) != 5)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array10.C
new file mode 100644
index 000000000..41121055e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array10.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "" }
+
+typedef int __attribute__((vector_size (8))) vec;
+
+vec foo[] = { (vec) {1, 2} };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array11.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array11.C
new file mode 100644
index 000000000..e52effe9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array11.C
@@ -0,0 +1,28 @@
+/* PR 11665
+ Orgin: jwhite@cse.unl.edu
+ The problem was in initializer_constant_valid_p,
+ "for a CONSTRUCTOR, only the last element
+ of the CONSTRUCTOR was being checked"
+ (from the email of the patch which fixed this).
+ This used to ICE because GCC thought gdt_table was a
+ constant value when it is not. */
+
+int x;
+
+typedef __SIZE_TYPE__ size_t;
+
+struct gdt
+{
+size_t a,b,c,d,e,f;
+};
+void f()
+{
+struct gdt gdt_table[2]=
+{
+ {
+ 0,
+ ( (((size_t)(&x))<<(24))&(-1<<(8)) ),
+ },
+};
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array12.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array12.C
new file mode 100644
index 000000000..3bb480029
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array12.C
@@ -0,0 +1,28 @@
+// PR c++/12253
+// Bug: We were failing to destroy the temporary A passed to the
+// constructor for b[0] before going on to construct b[1].
+
+// { dg-do run }
+
+extern "C" int printf (const char *, ...);
+
+int c;
+int r;
+
+struct A
+{
+ A() { printf ("A()\n"); if (c++) r = 1; }
+ A(const A&) { printf ("A(const A&)\n"); ++c; }
+ ~A() { printf ("~A()\n"); --c; }
+};
+
+struct B
+{
+ B(int, const A& = A()) { printf ("B()\n"); }
+};
+
+int main()
+{
+ B b[] = { 0, 0 };
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array13.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array13.C
new file mode 100644
index 000000000..aa66e33ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array13.C
@@ -0,0 +1,9 @@
+template <typename DisjointSet>
+struct test_disjoint_set {
+ static void do_test()
+ {
+ unsigned int elts[]
+ = { 0, 1, 2, 3 };
+ const int N = sizeof(elts)/sizeof(*elts);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array14.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array14.C
new file mode 100644
index 000000000..847bd1f20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array14.C
@@ -0,0 +1,21 @@
+// PR c++/12883
+// Bug: Destructor of array object not called if no prior
+// instantiation of the template has happened.
+
+// { dg-do run }
+
+int ret = 1;
+
+template <int> struct X
+{
+ X(int) { }
+ ~X() { ret = 0; }
+};
+
+int main()
+{
+ {
+ X<0> array[] = { 0 };
+ }
+ return ret;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array15.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array15.C
new file mode 100644
index 000000000..17160d076
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array15.C
@@ -0,0 +1,46 @@
+// { dg-do run }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com>
+
+// PR 16681 too much memory used
+// Origin: Matt LaFary <lafary@activmedia.com>
+
+struct foo {
+ unsigned char buffer[4111222];
+ foo() ;
+ bool check () const;
+};
+
+foo::foo ()
+ : buffer()
+{}
+
+bool foo::check () const
+{
+ for (unsigned ix = sizeof (buffer); ix--;)
+ if (buffer[ix])
+ return false;
+ return true;
+}
+
+void *operator new (__SIZE_TYPE__ size, void *p)
+{
+ return p;
+}
+
+char heap[5000000];
+
+int main ()
+{
+ for (unsigned ix = sizeof (heap); ix--;)
+ heap[ix] = ix;
+
+ foo *f = new (heap) foo ();
+
+ if (!f->check ())
+ return 1;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array16.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array16.C
new file mode 100644
index 000000000..188d1a84f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array16.C
@@ -0,0 +1,112 @@
+// Causes timeout for the MMIX simulator on a 3GHz P4 and we can't
+// have "compile" for some targets and "run" for others.
+// { dg-do run { target { ! mmix-*-* } } }
+// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com>
+
+// PR 16681 too much memory used
+// Origin: Matt LaFary <lafary@activmedia.com>
+
+// NOTE: This test assumes that 4M instances of struct ELT can fit into
+// a 5MB array. This isn't true, e.g., with the default
+// arm-none-elf options.
+
+struct elt
+{
+ static int count;
+ static elt*ptr;
+ static int abort;
+ char c;
+
+ elt ();
+ ~elt ();
+
+};
+
+int elt::count;
+elt *elt::ptr;
+int elt::abort;
+
+elt::elt ()
+ :c ()
+{
+ if (count >= 0)
+ {
+ if (!ptr)
+ ptr = this;
+ if (count == 100)
+ throw 2;
+ if (this != ptr)
+ abort = 1;
+ count++;
+ ptr++;
+ }
+}
+
+elt::~elt ()
+{
+ if (count >= 0)
+ {
+ ptr--;
+ count--;
+ if (ptr != this)
+ abort = 2;
+ }
+}
+
+struct foo {
+ elt buffer[4111222];
+ foo() ;
+ bool check () const;
+};
+
+foo::foo ()
+ : buffer()
+{}
+
+bool foo::check () const
+{
+ for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;)
+ if (buffer[ix].c)
+ return false;
+ return true;
+}
+
+void *operator new (__SIZE_TYPE__ size, void *p)
+{
+ return p;
+}
+
+char heap[5000000];
+
+int main ()
+{
+ for (unsigned ix = sizeof (heap); ix--;)
+ heap[ix] = ix;
+
+ try
+ {
+ foo *f = new (heap) foo ();
+ return 1;
+ }
+ catch (...)
+ {
+ if (elt::count)
+ return 2;
+ if (elt::abort)
+ return elt::abort + 3;
+ }
+
+ for (unsigned ix = sizeof (heap); ix--;)
+ heap[ix] = ix;
+
+ elt::count = -1;
+ foo *f = new (heap) foo ();
+ if (!f->check ())
+ return 3;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array17.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array17.C
new file mode 100644
index 000000000..4240f7193
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array17.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+
+class StringMap {
+ const char empty_str[1];
+public:
+ StringMap() : empty_str() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array18.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array18.C
new file mode 100644
index 000000000..154d03fcf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array18.C
@@ -0,0 +1,22 @@
+// PR c++/20142
+// { dg-do run }
+
+int n=4;
+
+struct A
+{
+ A() {}
+ A& operator= (const A&) { --n; return *this; }
+};
+
+struct B
+{
+ A x[2][2];
+};
+
+int main()
+{
+ B b;
+ b = b;
+ return n;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array19.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array19.C
new file mode 100644
index 000000000..a5f124e21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array19.C
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "" }
+double a[0] = { };
+const double b[0][1] = { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array2.C
new file mode 100644
index 000000000..ca03ff39c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array2.C
@@ -0,0 +1,8 @@
+// Check that the type of an array is set correctly when flat initializers
+// are used.
+
+// { dg-do compile }
+
+struct s { int a; int b; };
+struct s x[] = { 1, 2, 3, 4 };
+int y[sizeof (x) == 2 * sizeof (x[0])? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array20.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array20.C
new file mode 100644
index 000000000..06a167596
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array20.C
@@ -0,0 +1,5 @@
+// PR c++/27385
+
+struct A {};
+A a[] = { 0 }; // { dg-error "initializer" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array21.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array21.C
new file mode 100644
index 000000000..fc6abab55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array21.C
@@ -0,0 +1,7 @@
+// PR c++/27722
+
+void foo()
+{
+ const int x[] = 0; // { dg-error "initializer" }
+ ++x; // { dg-error "read-only|operand" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array22.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array22.C
new file mode 100644
index 000000000..0c5bb33da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array22.C
@@ -0,0 +1,6 @@
+// PR C++/29002
+// We ICE trying to set the "zero" initializer on the incomplete
+// array
+
+struct A {};
+int A::* x[]; // { dg-error "size" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array23.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array23.C
new file mode 100644
index 000000000..80ffb0a98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array23.C
@@ -0,0 +1,6 @@
+// PR C++/29002
+// We ICE trying to set the "zero" initializer on the incomplete
+// array
+
+struct A {A();int A::* t;};
+A x[]; // { dg-error "size" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array24.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array24.C
new file mode 100644
index 000000000..2d72df403
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array24.C
@@ -0,0 +1,7 @@
+// PR c++/29175
+// { dg-options "-Wno-vla" }
+
+void foo(int i)
+{
+ int x[][i] = { 0 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array25.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array25.C
new file mode 100644
index 000000000..1ab2725d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array25.C
@@ -0,0 +1,49 @@
+// related to PR c++/38233
+// test for value-init of a member array
+// { dg-do run }
+
+struct elt
+{
+ virtual void f();
+ char c;
+};
+
+void elt::f() { }
+
+struct foo {
+ elt buffer[500];
+ foo() ;
+ bool check () const;
+};
+
+foo::foo ()
+ : buffer()
+{}
+
+bool foo::check () const
+{
+ for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;)
+ if (buffer[ix].c)
+ return false;
+ return true;
+}
+
+inline void *operator new (__SIZE_TYPE__ size, void *p)
+{
+ return p;
+}
+
+char heap[sizeof(elt[500])];
+
+int main ()
+{
+ for (unsigned ix = sizeof (heap); ix--;)
+ heap[ix] = ix;
+
+ foo *f = new (heap) foo ();
+ if (!f->check ())
+ return 3;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array26.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array26.C
new file mode 100644
index 000000000..f8f3c3743
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array26.C
@@ -0,0 +1,11 @@
+// PR c++/42058
+// { dg-options "" }
+
+struct A;
+
+struct B
+{
+ A a; // { dg-error "incomplete type" }
+};
+
+B b[1] = (B[]) { 0 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array27.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array27.C
new file mode 100644
index 000000000..988501545
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array27.C
@@ -0,0 +1,11 @@
+// PR c++/42058
+// { dg-options "" }
+
+struct A {};
+
+struct B
+{
+ A a;
+};
+
+B b[1] = (B[]) { 0 }; // { dg-error "initializer" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array28.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array28.C
new file mode 100644
index 000000000..8cf19ba43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array28.C
@@ -0,0 +1,7 @@
+// PR c++/49669
+
+struct Foo { explicit Foo(int) { } };
+struct Goo {
+ Goo() : x(Foo(4), Foo(5)) { } // { dg-error "array" }
+ Foo x[2];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array3.C
new file mode 100644
index 000000000..700b26389
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array3.C
@@ -0,0 +1,23 @@
+// PR c++/6331
+// Bug: we were generating a badly cv-qualified ARRAY_TYPE in the
+// synthesized copy constructor for A, which then became the canonical
+// version, confusing later uses.
+
+struct A {
+ virtual ~A();
+ const float* f();
+ float fa[3];
+};
+
+struct B {
+ B(const A& ai) : a (ai) {}
+ A a;
+};
+
+void g (const float pos[3]);
+
+extern A& a;
+void h()
+{
+ g (a.f());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array30.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array30.C
new file mode 100644
index 000000000..696d9bf99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array30.C
@@ -0,0 +1,7 @@
+// PR c++/54501
+// { dg-options "" }
+
+int main()
+{
+ int a[][0] = {0}; // { dg-error "too many" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array31.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array31.C
new file mode 100644
index 000000000..9bb66a595
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array31.C
@@ -0,0 +1,10 @@
+// PR c++/54501
+// { dg-options "" }
+
+struct A
+{
+ int i[0];
+ int j;
+};
+
+struct A a = { 1 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array32.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array32.C
new file mode 100644
index 000000000..06b27a94a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array32.C
@@ -0,0 +1,7 @@
+// PR c++/42315
+
+extern int x[];
+
+int i = x[0];
+
+int x[] = 0; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array33.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array33.C
new file mode 100644
index 000000000..4440d3d54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array33.C
@@ -0,0 +1,22 @@
+// PR c++/55804
+// { dg-do run }
+
+int t = 0;
+template <typename> struct vector {
+ vector() { t++; }
+};
+
+typedef vector<int> Arrays[1];
+class C
+{
+ vector<int> v_;
+ void Foo(const Arrays &);
+};
+Arrays a;
+
+int main(void)
+{
+ if (t!=1)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array34.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array34.C
new file mode 100644
index 000000000..1c2e022e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array34.C
@@ -0,0 +1,15 @@
+// PR c++/53650
+// We should loop over array inits if they don't involve temporaries
+// that need extending.
+// { dg-options "-fdump-tree-gimple" }
+// { dg-final { scan-tree-dump-times "Class::Class" 1 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
+
+struct Class {
+ Class();
+};
+
+int main() {
+ Class table [10] = {};
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array35.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array35.C
new file mode 100644
index 000000000..6ce6d5cc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array35.C
@@ -0,0 +1,3 @@
+// PR c++/58868
+
+static struct { const int i; } a[] = { 1 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array36.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array36.C
new file mode 100644
index 000000000..77e4f9091
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array36.C
@@ -0,0 +1,8 @@
+// PR c++/60224
+
+struct A {};
+
+void foo()
+{
+ bool b[] = (int (A::*)())0; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array37.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array37.C
new file mode 100644
index 000000000..a909a18dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array37.C
@@ -0,0 +1,14 @@
+struct A
+{
+ int i;
+ A(int);
+};
+
+struct B
+{
+ virtual void f();
+ A ar[3];
+};
+
+extern B b;
+B b2(b);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array4.C
new file mode 100644
index 000000000..67519bf7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array4.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Origin: Markus Breuer <markus.breuer@materna.de>
+
+// PR c++/6944
+// Fail to synthesize copy constructor of multi-dimensional
+// array of class.
+
+#include <string>
+
+class Array
+{
+public:
+ std::string m_array[10][20][30];
+};
+
+Array func()
+{
+ Array result;
+ return result; // sorry, not implemented: cannot initialize multi-dimensional array with initializer
+}
+
+
+int main()
+{
+ Array arr = func();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array5.C
new file mode 100644
index 000000000..aeacb31cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array5.C
@@ -0,0 +1,52 @@
+// { dg-do run }
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Incorrect construction and destruction of multi-dimensional
+// array of class.
+
+extern "C" void abort();
+extern "C" int printf(const char *, ...);
+
+int count;
+int num;
+
+struct A
+{
+ A()
+ {
+ if (count == num)
+ throw "";
+ count++;
+#ifdef PRINT
+ printf("ctor %p\n", static_cast<void *>(this));
+#endif
+ }
+
+ ~A()
+ {
+ count--;
+#ifdef PRINT
+ printf("dtor %p\n", static_cast<void *>(this));
+#endif
+ }
+};
+
+struct Array
+{
+ A array[2][2][2];
+};
+
+int main()
+{
+ for (num = 0; num <= 8; ++num) {
+ count = 0;
+ try {
+ Array A;
+ }
+ catch (...) {
+ }
+ if (count != 0)
+ abort();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array6.C
new file mode 100644
index 000000000..6181d02bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array6.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+char arr [][4] = { "one", "two" };
+const char arr2[][4] = { "one", "two" };
+signed char arr3[][4] = { "one", "two" };
+const unsigned char arr4[][4] = { "one", "two" };
+volatile wchar_t arr5[][4] = { L"one", L"two" };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array7.C
new file mode 100644
index 000000000..23c6a7098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array7.C
@@ -0,0 +1,15 @@
+struct S {
+ virtual void v () {}
+ void f (const float g[3]);
+ float h[3];
+};
+
+void g () {
+ S s1, s2;
+ s1 = s2;
+}
+
+void S::f (const float g[3]) {}
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array8.C
new file mode 100644
index 000000000..5f28ca490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array8.C
@@ -0,0 +1,12 @@
+struct A {
+ A ();
+};
+
+struct B {
+ A a1;
+ A a2;
+};
+
+A a;
+
+struct B b[] = { { a, a }, { a, a } };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/array9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/array9.C
new file mode 100644
index 000000000..d37e00e5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/array9.C
@@ -0,0 +1,9 @@
+struct T {
+ T ();
+};
+
+void f () {
+ T t[2];
+ for (int i = 0; i < 10; ++i);
+ int i = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/assign1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/assign1.C
new file mode 100644
index 000000000..690a48191
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/assign1.C
@@ -0,0 +1,30 @@
+// PR c++/13009
+// { dg-do run }
+
+struct A {
+ char a;
+};
+
+struct B: public virtual A {
+ #if 0 // this piece of code works around the problem
+ B& operator= (const B& other)
+ {
+ A::operator= (other);
+ }
+ #endif
+};
+
+struct C: public B {
+ char c;
+};
+
+int main() {
+ B b;
+ b.a = 'b';
+ C c;
+ c.a = c.c = 'c';
+
+ c.B::operator= (b);
+ if (c.a != 'b' || c.c != 'c')
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/attrib1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/attrib1.C
new file mode 100644
index 000000000..839e4ce21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/attrib1.C
@@ -0,0 +1,10 @@
+// { dg-do run }
+
+void f() __attribute((__constructor__));
+int i;
+void f() { i = 1; }
+
+int main(int, char **)
+{
+ return 1-i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield1.C
new file mode 100644
index 000000000..70a06d0e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield1.C
@@ -0,0 +1,24 @@
+// Check that we handle bitfields as complex lvalues properly.
+
+struct A
+{
+ int i: 2;
+ int j: 2;
+ int k: 2;
+};
+
+A a, a2;
+bool b;
+void f ();
+
+int main ()
+{
+ (f(), a.j) = 1;
+ (f(), a).j = 2; // { dg-warning "overflow" }
+ (b ? a.j : a2.k) = 3; // { dg-warning "overflow" }
+ (b ? a : a2).j = 0;
+ ++(a.j) = 1;
+ (a.j = 2) = 3; // { dg-warning "overflow" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield2.C
new file mode 100644
index 000000000..e54b2e423
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield2.C
@@ -0,0 +1,33 @@
+// PR c++/13371
+// Bug: We were failing to properly protect the lhs on the line marked
+// "here" from multiple evaluation.
+
+// { dg-do run }
+
+extern "C" int printf (const char *, ...);
+
+enum E { E1, E2 };
+
+struct A
+{
+ E e : 8;
+ unsigned char c;
+};
+
+A ar[2];
+
+int c;
+
+int f()
+{
+ ++c;
+ printf ("f()\n");
+ return 0;
+}
+
+int main()
+{
+ ar[0].c = 0xff;
+ ar[f()].e = E1; // here
+ return (c != 1 || ar[0].c != 0xff);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield3.C
new file mode 100644
index 000000000..23db2d4a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield3.C
@@ -0,0 +1,11 @@
+// PR c++/43663
+
+struct S
+{
+ S(): i(0) {}
+ int i : 3;
+};
+
+S s;
+
+const int& cr(s.i);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield4.C
new file mode 100644
index 000000000..30041c435
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield4.C
@@ -0,0 +1,24 @@
+// PR c++/56235
+
+struct A
+{
+ A (const A &);
+};
+
+struct B
+{
+ A a;
+ enum Mode { };
+ Mode m:8;
+};
+
+struct C
+{
+ C();
+ B b;
+};
+
+C fn()
+{
+ return C();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield5.C
new file mode 100644
index 000000000..58f686d9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/bitfield5.C
@@ -0,0 +1,12 @@
+// PR c++/51219
+
+struct A
+{
+ int i;
+ int : 8;
+};
+
+void foo()
+{
+ A a = { 0 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace1.C
new file mode 100644
index 000000000..a819fa258
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace1.C
@@ -0,0 +1,4 @@
+// { dg-do compile }
+
+int i[4] = { { 3 } }; // { dg-error "brace" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace2.C
new file mode 100644
index 000000000..50dc48139
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace2.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// [dcl.init] paragraph 13.
+int x = { 2 };
+const char * y = { "hello" };
+int a = 2;
+int b = { 2,3 }; // { dg-error "requires one element in initializer" }
+int c = { { 2 } } ; // { dg-error "braces around scalar initializer" }
+int d = {}; // { dg-error "initializer" "" { target { ! c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace3.C
new file mode 100644
index 000000000..0a1ee8f00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace3.C
@@ -0,0 +1 @@
+int array[2][1] = { {0} {1} }; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace4.C
new file mode 100644
index 000000000..0c3790193
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace4.C
@@ -0,0 +1,5 @@
+// PR c++/16859
+// { dg-do compile }
+// { dg-options "-pedantic" }
+
+int a[] = { }; // { dg-error "zero-size array" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace5.C
new file mode 100644
index 000000000..696bbd676
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace5.C
@@ -0,0 +1,7 @@
+// PR c++/27491
+// { dg-do compile }
+// { dg-options "" }
+
+int i = (int) { 0 };
+int j = (int) { i };
+int k = (int) { k };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/brace6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/brace6.C
new file mode 100644
index 000000000..0fa818c80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/brace6.C
@@ -0,0 +1,25 @@
+/* PR c++/30759 */
+/* { dg-do compile } */
+
+struct A {
+ A(int) { }
+};
+
+struct B {
+ B(const B&);
+ int b;
+};
+
+struct C {};
+
+struct D { int c; };
+
+int main()
+{
+ int i = { 1 };
+ int j = { 1, 2 }; /* { dg-error "requires one element" } */
+ A a = { 6 }; /* { dg-error "initialize" "" { target { ! c++11 } } } */
+ B b = { 6 }; /* { dg-error "" } */
+ C c = { 6 }; /* { dg-error "too many initializers" } */
+ D d = { 6 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/byval1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/byval1.C
new file mode 100644
index 000000000..86c6e4683
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/byval1.C
@@ -0,0 +1,31 @@
+// PR c++/3948
+// Test that the destructor call for a value parameter gets the
+// right address.
+
+// { dg-do run }
+
+void *p[2];
+int i;
+int r;
+
+struct C
+{
+ int m;
+
+ C() { p[i++] = this; }
+ ~C() { if (p[--i] != this) r = 1; }
+};
+
+
+void Foo (C c)
+{
+ p[i++] = &c;
+}
+
+int main ()
+{
+ C c;
+
+ Foo (c);
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/call1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/call1.C
new file mode 100644
index 000000000..d44b6dddc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/call1.C
@@ -0,0 +1,35 @@
+// Bug c++/16115
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+int count = 0;
+
+struct T {
+ T() { count++; }
+ T(const T&) { count++; }
+ ~T() { if (count==0) abort(); --count; }
+};
+
+struct auto_ptr {
+ T* p;
+
+ auto_ptr(T* __p) : p(__p) { }
+ ~auto_ptr() { delete p; }
+
+ T* release() {
+ T* t = p;
+ p = 0;
+ return t;
+ }
+};
+
+void destroy (auto_ptr a) {
+ delete a.release();
+}
+
+
+int main ()
+{
+ destroy (new T);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup1.C
new file mode 100644
index 000000000..517af15c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup1.C
@@ -0,0 +1,16 @@
+// PR c++/13033
+
+// We failed to treat the for increment expression as a full-expression,
+// which broke gimplification.
+
+struct QDomNode {
+ virtual ~QDomNode();
+ QDomNode nextSibling() const;
+ bool isNull() const;
+};
+
+void processNode(QDomNode n)
+{
+ for (; !n.isNull(); n = n.nextSibling())
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup2.C
new file mode 100644
index 000000000..e62364be1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup2.C
@@ -0,0 +1,19 @@
+// PR c++/12526
+
+// We decided that the call to strcmp has no side-effects because strcmp is
+// pure, even though the first argument has side-effects. As a result, we
+// stripped the CLEANUP_POINT_EXPR. Hilarity ensued.
+
+extern "C" int strcmp (const char *, const char *);
+
+struct A {
+ A(int);
+ const char *str();
+ ~A();
+};
+
+void printQueryI()
+{
+ if(!strcmp(A(1).str(), "foo"))
+ { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup3.C
new file mode 100644
index 000000000..da7e411ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/cleanup3.C
@@ -0,0 +1,22 @@
+// Check that on targets with "__cxa_atexit" we use destructors,
+// rather than cleanup functions, to destroy objects with static
+// storage duration.
+
+// { dg-require-effective-target "cxa_atexit" }
+// Cleanup functions generated by G++ have the "_tcf" prefix.
+// { dg-final { scan-assembler-not "_tcf" } }
+
+struct S {
+ ~S();
+};
+
+struct T {
+ S s;
+};
+
+S s;
+T t;
+
+void f() {
+ static S s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/complex1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/complex1.C
new file mode 100644
index 000000000..3f88fd902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/complex1.C
@@ -0,0 +1,7 @@
+/* PR c++/21210 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef float __complex__ fcomplex;
+fcomplex cplx = fcomplex();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const1.C
new file mode 100644
index 000000000..af4427d9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const1.C
@@ -0,0 +1,8 @@
+// PR c++/20073
+
+template<int> struct A
+{
+ A();
+};
+
+const A<0> x[] = { A<0>() };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const2.C
new file mode 100644
index 000000000..4fd631851
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const2.C
@@ -0,0 +1,7 @@
+// PR c++/19878
+
+struct S {
+ char k;
+};
+char const volatile S::* const p01 = &S::k;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const3.C
new file mode 100644
index 000000000..96cb6f909
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const3.C
@@ -0,0 +1,12 @@
+// { dg-do run }
+
+struct S {
+ static const int i = 3;
+};
+
+const int S::i;
+
+int main () {
+ if (!S::i)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const4.C
new file mode 100644
index 000000000..b99726b86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const4.C
@@ -0,0 +1,8 @@
+// PR c++/27804
+// { dg-do compile }
+
+bool foo()
+{
+ const int i = X; // { dg-error "not declared" }
+ return i > 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const5.C
new file mode 100644
index 000000000..fa8d8fc23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const5.C
@@ -0,0 +1,11 @@
+// PR c++/31449
+
+class Foo {};
+class Bar : public Foo {};
+static const Foo *foo = 0;
+
+static Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
+
+void func(const Foo *foo) {
+ Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const6.C
new file mode 100644
index 000000000..e626bfeac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const6.C
@@ -0,0 +1,27 @@
+// PR c++/36688
+// { dg-do run }
+// { dg-options "-O2" }
+
+struct S
+{
+ long long a;
+ long long b;
+ long long c;
+};
+
+struct T
+{
+ S g;
+ long long h[12];
+};
+
+static const S s = { 1, 2, 3 };
+static const T t = { s, 0 };
+
+int
+main ()
+{
+ T x = t;
+ if (__builtin_memcmp (&x, &t, sizeof (T)))
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const7.C
new file mode 100644
index 000000000..18d04625d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const7.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fdump-tree-gimple" }
+
+struct s { int x, y; };
+short offsets[1] = {
+ ((char*) &(((struct s*)16)->y) - (char *)16),
+};
+
+// This ensures that we get a dump whether or not the bug is present.
+void fn() { }
+
+// { dg-final { scan-tree-dump-not "initialization" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const8.C
new file mode 100644
index 000000000..4eb293d65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const8.C
@@ -0,0 +1,11 @@
+// DR 234 - it should be OK to leave off the initializer of a const
+// variable if the default constructor fully initializes the object.
+
+struct A { };
+const A a;
+
+struct B { A a; };
+const B b;
+
+struct C { virtual void f(); };
+const C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C
new file mode 100644
index 000000000..ba1dfd4bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C
@@ -0,0 +1,12 @@
+// PR c++/55893
+// { dg-final { scan-assembler-not "rodata" } }
+
+struct foo
+{
+ virtual ~foo ();
+};
+
+int main ()
+{
+ static const foo tmp;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/constant1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/constant1.C
new file mode 100644
index 000000000..386b92610
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/constant1.C
@@ -0,0 +1,17 @@
+// PR c++/51554
+
+typedef unsigned char uint8;
+typedef unsigned int uint32;
+
+const uint32 XX[] = { 1, 3, 7 };
+
+const uint8 V[] = {
+ *(((const uint8*)&XX[0]) + 0),
+ *(((const uint8*)&XX[0]) + 1),
+ *(((const uint8*)&XX[0]) + 2),
+ *(((const uint8*)&XX[0]) + 3),
+ *(((const uint8*)&XX[1]) + 0),
+ *(((const uint8*)&XX[1]) + 1),
+ *(((const uint8*)&XX[1]) + 2),
+ *(((const uint8*)&XX[1]) + 3),
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy1.C
new file mode 100644
index 000000000..91a84ae3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+class A {
+public:
+ A(){}
+ A( const A& a ){}
+};
+
+class B : public A
+{
+public:
+ B( int& s) : s_(s){}
+ int& s_;
+};
+
+int main()
+{
+ int i;
+ B x1( i );
+ B x2( x1 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy2.C
new file mode 100644
index 000000000..9a662d4cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy2.C
@@ -0,0 +1,5 @@
+// { dg-do compile }
+
+struct S { S (); };
+
+volatile S s[1] = { S () };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy3.C
new file mode 100644
index 000000000..fa6a6ea18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy3.C
@@ -0,0 +1,16 @@
+// { dg-do run }
+// { dg-options "-fno-elide-constructors" }
+
+int copies;
+
+struct S {
+ S () {}
+ S (const S&) { ++copies; }
+};
+
+S s[1] = { S () };
+
+int main () {
+ if (copies != 1)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy4.C
new file mode 100644
index 000000000..bfff68566
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy4.C
@@ -0,0 +1,19 @@
+// PR c++/9342
+// We were failing to wrap def().user in a TARGET_EXPR, so copying it
+// into the reference temp used a bitwise copy.
+
+struct QString
+{
+ QString( const QString & );
+ QString &operator=( const QString & );
+};
+struct ServerSettings
+{
+ QString user;
+};
+extern ServerSettings def();
+extern void arg( const QString& a );
+void startSession( bool b, QString s )
+{
+ arg (b ? def().user : s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy5.C
new file mode 100644
index 000000000..cef5a2950
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy5.C
@@ -0,0 +1,29 @@
+// { dg-options "-O2" }
+
+struct BOOL {
+ int nVal:1, bSet:1;
+ BOOL (int i) : nVal(i!=0), bSet(1) {}
+};
+struct Fill {
+ void *d;
+ Fill() : d(0) {}
+ Fill( const Fill& ) {}
+};
+struct SvMetaSlot {
+ Fill aGroupId;
+ BOOL a8;
+ SvMetaSlot() :
+ a8(1) {}
+ SvMetaSlot* MakeClone() const;
+};
+
+SvMetaSlot* SvMetaSlot::MakeClone() const { return new SvMetaSlot( *this ); }
+
+extern "C" void abort(void);
+int main()
+{
+ SvMetaSlot s; SvMetaSlot s2(s);
+ if (s.a8.bSet != s2.a8.bSet)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/copy6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/copy6.C
new file mode 100644
index 000000000..136dc7830
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/copy6.C
@@ -0,0 +1,13 @@
+// PR c++/11878
+
+struct A
+{
+ virtual ~A();
+};
+
+template<typename T> struct B
+{
+ T t;
+};
+
+void foo() { throw B<A>().t; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor1.C
new file mode 100644
index 000000000..aeb509bfa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor1.C
@@ -0,0 +1,57 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2002 <nathan@codesourcery.com>
+
+// From WindRiver SPR 80797
+// We were inadvertently SAVE_EXPRing volatile arrays during delete[]
+
+struct A
+{
+ A *ptr;
+ static int ok;
+
+ A () {ptr = this;}
+ ~A () {ok = ptr == this;}
+};
+int A::ok = -1;
+
+struct B
+{
+ B *ptr;
+ static int ok;
+
+ B () {ptr = this;}
+ ~B () {ok = ptr == this;}
+};
+int B::ok = -1;
+
+struct C
+{
+ A volatile a;
+ B volatile b[1];
+
+ C ();
+};
+
+C::C ()
+{
+ throw 1;
+}
+
+int main ()
+{
+ try
+ {
+ C c;
+ }
+ catch (...)
+ {
+ if (A::ok != 1)
+ return 1;
+ if (B::ok != 1)
+ return 2;
+ return 0;
+ }
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor10.C
new file mode 100644
index 000000000..91cc25012
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor10.C
@@ -0,0 +1,9 @@
+// PR c++/48606
+// { dg-do compile }
+// { dg-options "-fkeep-inline-functions" }
+
+struct S
+{
+ int &ref;
+ S() : ref() {}; // { dg-error "value-initialization of" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor11.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor11.C
new file mode 100644
index 000000000..486f58aa9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor11.C
@@ -0,0 +1,19 @@
+// PR c++/49569
+
+struct A
+{
+ virtual void f() = 0;
+};
+
+struct B: A
+{
+ int i;
+ virtual void f() { }
+};
+
+struct C
+{
+ B b;
+ C(): b() { }
+ C(const B& b): b(b) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor2.C
new file mode 100644
index 000000000..cf426f2bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor2.C
@@ -0,0 +1,34 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9629. The vtable is not set up until the base initializers have
+// run.
+
+struct A {
+ static A *a;
+ A ();
+};
+A *A::a;
+A::A () {a = this;}
+
+struct B {
+ static A *a;
+ B (A *);
+};
+A *B::a;
+B::B(A *a_) {a = a_;}
+
+struct C : virtual public A, public B {
+ C();
+};
+C::C () : B(this) {}
+
+struct D : virtual public C {};
+
+int main()
+{
+ new D();
+ return A::a != B::a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor3.C
new file mode 100644
index 000000000..1678aaf2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor3.C
@@ -0,0 +1,6 @@
+// PR c++/14401
+
+struct S {
+ S() {} // { dg-error "" }
+ const int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C
new file mode 100644
index 000000000..1c92bb973
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C
@@ -0,0 +1,20 @@
+// PR c++/17788
+// { dg-do compile }
+
+class foo {
+public:
+ foo();
+};
+
+class bar: public foo { // { dg-error "reference|bar::bar" }
+private:
+ int &a;
+};
+
+foo::foo() {
+}
+
+int main(int argc, char **argv)
+{
+ bar x; // { dg-message "synthesized|deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor5.C
new file mode 100644
index 000000000..cc9331882
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor5.C
@@ -0,0 +1,17 @@
+// PR C++/21645
+// We were crashing because we forgot to update the type for
+// the cloned argument for the cloned ctor.
+
+struct color {
+ ~color();
+};
+struct style {
+ color col;
+ style (color);
+};
+
+style::style(color c)
+ : col(c)
+{
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor6.C
new file mode 100644
index 000000000..a25ecab1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor6.C
@@ -0,0 +1,20 @@
+// PR c++/21340
+
+struct Base{};
+struct Iterator : virtual Base {};
+bool operator==(const Iterator&, const Iterator&);
+struct IteratorI : Iterator {};
+struct Obj
+{
+ bool operator==(const Obj&) const;
+};
+template <int>bool dummy()
+{
+ Obj lhs, rhs;
+ return lhs == rhs;
+}
+int
+main(int argc, char** argv)
+{
+ IteratorI* it2 = new IteratorI();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor7.C
new file mode 100644
index 000000000..3378a150e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor7.C
@@ -0,0 +1,51 @@
+// { dg-do run }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Oct 2005 <nathan@codesourcery.com>
+
+// PR 23984:ICE
+// Origin: Andrew Pinski pinskia@gcc.gnu.org
+
+struct B
+{
+ virtual void Foo ();
+};
+
+void B::Foo ()
+{
+}
+
+struct D : virtual B
+{
+};
+
+struct E
+{
+ B *ptr;
+
+ E (B *);
+};
+
+static B *ptr;
+
+E::E (B *ptr_)
+ :ptr (ptr_)
+{
+}
+
+struct G : D, E
+{
+ G ();
+};
+
+G::G ()
+ : E (this)
+{
+}
+
+int main ()
+{
+ G object;
+
+ return object.ptr != &object;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C
new file mode 100644
index 000000000..7eb72eb83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C
@@ -0,0 +1,10 @@
+// PR c++/29039
+
+typedef struct S { // { dg-error "reference" "" { target c++11 } }
+ int &r;
+}; // { dg-warning "'typedef' was ignored" }
+
+
+S f () {
+ return S (); // { dg-error "reference|deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor9.C
new file mode 100644
index 000000000..02bb5700f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor9.C
@@ -0,0 +1,8 @@
+// PR c++/38427
+// { dg-do compile }
+
+struct S
+{
+ int &ref;
+ S() : ref() {}; // { dg-error "value-initialization of" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/delete1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/delete1.C
new file mode 100644
index 000000000..304dca1ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/delete1.C
@@ -0,0 +1,7 @@
+// PR c++/19811
+
+class C; // { dg-warning "forward" }
+
+void foo(void *p) {
+ delete [] ((C*)p) ; // { dg-warning "problem|incomplete" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/delete2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/delete2.C
new file mode 100644
index 000000000..8a486beaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/delete2.C
@@ -0,0 +1,55 @@
+// PR c++/15097
+// { dg-do run }
+
+typedef __SIZE_TYPE__ size_t;
+
+extern "C" void * malloc (size_t);
+extern "C" void free (void *);
+extern "C" void abort(void);
+
+void *saved;
+
+void * operator new (size_t size)
+{
+ void *p = malloc (size);
+ saved = p;
+ return p;
+}
+
+void operator delete (void *p)
+{
+ if (p != saved)
+ abort ();
+ free (p);
+}
+
+struct B1
+{
+ virtual ~B1 () throw() {}
+ B1 (){}
+ int x;
+};
+struct B2
+{
+ virtual ~B2 () throw() {}
+ B2 (){}
+ int x;
+};
+struct D : B1, B2
+{
+ D (){}
+ ~D () throw() {}
+ int y;
+};
+void f1 (D*);
+void f2 (B2*);
+void f3 (B1*);
+int main (void)
+{
+ f1 (::new D);
+ f2 (::new D);
+ f3 (::new D);
+}
+void f1 ( D* p) { ::delete p; }
+void f2 (B2* p) { ::delete p; }
+void f3 (B1* p) { ::delete p; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle1.C
new file mode 100644
index 000000000..97f67cad8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle1.C
@@ -0,0 +1,11 @@
+// PR c++/17042
+// { dg-do assemble }
+/* { dg-require-weak "" } */
+// { dg-options "-fuse-cxa-atexit" }
+
+struct A
+{ A(); ~A(); };
+A a;
+extern "C" { void* __dso_handle __attribute__ ((__weak__)); }
+void f()
+{ __dso_handle = 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle2.C
new file mode 100644
index 000000000..b219dc026
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dso_handle2.C
@@ -0,0 +1,11 @@
+// PR c++/58846
+// { dg-options "-fuse-cxa-atexit" }
+
+extern "C" { char* __dso_handle; }
+
+struct A
+{
+ ~A();
+};
+
+A a; // { dg-error "conflicting declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor1.C
new file mode 100644
index 000000000..624433897
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor1.C
@@ -0,0 +1,43 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+int d = 5;
+
+struct B
+{
+ int x;
+ B (int i) : x (i) { }
+ ~B () { if (d-- != x) abort (); }
+};
+
+struct C1 : public B {
+ C1 (int i) : B (i) {}
+};
+
+struct C2 : public B {
+ C2 (int i) : B (i) {}
+};
+
+struct D : public B {
+ D (int i) : B (i) {}
+};
+
+struct E : public B {
+ E (int i) : B (i) {}
+};
+
+struct A
+ : public C1, C2, virtual public D, virtual public E
+{
+ A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {}
+ B x1;
+ B x2;
+};
+
+
+int main ()
+{
+ A a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor2.C
new file mode 100644
index 000000000..56c7cac91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor2.C
@@ -0,0 +1,28 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct A
+{
+ ~A();
+};
+
+A::~A () {
+ abort ();
+}
+
+struct B
+{
+ ~B();
+};
+
+B::~B () {
+ if(true) return;
+ A a;
+}
+
+int main()
+{
+ B b;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor3.C
new file mode 100644
index 000000000..2af1ffe46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor3.C
@@ -0,0 +1,21 @@
+// PR c++/17976
+// { dg-do run }
+
+extern "C" void abort();
+struct A
+{
+ static int i;
+ A(){}
+ ~A(){i++;if(i>1)abort();}
+};
+
+int A::i = 0;
+
+A a;
+extern A a;
+
+int main()
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/dtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor4.C
new file mode 100644
index 000000000..4bca69e4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/dtor4.C
@@ -0,0 +1,9 @@
+// { dg-final { scan-assembler-not "_ZN1AD2Ev" } }
+
+struct A { };
+
+int main()
+{
+ A a;
+ a.~A();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/elide1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/elide1.C
new file mode 100644
index 000000000..24e81e387
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/elide1.C
@@ -0,0 +1,38 @@
+// { dg-do run }
+
+// Test that the destructor for a temporary passed by value isn't run
+// until end of full-expression, as per [class.copy]:
+
+// Whenever a temporary class object is copied using a copy constructor,
+// and this object and the copy have the same cv-unqualified type, an
+// implementation is permitted to treat the original and the copy as two
+// different ways of referring to the same object and not perform a copy
+// at all, even if the class copy constructor or destructor have side
+// effects.... In these cases, the
+// object is destroyed at the later of times when the original and the
+// copy would have been destroyed without the optimization.
+
+// Here, the temporary would be destroyed later than the parm, so either we
+// must suppress the optimization in this case or destroy value parms in the
+// caller.
+
+int d;
+
+struct A {
+ A () { }
+ A (const A&) { }
+ ~A() { ++d; }
+};
+
+void f (A a) { }
+
+int main ()
+{
+ int r;
+ f (A ()), r = d;
+
+ if (r < d && d)
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/elide2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/elide2.C
new file mode 100644
index 000000000..e6d3300b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/elide2.C
@@ -0,0 +1,30 @@
+// PR c++/8674
+
+// Bug: Since B().a is an rvalue, we tried to treat it like a TARGET_EXPR
+// and elide the copy. But that produces a bitwise copy, which causes us
+// to abort in cp_expr_size.
+
+// Test that we actually run the A copy constructor when calling f().
+
+// { dg-do run }
+
+int c;
+
+struct A
+{
+ A () { ++c; }
+ A (const A&) { ++c; }
+};
+
+struct B
+{
+ A a;
+};
+
+void f (A) { }
+
+int main ()
+{
+ f (B().a);
+ return c < 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/empty1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/empty1.C
new file mode 100644
index 000000000..bba179f98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/empty1.C
@@ -0,0 +1,30 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 3 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 4203. We were bit copying empty bases including the
+// padding. Which clobbers whatever they overlay.
+
+class EmptyBase0 {};
+class EmptyBase1 : public EmptyBase0 {};
+class Base1
+{
+public:
+unsigned int t_;
+Base1(unsigned int t) : t_(t) {}
+};
+
+class PEPE : public Base1, public EmptyBase1
+{
+public:
+PEPE(unsigned int t)
+ : Base1(t), EmptyBase1(EmptyBase1()) {}
+};
+
+int main()
+{
+ PEPE pepe(0xff);
+
+ return pepe.t_ != 255;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/enum1.C
new file mode 100644
index 000000000..4876e4594
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/enum1.C
@@ -0,0 +1,18 @@
+/* { dg-options "-Wno-overflow" } */
+
+#ifndef __SIZEOF_INT128__
+#define UNACCEPT 0xffffffffffffffffLL
+#else
+#define UNACCEPT ~((unsigned __int128) 0)
+#endif
+
+enum test {
+ acceptable = -1,
+ unacceptable = UNACCEPT
+}; // { dg-error "" }
+
+enum test t = acceptable, u = unacceptable;
+
+int main() {
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/enum2.C
new file mode 100644
index 000000000..dea7dc17b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/enum2.C
@@ -0,0 +1,9 @@
+#include <limits.h>
+enum test {
+ z = 0,
+ c = UINT_MAX + 1LL
+} x = z;
+
+int main() {
+ return x != z;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/error1.C
new file mode 100644
index 000000000..bdd983f96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/error1.C
@@ -0,0 +1,7 @@
+// PR c++/12696
+
+struct A {
+ static float b[10];
+} // { dg-error "after struct definition" }
+
+float A::b[] = {1,2,3};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/error2.C
new file mode 100644
index 000000000..43d24f13b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/error2.C
@@ -0,0 +1,15 @@
+/* PR c++/29727 */
+/* { dg-do compile } */
+
+template<int> struct A
+{
+ static int a[1];
+};
+template<int N> int A<N>::a[1] = { X:0 }; /* { dg-error "does not allow designated|was not declared|designated initializer for an array" } */
+
+void foo()
+{
+ A<0>::a;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/explicit1.C
new file mode 100644
index 000000000..f376df236
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/explicit1.C
@@ -0,0 +1,9 @@
+// PR c++/60417
+
+struct A { explicit A(int = 0); };
+struct B { A a; };
+
+int main()
+{
+ B b = {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/float1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/float1.C
new file mode 100644
index 000000000..d18ff3db0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/float1.C
@@ -0,0 +1,19 @@
+// PR c++/21089
+// { dg-do run }
+
+extern "C" void abort();
+
+static const double a = 1.0;
+struct S {
+ S();
+};
+static S s;
+static const double b = a + 1.0;
+
+S::S() {
+ if (b < 1.9 || b > 2.1)
+ abort ();
+}
+
+int main () {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/for1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/for1.C
new file mode 100644
index 000000000..420e85cff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/for1.C
@@ -0,0 +1,30 @@
+// PR c++/13865
+// Bug: We were destroying 'a' before executing the loop.
+
+// { dg-do run }
+
+#include <stdio.h>
+
+int i;
+int r;
+
+class A
+{
+public:
+ A() { printf("A ctor\n"); }
+ ~A()
+ {
+ printf("A dtor\n");
+ if (i != 2)
+ r = 1;
+ }
+};
+
+int main(int argc, char **argv)
+{
+ for (A a; i < 2; ++i) {
+ printf("iteration %d\n", i);
+ }
+
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/for2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/for2.C
new file mode 100644
index 000000000..d66fea30e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/for2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// PR 16012: Got the scope of I incorrect in templates only.
+
+template<int> void foo()
+{
+ for (int i=0 ;;) ;
+ int i;
+}
+
+void bar()
+{
+ foo<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/for3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/for3.C
new file mode 100644
index 000000000..c8ef3cc62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/for3.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+struct A { int i; A(); A(const A&); };
+
+void bar()
+{
+ A a;
+ for ( ;; a=A() ) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/global1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/global1.C
new file mode 100644
index 000000000..21f1cac06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/global1.C
@@ -0,0 +1,16 @@
+// PR c++/18416
+
+class errarg {
+ enum { EMPTY } type;
+public:
+ errarg();
+};
+extern errarg empty_errarg;
+extern void errprint(const char *,
+ const errarg &arg1 = empty_errarg,
+ const errarg &arg2 = empty_errarg,
+ const errarg &arg3 = empty_errarg);
+errarg::errarg() : type(EMPTY)
+{
+}
+errarg empty_errarg;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/goto1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/goto1.C
new file mode 100644
index 000000000..b0a0c5253
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/goto1.C
@@ -0,0 +1,23 @@
+// PR c++/14724
+// { dg-do run }
+
+int j;
+
+template <class T>
+struct C {
+ C() { ++j; }
+ ~C() { --j; }
+};
+
+int main(int, char **) {
+ {
+ int i = 0;
+ again:
+ C<int> v;
+ if (++i < 10)
+ goto again;
+ }
+
+ return j;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/goto2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/goto2.C
new file mode 100644
index 000000000..3f4ecc04c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/goto2.C
@@ -0,0 +1,11 @@
+// PR c++/20721
+
+bool f();
+void g(int i)
+{
+ if (i) goto bad; // { dg-error "from" }
+ bool a = f(); // { dg-error "initialization" }
+ bad: // { dg-error "jump" }
+ ;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref1.C
new file mode 100644
index 000000000..d0170cd18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref1.C
@@ -0,0 +1,45 @@
+// Submitted by Erik Rozendaal <dlr@acm.org>
+// Test case for GNATS bug 787.
+// { dg-do run }
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static int calls;
+
+int &foo (int &arg)
+{
+ calls++;
+ arg=0;
+ return arg;
+}
+
+int &identity (int &x)
+{
+ return x;
+}
+
+int main()
+{
+ int a;
+
+ calls = 0;
+ int &b = ++foo (a);
+ if (calls > 1)
+ abort ();
+ if (&a != &b)
+ abort ();
+ if (a != 1)
+ abort ();
+
+ calls = 0;
+ int &c = ++identity (++foo (a));
+ if (calls > 1)
+ abort ();
+ if (&a != &c)
+ abort ();
+ if (a != 2)
+ abort ();
+
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref2.C
new file mode 100644
index 000000000..6d9448a8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref2.C
@@ -0,0 +1,42 @@
+// Submitted by Jason Merrill <jason_merrill@redhat.com>
+// Test for proper handling of local static references.
+// { dg-do run }
+
+int r;
+
+int c;
+int f ()
+{
+ // Test that we only initialize i once.
+ if (++c > 1)
+ ++r;
+ return 42;
+}
+
+const int *p;
+void g ()
+{
+ static const int &i = f();
+
+ // Test that i points to the same place in both calls.
+ if (p && p != &i)
+ ++r;
+ // Test that if so, it points to static data.
+ if (i != 42)
+ ++r;
+
+ p = &i;
+}
+
+void h ()
+{
+ int arr[] = { 1, 1, 1, 1, 1, 1, 1 };
+ g ();
+}
+
+int main ()
+{
+ g ();
+ h ();
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref3.C
new file mode 100644
index 000000000..e858fd74d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref3.C
@@ -0,0 +1,47 @@
+// Origin: Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
+
+// { dg-do link }
+
+template <class T>
+class Ptr {
+protected:
+ T * ptr;
+
+public:
+
+ Ptr(void) : ptr(0) { }
+ Ptr(T * p) : ptr(p) { }
+
+ ~Ptr(void) { delete ptr; }
+
+ operator T & () { return *ptr; }
+};
+
+class base {
+public:
+ base(void) { }
+ ~base(void) { }
+};
+
+
+class foo : public base {
+private:
+ foo(const foo & rv);
+
+public:
+
+ foo(void) { }
+ ~foo(void) { }
+};
+
+void func2(base & b) {
+ // ...
+}
+
+int main () {
+ Ptr<foo> f = new foo;
+ /* This should not result in a copy; the result of the conversion
+ operator should be bound directly to the reference argument to
+ `func2'. */
+ func2(f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref4.C
new file mode 100644
index 000000000..7cd6986ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/init-ref4.C
@@ -0,0 +1,21 @@
+// Origin: dgregor@gcc.gnu.org
+// PR c++/11384
+// foo<int>::_S_something was not being emitted (as a weak definition).
+
+// { dg-do run }
+// { dg-require-weak "" }
+
+template<typename T>
+ struct foo
+ {
+ static const T _S_something;
+ };
+
+template<typename T>
+ const T foo<T>::_S_something = T();
+
+int main()
+{
+ const int* p = &foo<int>::_S_something;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/inline1.C
new file mode 100644
index 000000000..f3e323427
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/inline1.C
@@ -0,0 +1,14 @@
+// PR c++/9167
+// { dg-options "-finline" }
+
+struct A {
+ ~A();
+ A f(A) { }
+};
+
+
+void f(void)
+{
+ A a;
+ a.f(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime1.C
new file mode 100644
index 000000000..57f8c6217
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime1.C
@@ -0,0 +1,29 @@
+// PR c++/48370
+// { dg-do run }
+
+extern "C" void abort();
+
+int last = 4;
+
+struct A {
+ int i;
+ A(int i): i(i) { }
+ ~A() { if (i > last) abort(); last = i; }
+};
+
+struct D { int i; };
+
+struct B: D, A { B(int i): A(i) { } };
+struct E: D, virtual A { E(int i): A(i) { } };
+
+struct C
+{
+ const A& ar1;
+ const A& ar2;
+ const A& ar3;
+};
+
+int main()
+{
+ C c = { 1, B(2), E(3) };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime2.C
new file mode 100644
index 000000000..293bd692e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime2.C
@@ -0,0 +1,23 @@
+// PR c++/26714
+// { dg-do run }
+
+extern "C" void abort();
+
+bool ok = false;
+struct A
+{
+ A() { }
+ ~A() { if (!ok) abort(); }
+};
+
+struct B
+{
+ const A &a1;
+ const A &a2;
+ B() : a1(A()),a2(A()) { ok = true; }
+};
+
+int main()
+{
+ B b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime3.C
new file mode 100644
index 000000000..d099699f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/lifetime3.C
@@ -0,0 +1,37 @@
+// PR c++/26714
+// { dg-do run }
+
+extern "C" void abort();
+
+bool ok = false;
+struct A {
+ A() { }
+ ~A() { if (!ok) abort(); }
+};
+
+struct B {
+ static A foo() { return A(); }
+};
+
+B b_g;
+
+struct scoped_ptr {
+ B* operator->() const { return &b_g; }
+ B* get() const { return &b_g; }
+};
+
+B *get() { return &b_g; }
+
+int main()
+{
+ scoped_ptr f;
+ const A& ref1 = f->foo();
+ const A& ref2 = f.get()->foo();
+ const A& ref3 = get()->foo();
+ const A& ref4 = B::foo();
+ B *pf = f.get();
+ const A& ref5 = pf->foo();
+
+
+ ok = true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/member1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/member1.C
new file mode 100644
index 000000000..88f9b3134
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/member1.C
@@ -0,0 +1,21 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com>
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Bug 20789: ICE on invalid
+
+template<typename> struct A;
+
+template<int> struct B {};
+
+template<typename T> struct C
+{
+ static const int i = A<T>::i; // { dg-error "incomplete" }
+ static const int j = i;
+ B<j> b;
+};
+
+C<int> c;
+
+int i = C<int>::i;
+int j = C<int>::j;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/mutable1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/mutable1.C
new file mode 100644
index 000000000..af99ee0bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/mutable1.C
@@ -0,0 +1,20 @@
+// PR c++/54026
+// { dg-final { scan-assembler-not "rodata" } }
+
+void non_const(int *);
+
+template <typename T>
+struct Foo {
+ T x;
+ mutable int y;
+ void func() const { non_const(&y); }
+};
+
+struct Bar {
+ int x;
+ mutable int y;
+ void func() const { non_const(&y); }
+};
+
+const Foo<int> foo = { 1, 2 };
+const Bar bar = { 3, 4 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new1.C
new file mode 100644
index 000000000..5015d819f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new1.C
@@ -0,0 +1,19 @@
+// Origin: asharji@uwaterloo.ca
+
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+
+class bar {
+ int i;
+ public :
+ void * operator new ( size_t , void * storage );
+};
+
+class foo {
+ int storage[ 5 ];
+ public:
+ void mem ( ) {
+ bar *s = new ( ( void * ) & storage ) bar;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new10.C
new file mode 100644
index 000000000..e19629bc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new10.C
@@ -0,0 +1,8 @@
+// PR c++/14452
+// We got confused trying to preevaluate the new-initializer.
+
+struct S {};
+void foo (bool b)
+{
+ new S(b ? S() : S());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new11.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new11.C
new file mode 100644
index 000000000..a13f262aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new11.C
@@ -0,0 +1,25 @@
+// PR c++/17670
+// { dg-do run }
+
+#include <cstdlib>
+#include <new>
+
+bool abort_new;
+void *operator new[](size_t bytes)
+#if __cplusplus <= 199711L
+ throw (std::bad_alloc)
+#endif
+{
+ if (abort_new)
+ abort();
+ return operator new (bytes);
+}
+
+
+struct X {};
+int main () {
+ // Do not abort until main is running in case startup code uses
+ // operator new[].
+ abort_new = true;
+ new (X);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new12.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new12.C
new file mode 100644
index 000000000..ce2acb237
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new12.C
@@ -0,0 +1,6 @@
+// PR c++/18369
+
+void breakme ()
+{
+ int *v = new (int [5]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new13.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new13.C
new file mode 100644
index 000000000..2ced6e3fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new13.C
@@ -0,0 +1,11 @@
+// PR c++/22508
+// ICE on invalid operator new
+// Origin: Flash Sheridan <flash@pobox.com>
+// { dg-do compile }
+
+struct A
+{
+ void* operator new(__SIZE_TYPE__) throw(X); // { dg-error "expected|type" }
+};
+
+A* p = new A;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new14.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new14.C
new file mode 100644
index 000000000..5d13da20e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new14.C
@@ -0,0 +1,11 @@
+// PR c++/23491
+
+struct X
+{
+ int m;
+};
+
+void f(int n)
+{
+ const X *p = new const X[1] () ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new15.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new15.C
new file mode 100644
index 000000000..b93b43c83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new15.C
@@ -0,0 +1,19 @@
+// PR c++/9782
+
+extern "C" void printf(const char*, ...);
+
+template <int>
+struct A {
+ A() {printf("A::A()\n");}
+};
+
+
+struct B {
+ B() {printf("B::B()\n");}
+};
+
+
+int main () {
+ new A<0>[1][1];
+ new B [1][1];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new16.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new16.C
new file mode 100644
index 000000000..c49f13f83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new16.C
@@ -0,0 +1,38 @@
+// { dg-do run }
+// { dg-options "-O2 -fstrict-aliasing" }
+
+// Test that we don't let TBAA reorder an assignment across a
+// placement new.
+// See PR 29286.
+
+typedef __SIZE_TYPE__ size_t;
+
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+
+void __attribute__((noinline)) bar() {}
+
+long __attribute__((noinline)) foo(double *p, int n)
+{
+ long *f;
+ for (int i=0; i<n; ++i)
+ {
+ int *l = (int *)p;
+ *l = 0;
+ f = new (p) long;
+ *f = -1;
+ }
+ bar ();
+ return *f;
+}
+
+extern "C" void abort(void);
+int main()
+{
+ union {
+ int i;
+ long l;
+ } u;
+ if (foo((double *)&u, 1) != -1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new17.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new17.C
new file mode 100644
index 000000000..42b9f077a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new17.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// { dg-options "-O2 -fstrict-aliasing -fdump-tree-optimized" }
+
+// Test that placement new does not introduce an unnecessary memory
+// barrier.
+// See PR 29286.
+
+typedef __SIZE_TYPE__ size_t;
+
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+
+template <class T, int D>
+class Vector
+{
+public:
+ Vector()
+ {
+ for (int i = 0; i < D; ++i)
+ new (&x_m[i]) T();
+ }
+ T& operator[](int i) { return x_m[i]; }
+
+private:
+ T x_m[D];
+};
+
+void foo(Vector<float, 3> *m)
+{
+ Vector<float, 3> v;
+ v[0] = 1.0;
+ v[1] = 2.0;
+ v[3] = 3.0;
+ *m = v;
+}
+
+// { dg-final { scan-tree-dump-times "= 0\.0" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new18.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new18.C
new file mode 100644
index 000000000..45f6e7a09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new18.C
@@ -0,0 +1,45 @@
+// { dg-do compile }
+// { dg-options "-O2 -fstrict-aliasing" }
+
+// This caused an ICE during placement new.
+
+namespace Pooma {
+ typedef int Context_t;
+ namespace Arch {
+ }
+ inline Context_t context() {
+ }
+ inline int contexts() {
+ }
+ }
+template<class DomT, class T, class NewDom1T> struct DomainTraitsScalar {
+ };
+template<class T> struct DomainTraits : public DomainTraitsScalar<T, T, T> {
+ };
+template<int Dim> class Grid;
+template<class DT> class DomainBase {
+ };
+template<int Dim, class DT> class Domain : public DomainBase<DT> {
+ };
+#include <vector>
+template<> class Grid<1> : public Domain<1, DomainTraits<Grid<1> > > {
+ };
+namespace Pooma {
+ class PatchSizeSyncer {
+ typedef Grid<1> Grid_t;
+ PatchSizeSyncer(int contextKey, Grid_t &localGrid);
+ int myContext_m;
+ int numContexts_m;
+ int localKey_m;
+ Grid_t localGrid_m;
+ typedef std::pair<int,Grid_t *> Elem_t;
+ std::vector<Elem_t> gridList_m;
+ };
+ }
+namespace Pooma {
+ PatchSizeSyncer::PatchSizeSyncer(int contextKey, Grid_t &localGrid) :
+myContext_m(Pooma::context()), numContexts_m(Pooma::contexts()),
+localKey_m(contextKey), localGrid_m(localGrid) {
+ if (myContext_m == 0) gridList_m.reserve(numContexts_m);
+ }
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new19.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new19.C
new file mode 100644
index 000000000..a25be7da7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new19.C
@@ -0,0 +1,73 @@
+// { dg-do compile }
+// { dg-options "-O2 -fstrict-aliasing -fdump-tree-pre-details" }
+
+// Make sure we hoist invariants out of the loop even in the presence
+// of placement new. This is similar to code in tramp3d.
+
+typedef __SIZE_TYPE__ size_t;
+
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+
+template <class T, int D>
+class Vector
+{
+public:
+ Vector()
+ {
+ for (int i = 0; i < D; ++i)
+ new (&x_m[i]) T();
+ }
+ T& operator[](int i) { return x_m[i]; }
+
+private:
+ T x_m[D];
+};
+
+struct sia
+{
+ int ai[3];
+};
+
+struct s
+{
+ struct si
+ {
+ sia* p;
+ } asi[3];
+ float* pd;
+};
+
+class c
+{
+ int foo(int, int, int);
+ s sm;
+};
+
+
+extern void bar(Vector<float, 3>*, int);
+int c::foo(int f1, int f2, int f3)
+{
+ float sum = 0;
+ for (int i = 0; i < 3; ++i)
+ {
+ for (int j = 0; j < 3; ++j)
+ {
+ Vector<float, 3> v;
+ v[0] = 1.0;
+ v[1] = 2.0;
+ v[2] = 3.0;
+ for (int k = 0; k < 3; ++k)
+ {
+ float f = (f1 * this->sm.asi[0].p->ai[0]
+ + f2 * this->sm.asi[1].p->ai[0]
+ + f3 * this->sm.asi[2].p->ai[0]);
+ sum += f * v[k];
+ }
+ *this->sm.pd = sum;
+ }
+ }
+ return sum;
+}
+
+// { dg-final { scan-tree-dump "Replaced.*->ai\\\[0\\\]" "pre" } }
+// { dg-final { cleanup-tree-dump "pre" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new2.C
new file mode 100644
index 000000000..8b207d0a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new2.C
@@ -0,0 +1,17 @@
+// Origin: asharji@uwaterloo.ca
+
+// { dg-do compile }
+
+class bar {
+ public :
+ bar() { }
+ void * operator new ( __SIZE_TYPE__ , void * storage )
+ { return (void *)1;}
+};
+
+class foo {
+ public:
+ void mem ( ) {
+ new ( 0 ) bar;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new20.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new20.C
new file mode 100644
index 000000000..705c1be48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new20.C
@@ -0,0 +1,6 @@
+// PR c++/31743
+typedef int A[];
+A* p = new A; // { dg-error "invalid use of array with unspecified bounds" }
+A* q = new (A); // { dg-error "invalid use of array with unspecified bounds" }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new21.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new21.C
new file mode 100644
index 000000000..5797ea981
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new21.C
@@ -0,0 +1,10 @@
+// PR c++/32251
+
+struct A {
+ A();
+ void operator delete(void *, ...);
+};
+
+void foo () {
+ new A; // { dg-warning "deallocation" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new22.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new22.C
new file mode 100644
index 000000000..2ce51ff28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new22.C
@@ -0,0 +1,3 @@
+// PR c++/29001
+
+void* operator new (__SIZE_TYPE__) { return; } // { dg-error "with no value" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new23.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new23.C
new file mode 100644
index 000000000..cedd898b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new23.C
@@ -0,0 +1,20 @@
+// PR c++/33025
+// { dg-do run }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+inline void *operator new (size_t, void *p) throw () { return p; }
+extern "C" void abort ();
+
+int
+main()
+{
+ const unsigned num = 10;
+ unsigned *data = new unsigned[2 * num];
+ unsigned *ptr = data;
+ for (unsigned i = 0; i < 2 * num; ++i)
+ (i % 2 == 0) ? new (ptr) unsigned (2) : new (ptr++) unsigned (1);
+ if (ptr - data != num)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new24.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new24.C
new file mode 100644
index 000000000..6f5613be7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new24.C
@@ -0,0 +1,18 @@
+// PR c++/33025
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+inline void *operator new (size_t, void *p) throw () { return p; }
+extern "C" void abort ();
+
+int
+main()
+{
+ const unsigned num = 10;
+ unsigned *data = new unsigned[num];
+ unsigned *ptr = new (data) unsigned (num);
+ static unsigned data2[10];
+ unsigned *ptr2 = new (&data2[0]) unsigned (10);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new25.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new25.C
new file mode 100644
index 000000000..2d447f8f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new25.C
@@ -0,0 +1,29 @@
+// PR c++/31988
+#include <new>
+
+class C
+{
+public:
+ void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" }
+ void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" }
+ void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" }
+ void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" }
+};
+
+class D
+{
+public:
+ void* operator new(std::size_t,
+ const std::nothrow_t& = std::nothrow_t()) throw();
+ void* operator new[](std::size_t,
+ const std::nothrow_t& = std::nothrow_t()) throw();
+};
+
+class E
+{
+public:
+ void* operator new(std::size_t = 0,
+ const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" }
+ void* operator new[](std::size_t = 0,
+ const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new26.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new26.C
new file mode 100644
index 000000000..541de3058
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new26.C
@@ -0,0 +1,44 @@
+// PR c++/33407
+// { dg-do run }
+// { dg-options "-O2 -fstrict-aliasing" }
+
+extern "C" void * malloc(__SIZE_TYPE__);
+extern "C" void abort(void);
+
+void *p;
+void __attribute__((noinline)) init(void)
+{
+ p = malloc(4);
+}
+
+inline void *operator new(__SIZE_TYPE__)
+{
+ return p;
+}
+
+inline void operator delete (void*) {}
+
+int * __attribute__((noinline)) doit(int n)
+{
+ float *q;
+ int *r;
+
+ for (int i=0; i<n; ++i)
+ {
+ q = new float;
+ *q = 1.0;
+ delete q;
+ r = new int;
+ *r = 1;
+ }
+
+ return r;
+}
+
+int main()
+{
+ init();
+ if (*doit(1) != 1)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new27.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new27.C
new file mode 100644
index 000000000..a6271c930
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new27.C
@@ -0,0 +1,40 @@
+// PR c++/34862
+// { dg-do run }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void abort ();
+
+struct T
+{
+ void *operator new (size_t, char *&);
+ T () { i[0] = 1; i[1] = 2; }
+ int i[2];
+};
+
+void *
+T::operator new (size_t size, char *&p)
+{
+ void *o = (void *) p;
+ p += size;
+ return o;
+}
+
+T *
+f (char *&x)
+{
+ return new (x) T ();
+}
+
+char buf[10 * sizeof (T)] __attribute__((aligned (__alignof (T))));
+
+int
+main ()
+{
+ char *p = buf;
+ T *t = f (p);
+ if (p != buf + sizeof (T))
+ abort ();
+ if (t->i[0] != 1 || t->i[1] != 2)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new28.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new28.C
new file mode 100644
index 000000000..41a78be2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new28.C
@@ -0,0 +1,27 @@
+// PR c++/43951
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+class Foo
+{
+public:
+ Foo () : xxx (1) {};
+ const int xxx;
+};
+Foo *
+bar ()
+{
+ return new Foo;
+}
+
+int
+main ()
+{
+ Foo *p = bar ();
+
+ if (p->xxx != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new29.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new29.C
new file mode 100644
index 000000000..1ca8ca06a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new29.C
@@ -0,0 +1,33 @@
+// PR c++/43951
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+class Foo
+{
+public:
+ Foo () : xxx (1) {};
+ const int xxx;
+};
+
+struct Foo2
+{
+ Foo foo;
+};
+
+Foo2 *
+bar ()
+{
+ return new Foo2;
+}
+
+int
+main ()
+{
+ Foo2 *p = bar ();
+
+ if (p->foo.xxx != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new3.C
new file mode 100644
index 000000000..d0eab73cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new3.C
@@ -0,0 +1,8 @@
+// Test that new-expressions at file scope work properly.
+
+struct A { static char* p; };
+
+int i = 1;
+char* A::p = new char[i];
+
+void foo() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new30.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new30.C
new file mode 100644
index 000000000..24582d8fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new30.C
@@ -0,0 +1,15 @@
+// PR c++/40975
+
+struct data_type
+{
+ // constructor required to reproduce compiler bug
+ data_type() {}
+};
+
+struct ptr_type
+{
+ // array new as default argument required to reproduce compiler bug
+ ptr_type (data_type* ptr = new data_type[1]) { delete[] ptr; }
+};
+
+ptr_type obj;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new31.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new31.C
new file mode 100644
index 000000000..33c94aaab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new31.C
@@ -0,0 +1,18 @@
+// PR c++/48834
+// { dg-options -Wuninitialized }
+// { dg-do run }
+
+struct S
+{
+ S ():i (0)
+ {
+ }
+ int i;
+};
+
+int
+main ()
+{
+ S *s = new S[2];
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new32.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new32.C
new file mode 100644
index 000000000..f82785749
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new32.C
@@ -0,0 +1,16 @@
+// PR c++/48873
+
+#include <new>
+
+struct D {
+private:
+ ~D();
+};
+
+template<class T>
+T& create();
+
+void f()
+{
+ D* dp = new (((void*) 0)) D(create<D>()); // #
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new33.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new33.C
new file mode 100644
index 000000000..18da79e7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new33.C
@@ -0,0 +1,11 @@
+// PR c++/53356
+// { dg-do compile }
+
+struct A {};
+struct B { operator const A & () const; };
+struct C { operator const A & () const; C (); };
+struct D { operator const A & () const; D (); ~D (); };
+
+A *foo () { return new A (B ()); }
+A *bar () { return new A (C ()); }
+A *baz () { return new A (D ()); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new34.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new34.C
new file mode 100644
index 000000000..9e67eb341
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new34.C
@@ -0,0 +1,11 @@
+// PR c++/53356
+
+struct A { A(); ~A(); };
+
+struct B {
+ operator const A () const;
+};
+
+A* cause_ICE() {
+ return new A((A(),A()));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new35.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new35.C
new file mode 100644
index 000000000..7d07cf57f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new35.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "" }
+
+int
+main (int argc, char **argv)
+{
+ typedef char A[argc];
+ new A; // { dg-warning "array" }
+ new A[0]; // { dg-error "must be constant|not a constant" }
+ new A[5]; // { dg-error "must be constant|not a constant" }
+ new (A[0]); // { dg-error "must be constant|not a constant" }
+ new (A[5]); // { dg-error "must be constant|not a constant" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new36.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new36.C
new file mode 100644
index 000000000..c9b7af2d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new36.C
@@ -0,0 +1,153 @@
+// Testcase for invocation of constructors/destructors in operator new[].
+// { dg-do run }
+
+#include <stdlib.h>
+
+struct E {
+ virtual ~E() { }
+};
+
+struct S {
+ S();
+ ~S();
+};
+
+static int count;
+static int max;
+static int throwAfter = -1;
+static S *pS;
+
+S::S()
+{
+ if (throwAfter >= 0 && count >= throwAfter)
+ throw E();
+ if (pS)
+ {
+ ++pS;
+ if (this != pS)
+ abort();
+ }
+ else
+ pS = this;
+ ++count;
+ max = count;
+}
+
+S::~S()
+{
+ if (count > 1)
+ {
+ if (this != pS)
+ abort();
+ --pS;
+ }
+ else
+ pS = 0;
+ --count;
+}
+
+void __attribute__((noinline)) doit(int n)
+{
+ {
+ S *s = new S[n];
+ if (count != n)
+ abort();
+ if (pS != s + n - 1)
+ abort();
+ delete [] s;
+ if (count != 0)
+ abort();
+ }
+ throwAfter = 2;
+ max = 0;
+ try
+ {
+ new S[n];
+ abort();
+ }
+ catch (E)
+ {
+ if (max != 2)
+ abort();
+ }
+ throwAfter = -1;
+}
+
+int main()
+{
+ {
+ S s;
+ if (count != 1)
+ abort();
+ if (pS != &s)
+ abort();
+ }
+ if (count != 0)
+ abort();
+ {
+ S *s = new S;
+ if (count != 1)
+ abort();
+ if (pS != s)
+ abort();
+ delete s;
+ if (count != 0)
+ abort();
+ }
+ {
+ S *s = new S[1];
+ if (count != 1)
+ abort();
+ if (pS != s)
+ abort();
+ delete [] s;
+ if (count != 0)
+ abort();
+ }
+ {
+ S *s = new S[5];
+ if (count != 5)
+ abort();
+ if (pS != s + 4)
+ abort();
+ delete [] s;
+ if (count != 0)
+ abort();
+ }
+ typedef S A[5];
+ {
+ S *s = new A;
+ if (count != 5)
+ abort();
+ if (pS != s + 4)
+ abort();
+ delete [] s;
+ if (count != 0)
+ abort();
+ }
+ throwAfter = 2;
+ max = 0;
+ try
+ {
+ new S[5];
+ abort();
+ }
+ catch (E)
+ {
+ if (max != 2)
+ abort();
+ }
+ max = 0;
+ try
+ {
+ new A;
+ abort();
+ }
+ catch (E)
+ {
+ if (max != 2)
+ abort();
+ }
+ throwAfter = -1;
+ doit(5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new37.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new37.C
new file mode 100644
index 000000000..eab785421
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new37.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+void
+nonconst(int n)
+{
+ new (long[n][n]); // { dg-error "variable length|array size|not a constant|runtime bound" }
+ new long[n][n]; // { dg-error "variable length|array size|not a constant" }
+}
+
+template <typename T>
+void *
+callnew(int n)
+{
+ return new long[n][T::n];
+}
+
+template <typename T>
+void *
+callnew_fail_1(int n)
+{
+ return new long[n][T::n]; // { dg-error "variable length|array size|usable in a constant" }
+}
+
+template <typename T>
+void *
+callnew_fail_2()
+{
+ return new long[T::n]; // { dg-error "size in array new" }
+}
+
+template <typename T>
+void *
+callnew_fail_3()
+{
+ return new T[2][T::n]; // { dg-error "size of array has non-integral type" }
+}
+
+struct T1 {
+ static int n;
+};
+
+struct T2 {
+ static const double n = 2; // { dg-error "non-integral type" }
+};
+
+struct T3 {
+ static const int n = 2;
+};
+
+struct T4 {
+ enum { n = 3 };
+};
+
+void
+test_callnew(int n)
+{
+ new long[0.2]; // { dg-error "integral or enumeration type" }
+ callnew_fail_1<T1>(n);
+ callnew_fail_2<T2>();
+ callnew_fail_3<T2>();
+ callnew<T3>(n);
+ callnew<T4>(n);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new38.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new38.C
new file mode 100644
index 000000000..1672f229d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new38.C
@@ -0,0 +1,54 @@
+// { dg-do compile }
+
+void
+large_array_char(int n)
+{
+ new char[n]
+ [1ULL << (sizeof(void *) * 4)]
+ [1ULL << (sizeof(void *) * 4)]; // { dg-error "size of array" }
+}
+
+template <typename T>
+void
+large_array_char_template(int n)
+{
+ new char[n]
+ [1ULL << (sizeof(void *) * 4)]
+ [1ULL << (sizeof(void *) * 4)]; // { dg-error "size of array" }
+}
+
+
+template <typename T>
+void
+large_array_template1(int n)
+{
+ new T[n] // { dg-error "size of array is too large" }
+ [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
+ [1ULL << (sizeof(void *) * 4)];
+}
+
+template <typename T>
+void
+large_array_template2(int n)
+{
+ new T[n] // { dg-error "size of array is too large" }
+ [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
+ [1ULL << (sizeof(void *) * 4)];
+}
+
+template <typename T>
+void
+large_array_template3(int n)
+{
+ new T[n] // { dg-error "size of array is too large" }
+ [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
+ [1ULL << (sizeof(void *) * 4)];
+}
+
+void
+call_large_array_template(int n)
+{
+ large_array_template1<char>(n);
+ large_array_template2<int>(n);
+ large_array_template3<double>(n);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new39.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new39.C
new file mode 100644
index 000000000..f274ebb7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new39.C
@@ -0,0 +1,68 @@
+// Testcase for overflow handling in operator new[].
+// { dg-do run }
+
+#include <stdlib.h>
+#include <stdexcept>
+
+struct without_new {
+ char bar[256];
+};
+
+struct with_new {
+ char bar[256];
+ void *operator new[] (size_t sz)
+ {
+ if (sz != -1)
+ abort ();
+ throw std::bad_alloc();
+ }
+};
+
+template <typename T>
+inline void
+test (size_t s)
+{
+ try {
+ new T[s];
+ abort ();
+ } catch (std::bad_alloc &) {
+ }
+}
+
+template <typename T>
+void
+test_noopt (size_t s) __attribute__((noinline));
+
+template <typename T>
+void
+test_noopt (size_t s)
+{
+ __asm__ ("");
+ test<T> (s);
+}
+
+template <typename T>
+void
+all_tests ()
+{
+ test<T>(-1);
+ test<T>(size_t(-1) / sizeof (T) + 1);
+ test<T>(size_t(-1) / sizeof (T) + 2);
+ test_noopt<T>(-1);
+ test_noopt<T>(size_t(-1) / sizeof (T) + 1);
+ test_noopt<T>(size_t(-1) / sizeof (T) + 2);
+}
+
+int
+main ()
+{
+ try {
+ ::operator new(size_t(-1));
+ abort ();
+ } catch (std::bad_alloc &) {
+ }
+ all_tests<without_new> ();
+ all_tests<with_new> ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new4.C
new file mode 100644
index 000000000..ab2fe3131
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new4.C
@@ -0,0 +1 @@
+int *x = new int [2] ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new40.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new40.C
new file mode 100644
index 000000000..026712dc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new40.C
@@ -0,0 +1,114 @@
+// Testcase for overflow handling in operator new[].
+// Optimization of unnecessary overflow checks.
+// In C++11 we throw bad_array_new_length instead.
+// { dg-options -std=c++03 }
+// { dg-do run }
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdexcept>
+
+static size_t magic_allocation_size
+ = 1 + (size_t (1) << (sizeof (size_t) * 8 - 1));
+
+struct exc : std::bad_alloc {
+};
+
+static size_t expected_size;
+
+struct pod_with_new {
+ char ch;
+ void *operator new[] (size_t sz)
+ {
+ if (sz != expected_size)
+ abort ();
+ throw exc ();
+ }
+};
+
+struct with_new {
+ char ch;
+ with_new () { }
+ ~with_new () { }
+ void *operator new[] (size_t sz)
+ {
+ if (sz != size_t (-1))
+ abort ();
+ throw exc ();
+ }
+};
+
+struct non_pod {
+ char ch;
+ non_pod () { }
+ ~non_pod () { }
+};
+
+void *
+operator new (size_t sz) _GLIBCXX_THROW (std::bad_alloc)
+{
+ if (sz != expected_size)
+ abort ();
+ throw exc ();
+}
+
+int
+main ()
+{
+ if (sizeof (pod_with_new) == 1)
+ expected_size = magic_allocation_size;
+ else
+ expected_size = -1;
+
+ try {
+ new pod_with_new[magic_allocation_size];
+ abort ();
+ } catch (exc &) {
+ }
+
+ if (sizeof (with_new) == 1)
+ expected_size = magic_allocation_size;
+ else
+ expected_size = -1;
+
+ try {
+ new with_new[magic_allocation_size];
+ abort ();
+ } catch (exc &) {
+ }
+
+ expected_size = magic_allocation_size;
+ try {
+ new char[magic_allocation_size];
+ abort ();
+ } catch (exc &) {
+ }
+
+ expected_size = -1;
+
+ try {
+ new pod_with_new[magic_allocation_size][2];
+ abort ();
+ } catch (exc &) {
+ }
+
+ try {
+ new with_new[magic_allocation_size][2];
+ abort ();
+ } catch (exc &) {
+ }
+
+ try {
+ new char[magic_allocation_size][2];
+ abort ();
+ } catch (exc &) {
+ }
+
+ try {
+ new non_pod[magic_allocation_size];
+ abort ();
+ } catch (exc &) {
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new41.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new41.C
new file mode 100644
index 000000000..0559b1dac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new41.C
@@ -0,0 +1,22 @@
+// PR c++/55446
+// { dg-do run }
+
+struct S
+{
+ S() { }
+};
+
+int n = 1;
+
+void* operator new[](__SIZE_TYPE__)
+{
+ n = -1;
+ return &n;
+}
+
+int main()
+{
+ new S[0];
+ if (n != -1)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new5.C
new file mode 100644
index 000000000..0d99f93c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new5.C
@@ -0,0 +1,18 @@
+// { dg-do run }
+
+#include <new>
+
+void * operator new[](std::size_t, std::nothrow_t const &) throw()
+{ return 0; }
+
+struct X {
+ struct Inner { ~Inner() {} };
+
+ X() {
+ Inner * ic = new (std::nothrow) Inner[1]; // SegFault here
+ }
+};
+
+int main() {
+ X table;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new6.C
new file mode 100644
index 000000000..ecbafd13e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new6.C
@@ -0,0 +1,8 @@
+// { dg-options "-fkeep-inline-functions" }
+
+struct B1 { virtual ~B1(); };
+struct B2 { virtual ~B2(); };
+struct D : B1, B2 {};
+struct X : D { X (); };
+
+X::X () { new int; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new7.C
new file mode 100644
index 000000000..e07d22617
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new7.C
@@ -0,0 +1,7 @@
+template <class T>
+ struct Foo
+ {};
+
+ template <class T>
+ void Foo<T>::NON_EXISTENT(int* val = new int()) {} // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new8.C
new file mode 100644
index 000000000..1fefc366b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new8.C
@@ -0,0 +1,17 @@
+typedef __SIZE_TYPE__ size_t;
+
+enum Refcount_Type {
+ NO_REFCOUNT
+};
+
+struct d0_Unknown_Object
+{
+ void* operator new (size_t, size_t, Refcount_Type type);
+ void operator delete (void*, size_t, Refcount_Type);
+ d0_Unknown_Object ();
+};
+
+void make ()
+{
+ new (10, NO_REFCOUNT) d0_Unknown_Object;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/new9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/new9.C
new file mode 100644
index 000000000..6729d76fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/new9.C
@@ -0,0 +1,22 @@
+// PR 12337
+
+class A {};
+
+template <typename T>
+class X : public A {
+public:
+ X(T&);
+};
+
+class B {
+public:
+ bool foo(A*);
+ template <typename T>
+ bool foo(T& t) { return foo(new X<T>(t)); }
+};
+
+int main()
+{
+ B x, y;
+ x.foo(y);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/no-elide1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/no-elide1.C
new file mode 100644
index 000000000..75b648ed1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/no-elide1.C
@@ -0,0 +1,14 @@
+// PR c++/47503
+// { dg-options "-fno-elide-constructors" }
+
+struct A
+{
+ int i;
+ A ();
+};
+
+struct B
+{
+ A a;
+ B (A &aa) : a (aa) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/null1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/null1.C
new file mode 100644
index 000000000..2c05dc3dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/null1.C
@@ -0,0 +1,7 @@
+// PR c++/16489
+// { dg-do compile { target { ! c++11 } } }
+
+const int NULL = 0;
+int main() {
+ double* p = NULL;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/placement1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/placement1.C
new file mode 100644
index 000000000..382fae8ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/placement1.C
@@ -0,0 +1,10 @@
+// PR c++/11266
+// We were expanding the same TARGET_EXPR twice, for placement new and
+// delete.
+
+void* operator new (__SIZE_TYPE__, void*) throw();
+void operator delete (void*, void*) throw();
+
+struct A { A(); };
+
+void foo() { new(new A)A; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/placement2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/placement2.C
new file mode 100644
index 000000000..7a9d6d082
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/placement2.C
@@ -0,0 +1,22 @@
+// Bug: We were calling f() twice, for both the placement new and placement
+// delete calls.
+
+// { dg-do run }
+
+void* operator new (__SIZE_TYPE__ sz, void*) { return operator new (sz); }
+void operator delete (void* p, void*) { operator delete (p); }
+
+struct A { A() { throw 1; } };
+
+int c;
+void *f() { ++c; return 0; }
+
+int main()
+{
+ try
+ {
+ new (f()) A;
+ }
+ catch (...) {}
+ return c != 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/placement3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/placement3.C
new file mode 100644
index 000000000..919e2a816
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/placement3.C
@@ -0,0 +1,30 @@
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *malloc (size_t);
+
+int i;
+
+struct S {
+ S(int) {
+ throw 3;
+ }
+
+ void *operator new(size_t s, int) {
+ ++i;
+ return malloc (s);
+ }
+
+ void operator delete(void *, int) {
+ --i;
+ }
+
+ void operator delete(void *, int, int) ;
+};
+
+int main () {
+ try {
+ new (7) S (12);
+ } catch (int) {
+ if (i)
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/placement4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/placement4.C
new file mode 100644
index 000000000..3cfe27d63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/placement4.C
@@ -0,0 +1,32 @@
+// PR c++/34158
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void* malloc (size_t);
+extern "C" void free (void *);
+
+template <class T> class undef;
+
+struct A {
+ A() { throw 1; }
+};
+
+template<typename T> class Pool { };
+
+void *operator new(size_t size,Pool<int>& pool)
+{
+ return malloc(size);
+}
+
+template<typename T>
+void operator delete(void *p,Pool<T>& pool)
+{
+ undef<T> t; // { dg-error "incomplete" }
+ free(p);
+}
+
+int main ()
+{
+ Pool<int> pool;
+ new (pool) A(); // { dg-message "required" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/placement5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/placement5.C
new file mode 100644
index 000000000..1d540daca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/placement5.C
@@ -0,0 +1,32 @@
+// 5.3.4/19: If the lookup finds the two-parameter form of a usual
+// deallocation function (3.7.4.2) and that function, considered as a
+// placement deallocation function, would have been selected as a match for
+// the allocation function, the program is ill-formed.
+
+// But we should only complain about using op delete (void *, size_t) for
+// placement delete if it would also be selected for normal delete, not if
+// there's also an op delete (void *).
+
+typedef __SIZE_TYPE__ size_t;
+
+struct A
+{
+ A();
+ void* operator new (size_t, size_t);
+ void operator delete (void *, size_t); // { dg-error "non-placement" }
+};
+
+struct B
+{
+ B();
+ void * operator new (size_t);
+ void * operator new (size_t, size_t);
+ void operator delete (void *);
+ void operator delete (void *, size_t);
+};
+
+int main()
+{
+ A* ap = new (24) A; // { dg-error "placement delete" }
+ B* bp = new (24) B;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pm1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pm1.C
new file mode 100644
index 000000000..c0aed2410
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pm1.C
@@ -0,0 +1,88 @@
+// { dg-do run }
+
+// Copyright 2002 Free Software Foundation
+// Contributed by Jason Merrill and Alexandre Oliva
+
+// Test zero-initialization of pointers to data members. Their NULL
+// value is represented with -1, not 0.
+
+#include <stdlib.h>
+
+struct A
+{
+ int i;
+};
+
+int A::* gp;
+
+typedef int A::* iApm;
+
+iApm gp_zero = 0;
+iApm gp_dflt = iApm();
+iApm gp_cast = (iApm)0;
+iApm gp_func = iApm(0);
+iApm gp_stat = static_cast<iApm>(0);
+
+struct AD : A {};
+
+int AD::* gp_impl = gp_dflt;
+int AD::* gp_down = static_cast<int AD::*>(gp_stat);
+
+int A::* ga[2];
+
+// Test use in a simple struct.
+struct B
+{
+ int A::* mp;
+};
+
+B gb;
+
+struct D;
+struct C;
+extern D gd;
+extern C gc;
+
+// Test that in a class with a constructor, the pointer to member is
+// zero-initialized until the constructor is run.
+struct C
+{
+ int A::* mp;
+ inline C ();
+};
+
+int fail;
+struct D
+{
+ int count;
+ inline D ();
+};
+
+C::C() : mp (&A::i) { gd.count++; }
+
+D::D() : count (0)
+{
+ if (gc.mp != 0)
+ abort ();
+}
+
+// The D must come first for this to work.
+D gd;
+C gc;
+
+int main()
+{
+ static int A::* slp;
+ static int A::* sla[2];
+ static B slb;
+
+ if (gp != 0 || slp != 0
+ || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0
+ || gp_func != 0 || gp_stat != 0
+ || gp_impl != 0 || gp_down != 0)
+ abort ();
+ if (ga[1] != 0 || sla[1] != 0)
+ abort ();
+ if (gb.mp != 0 || slb.mp != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pm2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pm2.C
new file mode 100644
index 000000000..35b9b32fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pm2.C
@@ -0,0 +1,7 @@
+struct S {
+ S ();
+ int S::* sp;
+ int i;
+};
+
+S s[2] = {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pm3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pm3.C
new file mode 100644
index 000000000..980790db3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pm3.C
@@ -0,0 +1,10 @@
+// PR c++/12218
+// { dg-do run }
+
+struct C { int i, j; };
+typedef int C::*mPtr;
+extern const mPtr should_be_0 = &C::i;
+extern const mPtr should_be_4 = &C::j;
+
+int main () {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pmf1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pmf1.C
new file mode 100644
index 000000000..93c67bdd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pmf1.C
@@ -0,0 +1,17 @@
+// PR c++/14089
+// { dg-do compile }
+//
+// C++ front end generated assignment between types that were not
+// compatible in any sense visible to the optimizers.
+
+struct pair {
+ typedef void (pair::*fp)();
+ int first;
+ pair::fp second;
+ pair(const int& a, const pair::fp& b) : first(a), second(b) {}
+ void f(const int& a, const pair::fp& b) { first = a; second = b; }
+};
+
+void op() {
+ pair(5, pair::fp());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr20039.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr20039.C
new file mode 100644
index 000000000..aaac8bd4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr20039.C
@@ -0,0 +1,20 @@
+// PR c++/20039
+// { dg-do compile }
+
+struct M
+{
+ M() : m(0) { }
+ int m;
+};
+
+struct X
+{
+ M m;
+ int i;
+};
+
+int mymain()
+{
+ const X *p = new const X[2]; // { dg-error "uninitialized const" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-3.C
new file mode 100644
index 000000000..631da5b4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-3.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+struct A { int const i; };
+struct B { int& i; };
+struct C { int i; };
+
+template< class T >
+class is_constructible_via_new_without_initializer
+{
+ template<int> class size {};
+
+ typedef char yes_type;
+ struct no_type { char data[2]; };
+
+ template <class U>
+ static yes_type sfinae (size< sizeof (new U) >*);
+
+ template <class U>
+ static no_type sfinae (...);
+
+public:
+ static const bool value = sizeof (sfinae<T>(0)) == sizeof (yes_type);
+};
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+STATIC_ASSERT (!is_constructible_via_new_without_initializer<A>::value);
+STATIC_ASSERT (!is_constructible_via_new_without_initializer<B>::value);
+STATIC_ASSERT (is_constructible_via_new_without_initializer<C>::value);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-4.C
new file mode 100644
index 000000000..abfb3d9f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811-4.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-fpermissive" }
+
+struct A { int const i; };
+struct B { int& i; };
+struct C { int i; };
+
+template< class T >
+class is_constructible_via_new_without_initializer
+{
+ template<int> class size {};
+
+ typedef char yes_type;
+ struct no_type { char data[2]; };
+
+ template <class U>
+ static yes_type sfinae (size< sizeof (new U) >*);
+
+ template <class U>
+ static no_type sfinae (...);
+
+public:
+ static const bool value = sizeof (sfinae<T>(0)) == sizeof (yes_type);
+};
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+STATIC_ASSERT (!is_constructible_via_new_without_initializer<A>::value);
+STATIC_ASSERT (!is_constructible_via_new_without_initializer<B>::value);
+STATIC_ASSERT (is_constructible_via_new_without_initializer<C>::value);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C
new file mode 100644
index 000000000..0a462be54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C
@@ -0,0 +1,195 @@
+// PR c++/25811
+// { dg-do compile }
+
+struct A1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A5 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+ T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct X
+{
+ X () : c (0), r (c) {}
+ int const c;
+ int const& r;
+};
+
+struct Y11 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Y1 // { dg-error "deleted" "" { target c++11 } }
+{
+ Y11 a[1];
+};
+
+struct Y22 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Y2 // { dg-error "deleted" "" { target c++11 } }
+{
+ Y22 a[1];
+};
+
+struct Z1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z5
+{
+ int i;
+};
+
+struct Z // { dg-error "deleted" "" { target c++11 } }
+{
+ Z1 z1;
+ Z2 z2;
+ Z3 z3;
+ Z4 z4;
+ Z5 z5;
+};
+
+union U // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+void f1 ()
+{
+ new A1; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f2 ()
+{
+ new A2; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f3 ()
+{
+ new A3; // { dg-error "deleted|uninitialized reference member" }
+}
+
+void f4 ()
+{
+ new A4; // { dg-error "deleted|uninitialized reference member" }
+}
+
+void f5 ()
+{
+ new A5; // { dg-error "deleted|uninitialized reference member|uninitialized const member" }
+}
+
+void f6 ()
+{
+ new S1<int>; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f7 ()
+{
+ new S2<int>; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f8 ()
+{
+ new S3<int>; // { dg-error "deleted|uninitialized reference member" }
+}
+
+void f9 ()
+{
+ new S4<int>; // { dg-error "deleted|uninitialized reference member|uninitialized const member" }
+}
+
+void f10 ()
+{
+ new X;
+}
+
+void f11 ()
+{
+ new A1[1]; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f12 ()
+{
+ new A3[1]; // { dg-error "deleted|uninitialized reference member" }
+}
+
+void f13 ()
+{
+ new Y1; // { dg-error "deleted|uninitialized const member" }
+}
+
+void f14 ()
+{
+ new Y2; // { dg-error "deleted|uninitialized reference member" }
+}
+
+void f15 ()
+{
+ new Z; // { dg-error "deleted|uninitialized reference member|uninitialized const member" }
+}
+
+void f16 ()
+{
+ new U; // { dg-error "deleted|uninitialized const member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C
new file mode 100644
index 000000000..f341f8c8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C
@@ -0,0 +1,52 @@
+// PR c++/29043
+// { dg-do compile }
+
+struct S // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+class C
+{
+public:
+ C() {} // { dg-error "uninitialized const member|deleted" }
+ S s;
+};
+
+struct S2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+class C2
+{
+public:
+ C2() {} // { dg-error "uninitialized reference member|deleted" }
+ S2 s;
+};
+
+class C3
+{
+ C3() { }
+ struct s {
+ const int i;
+ };
+};
+
+struct S4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct C4
+{
+ C4() {} // { dg-error "uninitialized const member|deleted" }
+ S4 s4[ 1 ];
+};
+
+struct C5
+{
+ C5() {} // { dg-message "uninitialized" }
+ int const iit[ 1 ];
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr29571.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29571.C
new file mode 100644
index 000000000..d0dc678cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29571.C
@@ -0,0 +1,13 @@
+// PR c++/29571
+
+struct A
+{
+ static const int i = 0/0 + ""; // { dg-warning "division by zero" }
+ // { dg-error "constant|conversion|initializ" "" { target *-*-* } 5 }
+ static const int j = int(i);
+};
+
+// Currently G++ complains about a non-constant initializer for 'j' in
+// C++11 mode, but not C++98. Either way is correct because it depends on
+// the erroneous initializer for i, so don't require the error.
+// { dg-prune-output ":7:" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr42556.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr42556.C
new file mode 100644
index 000000000..27370af79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr42556.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-fdump-tree-gimple" }
+
+void foo (int a, int b, int c, int d)
+{
+ int v[4] = {a, b, c, d};
+}
+
+// { dg-final { scan-tree-dump-not "v = {}" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr42844.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr42844.C
new file mode 100644
index 000000000..299a30a91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr42844.C
@@ -0,0 +1,56 @@
+// PR c++/42844
+// { dg-do compile }
+
+struct A
+{
+ A(){}
+};
+
+struct B : A { int i; }; // { dg-message "user-provided default constructor" }
+
+struct C : A { int i; }; // { dg-message "user-provided default constructor" }
+
+struct D : B { D() {} };
+
+struct E { int i; }; // { dg-message "user-provided default constructor" }
+
+template <class T>
+struct F : A { T t; }; // { dg-message "user-provided default constructor" }
+
+template <class T>
+struct G { T t; }; // { dg-message "user-provided default constructor" }
+
+void f ()
+{
+ B const b; // { dg-error "uninitialized const" }
+ extern B const bext;
+
+ C const c[ 1 ]; // { dg-error "uninitialized const" }
+ extern C const cext[ 1 ];
+
+ D const d;
+ extern D const dext;
+
+ E const e; // { dg-error "uninitialized const" }
+ extern E const eext;
+
+ F<int> const f; // { dg-error "uninitialized const" }
+ extern F<int> const fext;
+
+ G<int> const g; // { dg-error "uninitialized const" }
+ extern G<int> const gext;
+}
+
+struct H { int i; }; // { dg-message "user-provided default constructor" }
+
+struct I : A { int i; }; // { dg-message "user-provided default constructor" }
+
+template <class T>
+void g ()
+{
+ T const t; // { dg-error "uninitialized const" }
+ extern T const text;
+}
+
+template void g<H> ();
+template void g<I> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C
new file mode 100644
index 000000000..81930d07d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C
@@ -0,0 +1,197 @@
+// PR c++/43719
+// { dg-do compile }
+
+struct A1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct A5 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+ T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct X
+{
+ X () : c (0), r (c) {}
+ int const c;
+ int const& r;
+};
+
+struct Y11 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Y1 // { dg-error "deleted" "" { target c++11 } }
+{
+ Y11 a[1];
+};
+
+struct Y22 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Y2 // { dg-error "deleted" "" { target c++11 } }
+{
+ Y22 a[1];
+};
+
+struct Z1 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z2 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z3 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z4 // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+struct Z5
+{
+ int i;
+};
+
+struct Z // { dg-error "deleted" "" { target c++11 } }
+{
+ Z1 z1;
+ Z2 z2;
+ Z3 z3;
+ Z4 z4;
+ Z5 z5;
+};
+
+union U // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+
+void f1 ()
+{
+ A1 a1; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f2 ()
+{
+ A2 a2; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f3 ()
+{
+ A3 a3; // { dg-error "uninitialized reference member|deleted" }
+}
+
+void f4 ()
+{
+ A4 a4; // { dg-error "uninitialized reference member|deleted" }
+}
+
+void f5 ()
+{
+ A5 a5; // { dg-error "uninitialized reference member|uninitialized const member|deleted" }
+}
+
+void f6 ()
+{
+ S1<int> s; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f7 ()
+{
+ S2<int> s; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f8 ()
+{
+ S3<int> s; // { dg-error "uninitialized reference member|deleted" }
+}
+
+void f9 ()
+{
+ S4<int> s; // { dg-error "uninitialized reference member|uninitialized const member|deleted" }
+}
+
+void f10 ()
+{
+ X x;
+}
+
+void f11 ()
+{
+ A1 a[ 1 ]; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f12 ()
+{
+ A3 a[ 1 ]; // { dg-error "uninitialized reference member|deleted" }
+}
+
+void f13 ()
+{
+ Y1 y1; // { dg-error "uninitialized const member|deleted" }
+}
+
+void f14 ()
+{
+ Y2 y2; // { dg-error "uninitialized reference member|deleted" }
+}
+
+void f15 ()
+{
+ Z z; // { dg-error "uninitialized reference member|uninitialized const member|deleted" }
+}
+
+void f16 ()
+{
+ U u; // { dg-error "uninitialized const member|deleted" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr43890.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43890.C
new file mode 100644
index 000000000..1b2807d0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43890.C
@@ -0,0 +1,39 @@
+// PR c++/43890
+// { dg-do compile }
+
+class Outer
+{
+ public:
+ Outer()
+ : i(*this)
+ {
+ }
+
+ class Inner
+ {
+ public:
+ Inner(Outer& o)
+ : o(o)
+ , i(0)
+ {
+ }
+
+ private:
+ Outer& o;
+ int const i;
+ };
+
+ private:
+ Inner i;
+};
+
+class A {
+ Outer o;
+};
+
+int main()
+{
+ A *a = new A;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C
new file mode 100644
index 000000000..96b5bef1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C
@@ -0,0 +1,15 @@
+// PR c++/44086
+// { dg-do compile }
+
+struct A // { dg-error "uninitialized" "" { target c++11 } }
+{
+ int const i : 2; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+};
+
+void f()
+{
+ A a; // { dg-error "deleted|uninitialized const" }
+ new A; // { dg-error "deleted|uninitialized const" }
+ A(); // { dg-error "deleted" "" { target c++11 } }
+ new A(); // { dg-error "deleted" "" { target c++11 } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr48859.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr48859.C
new file mode 100644
index 000000000..8ef5c2ee4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr48859.C
@@ -0,0 +1,14 @@
+// PR c++/48859
+// { dg-do compile }
+
+struct HasConstructor {
+ HasConstructor() {}
+};
+
+class ConstMember {
+ const HasConstructor empty_;
+};
+
+void foo() {
+ new ConstMember;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr55497.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr55497.C
new file mode 100644
index 000000000..b50f3fbdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr55497.C
@@ -0,0 +1,15 @@
+// PR c++/55497
+// { dg-options "-g" }
+
+int get();
+
+struct B
+{
+ B()
+ {
+ static const int v = get();
+ char BUFFER[v];
+ }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr58811.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr58811.C
new file mode 100644
index 000000000..42e7fac42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr58811.C
@@ -0,0 +1,11 @@
+// PR c++/58811
+
+struct B
+{
+ struct A a; // { dg-error "incomplete type" }
+};
+
+void foo()
+{
+ B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr60572.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr60572.C
new file mode 100644
index 000000000..a39dfa09a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr60572.C
@@ -0,0 +1,13 @@
+// PR c++/60572
+// { dg-do compile }
+
+struct A
+{
+ A x; // { dg-error "incomplete type" }
+ virtual ~A () {}
+};
+
+struct B : A
+{
+ B () : A () {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn1.C
new file mode 100644
index 000000000..0cbabbf80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn1.C
@@ -0,0 +1,12 @@
+// PR c++/29016
+// { dg-options "-O2" }
+
+class A;
+class B
+{
+ typedef void (*C[5]) (A *);
+ static C D;
+ static void E (A*) {}
+};
+B::C B::D={E};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn2.C
new file mode 100644
index 000000000..0ca922b9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn2.C
@@ -0,0 +1,14 @@
+// { dg-options "" }
+// { dg-do compile }
+// C++/30221
+// We would ICE while trying to reshape the pointer to
+// member function element which is not needed.
+
+
+class abstract {};
+typedef void (abstract::*fptr1) (short & s ) const;
+struct s {};
+s array[] =
+{
+ (fptr1)0
+};// { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn3.C
new file mode 100644
index 000000000..960085063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrfn3.C
@@ -0,0 +1,14 @@
+// { dg-options "" }
+// { dg-do compile }
+// C++/30221
+// We would ICE while trying to reshape the pointer to
+// member function element which is not needed.
+
+
+class abstract {};
+typedef void (abstract::*fptr1) (short & s ) const;
+struct s {fptr1 f;};
+s array[] =
+{
+ (fptr1)0
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem1.C
new file mode 100644
index 000000000..6f1604faf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem1.C
@@ -0,0 +1,7 @@
+// PR c++/16853
+
+struct A {};
+struct B {};
+
+int B::* b;
+int A::* a = b; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem2.C
new file mode 100644
index 000000000..54b69215b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem2.C
@@ -0,0 +1,12 @@
+// PR c++/19916
+// { dg-do run }
+
+struct S {
+ char k;
+};
+
+char const volatile S::* const p01 = &S::k;
+int main(void)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem3.C
new file mode 100644
index 000000000..95b60379b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem3.C
@@ -0,0 +1,8 @@
+// PR c++/28148
+
+struct foo {
+public:
+ virtual int bar(int);
+};
+
+void (foo::*__Virtual__foo__Var1)() = (void (foo::*)())(&foo::bar);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem4.C
new file mode 100644
index 000000000..44ab8cf65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ptrmem4.C
@@ -0,0 +1,13 @@
+// PR c++/32245
+// { dg-do run }
+
+struct foo {
+ int mem1;
+ int foo::* mem2;
+};
+
+int main () {
+ foo x = { 0 } ;
+ if (x.mem2 != foo().mem2)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref1.C
new file mode 100644
index 000000000..12caff2d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref1.C
@@ -0,0 +1,5 @@
+void f(void)
+{
+ short x = 0;
+ const int &y = x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref10.C
new file mode 100644
index 000000000..7a280dd41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref10.C
@@ -0,0 +1,14 @@
+// PR c++/13478
+
+struct A {};
+struct B : protected A {
+ B() {}
+ B(const A& ) {}
+private:
+ B(const B& ) {}
+};
+
+void foo(const A* ap)
+{
+ const B& br = *ap;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref11.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref11.C
new file mode 100644
index 000000000..b283e3a69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref11.C
@@ -0,0 +1,13 @@
+// PR c++/14230
+
+struct A {
+ A ();
+ A (const A&);
+ A& operator= (const A&);
+};
+
+struct D {
+ A a;
+};
+
+const A& z = D().a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref12.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref12.C
new file mode 100644
index 000000000..4430e174b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref12.C
@@ -0,0 +1,30 @@
+// PR c++/17435
+// { dg-do run }
+
+extern "C" void abort ();
+
+bool ok;
+
+struct A
+{
+ void func() const
+ {
+ ok = 1;
+ }
+
+ ~A()
+ {
+ if (!ok)
+ abort ();
+ }
+};
+
+struct B : public A
+{
+};
+
+int main()
+{
+ A const& r1 = B();
+ r1.func();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref13.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref13.C
new file mode 100644
index 000000000..6be57aa2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref13.C
@@ -0,0 +1,7 @@
+// PR c++/28338
+
+void foo()
+{
+ { static const int& i = 0; }
+ { static const int& i = 0; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref14.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref14.C
new file mode 100644
index 000000000..6ac42415b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref14.C
@@ -0,0 +1,13 @@
+// PR c++/33459
+// { dg-prune-output "uninitialized" }
+// { dg-prune-output "deleted" }
+
+union A
+{
+ int &i; // { dg-error "may not have reference type" }
+};
+
+void foo()
+{
+ A();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref15.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref15.C
new file mode 100644
index 000000000..bc9c01dc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref15.C
@@ -0,0 +1,34 @@
+// PR c++/20416. We correctly constructed the temporary S in foo(),
+// but incorrectly destroyed it every time foo() was called.
+// When using a wrapped target, there is no way to override the exit
+// code after returning from main.
+// { dg-do run { target unwrapped } }
+extern "C" void abort (void);
+extern "C" void _exit (int);
+
+int c, exiting;
+struct S {
+ S() { ++c; }
+ S(const S &) { ++c; }
+ ~S()
+ {
+ if (!exiting) abort ();
+ _exit (0);
+ }
+};
+void
+foo (void)
+{
+ static const S &s = S();
+}
+int main ()
+{
+ if (c != 0)
+ abort ();
+ foo ();
+ foo ();
+ if (c != 1)
+ abort ();
+ exiting = 1;
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref16.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref16.C
new file mode 100644
index 000000000..2d56395cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref16.C
@@ -0,0 +1,23 @@
+// PR c++/35548
+// { dg-do run }
+
+int c;
+struct A
+{
+ A() { ++c; }
+ A(const A&) { ++c; }
+ ~A() { --c; }
+};
+
+A f()
+{
+ return A();
+}
+
+int i;
+const A* ap;
+int main()
+{
+ const A& ar = i ? *ap : f();
+ return (c == 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref17.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref17.C
new file mode 100644
index 000000000..2c8c22b8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref17.C
@@ -0,0 +1,23 @@
+// PR c++/35650
+// { dg-do compile }
+
+void f1 ();
+
+namespace N
+{
+ using::f1;
+ void f2 ();
+ void f3 ();
+}
+
+using N::f3;
+
+void
+test ()
+{
+ void (&a) () = f1;
+ void (&b) () = N::f1;
+ void (&c) () = N::f2;
+ void (&d) () = f3;
+ void (&e) () = ::f3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref18.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref18.C
new file mode 100644
index 000000000..e704077c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref18.C
@@ -0,0 +1,12 @@
+// PR c++/49395
+
+volatile int foo();
+struct A { volatile int i; };
+typedef volatile int vi;
+
+volatile int i;
+
+const int& ir1 = foo();
+//const int& ir2 = A().i; // line 8
+const int& ir3 = static_cast<volatile int>(i);
+const int& ir4 = vi(); // line 10
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref19.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref19.C
new file mode 100644
index 000000000..ed78c939b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref19.C
@@ -0,0 +1,17 @@
+// PR c++/49528
+// { dg-do run }
+
+int d;
+
+struct A
+{
+ int i;
+ ~A() { ++d; };
+};
+
+int main()
+{
+ const int &r = A().i;
+ if (d != 1)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref2.C
new file mode 100644
index 000000000..231ea047f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref2.C
@@ -0,0 +1,10 @@
+struct Base {
+ Base();
+ Base(const Base &);
+ Base & operator = (const Base &);
+};
+
+struct Derived : public Base {};
+
+Derived derived();
+const Base &b = derived();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref20.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref20.C
new file mode 100644
index 000000000..b64cb57e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref20.C
@@ -0,0 +1,8 @@
+// PR c++/50787
+// { dg-do run }
+
+int main() {
+ const int Ci = 0;
+ const int &rCi = Ci;
+ if (!(&Ci == &rCi)) __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref21.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref21.C
new file mode 100644
index 000000000..db4ac4a30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref21.C
@@ -0,0 +1,7 @@
+struct A
+{
+ const int &i1;
+ const int &i2;
+};
+
+A a = { 1, 2 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref3.C
new file mode 100644
index 000000000..776f2d0c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref3.C
@@ -0,0 +1,12 @@
+struct Base { };
+struct Derived : public Base { };
+struct Choose {
+ operator Base&();
+ operator Derived&();
+};
+
+void f()
+{
+ Choose c;
+ Base& ref = c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref4.C
new file mode 100644
index 000000000..6b65d9925
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref4.C
@@ -0,0 +1,18 @@
+// { dg-do run }
+
+int c;
+
+struct Base {
+ Base() {}
+ Base(const Base &) { ++c; }
+ Base & operator = (const Base &);
+};
+
+struct Derived : public Base {};
+
+const Base &b = Derived();
+
+int main()
+{
+ return c; // No copies should be required.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref5.C
new file mode 100644
index 000000000..ad1c30c36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref5.C
@@ -0,0 +1,12 @@
+struct A { };
+struct B : public A { };
+struct X {
+ operator B();
+};
+X x;
+
+int main()
+{
+ const A& r = x;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref6.C
new file mode 100644
index 000000000..50a963603
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref6.C
@@ -0,0 +1,12 @@
+struct B {
+ void g() { }
+};
+
+struct A {
+ void f() {
+ B &b = b;
+ b.g();
+ }
+};
+
+int main(void) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref7.C
new file mode 100644
index 000000000..0832069e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref7.C
@@ -0,0 +1,9 @@
+class hop
+{
+public:
+ hop operator* () const;
+};
+int main(void)
+{
+ const hop &x = *x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref8.C
new file mode 100644
index 000000000..406cc1040
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref8.C
@@ -0,0 +1,10 @@
+struct A {
+ A operator=(const A&);
+};
+
+A operator*(A, A);
+
+A& operator+=(A& a, const A& b)
+{
+ return a = a * b; // { dg-error "non-const reference" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ref9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ref9.C
new file mode 100644
index 000000000..127b7d8e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ref9.C
@@ -0,0 +1,36 @@
+// { dg-do run }
+
+struct ex;
+struct basic {
+ int refcount;
+ ex eval() const;
+ basic() : refcount(0) {}
+};
+
+struct ex {
+ basic *bp;
+ ex() : bp(0) { }
+ ex(const basic &);
+ virtual ~ex();
+ void construct_from_basic(const basic &);
+};
+
+ex basic::eval() const {
+ throw 1;
+}
+
+inline ex::ex(const basic &b) { construct_from_basic (b); }
+inline ex::~ex() { if (--bp->refcount == 0) delete bp; }
+void ex::construct_from_basic(const basic &b) {
+ const ex & tmpex = b.eval();
+ bp = tmpex.bp;
+ bp->refcount++;
+}
+
+ex pow() { return basic(); }
+
+int main()
+{
+ try { pow (); } catch (int) {}
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/reference1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/reference1.C
new file mode 100644
index 000000000..7ce5f90fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/reference1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// This code used to be accepted but it is invalid as there is no
+// value initialization of a reference type.
+// PR c++/36695
+
+int main()
+{
+ typedef int& T;
+ T a = T(); // { dg-error "value-initialization of reference" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/reference2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/reference2.C
new file mode 100644
index 000000000..42f537426
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/reference2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// This code used to be accepted but it is invalid as there is no
+// value initialization of a reference type.
+// PR c++/36695
+
+// We should we able to diagnostic this without instantiating the template
+template <int a1>
+int f()
+{
+ typedef int& T;
+ T a = T(); // { dg-error "value-initialization of reference" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/reference3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/reference3.C
new file mode 100644
index 000000000..8cc5afd6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/reference3.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// This code used to be accepted but it is invalid as there is no
+// value initialization of a reference type.
+// PR c++/36695
+
+template <typename T>
+T f()
+{
+ T a = T(); // { dg-error "value-initialization of reference" }
+}
+
+int &a = f<int&>(); // { dg-message "required from here" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/save1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/save1.C
new file mode 100644
index 000000000..2358eb50c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/save1.C
@@ -0,0 +1,20 @@
+// PR c++/8748
+// We were wrapping the ARRAY_REF in a SAVE_EXPR, causing us to try to make a bitwise
+// copy of b[0].
+
+struct A
+{
+ int i;
+};
+
+struct B : A
+{
+ virtual ~B();
+};
+
+struct C
+{
+ B b[1];
+};
+
+void foo() { C().b[0].i; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/self1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/self1.C
new file mode 100644
index 000000000..dd37c8e60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/self1.C
@@ -0,0 +1,19 @@
+// PR c++/29106
+// { dg-do run }
+
+int i;
+
+void f(__SIZE_TYPE__) {
+ i = 3;
+}
+
+
+int main()
+{
+ int* const savepos = sizeof(*savepos) ? 0 : 0;
+
+ f (sizeof (*savepos));
+
+ if (i != 3)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static-init1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init1.C
new file mode 100644
index 000000000..298d17140
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init1.C
@@ -0,0 +1,5 @@
+// Related to the patch for 38880.
+// Make sure we don't think we can initialize a at compile time.
+
+char c;
+short a[] = { (short)((__PTRDIFF_TYPE__)&c + (__PTRDIFF_TYPE__)&c) };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static-init2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init2.C
new file mode 100644
index 000000000..34bf2b238
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init2.C
@@ -0,0 +1,3 @@
+// PR c++/36912
+// { dg-options -frounding-math }
+const double c = .1, d = c+1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static-init3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init3.C
new file mode 100644
index 000000000..9f89c3119
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static-init3.C
@@ -0,0 +1,9 @@
+// PR c++/55137
+// s should have constant initialization.
+// { dg-final { scan-assembler-not "GLOBAL" } }
+
+struct S {
+ int b;
+};
+
+struct S s = { -1 + (int)(sizeof(int) - 1) };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static1.C
new file mode 100644
index 000000000..7609215dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static1.C
@@ -0,0 +1,4 @@
+struct A {
+ static const int size = BOGUS; // { dg-error "" }
+};
+const int A::size;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static2.C
new file mode 100644
index 000000000..b0344f480
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static2.C
@@ -0,0 +1,25 @@
+// PR 14804
+// { dg-do run }
+
+struct A {
+ virtual void foo() = 0;
+};
+
+struct B : public A {
+ virtual void bar() = 0;
+};
+
+typedef void (A::*mfptr)();
+
+struct D {
+ mfptr p;
+};
+
+static const D ds[] = {
+ { reinterpret_cast<mfptr>(&B::bar) },
+};
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static3.C
new file mode 100644
index 000000000..8fac85fbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static3.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+
+struct T
+{
+ static void (*handler)();
+ static void func() {}
+};
+
+bool fail;
+
+struct S {
+ S() {
+ if (T::handler != T::func)
+ fail = true;
+ }
+};
+
+static S s;
+
+void (*T::handler)() = func;
+
+int main()
+{
+ if (fail)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/static4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/static4.C
new file mode 100644
index 000000000..0cdc48b0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/static4.C
@@ -0,0 +1,6 @@
+// PR c++/51461
+
+struct A
+{
+ static const A a = 0; // { dg-error "incomplete|non-integral" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/string1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/string1.C
new file mode 100644
index 000000000..597b8619e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/string1.C
@@ -0,0 +1,8 @@
+extern void f (char*);
+
+extern const char * const target = "foo";
+
+void g ()
+{
+ f (target); // { dg-error "conversion" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/struct1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/struct1.C
new file mode 100644
index 000000000..e23faef50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/struct1.C
@@ -0,0 +1,6 @@
+struct bug {
+ const char *name;
+ __SIZE_TYPE__ type;
+};
+
+struct bug s = { 0, (__SIZE_TYPE__) &s | 1 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/struct2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/struct2.C
new file mode 100644
index 000000000..85aacc6fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/struct2.C
@@ -0,0 +1,22 @@
+/* PR c++/23180. */
+/* Initialize a local structure with an expression that attempts to use
+ pointer arithmetic to calculate another structure field offset. */
+
+void saveLoadEntries(const void *);
+
+void saveOrLoad() {
+ struct Track {
+ char soundName[15];
+ };
+ struct SaveLoadEntry {
+ int offs;
+ int type;
+ int size;
+ };
+
+ SaveLoadEntry trackEntries = {
+ ((long) (__SIZE_TYPE__) (&((Track *) 42)->soundName[0])) - 42,
+ 0, 1
+ };
+ saveLoadEntries(&trackEntries);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/struct3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/struct3.C
new file mode 100644
index 000000000..53804b3d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/struct3.C
@@ -0,0 +1,15 @@
+/* PR c++/23180. */
+/* Initialize a global variable with an expression that attempts to use
+ pointer arithmetic to calculate a structure field offset. */
+
+struct Track {
+ char soundName[15];
+};
+
+struct SaveLoadEntry {
+ int offs;
+ int type;
+ int size;
+};
+
+int foobar = ((long) (__SIZE_TYPE__) (& ((Track *) 42)->soundName[0])) - 42;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/switch1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/switch1.C
new file mode 100644
index 000000000..b0b06b748
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/switch1.C
@@ -0,0 +1,8 @@
+int f(int c)
+{
+ switch (c)
+ {
+ case d: /* { dg-error "'d' was not declared" } */
+ int optBzip2 = true;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/synth1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/synth1.C
new file mode 100644
index 000000000..6c00bc022
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/synth1.C
@@ -0,0 +1,17 @@
+// PR middle-end/17525
+
+struct A
+{
+ ~A();
+ int a;
+};
+
+struct B : public A
+{
+ virtual ~B();
+};
+
+void run (B& b, B& b1)
+{
+ b1 = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/synth2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/synth2.C
new file mode 100644
index 000000000..ed5046715
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/synth2.C
@@ -0,0 +1,18 @@
+// PR c++/34180
+
+struct G {
+ G(); // { dg-message "" "candidate" }
+ G(G&); // { dg-message "" "candidate" }
+};
+
+class A // { dg-error "" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+{
+ const G g;
+};
+
+int main()
+{
+ A a;
+ A b = a; // { dg-message "required here|deleted" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/synth3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/synth3.C
new file mode 100644
index 000000000..d656ddb2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/synth3.C
@@ -0,0 +1,21 @@
+// Test that synthesizing the C copy constructor doesn't require B<int> to
+// be complete.
+
+template <class T>
+struct B
+{
+ typename T::NT nt;
+};
+
+struct A
+{
+ A ();
+ A (const A&);
+ A (const B<int>&);
+};
+
+struct C: A { };
+
+C c;
+C c2(c);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/synth4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/synth4.C
new file mode 100644
index 000000000..2b0b0b95a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/synth4.C
@@ -0,0 +1,18 @@
+// PR c++/45822
+
+struct A
+{
+ A(int);
+};
+
+struct B
+{
+ B(A = 0);
+};
+
+struct C
+{
+ B b;
+};
+
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C
new file mode 100644
index 000000000..1e4f7ae84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C
@@ -0,0 +1,12 @@
+// PR c++/58126
+
+struct A { // { dg-error "uninitialized" "" { target c++11 } }
+ const int value1;
+ int& value2;
+};
+
+struct B : A { }; // { dg-error "deleted" "" { target c++11 } }
+
+A a; // { dg-error "deleted|uninitialized const member in 'struct A'|uninitialized reference member in 'struct A'" }
+
+B b; // { dg-error "deleted|uninitialized const member in base 'struct A' of 'struct B'|uninitialized reference member in base 'struct A' of 'struct B'" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/union1.C
new file mode 100644
index 000000000..0049f4429
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/union1.C
@@ -0,0 +1,5 @@
+// PR c++/14401
+
+union U {
+ int& i; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/union2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/union2.C
new file mode 100644
index 000000000..ac39f6092
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/union2.C
@@ -0,0 +1,13 @@
+// PR c++/15938
+// { dg-do compile }
+// { dg-options "" }
+
+typedef union
+{
+ struct { int i; };
+ struct { char c; };
+} A;
+
+A a = { 0 };
+A b = {{ 0 }};
+A c = {{{ 0 }}}; // { dg-error "braces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value1.C
new file mode 100644
index 000000000..9dbc2e067
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value1.C
@@ -0,0 +1,22 @@
+// Test that with value-initialization, i is initialized to 0
+// and the vtable pointer is properly initialized.
+
+// { dg-do run }
+
+struct A
+{
+ int i;
+ virtual void f() {}
+};
+
+void f (A& a)
+{
+ a.f();
+}
+
+int main()
+{
+ A a = A();
+ f (a);
+ return a.i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value10.C
new file mode 100644
index 000000000..2066410a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value10.C
@@ -0,0 +1,27 @@
+// PR c++/51331
+// { dg-do run }
+
+struct A {
+ A(): x(10) {}
+ virtual ~A() {}
+
+ int x;
+};
+
+struct B: public virtual A {
+};
+
+struct C: public virtual A {
+};
+
+struct D: public B, virtual public C {
+ D(): B(), C() {} // note an explicit call to C() which is auto-generated
+};
+
+int main() {
+ D* d = new D();
+
+ // Crashes here with the following message:
+ // *** glibc detected *** ./test: free(): invalid next size (fast)
+ delete d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value2.C
new file mode 100644
index 000000000..fbe166471
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value2.C
@@ -0,0 +1,23 @@
+// PR c++/35116
+// Test that break_out_target_exprs works properly with complex
+// value-initialization.
+
+struct A
+{
+ virtual void f ();
+};
+
+struct B
+{
+ A a;
+};
+
+struct C
+{
+ C (int, B = B());
+};
+
+void f ()
+{
+ C c (4);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value3.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value3.C
new file mode 100644
index 000000000..487baabec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value3.C
@@ -0,0 +1,31 @@
+// Testcase for value-initialization in new-expressions.
+// { dg-do run }
+
+#include <stdlib.h>
+#include <string.h>
+
+// Make sure that we return memory that isn't already set to 0.
+void *operator new(size_t s)
+{
+ void *p = malloc (s);
+ memset (p, 42, s);
+ return p;
+}
+
+struct A { A() {} ~A() {} };
+struct B { A a; int i; };
+
+int main()
+{
+ B *p = new B();
+ if (p->i != 0)
+ abort();
+
+ p = new B[2]();
+ if (p[0].i != 0 || p[1].i != 0)
+ abort();
+
+ B(*p2)[2] = new B[2][2]();
+ if (p2[0][0].i != 0 || p2[0][1].i != 0)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value4.C
new file mode 100644
index 000000000..fa7a02cc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value4.C
@@ -0,0 +1,35 @@
+// PR c++/38233
+
+template<class _T1, class _T2>
+ struct pair
+ {
+ _T1 first;
+ _T2 second;
+
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 265. std::pair::pair() effects overly restrictive
+ /** The default constructor creates @c first and @c second using their
+ * respective default constructors. */
+ pair()
+ : first(), second() { }
+};
+
+class a {
+ public:
+ a();
+};
+
+class b {
+ public:
+ // implicit default ctor
+ bool operator<(const b& rhs) const;
+
+ private:
+ a a_val;
+};
+
+typedef pair<const b, int> my_pair;
+
+void func() {
+ my_pair x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value5.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value5.C
new file mode 100644
index 000000000..d705f87b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value5.C
@@ -0,0 +1,17 @@
+// PR c++/38232
+
+class base {
+ public:
+ base();
+ virtual ~base();
+
+ private:
+ int& int_ref; // initialized by base ctor, not visible here
+};
+
+class derived : public base {
+};
+
+base *make_derived() {
+ return new derived();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value6.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value6.C
new file mode 100644
index 000000000..d7d29bf0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value6.C
@@ -0,0 +1,13 @@
+// PR c++/39109
+
+struct N
+{
+ private:
+ virtual ~N ();
+};
+
+N *
+foo ()
+{
+ return new N ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value7.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value7.C
new file mode 100644
index 000000000..c79de4a68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value7.C
@@ -0,0 +1,17 @@
+// PR c++/30111
+// { dg-do run }
+
+struct pod {
+ int i;
+};
+
+struct inherit : pod {
+ inherit() : pod() {}
+};
+
+int main()
+{
+ inherit i;
+ return i.i != 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value8.C
new file mode 100644
index 000000000..0a9b90b64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value8.C
@@ -0,0 +1,19 @@
+// PR c++/45315
+
+struct A
+{
+ A ();
+};
+
+template < int > struct B : A
+{
+ void foo ()
+ {
+ new B < 0 > ();
+ }
+};
+
+int main()
+{
+ B<1>().foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/value9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/value9.C
new file mode 100644
index 000000000..4899bd810
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/value9.C
@@ -0,0 +1,32 @@
+// PR c++/50793
+// { dg-do run }
+
+struct NonTrivial
+{
+ NonTrivial() { }
+};
+
+struct S
+{
+ NonTrivial nt;
+ int i;
+};
+
+int f(S s)
+{
+ s.i = 0xdeadbeef;
+ return s.i;
+}
+
+int g(S s = S())
+{
+ return s.i;
+}
+
+int main()
+{
+ f(S()); // make stack dirty
+
+ if ( g() )
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/vbase1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/vbase1.C
new file mode 100644
index 000000000..bbfd58f5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/vbase1.C
@@ -0,0 +1,39 @@
+// PR c++/50618
+// { dg-do run }
+
+struct Base
+{
+ const int text;
+ Base():text(1) {}
+ Base(int aText)
+ : text(aText) {}
+};
+struct SubA : public virtual Base
+{
+protected:
+ int x;
+public:
+ SubA(int aX)
+ : x(aX) {}
+};
+class SubB : public virtual Base
+{};
+struct Diamond : public SubA, public SubB
+{
+ Diamond(int text)
+ : Base(text), SubA(5), SubB() {}
+
+ void printText()
+ {
+ if(text != 2)
+ __builtin_abort();
+ if(x!=5)
+ __builtin_abort();
+ }
+};
+
+int main(int, char**)
+{
+ Diamond x(2);
+ x.printText();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/vector1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/vector1.C
new file mode 100644
index 000000000..f33df2a92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/vector1.C
@@ -0,0 +1,79 @@
+// PR c++/19263
+// { dg-do run }
+// { dg-options "-O2 -fpermissive" }
+// { dg-prune-output "narrowing" }
+
+typedef signed char v8qi __attribute__ ((vector_size (8)));
+
+extern "C" void abort (void);
+
+static unsigned char S[16];
+
+struct A
+{
+ int i;
+ v8qi j, k;
+ int l;
+};
+
+void
+foo (unsigned char v)
+{
+ A a = { 1, { v, v, v, v, v, v, v, v },
+ { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 };
+ v8qi *s = (v8qi *) &S[0];
+ *s = a.j;
+ s[1] = a.k;
+}
+
+void
+bar (unsigned char v)
+{
+ v8qi val8 = { v, v, v, v, v, v, v, v };
+ v8qi *s = (v8qi *) &S[0];
+ *s = val8;
+}
+
+int n = 5, cnt;
+
+int
+num (void)
+{
+ ++cnt;
+ return n;
+}
+
+void
+baz (void)
+{
+ static A a = { 0, { num (), num (), num (), num (), 6, 6, 6, 6 },
+ { 7, 7, 7, 7, 8, 8, 8, 8 }, 0 };
+ v8qi *s = (v8qi *) &S[0];
+ *s = a.j;
+ s[1] = a.k;
+}
+
+int
+main ()
+{
+ int i;
+ foo (1);
+ for (i = 0; i < 8; ++i)
+ if (S[i] != 1)
+ abort ();
+ for (; i < 16; ++i)
+ if (S[i] != 2)
+ abort ();
+ bar (3);
+ for (i = 0; i < 8; ++i)
+ if (S[i] != 3)
+ abort ();
+ return 0;
+ baz ();
+ if (cnt != 4)
+ abort ();
+ for (i = 0; i < 16; ++i)
+ if (S[i] != 5 + (i / 4))
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/void1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/void1.C
new file mode 100644
index 000000000..ed41a90de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/void1.C
@@ -0,0 +1,6 @@
+// PR c++/48569
+
+int main()
+{
+ void();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/volatile1.C
new file mode 100644
index 000000000..9080ed5dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/volatile1.C
@@ -0,0 +1,16 @@
+// PR c++/26577
+// The call to bar() was causing an inappropriate dereference of *this,
+// which led to an abort in cp_expr_size.
+
+struct A
+{
+ A(const A&);
+ A& operator=(const A&);
+ static void bar();
+ void baz() volatile;
+};
+
+void A::baz() volatile
+{
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/volatile2.C b/gcc-4.9/gcc/testsuite/g++.dg/init/volatile2.C
new file mode 100644
index 000000000..036d5f162
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/init/volatile2.C
@@ -0,0 +1,13 @@
+// PR c++/47003
+
+struct A
+{
+ A(int);
+};
+
+volatile int i;
+
+int main()
+{
+ A *q = new A (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/20090113-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/20090113-1.C
new file mode 100644
index 000000000..3f371257e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/20090113-1.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct S1 {
+ S1() { }
+};
+
+struct S2 {
+ int n;
+ S1* p;
+ void f() {
+ p = new S1[n = 1];
+ }
+};
+
+struct S3 {
+ S2 s2;
+ void g() {
+ s2.f();
+ }
+};
+
+void h() {
+ S3().g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C
new file mode 100644
index 000000000..de0f665c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C
@@ -0,0 +1,62 @@
+/* Verify that simple virtual calls are converted to direct calls by ipa-cp. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ if (middleman (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C
new file mode 100644
index 000000000..658442e34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp -fno-early-inlining" } */
+class wxPaintEvent { };
+struct wxDCBase
+{
+ wxDCBase ();
+ virtual int GetLayoutDirection() const{}
+ virtual void SetLayoutDirection(int){}
+};
+struct wxWindowDC : public wxDCBase {};
+struct wxBufferedDC : public wxDCBase
+{
+ void Init(wxDCBase*dc) {
+ InitCommon(dc);
+ }
+ void InitCommon(wxDCBase*dc) {
+ if (dc)
+ SetLayoutDirection(dc->GetLayoutDirection());
+ }
+};
+struct wxBufferedPaintDC : public wxBufferedDC {
+ wxBufferedPaintDC() {
+ Init(&m_paintdc);
+ }
+ wxWindowDC m_paintdc;
+};
+void OnPaint(wxPaintEvent & event) {
+ wxBufferedPaintDC dc;
+}
+/* IPA-CP should really discover both cases, but for time being the second is handled by inliner. */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "inline" } } */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C
new file mode 100644
index 000000000..d30d56cff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline -fno-devirtualize-speculatively" } */
+int baz ();
+struct A
+{
+ virtual int fn2 () = 0;
+ virtual int *fn3 ();
+ double *fn4 ();
+ int fn5 (int);
+ template <class T>
+ void fn1 (A &, T) { fn3 (); fn4 (); fn2 (); }
+};
+struct B : A
+{
+ int fn2 () { return 6; }
+ void fn3 (int, double);
+ B (bool = true);
+ B (int, int);
+};
+template <typename T>
+void
+foo (B &x, A &y, A &z)
+{
+ y.fn2 ();
+ z.fn2 ();
+ int i = baz ();
+ int j = (y.fn3 ())[i];
+ x.fn3 (j, (y.fn4 ())[i] + (z.fn4 ())[z.fn5 (j)]);
+}
+inline B
+operator+ (A &y, A &z)
+{
+ B x;
+ foo<int> (x, y, z);
+ return x;
+}
+void
+bar ()
+{
+ B a, b, c (4, 0), d;
+ a.fn1 (b, .6);
+ baz ();
+ c + d;
+}
+/* While inlining function called once we should devirtualize a new call to fn2
+ and two to fn3. While doing so the new symbol for fn2 needs to be
+ introduced. */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 3 "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C
new file mode 100644
index 000000000..16bae4d8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-O -fdump-ipa-inline" }
+
+class Foo
+{
+public:
+ void Bar() const
+ {
+ __builtin_puts ("Howdy!");
+ }
+};
+
+int main()
+{
+ Foo x;
+ auto y = &Foo::Bar;
+ (x.*y)();
+ return 0;
+}
+
+// { dg-final { scan-ipa-dump "Inlined 1 calls, eliminated 1 functions" "inline" } }
+// { dg-final { cleanup-ipa-dump "inline" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C
new file mode 100644
index 000000000..b338a4c34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* Call to foo should be devirtualized because there are no derived types of A. */
+/* { dg-options "-O2 -fdump-tree-ssa" } */
+namespace {
+class A {
+public:
+ virtual int foo(void)
+{
+ return 0;
+}
+};
+}
+class A a, *b=&a;
+main()
+{
+ return b->foo();
+}
+
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "ssa"} } */
+/* { dg-final { cleanup-tree-dump "ssa" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C
new file mode 100644
index 000000000..456d44f84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C
@@ -0,0 +1,34 @@
+/* No devirtualization happens here, but A::foo should not end up as reachable
+ because the constructor of A is unreachable and therefore the virtual
+ method table referring to A::foo is optimized out. */
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-tree-ssa" } */
+class B {
+public:
+ virtual int foo(void)
+{
+ return 0;
+}
+};
+namespace {
+class A : public B {
+public:
+ virtual int foo(void)
+{
+ return 1;
+}
+};
+}
+class B a, *b=&a;
+main()
+{
+ if (0)
+ {
+ class A a;
+ a.foo();
+ }
+ return b->foo();
+}
+
+/* { dg-final { scan-tree-dump-not "A::foo" "ssa"} } */
+/* { dg-final { cleanup-tree-dump "ssa" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C
new file mode 100644
index 000000000..2ea85f487
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C
@@ -0,0 +1,40 @@
+/* Check that we speculatively devirutalize call to FOO to B::foo becuase
+ A is noreturn. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-devirt -fdump-tree-optimized" } */
+class A {
+public:
+ virtual int foo(void)
+ {
+ throw (1);
+ return 0;
+ }
+};
+
+
+class B : public A {
+public:
+ virtual int foo(void);
+};
+
+int
+B::foo(void)
+{
+ return 1;
+}
+class A a, *b=&a;
+void
+m(void)
+{
+ b->foo();
+}
+main()
+{
+ m();
+}
+
+/* { dg-final { scan-ipa-dump "Speculatively devirtualizing call" "devirt"} } */
+/* { dg-final { cleanup-ipa-dump "devirt" } } */
+/* Match if (PROF_6 == foo) to verify that the speculation survived. */
+/* { dg-final { scan-tree-dump "== foo" "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C
new file mode 100644
index 000000000..85567867f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C
@@ -0,0 +1,39 @@
+/* We shall devirtualize to unreachable. No anonymous type method should surivve
+ reachability. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+namespace {
+class B {
+public:
+ virtual int foo(void)
+{
+ return 0;
+}
+};
+class A : public B {
+public:
+ virtual int foo(void)
+{
+ return 1;
+}
+};
+}
+class B *b;
+main()
+{
+ int c;
+ if (c)
+ {
+ class A a;
+ a.foo();
+ class B b;
+ b.foo();
+ }
+ return b->foo();
+}
+
+/* { dg-final { scan-ipa-dump "Devirtualizing" "whole-program"} } */
+/* { dg-final { scan-ipa-dump "builtin_unreachable" "whole-program"} } */
+/* { dg-final { scan-ipa-dump-not "A::foo" "whole-program"} } */
+/* { dg-final { scan-ipa-dump-not "A::foo" "whole-program"} } */
+/* { dg-final { cleanup-ipa-dump "whole-program" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C
new file mode 100644
index 000000000..9edfd73af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C
@@ -0,0 +1,44 @@
+/* We shall devirtualize to B::foo since it is the only live candidate of an
+ anonymous type. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+namespace {
+class B {
+public:
+ virtual int foo(void)
+{
+ return 0;
+}
+};
+class A : public B {
+public:
+ virtual int foo(void)
+{
+ return 1;
+}
+};
+}
+class B *b;
+void get_me_lost (void *);
+main()
+{
+ int c;
+ if (c)
+ {
+ class A a;
+ a.foo();
+ }
+ else
+ {
+ b = new (class B);
+ b->foo();
+ get_me_lost ((void *)&b);
+ }
+ return b->foo();
+}
+
+/* { dg-final { scan-ipa-dump "Devirtualizing" "whole-program"} } */
+/* { dg-final { scan-ipa-dump-not "builtin_unreachable" "whole-program"} } */
+/* { dg-final { scan-ipa-dump "B::foo" "whole-program"} } */
+/* { dg-final { scan-ipa-dump-not "A::foo" "whole-program"} } */
+/* { dg-final { cleanup-ipa-dump "whole-program" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C
new file mode 100644
index 000000000..dbbe597c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C
@@ -0,0 +1,37 @@
+/* We shall devirtualize to unreachable. No anonymous type method should surivve
+ reachability. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ssa" } */
+namespace {
+class B {
+public:
+ virtual int foo(void)
+{
+ return 0;
+}
+};
+class A : public B {
+public:
+ virtual int foo(void)
+{
+ return 1;
+}
+};
+}
+class B *b;
+main()
+{
+ if (0)
+ {
+ class A a;
+ a.foo();
+ class B b;
+ b.foo();
+ }
+ return b->foo();
+}
+
+/* { dg-final { scan-tree-dump-not "A::foo" "ssa"} } */
+/* { dg-final { scan-tree-dump-not "B::foo" "ssa"} } */
+/* { dg-final { scan-tree-dump "builtin_unreachable" "ssa"} } */
+/* { dg-final { cleanup-tree-dump "ssa" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C
new file mode 100644
index 000000000..13686e3e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C
@@ -0,0 +1,32 @@
+/* We should specialize for &b and devirtualize the call.
+ Previously we were failing by considering CLOBBER statement to be
+ a type change. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-cp" } */
+struct A {
+ void operator==(const A &);
+};
+class B {
+public:
+ A m_fn1();
+ A m_fn2();
+};
+template <typename T, typename M> class C {
+public:
+ T Key;
+ const M &m_fn2(const T &);
+ virtual void m_fn1() {}
+ B _map;
+};
+
+C<int, int> b;
+template <typename T, typename M> const M &C<T, M>::m_fn2(const T &) {
+ A a = _map.m_fn2();
+ a == _map.m_fn1();
+ m_fn1();
+}
+
+void fn1() { b.m_fn2(0); }
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C
new file mode 100644
index 000000000..d3181e4c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C
@@ -0,0 +1,62 @@
+/* Verify that simple virtual calls using this pointer are converted
+ to direct calls by ipa-cp. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+ int middleman (int i)
+ {
+ return foo (i);
+ }
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+ for (i = 0; i < get_input(); i++)
+ if (b.middleman (get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
new file mode 100644
index 000000000..0ea245baf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
@@ -0,0 +1,31 @@
+#include <stdlib.h>
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-release_ssa" } */
+namespace {
+struct A
+{ int a; virtual int foo() {return a;} void bar() {a=7;} };
+struct B
+{ int b; virtual int foo2() {return b;} void bar2() {b=9;} };
+struct C : public virtual A, public virtual B { };
+struct D : public virtual B, public virtual A { };
+struct E : public C, public D { void bar2() {b=9;} }; }
+int
+main(void)
+{
+ struct E e;
+ struct C *c = &e;
+ struct D *d = &e;
+ struct A *a = &e;
+ struct B *b = &e;
+ e.bar();
+ e.bar2();
+ if (e.foo() + e.foo2() != 16)
+ abort ();
+ if (c->foo() + d->foo2() != 16)
+ abort ();
+ if (a->foo() + b->foo2() != 16)
+ abort ();
+ return 0;
+}
+/* { dg-final { scan-tree-dump-not "abort" "release_ssa" } } */
+/* { dg-final { cleanup-tree-dump "release_ssa" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C
new file mode 100644
index 000000000..99f60afe3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C
@@ -0,0 +1,41 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
+/* Main purpose is to verify that we do not produce wrong devirtualization to
+ C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */
+#include <stdlib.h>
+class A {
+public:
+ unsigned length;
+};
+class B {};
+class MultiTermDocs : public virtual B {
+protected:
+ A readerTermDocs;
+ A subReaders;
+ virtual B *m_fn1(int *) {}
+ virtual inline ~MultiTermDocs();
+ void wrap(void)
+ {
+ m_fn1(NULL);
+ }
+};
+class C : MultiTermDocs {
+ B *m_fn1(int *);
+};
+MultiTermDocs::~MultiTermDocs() {
+ wrap ();
+ if (&readerTermDocs) {
+ B *a;
+ for (unsigned i = 0; i < subReaders.length; i++)
+ (a != 0);
+ }
+}
+
+B *C::m_fn1(int *) { abort (); }
+
+main()
+{
+ class C c;
+}
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C
new file mode 100644
index 000000000..37e766945
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
+class A {};
+class B {
+public:
+ A &operator[](int);
+};
+class C : B {
+public:
+ virtual int m_fn1() { return 0; }
+ A &operator[](int p1) {
+ int a;
+ a = m_fn1();
+ static_cast<void>(__builtin_expect(a, 0) ?: 0);
+ return B::operator[](p1);
+ }
+};
+
+C b;
+int *e;
+static void sort(C &p1, C &p2) {
+ for (int i=0;; i++) {
+ A c, d = p2[0];
+ p1[0] = c;
+ p2[0] = d;
+ }
+}
+
+void lookupSourceDone() { b[0]; }
+
+void update_sources() {
+ if (e) {
+ C f;
+ sort(f, b);
+ }
+}
+/* Note that we miss one devirtualization because we are not able to track the
+ vtbl store in destructor.
+ Previously we devirtualized to C::m_fn1 instead of B::m_fn1. */
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C
new file mode 100644
index 000000000..a32c7d674
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively" } */
+/* Main purpose is to verify that we do not produce wrong devirtualization to
+ C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */
+#include <stdlib.h>
+class A {
+public:
+ unsigned length;
+};
+class B {};
+class MultiTermDocs : public virtual B {
+protected:
+ A readerTermDocs;
+ A subReaders;
+ virtual B *m_fn1(int *) {}
+ virtual inline ~MultiTermDocs();
+ inline void wrap(void)
+ {
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ m_fn1(NULL);
+ }
+};
+class C : MultiTermDocs {
+ B *m_fn1(int *);
+};
+MultiTermDocs::~MultiTermDocs() {
+ wrap ();
+ if (&readerTermDocs) {
+ B *a;
+ for (unsigned i = 0; i < subReaders.length; i++)
+ (a != 0);
+ }
+}
+
+B *C::m_fn1(int *) { abort (); }
+
+main()
+{
+ class C c;
+}
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C
new file mode 100644
index 000000000..01bfdc2ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-inline -fdump-ipa-cp" } */
+void pad(void);
+class A {};
+class B {
+public:
+ A &operator[](int);
+};
+class C : B {
+public:
+ virtual int m_fn1() { return 0; }
+ inline A &operator[](int p1) {
+ int a;
+ a = m_fn1();
+ static_cast<void>(__builtin_expect(a, 0) ?: 0);
+ return B::operator[](p1);
+ }
+};
+
+int *e;
+static void sort(C &p1, C &p2) {
+ for (int i=0;; i++) {
+ A c, d = p2[0];
+ pad();
+ pad();
+ pad();
+ }
+}
+
+int test ();
+
+void update_sources() {
+while (test()) {
+ C f;
+C *b = new (C);
+ sort(f, *b);
+ }
+}
+/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
+/* { dg-final { scan-ipa-dump-times "Aggregate passed by reference" 1 "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C
new file mode 100644
index 000000000..751647957
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-cp" } */
+
+class ert_RefCounter {
+ protected:
+ int refCounterE;
+ virtual ~ert_RefCounter() {}
+};
+
+class ebs_Object : virtual public ert_RefCounter {
+};
+
+class dpr_App : public ebs_Object {
+ public:
+ virtual void run();
+};
+
+class dpr_Job : public ebs_Object {};
+
+void dpr_run(ebs_Object& objectA) {
+ ((dpr_App&)objectA).run();
+ dpr_Job jobL;
+ dpr_run(jobL);
+}
+/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C
new file mode 100644
index 000000000..2df429c34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-devirt" } */
+struct A
+ {
+ int a;
+ virtual int bar(void) {return a;}
+ };
+struct B
+ {
+ virtual int foo(void) {return b;}
+ int b;
+ };
+struct C: A,B
+ {
+ virtual int foo(void) {return a;}
+ };
+
+struct C c;
+int test(void)
+{
+ struct C *d=&c;
+ struct B *b=d;
+ return d->foo()+b->foo();
+}
+/* The call to b->foo() is perfectly devirtualizable because C can not be in construction
+ when &c was used, but we can not analyze that so far. Test that we at least speculate
+ that type is in the construction. */
+/* { dg-final { scan-ipa-dump "Speculatively devirtualizing" "devirt" } } */
+/* { dg-final { cleanup-ipa-dump "devirt" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C
new file mode 100644
index 000000000..1dcf76cc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-devirt -fdump-tree-optimized" } */
+struct A
+ {
+ int a;
+ };
+struct B
+ {
+ __attribute__ ((visibility("default")))
+ virtual int foo(void) {return 42;}
+ int b;
+ };
+struct C: A,B
+ {
+ __attribute__ ((visibility("hidden")))
+ virtual int foo(void);
+ };
+
+struct C c;
+int test(void)
+{
+ struct C *d=&c;
+ struct B *b=d;
+ return d->foo()+b->foo();
+}
+/* { dg-final { scan-tree-dump "OBJ_TYPE_REF" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C
new file mode 100644
index 000000000..e18b81897
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C
@@ -0,0 +1,17 @@
+// PR c++/58678
+// { dg-options "-O3 -fdump-ipa-devirt" }
+
+struct A {
+ virtual ~A();
+};
+struct B : A {
+ virtual int m_fn1();
+};
+void fn1(B* b) {
+ delete b;
+}
+
+// { dg-final { scan-assembler-not "_ZN1AD2Ev" } }
+// { dg-final { scan-assembler-not "_ZN1BD0Ev" } }
+// { dg-final { scan-ipa-dump "Target is artificial" "devirt" } }
+// { dg-final { cleanup-ipa-dump "devirt" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C
new file mode 100644
index 000000000..b4f24a104
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C
@@ -0,0 +1,75 @@
+/* { dg-do run { target c++11 } } */
+/* There is a devirtualizable call. In PR60306 we deduced wrong target to cxa_pure_virtual.
+ For gcc 4.10 we temporarily disable the devirtualization. */
+/* { dg-options "-O3" } */
+
+#include <vector>
+
+using std::vector;
+
+class Object
+{
+public:
+
+ virtual Object* clone() const =0;
+
+ virtual int type() const {return 0;}
+
+ Object& operator=(const Object&) {return *this;}
+
+ Object() {}
+ Object(const Object&) {}
+ virtual ~Object() {}
+};
+
+Object* f(const Object&o)
+{
+ return o.clone();
+}
+
+template<typename T>
+class Box: public Object, public T
+{
+public:
+ Box<T>* clone() const {return new Box<T>(*this);}
+
+ Box<T>& operator=(const Box<T>& t)
+ {
+ T::operator=(t);
+ return *this;
+ }
+
+ Box<T>& operator=(const T& t)
+ {
+ T::operator=(t);
+ return *this;
+ }
+
+ Box() = default;
+ Box(const Box<T>&) = default;
+ explicit Box(const T& t):T(t) {}
+};
+
+template <typename T>
+using Vector = Box<vector<T>>;
+
+typedef Vector<int> OVector;
+
+OVector edges_connecting_to_node(int n)
+{
+ OVector branch_list_;
+ for(int i=0;i<n;i++)
+ branch_list_.push_back(i);
+
+ return branch_list_;
+}
+
+int main(int argc,char* argv[])
+{
+ for(int n=0; n < argc; n++)
+ {
+ auto x = edges_connecting_to_node(1);
+ x.clone();
+ f(x);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C
new file mode 100644
index 000000000..a68eb024f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C
@@ -0,0 +1,70 @@
+/* Verify that simple virtual calls on an object refrence are
+ converted to simple calls by ipa-cp. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual float distraction (float f);
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+float A::distraction (float f)
+{
+ f += 6.2;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A &obj, int i)
+{
+ return obj.foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ if (middleman (b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C
new file mode 100644
index 000000000..c4ac6940a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C
@@ -0,0 +1,25 @@
+// PR c++/58678
+// { dg-options "-O3 -fdump-ipa-devirt" }
+
+// We shouldn't speculatively devirtualize to ~B because B is an abstract
+// class; any actual object passed to f will be of some derived class which
+// has its own destructor.
+
+struct A
+{
+ virtual void f() = 0;
+ virtual ~A();
+};
+
+struct B : A
+{
+ virtual ~B() {}
+};
+
+void f(B* b)
+{
+ delete b;
+}
+
+// { dg-final { scan-ipa-dump-not "Speculatively devirtualizing" "devirt" } }
+// { dg-final { cleanup-ipa-dump "devirt" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C
new file mode 100644
index 000000000..72c883b3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C
@@ -0,0 +1,68 @@
+/* Verify that ipa-co can convert virtual calls to direct ones even
+ when a typecast to an ancestor is involved along the way. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C
new file mode 100644
index 000000000..575bc0271
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C
@@ -0,0 +1,79 @@
+/* Verify that ipa-cp can convert simple virtual calls to a direct
+ ones even when a typecast to an ancestor is involved along the way
+ and that ancestor is not the first one with virtual functions. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+
+class B : public Distraction, public A
+{
+public:
+ virtual int foo (int i);
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C
new file mode 100644
index 000000000..e9a5d7093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C
@@ -0,0 +1,38 @@
+/* Verify that we either do not do any devirtualization or correctly
+ spot that foo changes the dynamic type of the passed object. */
+
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+extern "C" void abort (void);
+extern "C" void *malloc(__SIZE_TYPE__);
+
+inline void* operator new(__SIZE_TYPE__, void* __p) throw() { return __p;}
+
+int x;
+
+class A {
+public:
+ virtual ~A() { }
+};
+
+class B : public A {
+public:
+ virtual ~B() { if (x == 1) abort (); x = 1; }
+};
+
+void __attribute__((noinline,noclone)) foo (void *p)
+{
+ B *b = reinterpret_cast<B *>(p);
+ b->~B();
+ new (p) A;
+}
+
+int main()
+{
+ void *p = __builtin_malloc (sizeof (B));
+ new (p) B;
+ foo(p);
+ reinterpret_cast<A *>(p)->~A();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C
new file mode 100644
index 000000000..1c5912230
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C
@@ -0,0 +1,87 @@
+/* Verify that IPA-CP can do devirtualization even if the virtual call
+ comes from a method that has been early-inlined into a descendant. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fdump-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+ int middleman_1 (int i);
+};
+
+
+class B : public Distraction, public A
+{
+public:
+ virtual int foo (int i);
+ int middleman_2 (int i);
+ __attribute__ ((noinline)) B();
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int inline __attribute__ ((always_inline))
+A::middleman_1 (int i)
+{
+ return this->foo (i);
+}
+
+int __attribute__ ((noinline))
+B::middleman_2 (int i)
+{
+ return this->middleman_1 (i);
+}
+
+B::B ()
+{
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input(); i++)
+ if (b.middleman_2 (get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C
new file mode 100644
index 000000000..7fd0bf5f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+double foo ();
+struct B
+{
+ bool b1 () { return b3 (); }
+ void b2 ();
+ virtual bool b3 ();
+};
+struct C
+{
+ C () {}
+ bool
+ c1 (float x, float y)
+ {
+ if (x != c3 || y != c4)
+ c2.b2 ();
+ return c2.b1 ();
+ }
+ B c2;
+ float c3, c4;
+};
+
+void
+bar ()
+{
+ static C c;
+ c.c1 (60, (int) foo ());
+}
+/* We optimize out this call just after early passes. Unfortunately
+ this unreachable removal is not logged in dump file. */
+/* { dg-final { scan-ipa-dump-not "OBJ_TYPE_REF" "whole-program" } } */
+/* { dg-final { cleanup-ipa-dump "whole-program" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C
new file mode 100644
index 000000000..dcd804659
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C
@@ -0,0 +1,76 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+A::A ()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*A::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C
new file mode 100644
index 000000000..b9a36e29f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C
@@ -0,0 +1,84 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public Distraction, public A
+{
+public:
+ virtual int foo (int i);
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+A::A()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*A::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C
new file mode 100644
index 000000000..c8791f79e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C
@@ -0,0 +1,80 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-inline" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public Distraction, public A
+{
+public:
+ virtual int foo (int i);
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int __attribute__ ((noinline))
+middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+inline __attribute__ ((always_inline)) A::A()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C
new file mode 100644
index 000000000..56d41e496
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C
@@ -0,0 +1,110 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-inline" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public Distraction, public A
+{
+public:
+ B();
+ virtual int foo (int i);
+};
+
+class C : public B
+{
+public:
+ virtual int foo (int i);
+};
+
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int __attribute__ ((noinline))
+middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static void __attribute__ ((noinline))
+sth2 (A *a)
+{
+ if (a->foo (get_input ()) != 3)
+ abort ();
+}
+
+inline void __attribute__ ((always_inline)) sth1 (B *b)
+{
+ sth2 (b);
+}
+
+inline __attribute__ ((always_inline)) A::A()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+B::B() : Distraction(), A()
+{
+ sth1 (this);
+}
+
+static void bah ()
+{
+ class C c;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C
new file mode 100644
index 000000000..637d7d4be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C
@@ -0,0 +1,79 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */
+
+extern "C" void abort (void);
+
+class B;
+
+class A
+{
+public:
+ int data;
+ A();
+ A(B *b);
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+A::A ()
+{
+}
+
+A::A (B *b)
+{
+ if (middleman (b, get_input ()) != 3)
+ abort ();
+}
+
+static void bah ()
+{
+ B b;
+ A a(&b);
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C
new file mode 100644
index 000000000..f9b8b6954
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C
@@ -0,0 +1,72 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-inline" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static inline int __attribute__ ((always_inline))
+middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+__attribute__ ((noinline)) A::A ()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
new file mode 100644
index 000000000..2e76cbe40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
@@ -0,0 +1,88 @@
+/* Verify that ipa-cp will not get confused by placement new constructing an
+ object within another one when looking for dynamic type change . */
+/* { dg-do run } */
+/* { dg-require-effective-target nonpic } */
+/* { dg-options "-O3 -Wno-attributes" } */
+
+extern "C" void abort (void);
+namespace std {
+ typedef __SIZE_TYPE__ size_t;
+}
+inline void* __attribute__ ((always_inline))
+operator new(std::size_t, void* __p) throw()
+{
+ return __p;
+}
+
+class A
+{
+public:
+ char data[256];
+ A();
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C
+{
+public:
+ C();
+ virtual double foo (double i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+double C::foo (double i)
+{
+ return i + 3.5;
+}
+
+static int __attribute__ ((noinline)) middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+__attribute__ ((always_inline)) C::C ()
+{
+}
+
+A::A ()
+{
+}
+
+static __attribute__ ((noinline)) void bah ()
+{
+ class B b;
+
+ C *c = new ((void *) &b.data) C;
+
+ if (middleman (&b, get_input ()) != 3)
+ abort ();
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C
new file mode 100644
index 000000000..309644d92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C
@@ -0,0 +1,82 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under construction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ A();
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ B();
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int __attribute__ ((noinline))
+middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+inline __attribute__ ((always_inline)) A::A ()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+inline __attribute__ ((always_inline)) B::B ()
+{
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*A::foo" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C
new file mode 100644
index 000000000..3897a7782
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C
@@ -0,0 +1,71 @@
+/* Verify that ipa-cp correctly detects the dynamic type of an object
+ under destruction when doing devirtualization. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ ~A();
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+A::~A ()
+{
+ if (middleman (this, get_input ()) != 2)
+ abort ();
+}
+
+static void bah ()
+{
+ class B b;
+}
+
+int main (int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ bah ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C
new file mode 100644
index 000000000..175f24efb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-ipa-cp -fdump-tree-optimized" }
+
+struct S { S(); virtual void xyzzy(); void otherstuff(); };
+struct R { int a; S s; R(); };
+S s;
+R r;
+
+void S::xyzzy ()
+{
+ otherstuff ();
+ otherstuff ();
+}
+
+static void __attribute__ ((noinline)) foo(S *p) { p->xyzzy(); }
+void bar() {foo(&s); }
+
+static void __attribute__ ((noinline)) foh(S *p) { p->xyzzy(); }
+void bah() {foh(&r.s); }
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*S::xyzzy" "cp" } } */
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-1.C
new file mode 100644
index 000000000..9f9989322
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-1.C
@@ -0,0 +1,49 @@
+/* Verify that simple indirect calls are inlined even without early
+ inlining.. */
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining" } */
+/* { dg-add-options bind_pic_locally } */
+
+extern void non_existent (const char *, int);
+
+class String
+{
+private:
+ const char *data;
+
+public:
+ String (const char *d) : data(d)
+ {}
+
+ int funcOne (int delim) const;
+ int printStuffTwice (int delim) const;
+};
+
+
+int String::funcOne (int delim) const
+{
+ int i;
+ for (i = 0; i < delim; i++)
+ non_existent(data, i);
+
+ return 1;
+}
+
+int docalling (int (String::* f)(int delim) const)
+{
+ String S ("muhehehe");
+
+ return (S.*f)(4);
+}
+
+int main (int argc, char *argv[])
+{
+ int i = 0;
+ while (i < 1000)
+ i += docalling (&String::funcOne);
+ non_existent ("done", i);
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "String::funcOne\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-2.C
new file mode 100644
index 000000000..670a5dd95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-2.C
@@ -0,0 +1,61 @@
+/* Verify that simple indirect calls are inlined even without early
+ inlining.. */
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining" } */
+/* { dg-add-options bind_pic_locally } */
+
+extern void non_existent (const char *, int);
+
+class String
+{
+private:
+ const char *data;
+
+public:
+ String (const char *d) : data(d)
+ {}
+
+ int funcOne (int delim) const;
+ int printStuffTwice (int delim) const;
+};
+
+
+int String::funcOne (int delim) const
+{
+ int i;
+ for (i = 0; i < delim; i++)
+ non_existent(data, i);
+
+ return 1;
+}
+
+extern int global;
+
+int docalling (int c, int (String::* f)(int delim) const)
+{
+ String S ("muhehehe");
+
+ if (c > 2)
+ global = 3;
+ else
+ global = 5;
+
+ return (S.*f)(4);
+}
+
+int __attribute__ ((noinline,noclone)) get_input (void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ int i = 0;
+ while (i < 1000)
+ i += docalling (get_input (), &String::funcOne);
+ non_existent ("done", i);
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "String::funcOne\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-3.C
new file mode 100644
index 000000000..3daee9a86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/iinline-3.C
@@ -0,0 +1,64 @@
+/* Verify that we do not indirect-inline using member pointer
+ parameters which have been modified. */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+/* { dg-add-options bind_pic_locally } */
+
+extern "C" void abort (void);
+
+class String
+{
+private:
+ const char *data;
+
+public:
+ String (const char *d) : data(d)
+ {}
+
+ int funcOne (int stuff) const;
+ int funcTwo (int stuff) const;
+};
+
+
+int String::funcOne (int stuff) const
+{
+ return stuff + 1;
+}
+
+int String::funcTwo (int stuff) const
+{
+ return stuff + 100;
+}
+
+int (String::* gmp)(int stuff) const = &String::funcTwo;
+
+int docalling_1 (int (String::* f)(int stuff) const)
+{
+ String S ("muhehehe");
+
+ return (S.*f)(4);
+}
+
+int docalling (int a, int (String::* f)(int stuff) const)
+{
+ if (a < 200)
+ f = gmp;
+
+ return docalling_1 (f);
+}
+
+int __attribute__ ((noinline,noclone)) get_input (void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ int i = 0;
+ while (i < 10)
+ i += docalling (get_input (), &String::funcOne);
+
+ if (i != 104)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
new file mode 100644
index 000000000..32f7258a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
@@ -0,0 +1,62 @@
+/* Verify that virtual calls are folded even early inlining puts them into one
+ function with the definition. */
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-tree-fre1-details" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+
+class B : public A
+{
+public:
+ __attribute__ ((noinline)) B();
+ virtual int foo (int i);
+};
+
+int __attribute__ ((noinline)) A::foo (int i)
+{
+ return i + 1;
+}
+
+int __attribute__ ((noinline)) B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+__attribute__ ((noinline)) B::B()
+{
+}
+
+static inline int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static inline int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Replacing call target with foo" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C
new file mode 100644
index 000000000..5bddc2fcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C
@@ -0,0 +1,95 @@
+/* Verify that virtual calls are folded even early inlining puts them into one
+ function with the definition. */
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-tree-fre1-details" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ int data_2;
+ virtual int foo (int i);
+ virtual int baz (int i);
+};
+
+
+class C : public Distraction, public B
+{
+public:
+ __attribute__ ((noinline)) C();
+ virtual int foo (int i);
+};
+
+float __attribute__ ((noinline)) Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int __attribute__ ((noinline)) A::foo (int i)
+{
+ return i + 1;
+}
+
+int __attribute__ ((noinline)) B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline)) B::baz (int i)
+{
+ return i * 15;
+}
+
+int __attribute__ ((noinline)) C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static inline int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+__attribute__ ((noinline)) C::C()
+{
+}
+
+int main (int argc, char *argv[])
+{
+ class C c;
+
+ if (middleman (&c, get_input ()) != 4)
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Replacing call target" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-1.C
new file mode 100644
index 000000000..dbbfb4e33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-1.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+ extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, void (*ptr)(E))
+{
+ for (; b != e; b++)
+ ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+ std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+ foreach (argv, argv + argc, inline_me);
+ foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-2.C
new file mode 100644
index 000000000..fd284a1e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-2.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+ extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, E ptr)
+{
+ for (; b != e; b++)
+ ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+ std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+ foreach (argv, argv + argc, inline_me);
+ foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-3.C
new file mode 100644
index 000000000..8d5f905cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/inline-3.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+#include <algorithm>
+
+void foo(const char *s);
+
+void
+inline_me (char *x)
+{
+ foo(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ foo(x);
+}
+
+int main(int argc, char **argv)
+{
+ std::for_each (argv, argv + argc, inline_me);
+ std::for_each (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C
new file mode 100644
index 000000000..bc4dfea5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C
@@ -0,0 +1,64 @@
+/* Verify that simple virtual calls are inlined even without early
+ inlining. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C
new file mode 100644
index 000000000..001cff204
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C
@@ -0,0 +1,63 @@
+/* Verify that simple virtual calls using this pointer are inlined
+ even without early inlining.. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+ int middleman (int i)
+ {
+ return foo (i);
+ }
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (b.middleman (get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C
new file mode 100644
index 000000000..637a6aecc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C
@@ -0,0 +1,64 @@
+/* Verify that simple virtual calls on an object refrence are inlined
+ even without early inlining. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int middleman (class A &obj, int i)
+{
+ return obj.foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman (b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C
new file mode 100644
index 000000000..f5b8f8e5d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C
@@ -0,0 +1,70 @@
+/* Verify that simple virtual calls are inlined even without early
+ inlining, even when a typecast to an ancestor is involved along the
+ way. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C
new file mode 100644
index 000000000..d78173d69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C
@@ -0,0 +1,55 @@
+/* Verify that virtual call inlining does not pick a wrong method when
+ there is a user defined ancestor in an object. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ class A confusion;
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i, j = get_input ();
+
+ for (i = 0; i < j; i++)
+ if ((middleman (&b, j) + 100 * middleman (&b.confusion, j)) != 203)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "A::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C
new file mode 100644
index 000000000..9d725a508
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C
@@ -0,0 +1,80 @@
+/* Verify that simple virtual calls are inlined even without early
+ inlining, even when a typecast to an ancestor is involved along the
+ way and that ancestor is not the first one with virtual functions. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+
+class B : public Distraction, public A
+{
+public:
+ virtual int foo (int i);
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::.*foo" "inline" } } */
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" { xfail *-*-* } } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C
new file mode 100644
index 000000000..eebfc6af1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C
@@ -0,0 +1,77 @@
+/* Verify that virtual calls are inlined (ithout early inlining) even
+ when their caller is itself indirectly inlined. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int bar (int i);
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int bar (int i);
+ virtual int foo (int i);
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::bar (int i)
+{
+ return i + 100 * i;
+}
+
+int A::foo (int i)
+{
+ return bar (i) + 1;
+}
+
+int B::bar (int i)
+{
+ return i + 100 * (i + 2);
+}
+
+int B::foo (int i)
+{
+ return bar (i) + 2;
+}
+
+int C::foo (int i)
+{
+ return i + 3;
+}
+
+int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman (&b, get_input ()) != 303)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { scan-ipa-dump "B::bar\[^\\n\]*inline copy in int main" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C
new file mode 100644
index 000000000..586c3af30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C
@@ -0,0 +1,94 @@
+/* Verify that simple virtual calls are inlined even without early
+ inlining, even when a typecast to an ancestor is involved along the
+ way and that ancestor itself has an ancestor wich is not the
+ primary base class. */
+/* { dg-do run { target nonpic } } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class Distraction
+{
+public:
+ float f;
+ double d;
+ Distraction ()
+ {
+ f = 8.3;
+ d = 10.2;
+ }
+ virtual float bar (float z);
+};
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+/*
+class D2
+{
+public:
+ virtual float baz (float z)
+ {
+ abort();
+ }
+};
+*/
+class A2 : public Distraction, public A
+{
+ int i2;
+};
+
+class B : public A2
+{
+public:
+ virtual int foo (int i);
+};
+
+float Distraction::bar (float z)
+{
+ f += z;
+ return f/2;
+}
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_1 (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_2 (class B *obj, int i)
+{
+ return middleman_1 (obj, i);
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i;
+
+ for (i = 0; i < get_input (); i++)
+ if (middleman_2 (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::.*foo" "inline" } } */
+/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" { xfail *-*-* } } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43695.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43695.C
new file mode 100644
index 000000000..a01478324
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43695.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fipa-cp -fipa-cp-clone" } */
+
+extern void baz(int) __attribute__ ((noreturn));
+
+struct S {
+ ~S();
+};
+
+__attribute__ ((noreturn, noinline))
+void bar(int i)
+{
+ baz(i);
+}
+
+void foo()
+{
+ S s;
+ bar(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43812.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43812.C
new file mode 100644
index 000000000..cc46eed65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr43812.C
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fwhole-program -fipa-cp" } */
+
+typedef float scoord_t;
+typedef scoord_t sdist_t;
+typedef sdist_t dist_t;
+template<typename T> class TRay { };
+typedef TRay<dist_t> Ray;
+class BBox { };
+class RenderContext { };
+class RefCounted {
+public:
+ void deref () const {
+ if (--ref_count <= 0) {
+ delete this;
+ }
+ }
+ mutable int ref_count;
+};
+template<class T> class Ref {
+public:
+ ~Ref () {
+ if (obj) obj->deref ();
+ }
+ T *obj;
+};
+class Material : public RefCounted { };
+class Surface {
+public:
+ virtual ~Surface () { }
+ class IsecInfo { };
+ virtual const IsecInfo *intersect (Ray &ray, RenderContext &context) const;
+ Ref<const Material> material;
+};
+class LocalSurface : public Surface {
+ virtual BBox bbox () const;
+};
+BBox LocalSurface::bbox () const { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr44372.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr44372.C
new file mode 100644
index 000000000..22aa747e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr44372.C
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fipa-cp -fipa-cp-clone" } */
+
+template < typename > class S3;
+
+struct S1
+{
+ struct
+ {
+ int i[10];
+ } s0;
+ S1 () : s0 ()
+ { }
+ template < typename T > S1 (S3 < T > s3, int)
+ {
+ f (s3);
+ }
+};
+
+struct S2
+{
+ template < typename T > S2 s (S3 < T > s3)
+ {
+ S1 (s3, 0);
+ }
+ S2 (int i) : j (i)
+ { }
+ int j;
+ S1 s1[10];
+};
+
+template < typename > struct S3
+{
+ S3 ()
+ {
+ S2 (0).s (*this);
+ }
+};
+
+static inline void
+f (S3 < int > s3)
+{
+ extern bool m;
+ if (m)
+ S2 (0).s (s3);
+}
+
+S3 < int >s3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45565.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45565.C
new file mode 100644
index 000000000..c04de12e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45565.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-O -fno-toplevel-reorder -fno-inline -fipa-cp -fipa-cp-clone -fkeep-inline-functions" }
+
+template < typename Derived > struct AnyMatrixBase
+{
+};
+
+struct Matrix Random ();
+
+struct Matrix:AnyMatrixBase < Matrix >
+{
+ void bar ()
+ {
+ throw;
+ }
+ void foo (Matrix other)
+ {
+ bar ();
+ Matrix (AnyMatrixBase < Matrix > (Random ()));
+ }
+ template
+ < typename OtherDerived > Matrix (AnyMatrixBase < OtherDerived > other)
+ {
+ foo (other);
+ }
+};
+
+Matrix x (Random ());
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-1.C
new file mode 100644
index 000000000..82f347052
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-1.C
@@ -0,0 +1,64 @@
+// { dg-do compile }
+// { dg-options "-finline-small-functions -findirect-inlining -finline-functions -O" }
+
+extern "C" {
+typedef long unsigned int size_t;
+typedef long int __ssize_t;
+typedef struct _IO_FILE FILE;
+typedef struct
+{
+} __mbstate_t;
+extern __inline __attribute__ ((__gnu_inline__)) int
+fgetc_unlocked (FILE *__fp)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) int
+putc_unlocked (int __c, FILE *__stream)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) __ssize_t
+getline (char **__lineptr, size_t *__n, FILE *__stream)
+{
+}
+extern __inline __attribute__ ((__gnu_inline__)) int
+ferror_unlocked (FILE *__stream) throw ()
+{
+}
+}
+typedef struct
+{} __mpf_struct;
+typedef __mpf_struct mpf_t[1];
+typedef const __mpf_struct *mpf_srcptr;
+typedef __mpf_struct *mpf_ptr;
+extern "C" {
+ void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
+}
+class _knumber
+{
+ public:
+ enum NumType {SpecialType, IntegerType, FractionType, FloatType};
+ virtual NumType type(void) const = 0;
+ virtual _knumber * add(_knumber const & arg2) const = 0;
+ virtual operator long int(void) const = 0;
+};
+class _knumfloat : public _knumber
+{
+ _knumfloat(double num = 1.0)
+ ;
+ virtual NumType type(void) const ;
+ virtual _knumber * add(_knumber const & arg2) const;
+ virtual operator long int (void) const;
+ mpf_t _mpf;
+};
+_knumber *_knumfloat::add(_knumber const & arg2) const
+{
+ if (arg2.type() == SpecialType)
+ return arg2.add(*this);
+{
+ _knumfloat tmp_num(arg2);
+ return tmp_num.add(*this);
+ }
+ _knumfloat * tmp_num = new _knumfloat();
+ __gmpf_add(tmp_num->_mpf, _mpf,
+ dynamic_cast<_knumfloat const &>(arg2)._mpf);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-2.C
new file mode 100644
index 000000000..8b583d9c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45572-2.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-finline-small-functions -findirect-inlining -finline-function+
+typedef struct
+{} __mpf_struct;
+typedef __mpf_struct mpf_t[1];
+typedef const __mpf_struct *mpf_srcptr;
+typedef __mpf_struct *mpf_ptr;
+extern "C" {
+ void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
+}
+class _knumber
+{
+ public:
+ enum NumType {SpecialType, IntegerType, FractionType, FloatType};
+ virtual NumType type(void) const = 0;
+ virtual _knumber * add(_knumber const & arg2) const = 0;
+ virtual operator long int(void) const = 0;
+};
+class _knumfloat : public _knumber
+{
+ _knumfloat(double num = 1.0)
+ ;
+ virtual NumType type(void) const ;
+ virtual _knumber * add(_knumber const & arg2) const;
+ virtual operator long int (void) const;
+ mpf_t _mpf;
+};
+_knumber *_knumfloat::add(_knumber const & arg2) const
+{
+ if (arg2.type() == SpecialType)
+ return arg2.add(*this);
+{
+ _knumfloat tmp_num(arg2);
+ return tmp_num.add(*this);
+ }
+ _knumfloat * tmp_num = new _knumfloat();
+ __gmpf_add(tmp_num->_mpf, _mpf,
+ dynamic_cast<_knumfloat const &>(arg2)._mpf);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45875.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45875.C
new file mode 100644
index 000000000..34f02e300
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr45875.C
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ virtual int foo (int i);
+};
+
+class B
+{
+public:
+ class A confusion;
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_a (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_b (class B *obj, int i)
+{
+ return middleman_a (&obj->confusion, i);
+}
+
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i, j = get_input ();
+
+ for (i = 0; i < j; i++)
+ if (middleman_b (&b, j) != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46053.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46053.C
new file mode 100644
index 000000000..7be6fc3a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46053.C
@@ -0,0 +1,41 @@
+/* { dg-do run } */
+/* { dg-options "-O -fipa-cp -fno-early-inlining" } */
+
+extern "C" void abort ();
+
+struct A
+{
+ virtual void foo () = 0;
+};
+
+struct B : A
+{
+ virtual void foo () = 0;
+};
+
+struct C : A
+{
+};
+
+struct D : C, B
+{
+ int i;
+ D () : i(0xaaaa) {}
+ virtual void foo ()
+ {
+ if (i != 0xaaaa)
+ abort();
+ }
+};
+
+static inline void bar (B &b)
+{
+ b.foo ();
+}
+
+int main()
+{
+ D d;
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-1.C
new file mode 100644
index 000000000..0755529bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-1.C
@@ -0,0 +1,67 @@
+// Check that indirect calls to thunks do not lead to errors.
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+inline void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static inline void bar (B &b)
+{
+
+ b.foo ();
+}
+
+int main()
+{
+ int i;
+ D d;
+
+ for (i = 0; i < 5000; i++)
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-2.C
new file mode 100644
index 000000000..272852bad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-2.C
@@ -0,0 +1,68 @@
+// Check that indirect calls to thunks do not lead to errors.
+// { dg-do run }
+// { dg-options "-O -finline -finline-small-functions -finline-functions" }
+
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static inline void bar (B &b)
+{
+
+ b.foo ();
+}
+
+int main()
+{
+ int i;
+ D d;
+
+ for (i = 0; i < 5000; i++)
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-3.C
new file mode 100644
index 000000000..5f291ce1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46287-3.C
@@ -0,0 +1,67 @@
+// Check that indirect calls to thunks do not lead to errors.
+// { dg-do run }
+// { dg-options "-O -fipa-cp" }
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static void bar (B &b)
+{
+
+ b.foo ();
+}
+
+int main()
+{
+ int i;
+ D d;
+
+ for (i = 0; i < 5000; i++)
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46984.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46984.C
new file mode 100644
index 000000000..464ceb14a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr46984.C
@@ -0,0 +1,63 @@
+// { dg-options "-O -fipa-cp -fno-early-inlining -flto" }
+// { dg-do run }
+// { dg-require-effective-target lto }
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static inline void bar (B &b)
+{
+ b.foo ();
+}
+
+int main()
+{
+ D d;
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr50605.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr50605.C
new file mode 100644
index 000000000..4910a37f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr50605.C
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+class A
+{
+public:
+ int a;
+ void *stuff;
+};
+
+class B
+{
+public:
+ int b;
+ void *other_stuff;
+ A array[50];
+};
+
+extern B gb;
+
+int process_A (A *a)
+{
+ return a->a;
+}
+
+int process_A_complex (A *a)
+{
+ return process_A (a+3);
+}
+
+int process_B (B *b)
+{
+ return process_A_complex (&b->array[0]);
+}
+
+int foo (void)
+{
+ return process_B (&gb);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51759.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51759.C
new file mode 100644
index 000000000..1acb7cf1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51759.C
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#if __SIZEOF_INT__ == 2 && __SIZEOF_LONG__ == 4
+#define unsigned unsigned long
+#endif
+
+extern "C" void abort (void);
+struct S
+{
+ void __attribute__((noinline)) set(unsigned val)
+ {
+ data = val;
+ if (data != val)
+ abort ();
+ }
+ int pad0;
+ unsigned pad1 : 8;
+ unsigned data : 24;
+ int pad2;
+};
+int main()
+{
+ S s;
+ s.pad2 = -1;
+ s.set(0);
+ if (s.pad2 != -1)
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51929.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51929.C
new file mode 100644
index 000000000..cfc3df212
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr51929.C
@@ -0,0 +1,32 @@
+// PR middle-end/51929
+// { dg-do compile }
+// { dg-options "-O -fno-guess-branch-probability -fipa-cp -fipa-cp-clone --param=max-inline-insns-single=25" }
+
+struct A
+{
+ A (A, unsigned);
+ A (const char *);
+ ~A () { a1 (a4 ()); }
+ void a1 (int);
+ unsigned a2 ();
+ char *a3 ();
+ int a4 ();
+};
+
+template <typename T>
+struct B
+{
+ A b;
+ B (A x, int y = 1) : b (x.a3 (), x.a2 ()) { if (y & 1) b.a2 (); }
+};
+
+extern template struct B <char>;
+A a1 ("foo"), a2 ("bar");
+B<char> b1 (a1), b2 (a2, 8);
+
+void
+foo ()
+{
+ A a3 ("baz");
+ B<char> b3 (a1), b4 (a3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr52939.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr52939.C
new file mode 100644
index 000000000..e120827bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr52939.C
@@ -0,0 +1,58 @@
+/* Verify that we do not ICE on invalid devirtualizations (which might
+ be OK at run-time because never executed). */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i);
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i);
+ virtual int bar (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int B::foo (int i)
+{
+ return i + 2;
+}
+
+int B::bar (int i)
+{
+ return i + 3;
+}
+
+static int middleman (class A *obj, int i)
+{
+ class B *b = (class B *) obj;
+
+ if (i != 1)
+ return b->bar (i);
+ else
+ return i;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class A o;
+ if (middleman (&o, get_input ()) != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr55264.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr55264.C
new file mode 100644
index 000000000..cf54d6ae2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr55264.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-early-inlining -fno-weak" } */
+
+struct S
+{
+ S();
+ virtual inline void foo ()
+ {
+ foo();
+ }
+};
+
+void
+B ()
+{
+ S().foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr56310.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr56310.C
new file mode 100644
index 000000000..04f6aa6b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr56310.C
@@ -0,0 +1,36 @@
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-O -fipa-cp -fno-early-inlining -fipa-cp-clone --param=ipa-cp-eval-threshold=1" } */
+
+void bar (void *, void *);
+
+struct C
+{
+ constexpr C ():p (0)
+ {
+ }
+ void *get ()
+ {
+ return p;
+ }
+ void *p;
+};
+
+struct B:C
+{
+};
+
+struct A
+{
+ void f (B * x, B * y)
+ {
+ bar (x->get (), y->get ());
+ }
+};
+
+void
+foo ()
+{
+ A a;
+ B b;
+ a.f (&b, &b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr57670.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr57670.C
new file mode 100644
index 000000000..400612e75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr57670.C
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+class H
+{
+public:
+ virtual unsigned bar() const { return 16; }
+};
+
+class A : public H
+{
+ unsigned foo(unsigned (H::*func)(void) const) const;
+public:
+ H *h;
+ virtual unsigned bar() const;
+};
+
+unsigned A::foo(unsigned (H::*func)(void) const) const
+{
+ return (h->*func)();
+}
+
+unsigned A::bar() const
+{
+ return foo(&H::bar);
+}
+
+int main (int argc, char **argv)
+{
+ H h;
+ A a;
+ a.h = &h;
+
+ if (a.bar() != 16)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr58371.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr58371.C
new file mode 100644
index 000000000..00cfbb831
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr58371.C
@@ -0,0 +1,204 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+
+typedef int size_t;
+namespace {
+template < typename > struct char_traits;
+}
+namespace __gnu_cxx {
+template < typename > class new_allocator {
+};
+}
+namespace std {
+template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > {
+public:
+ size_t size_type;
+ typedef _Tp & const_reference;
+ template < typename > struct rebind {
+ typedef allocator other;
+ };
+};
+}
+namespace __gnu_cxx {
+template < typename _Alloc > struct __alloc_traits {
+ typedef typename _Alloc::const_reference const_reference;
+ template < typename _Tp > struct rebind {
+ typedef typename _Alloc::template rebind < _Tp >::other other;
+ };
+};
+}
+namespace std {
+struct __numeric_limits_base {
+};
+template < typename _Tp > struct numeric_limits:__numeric_limits_base {
+ static _Tp max () {
+ }
+};
+template < typename _Tp, typename _Alloc > struct _Vector_base {
+ typedef typename __gnu_cxx::__alloc_traits < _Alloc >::template rebind <
+ _Tp >::other _Tp_alloc_type;
+};
+template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:_Vector_base < _Tp,
+ _Alloc
+ > {
+ typedef _Vector_base < _Tp, _Alloc > _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ typedef __gnu_cxx::__alloc_traits < _Tp_alloc_type > _Alloc_traits;
+public:
+ _Tp value_type;
+ typedef typename _Alloc_traits::const_reference const_reference;
+ typedef size_t size_type;
+ size_type size () {
+ } const_reference operator[] (size_type) {
+ }
+};
+template < typename _CharT, typename =
+char_traits < _CharT > >class basic_ostream;
+typedef basic_ostream < int >ostream;
+class ios_base {
+};
+template < typename, typename > class basic_ios:ios_base {
+};
+template < typename _CharT, typename _Traits > class basic_ostream:basic_ios < _CharT,
+ _Traits
+ > {
+public:
+ _CharT char_type;
+ typedef basic_ostream __ostream_type;
+ __ostream_type & operator<< (const void *) {
+ }
+};
+}
+namespace logging {
+int GetMinLogLevel ();
+typedef int LogSeverity;
+LogSeverity LOG_ERROR_REPORT;
+LogSeverity LOG_DCHECK;
+class LogMessage {
+public:
+ LogMessage (const char *, int, LogSeverity);
+ std::ostream & stream () {
+ }
+};
+class LogMessageVoidify {
+public:
+ LogMessageVoidify () {
+ } void operator& (std::ostream &) {
+ }
+};
+}
+namespace base {
+namespace internal {
+class WeakPtrBase {
+};
+class SupportsWeakPtrBase {
+};
+} template < typename T > class WeakPtr:internal::WeakPtrBase {
+public:
+ WeakPtr () :ptr_ () {
+ } T *operator-> () {
+ logging:0 &&
+ logging::LOG_DCHECK >=
+ logging::GetMinLogLevel () ? (void) 0 : logging::
+ LogMessageVoidify () & logging::
+ LogMessage ("../../base/memory/weak_ptr.h", 0,
+ logging::LOG_ERROR_REPORT).stream () << ". ";
+ } T *ptr_;
+};
+template < class > class SupportsWeakPtr:internal::SupportsWeakPtrBase {
+};
+}
+template < class ObserverType > class ObserverListBase:base::SupportsWeakPtr < ObserverListBase < ObserverType >
+ > {
+public:
+ class Iterator {
+ public:
+ Iterator (ObserverListBase & list) :max_index_ (0 ? std::numeric_limits <
+ size_t >::max () : list.observers_.
+ size () ) {
+ } ObserverType *
+ GetNext () {
+ ListType & observers = list_->observers_;
+ if (observers[0])
+ ++index_;
+ }
+ base::WeakPtr < ObserverListBase > list_;
+ size_t
+ index_;
+ size_t
+ max_index_;
+ };
+ typedef
+ std::vector <
+ ObserverType * >
+ ListType;
+ ListType
+ observers_;
+};
+template < class ObserverType, bool > class ObserverList:public ObserverListBase <
+ ObserverType > {
+};
+namespace
+ ProxyPrefs {
+enum ConfigState
+{ };
+}
+namespace
+ net {
+class
+ ProxyConfig {
+};
+class
+ ProxyConfigService {
+public:
+ enum ConfigAvailability
+ { };
+ class
+ Observer {
+ public:
+ Observer () {
+ } virtual void
+ OnProxyConfigChanged (const ProxyConfig &, ConfigAvailability) = 0;
+ };
+ virtual void
+ OnLazyPoll () {
+ }
+};
+}
+class
+ ChromeProxyConfigService:
+ net::ProxyConfigService,
+ net::ProxyConfigService::Observer {
+ ConfigAvailability
+ GetLatestProxyConfig (net::ProxyConfig *);
+ void
+ UpdateProxyConfig (ProxyPrefs::ConfigState, const net::ProxyConfig &);
+ void
+ OnProxyConfigChanged (const net::ProxyConfig &, ConfigAvailability);
+ ObserverList <
+ net::ProxyConfigService::Observer,
+ 0 >
+ observers_;
+};
+void
+ChromeProxyConfigService::UpdateProxyConfig (ProxyPrefs::ConfigState,
+ const net::ProxyConfig &) {
+ net::ProxyConfig new_config;
+ ConfigAvailability availability = GetLatestProxyConfig (0);
+net:
+ ProxyConfigService::Observer * obs;
+ obs->OnProxyConfigChanged (new_config, availability);
+}
+void
+ChromeProxyConfigService::OnProxyConfigChanged (const net::ProxyConfig &,
+ ConfigAvailability
+ availability) {
+ net::ProxyConfig actual_config;
+ ObserverListBase <
+ net::ProxyConfigService::Observer >::Iterator it (observers_);
+net:
+ ProxyConfigService::Observer * obs;
+ if (it.GetNext () )
+ obs->OnProxyConfigChanged (actual_config, availability);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59176.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59176.C
new file mode 100644
index 000000000..d576bc3ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59176.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+template <class> class A {
+protected:
+ void m_fn2();
+ ~A() { m_fn2(); }
+ virtual void m_fn1();
+};
+
+class D : A<int> {};
+template <class Key> void A<Key>::m_fn2() {
+ m_fn1();
+ m_fn1();
+ m_fn1();
+}
+
+#pragma interface
+class B {
+ D m_cellsAlreadyProcessed;
+ D m_cellsNotToProcess;
+
+public:
+ virtual ~B() {}
+ void m_fn1();
+};
+
+class C {
+ unsigned long m_fn1();
+ B m_fn2();
+ unsigned long m_fn3();
+};
+unsigned long C::m_fn1() {
+CellHierarchy:
+ m_fn2().m_fn1();
+}
+
+unsigned long C::m_fn3() {
+CellHierarchy:
+ m_fn2().m_fn1();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59355.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59355.C
new file mode 100644
index 000000000..907c6d745
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59355.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/59355
+// { dg-do compile }
+// { dg-options "-O2 -fno-devirtualize" }
+
+struct S
+{
+ virtual void bar ();
+};
+
+void
+foo (S *s)
+{
+ s->bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59737.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59737.C
new file mode 100644
index 000000000..cb8a8aa2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr59737.C
@@ -0,0 +1,48 @@
+// PR middle-end/59737
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ virtual void foo (int &x);
+ friend void
+ operator>> (int &x, A &y)
+ {
+ y.foo (x);
+ }
+};
+
+struct B : public A
+{
+ void foo (int &x);
+};
+
+struct F : public B
+{
+ void foo (int &x);
+};
+
+struct G : public F
+{
+ void foo (int &);
+};
+
+struct C : A
+{
+ void foo (int &);
+ struct H : public G
+ {
+ void foo (int &);
+ };
+ struct D : A
+ {
+ H d;
+ };
+};
+
+void
+C::foo (int &x)
+{
+ D a;
+ x >> a.d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60419.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60419.C
new file mode 100644
index 000000000..84461f3ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60419.C
@@ -0,0 +1,80 @@
+// PR middle-end/60419
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C
+{
+};
+
+struct I : C
+{
+ I ();
+};
+
+struct J
+{
+ void foo ();
+ J ();
+ virtual void foo (int &, int);
+};
+
+template <class>
+struct D
+{
+ virtual void foo (I &) const;
+ void bar ()
+ {
+ I p;
+ foo (p);
+ }
+};
+
+struct K : J, public D<int>
+{
+};
+
+struct F
+{
+ K *operator->();
+};
+
+struct N : public K
+{
+ void foo (int &, int);
+ I n;
+ void foo (I &) const {}
+};
+
+struct L : J
+{
+ F l;
+};
+
+struct M : F
+{
+ L *operator->();
+};
+
+struct G
+{
+ G ();
+};
+
+M h;
+
+G::G ()
+try
+{
+ N f;
+ f.bar ();
+ throw;
+}
+catch (int)
+{
+}
+
+void
+baz ()
+{
+ h->l->bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60457.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60457.C
new file mode 100644
index 000000000..9e4cea7c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60457.C
@@ -0,0 +1,17 @@
+// PR ipa/60457
+// { dg-do compile }
+
+template <class T>
+struct A
+{
+};
+
+struct B : A <B>
+{
+ B ();
+};
+
+B::B ()
+{
+ const int c[] = { 1, 1 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-1.C
new file mode 100644
index 000000000..c25c425e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-1.C
@@ -0,0 +1,36 @@
+/* Verify that indirect-inlining induced removal of referenes will not remove
+ too many references in presence of speculative devirtualization. */
+/* { dg-do link } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+class A
+{
+ public:
+ virtual void foo(void (*)(void));
+};
+
+static
+void b(void)
+{
+}
+
+void
+A::foo(void (*back)(void))
+{
+ back();
+}
+
+class A *a;
+
+void __attribute__ ((noinline, noclone))
+allocate_a ()
+{
+ a = new A();
+}
+
+main()
+{
+ allocate_a();
+ for (int i=0; i<10000;i++)
+ a->foo(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-2.C
new file mode 100644
index 000000000..06bc71a5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/remref-2.C
@@ -0,0 +1,37 @@
+/* Verify that we survive creation and deletion of references to facilitate
+ reference removal while also doing (unsuccessful) speculative
+ devirtualization. */
+/* { dg-do link } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+class A
+{
+ public:
+ virtual void __attribute__ ((noinline)) foo(void (*)(void));
+};
+
+static
+void b(void)
+{
+}
+
+void __attribute__ ((noinline))
+A::foo(void (*back)(void))
+{
+ back();
+}
+
+class A *a;
+
+void __attribute__ ((noinline, noclone))
+allocate_a ()
+{
+ a = new A();
+}
+
+main()
+{
+ allocate_a();
+ for (int i=0; i<10000;i++)
+ a->foo(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
new file mode 100644
index 000000000..818002ec1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
@@ -0,0 +1,28 @@
+/* Verify that callgraph construction keeps FOO for possible devirtualization
+ and removes BAR. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-visibility" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ virtual int foo (void)
+ {
+ return 4;
+ }
+ virtual int bar (void)
+ {
+ return 5;
+ }
+};
+
+
+int t(class A *a)
+{
+ return a->foo();
+}
+/* { dg-final { scan-ipa-dump "A::foo" "visibility" } } */
+/* { dg-final { scan-ipa-dump-not "A::bar" "visibility" } } */
+/* { dg-final { cleanup-ipa-dump "visibility" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig1.C
new file mode 100644
index 000000000..c02742889
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B {
+ int f(); // { dg-message "int B::f" "" }
+};
+
+struct B1 : virtual B {};
+struct B2 : B {};
+struct BB : B1, B2 {};
+
+int i = BB().f(); // { dg-error "ambiguous" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig2.C
new file mode 100644
index 000000000..505eda60d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig2.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B {
+ int i; // { dg-message "int B::i" "" }
+};
+
+struct B1 : virtual B {};
+struct B2 : B {};
+struct BB : B1, B2 {};
+
+int i = BB().i; // { dg-error "ambiguous" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig3.C
new file mode 100644
index 000000000..5a3f5b949
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig3.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Sep 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// Follow on from Bug 16889:Undetected ambiguity.
+
+struct B {
+ int f(); // { dg-message "int B::f" "" }
+};
+
+struct B1 : virtual B {};
+struct B2 : B {};
+struct B2_2 : B2 {};
+struct BB : B1, B2_2 {};
+
+int i = BB().f(); // { dg-error "ambiguous" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig4.C
new file mode 100644
index 000000000..1f3daa1e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig4.C
@@ -0,0 +1,14 @@
+// PR c++/13377
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+namespace N
+{
+ int i; // { dg-message "i" }
+}
+
+int i; // { dg-message "i" }
+
+using namespace N;
+
+void foo() { i; } // { dg-error "ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig5.C
new file mode 100644
index 000000000..fb48ff3c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ambig5.C
@@ -0,0 +1,13 @@
+// PR c++/13377
+// Origin: Boris Kolpackov <boris@kolpackov.net>
+// { dg-do compile }
+
+namespace N
+{
+ namespace M {} // { dg-message "M" }
+}
+
+namespace M {} // { dg-message "M" }
+
+using namespace N;
+using namespace M; // { dg-error "namespace-name|ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon1.C
new file mode 100644
index 000000000..e4db50d94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon1.C
@@ -0,0 +1,47 @@
+// PR c++/2039
+// Test that a scoped reference to a member of an anonymous union member of
+// a base class works properly.
+
+// { dg-do run }
+
+struct A
+{
+ long ia1;
+ union
+ {
+ long ia2;
+ };
+};
+
+struct B : public A
+{
+ void f1();
+ void f2();
+};
+
+void B::f1()
+{
+ ia1 = 11;
+ ia2 = 22;
+}
+
+void B::f2()
+{
+ ia1 = 33;
+ A::ia2 = 44; // <<< !!!????
+}
+
+int main()
+{
+ B x;
+
+ x.f1();
+ if (x.ia1 != 11 || x.ia2 != 22)
+ return 1;
+
+ x.f2();
+ if (x.ia1 != 33 || x.ia2 != 44)
+ return 1;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon2.C
new file mode 100644
index 000000000..4984307e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+// Make sure we issue a diagnostic if a type with no linkage is used
+// to declare a a variable that has linkage.
+
+struct { int i; } a; // { dg-warning "anonymous type" }
+
+void foo() { a.i; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon3.C
new file mode 100644
index 000000000..2523e0a7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon3.C
@@ -0,0 +1,11 @@
+// Test that anonymous unions work with explicit scope.
+
+static union
+{
+ int i;
+};
+
+int main()
+{
+ return ::i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon4.C
new file mode 100644
index 000000000..40c4ab40a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon4.C
@@ -0,0 +1,9 @@
+static union {
+ int i;
+};
+
+int *ip;
+
+void g() {
+ ip = &i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon5.C
new file mode 100644
index 000000000..c3d36c20f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon5.C
@@ -0,0 +1,21 @@
+// PR c++/28409
+// shouldIbevisible should be emitted because it's an extern "C" decl with
+// external linkage, even though it's in the anonymous namespace.
+
+namespace
+{
+ extern "C" int shouldIbevisible()
+ {
+ return 0;
+ }
+}
+
+namespace t
+{
+ extern "C" int shouldIbevisible(void);
+}
+
+int main(void)
+{
+ return t::shouldIbevisible();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon6.C
new file mode 100644
index 000000000..7c5a96848
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon6.C
@@ -0,0 +1,11 @@
+extern int v1; // { dg-message "declared" }
+static union { int v1; }; // { dg-error "redeclaration" }
+
+static union { int v2; }; // { dg-message "declared" }
+extern int v2; // { dg-error "redeclaration" }
+
+int v3; // { dg-message "declared" }
+static union { int v3; }; // { dg-error "redeclaration" }
+
+static union { int v4; }; // { dg-message "declared" }
+static union { int v4; }; // { dg-error "redeclaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon7.C
new file mode 100644
index 000000000..79cad0acb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/anon7.C
@@ -0,0 +1,26 @@
+// PR c++/39560
+// { dg-options -Wunused }
+
+struct X { };
+
+class Z {
+public:
+ X* cc(int c);
+};
+
+class F {
+public:
+ typedef X* (Z::*MethO)(int);
+ typedef X* (F::*MethF)(int);
+ template<MethO m>
+ X* xwrapper(int i) {
+ union {
+ Z *z;
+ F *f;
+ }; // { dg-bogus "unused" }
+ f = this;
+ return ((z->*m)(i));
+ }
+};
+
+F::MethF meth = &F::xwrapper<&Z::cc>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin1.C
new file mode 100644
index 000000000..5f25f2889
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin1.C
@@ -0,0 +1,12 @@
+// PR c++/19367
+// { dg-do link }
+
+void abort (void) { throw 3; }
+
+namespace std { using ::abort; }
+
+int main ()
+{
+ using std::abort;
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin2.C
new file mode 100644
index 000000000..be0a6f65d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin2.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+/* PR c++/21087 */
+
+/* We used to overload the template function with the built-in
+ declaration, instead of replacing it as we should, and then barf at
+ the using decl because of a test that none of the overload set
+ members were anticipated built-ins. */
+
+extern "C" signed int toupper(signed int __c) throw();
+namespace std
+{
+ template< typename a > a toupper(a,int){}
+ using ::toupper;
+}
+
+int f () {
+ std::toupper((signed int)'a');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin3.C
new file mode 100644
index 000000000..3a29d8783
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin3.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// { dg-do compile }
+
+// PR 31749: ICE with redeclaration of builtin
+
+namespace std
+{
+ union abort;
+}
+
+void abort();
+
+using std::abort;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin4.C
new file mode 100644
index 000000000..b1785dcc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin4.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// { dg-do compile }
+
+// PR 31749: ICE with redeclaration of builtin
+
+namespace std
+{
+ union abort;
+}
+
+union abort;
+
+using std::abort; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin5.C
new file mode 100644
index 000000000..1bd67dce5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/builtin5.C
@@ -0,0 +1,16 @@
+// PR c++/37276
+
+// { dg-final { scan-assembler "_ZSt5atanhd" } }
+
+namespace std
+{
+ inline double
+ atanh(double __x)
+ { return __builtin_atanh(__x); }
+}
+
+int main()
+{
+ std::atanh(.3);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-1.C
new file mode 100644
index 000000000..37d40b4cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-1.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: PR/7621, Vaclav.Haisman@logout.sh.cvut.cz
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+struct A { };
+
+int main()
+{
+ A a;
+ a.i = 9; // { dg-error "no member" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-2.C
new file mode 100644
index 000000000..8e4dbe72d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/class-member-2.C
@@ -0,0 +1,7 @@
+template <typename T> struct A
+{
+ void foo () const {}
+ char A;
+};
+
+void bar() { A<void>().foo(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-1.C
new file mode 100644
index 000000000..0c4393e8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com>
+
+// Failed to spot ambiguous conversion
+
+struct A1
+{
+ operator int () const; // { dg-message "A1::operator" "" }
+};
+
+struct A2
+{
+ operator int () const; // { dg-message "A2::operator" "" }
+};
+
+struct B : A1, A2
+{
+};
+
+int Foo (B const &b)
+{
+ return b; // { dg-error "ambiguous" "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 24 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-2.C
new file mode 100644
index 000000000..6a087e183
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-2.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com>
+
+// { dg-final { scan-assembler "_ZNK2A1cviEv" } }
+
+struct A1
+{
+ operator int () const; // this one
+};
+
+struct A2 : A1
+{
+ template<typename T> operator T () const;
+};
+
+int Foo (A2 const &b)
+{
+ return b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-3.C
new file mode 100644
index 000000000..14b1446a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com>
+
+// { dg-final { scan-assembler "_ZNK2A1IiEcviEv" } }
+
+template <typename T> struct A1
+{
+ operator T () const; // this one
+};
+
+struct A2 : A1<int>
+{
+ template<typename T> operator T () const;
+};
+
+int Foo (A2 const &b)
+{
+ return b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-4.C
new file mode 100644
index 000000000..cd85b2ad3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-4.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com>
+
+// { dg-final { scan-assembler "_ZNK1AcviEv" } }
+// { dg-final { scan-assembler-not "_ZNK1VcviEv" } }
+
+struct V
+{
+ operator int () const;
+};
+
+struct A : virtual V
+{
+ operator int () const; // this one
+};
+
+struct B1 : A, virtual V
+{
+};
+
+struct B2 : virtual V, A
+{
+};
+
+
+int Foo (B1 const &b)
+{
+ return b;
+}
+int Foo (B2 const &b)
+{
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-5.C
new file mode 100644
index 000000000..f8df71092
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/conv-5.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18721. bogus error
+// Origin: Mikael Kilpel?inen <belz@kolumbus.fi>
+
+struct A {
+ template<typename T>
+ operator T() const;
+
+ operator float() const;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash1.C
new file mode 100644
index 000000000..cd90685c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash1.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 25 Aug 2003 <nathan@codesourcery.com>
+// Origin pr 11871 Dirk Mueller <mueller@kde.org>
+
+// PR c++/11871 Regression
+
+namespace std
+{
+ class A
+ {
+ public:
+ enum result
+ {
+ ok
+ };
+ };
+
+ template<typename T> class B : public A
+ {
+ public:
+ typedef A::result result;
+ };
+}
+
+int main()
+{
+ for(float result = 1.0;;);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash2.C
new file mode 100644
index 000000000..82735245f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash2.C
@@ -0,0 +1,20 @@
+// PR c++/14086
+
+struct ClassA
+{
+ ClassA();
+};
+
+struct ClassB
+{
+ enum Enum {ClassB}; // { dg-error "" }
+ ClassA key;
+
+ ClassB();
+ virtual ~ClassB();
+};
+
+
+ClassB::ClassB()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash3.C
new file mode 100644
index 000000000..5b58e8ed5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash3.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// Contributed by Wolfgang Wieser <wwieser at gmx dot de>
+// PR c++/15967: ICE with ambiguous operator new
+
+typedef __SIZE_TYPE__ size_t;
+
+struct A { void *operator new(size_t s){} }; // { dg-message "operator new" }
+struct B { void *operator new(size_t s){} }; // { dg-message "operator new" }
+
+struct C : A,B {};
+
+int crash()
+{
+ C *c=new C(); // { dg-error "ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash4.C
new file mode 100644
index 000000000..65686512a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash4.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+//
+// PR 3761
+
+struct A {};
+
+struct B {};
+
+template <class T>
+struct Foo : A, B
+{
+ void func(void);
+
+ struct Nested
+ {
+ friend void Foo::func(void);
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash5.C
new file mode 100644
index 000000000..6584ee645
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash5.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+//
+// PR 17618
+
+void foo()
+{
+ p; // { dg-error "not declared" }
+ (void*) p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash6.C
new file mode 100644
index 000000000..b8481be4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash6.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18652: ICE redeclaring variable as template.
+
+int A; // { dg-message "previous declaration" }
+template<int> struct A; // { dg-error "different kind of symbol" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash7.C
new file mode 100644
index 000000000..a3389a01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash7.C
@@ -0,0 +1,9 @@
+// PR c++/35323
+// { dg-options "" }
+
+void foo(int);
+
+void bar()
+{
+ foo(1r); // { dg-error "not supported" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash8.C
new file mode 100644
index 000000000..7dce9cb72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/crash8.C
@@ -0,0 +1,13 @@
+// PR c++/58843
+
+struct A {};
+
+template<typename T> void foo(T t)
+{
+ t.T::~X(); // { dg-error "no type" }
+}
+
+void bar()
+{
+ foo(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl1.C
new file mode 100644
index 000000000..d9af65604
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl1.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com>
+
+// PR 8702. Failure to match templates.
+
+template <typename X> struct C1{};
+
+template <typename X>
+struct C2 {
+ template<typename Y> operator C1<Y>();
+ template<typename Y> operator C2<Y>();
+};
+
+template<typename X> template<typename Y>
+C2<X>::operator C1<Y>()
+{
+ return C1<Y>();
+}
+
+struct A
+{
+ operator int (); // { dg-error "operator" "" }
+ operator float (); // { dg-error "operator" "" }
+ operator float () const; // { dg-error "operator" "" }
+ template <typename T> operator T * (); // { dg-error "candidates" "" }
+};
+
+A::operator short () { // { dg-error "prototype for" "" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl2.C
new file mode 100644
index 000000000..75ce0967a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/decl2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com>
+// Source Martin Buchholz martin@xemacs.org
+
+// PR 9053. Failed to consider templates that are disambiguated by
+// return type.
+
+template <typename T> class bar;
+template <> struct bar<const char*> { typedef void type; };
+template <typename T> class qux;
+template <> struct qux<int> { typedef void type; };
+
+template <typename T>
+typename bar<T>::type foo (T t) { }
+
+template <typename T>
+typename qux<T>::type foo (T t) { }
+
+
+int
+main (int argc, char *argv[])
+{
+ foo ("foo");
+ foo (7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/delete1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/delete1.C
new file mode 100644
index 000000000..beaed209d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/delete1.C
@@ -0,0 +1,16 @@
+// PR c++/2136
+// Test that overloaded op new and delete don't prevent us from using the
+// global versions with an explicit scope.
+
+#include <stddef.h>
+
+struct A {
+ void *operator new (size_t, float);
+ void operator delete (void *, float);
+};
+
+int main ()
+{
+ A *p = ::new A;
+ ::delete p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/disamb1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/disamb1.C
new file mode 100644
index 000000000..7585a32e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/disamb1.C
@@ -0,0 +1,15 @@
+// PR c++/525
+// Bug: With -pedantic, we weren't converting this to B1* for the call.
+
+struct A
+{
+ void f();
+};
+
+struct B1: public A {};
+struct B2: public A {};
+
+struct C: public B1, public B2
+{
+ void g() { B1::f(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/duperr1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/duperr1.C
new file mode 100644
index 000000000..cfb348d49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/duperr1.C
@@ -0,0 +1,5 @@
+// PR c++/29048
+
+class A { int i; }; // { dg-bogus "is private.*is private" }
+// { dg-error "is private" "" { target *-*-* } 3 }
+class B:public A { B() { A::i=0; } }; // { dg-error "within this context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/enum1.C
new file mode 100644
index 000000000..9422814e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/enum1.C
@@ -0,0 +1,5 @@
+// PR c++/14476
+
+struct tree_common {
+ enum tree_code code : 8; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/error1.C
new file mode 100644
index 000000000..3eb4b9721
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/error1.C
@@ -0,0 +1,10 @@
+// PR c++/17609
+// Origin: <papadopo@shfj.cea.fr>
+// { dg-do compile }
+
+namespace N { int i; } // { dg-message "N::i" }
+void foo() { i; } // { dg-error "not declared" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 6 }
+
+using namespace N;
+void bar() { i; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/exception1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/exception1.C
new file mode 100644
index 000000000..b5fcd0a6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/exception1.C
@@ -0,0 +1,33 @@
+/* PR 2743 */
+/* { dg-do compile } */
+
+namespace ns {
+ class Exception
+ {
+ };
+}
+
+namespace ns
+{
+ class Test {
+ public:
+ inline Test() throw( Exception );
+ inline Test(int n ) throw( Exception );
+ private:
+ int i;
+ };
+}
+
+// This line used to fail because Exception wasn't looked up in the
+// right scope.
+ns::Test::Test() throw( Exception ) : i( 1 )
+{
+}
+
+ns::Test::Test( int n ) throw( Exception ) : i( n )
+{
+}
+
+int main(int argc, char* argv[]) {
+ ns::Test test;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C
new file mode 100644
index 000000000..31d100a74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C
@@ -0,0 +1,11 @@
+// Contributed by Dodji Seketeli <dseketel@redhat.com>
+// Origin: PR c++/13699
+// { dg-do compile }
+
+namespace A {
+ extern "C" void foo_func () throw(); // { dg-error "conflicts" }
+}
+// next line should trigger an error because
+// it conflicts with previous declaration of foo_func (), due to
+// different exception specifications.
+extern "C" void foo_func (); // { dg-error "C language|exception specifications" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C
new file mode 100644
index 000000000..055148f38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C
@@ -0,0 +1,21 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/41020
+// { dg-do compile }
+
+extern "C"
+{
+ int fork (void);
+}
+
+class frok
+{
+ int this_errno;
+ friend int fork (void);
+};
+
+extern "C" int
+fork (void)
+{
+ frok grouped;
+ return grouped.this_errno;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C
new file mode 100644
index 000000000..56dcefa76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41020
+// { dg-options "" }
+// { dg-do compile }
+// { dg-final { scan-assembler-not "call\[\t \]+\[^\$\]*?_Z4forkv" { target i?86-*-* x86_64-*-* } } }
+// { dg-final { scan-assembler "call\[\t \]+_?fork" { target i?86-*-* x86_64-*-* } } }
+
+extern "C" int fork (void);
+
+void
+foo ()
+{
+ extern int fork (void);
+ fork ();
+}
+
+extern "C"
+int
+fork (void)
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C
new file mode 100644
index 000000000..c385ea701
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41020
+
+// { dg-options "" }
+// { dg-do compile }
+// { dg-final { scan-assembler "call\[\t \]+\[^\$\]*?_Z4forkv" { target i?86-*-* x86_64-*-* } } }
+
+class frok
+{
+ int this_errno;
+ friend int fork (void);
+};
+
+void
+foo ()
+{
+ fork ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C
new file mode 100644
index 000000000..4d934c104
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41020
+// { dg-do compile }
+
+
+class frok
+{
+ int this_errno;
+ friend int fork (void); // { dg-message "previous declaration .*?C\\+\\+. linkage" }
+};
+
+extern "C" int
+fork (void) // { dg-error "conflicting declaration .*?C. linkage" }}
+{
+ frok grouped;
+ return grouped.this_errno;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope1.C
new file mode 100644
index 000000000..e694d6f23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope1.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 4206. We were nesting SCOPE_STMTs badly.
+
+struct A
+{
+ A ();
+ ~A ();
+};
+
+
+void Go( )
+{
+ while (1)
+ {
+ switch (1) {
+ default: {}
+ }
+ A d;
+ }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope2.C
new file mode 100644
index 000000000..882f102a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/forscope2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+struct S {
+ void foo() {
+ for (_ptr; ;) {} // { dg-error "not declared" }
+ _ptr = 0;
+ }
+};
+
+// It's OK to error or not on line 6.
+// { dg-prune-output ":6:" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend1.C
new file mode 100644
index 000000000..47fe05565
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: <matz@suse.de>
+
+// PR c++/9970: In-class friend function definition after
+// declaration lexical scope problem.
+
+void f();
+struct X
+{
+ enum { k = 1 };
+ friend void f() {
+ char a[k];
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend10.C
new file mode 100644
index 000000000..fa2eccbea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend10.C
@@ -0,0 +1,22 @@
+// PR c++/18681
+// Bug: The friend declaration in A failed to give C::D access to A::B
+// as specified in DR 45.
+
+class A
+{
+ struct B;
+ friend class C;
+};
+
+class C
+{
+ struct D
+ {
+ void f();
+ };
+};
+
+void C::D::f()
+{
+ A::B* p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend11.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend11.C
new file mode 100644
index 000000000..2b4ffda83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend11.C
@@ -0,0 +1,23 @@
+/* PR c++/30917 */
+/* This used to ICE */
+/* { dg-do compile } */
+
+
+class QGList;
+unsigned count() {
+ class QGListIterator {
+ friend class QGList;
+ QGListIterator( const QGList & ); // OK, finds ::QGList.
+ };
+ return 0;
+}
+
+// This is valid.
+unsigned count2() {
+ class QGList2;
+ class QGListIterator2 {
+ friend class QGList2;
+ QGListIterator2( const QGList2 & );
+ };
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend12.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend12.C
new file mode 100644
index 000000000..95cfd5fb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend12.C
@@ -0,0 +1,10 @@
+// PR c++/34912
+
+void foo()
+{
+ struct A
+ {
+ friend void bar(); // { dg-error "without prior declaration" }
+ };
+ bar(); // { dg-error "not declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend13.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend13.C
new file mode 100644
index 000000000..bec71df37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend13.C
@@ -0,0 +1,6 @@
+// PR c++/37558
+
+class Foo {
+ friend class Bar;
+ friend void func(const class Bar*);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend14.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend14.C
new file mode 100644
index 000000000..5c244112a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend14.C
@@ -0,0 +1,17 @@
+// PR c++/35109
+
+struct C;
+void f() {
+ struct A {
+ friend struct B;
+ friend struct C;
+ void g()
+ {
+ B *b; // { dg-error "not declared" }
+ C* c; // OK, finds ::C
+ }
+ };
+ C *c; // OK, finds ::C
+ struct B {};
+ B *b; // OK, now it isn't hidden
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend15.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend15.C
new file mode 100644
index 000000000..e05cc5557
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend15.C
@@ -0,0 +1,11 @@
+// Origin: PR c++/35109
+// { dg-do compile }
+
+void foo()
+{
+ struct A
+ {
+ friend class B;
+ };
+ B::B() {} // { dg-error "has not been declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend2.C
new file mode 100644
index 000000000..765c69b67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend2.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Albert Chin <bugzilla-gcc@thewrittenword.com>
+// Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/14513, unqualified lookup of friend class.
+
+struct S {
+ void test (void);
+};
+
+namespace NS {
+ class X {
+ friend class S;
+ static int *i; // { dg-error "private" }
+ };
+}
+
+void S::test () {
+ NS::X::i; // { dg-error "this context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend3.C
new file mode 100644
index 000000000..2a58dd8ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend3.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Friend name lookup in class defined outside its namespace
+
+namespace A {
+ class B;
+ class C;
+}
+
+class A::B {
+ friend class C;
+ typedef int i;
+};
+
+class A::C {
+ A::B::i j;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend4.C
new file mode 100644
index 000000000..86ac91561
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend4.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Friend name lookup in class defined outside its namespace
+// (Local class case)
+
+void f() {
+ class A {
+ class B;
+ class C;
+ };
+
+ class A::B {
+ friend class C;
+ typedef int i;
+ };
+
+ class A::C {
+ A::B::i j;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend5.C
new file mode 100644
index 000000000..5be37bbd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend5.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Origin: aroach@stoic.electriceyeball.com
+
+// PR c++/3332: Friend function lookup in class defined outside its
+// namespace
+
+namespace N
+{
+ class A;
+}
+
+class N::A
+{
+ void x();
+ friend void func(void);
+};
+
+namespace N
+{
+ void func(void);
+}
+
+void N::func(void)
+{
+ N::A a;
+ a.x();
+}
+
+int main()
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend6.C
new file mode 100644
index 000000000..e3dafb1d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend6.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: Matt Austern <austern@apple.com>
+
+// PR c++/19258: Wrong lookup scope for friend defined in class.
+
+class X {
+ template<class T> friend int ff(T*, int y=anX.x) { return y; }
+ int f() { return ff(&anX); }
+
+ static X anX;
+ int x;
+};
+
+X dummy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend7.C
new file mode 100644
index 000000000..ce9b79f8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend7.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// PR c++/7874: Don't inject friend functions into global name space.
+
+namespace N { template<typename T> struct A { friend void f(A) { } }; }
+int main()
+{
+ N::A<int> a;
+ N::f(a); // { dg-error "not a member" }
+}
+
+struct S { friend void g(); friend void h(S); };
+struct T { friend void g(); friend void h(T); };
+void i() {
+ g(); // { dg-error "not declared" }
+ S s;
+ h(s);
+ T t;
+ h(t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend8.C
new file mode 100644
index 000000000..e9992cdad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend8.C
@@ -0,0 +1,12 @@
+// Test that we look up a friend declared at top level ahead of an
+// undeclared friend found by argument dependent lookup.
+
+// { dg-do run }
+
+int f(int) { return 0; }
+
+struct S {
+ friend int f(char) { return 1; }
+};
+
+int main () { return f('a'); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend9.C
new file mode 100644
index 000000000..caf685c3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/friend9.C
@@ -0,0 +1,23 @@
+// PR c++/25492
+
+class Base {
+public:
+ class Nested {};
+};
+
+class Derived:public Base {
+public:
+ class Nested {
+ public:
+ void m();
+ };
+ class AnotherNested {
+ friend class Nested;
+ AnotherNested() {}
+ };
+};
+
+void Derived::Nested::m() {
+ Derived::AnotherNested instance;
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class1.C
new file mode 100644
index 000000000..b3be4e8e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class1.C
@@ -0,0 +1,8 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+ B *b; // { dg-error "type|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class10.C
new file mode 100644
index 000000000..c9b5ca9f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class10.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Verify that a friend class is hidden even if it overrides a builtin
+// function name.
+
+class A {
+ friend class abort;
+ abort *b; // { dg-error "type|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class11.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class11.C
new file mode 100644
index 000000000..8432e32d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class11.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Verify that a friend class is hidden even if it is hidden by a non-builtin
+// function name.
+
+namespace M {
+ void F (void);
+ class F;
+}
+
+namespace N {
+ void F(void);
+ class A {
+ friend class F;
+ };
+}
+
+using namespace M;
+using namespace N;
+
+class F *b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class12.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class12.C
new file mode 100644
index 000000000..4a3f2d761
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class12.C
@@ -0,0 +1,24 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/36019
+// { dg-do compile }
+
+struct F {
+ static const int x = 0;
+};
+
+struct A {
+ template <typename A>
+ static int f ()
+ {
+ return A::x;
+ }
+};
+
+
+int
+main ()
+{
+ int i = A::f<F> ();
+ return i;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class13.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class13.C
new file mode 100644
index 000000000..2f685b2cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class13.C
@@ -0,0 +1,25 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/36019
+// { dg-do compile }
+
+struct F {
+ static const int x = 0;
+};
+
+struct B {
+ template <typename B>
+ struct C
+ {
+ static int f ()
+ {
+ return B::x;
+ }
+ };
+};
+
+int
+main ()
+{
+ int j = B::C<F>::f ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class14.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class14.C
new file mode 100644
index 000000000..99bd6731b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class14.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/36019
+// { dg-do compile }
+
+struct F {
+ static const int x = 0;
+ typedef int A;
+};
+
+struct A {
+ template <typename A>
+ struct G : public F
+ {
+ static const A i = 0;
+ };
+};
+
+int
+main ()
+{
+ return A::G<F>::i ;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class15.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class15.C
new file mode 100644
index 000000000..b0ed660a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class15.C
@@ -0,0 +1,30 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/36019
+// { dg-do compile }
+
+struct F {
+ static const int y = 0;
+};
+
+struct A {
+ static const int x = 0;
+};
+
+struct B : public A {
+ template <typename A>
+ struct C
+ {
+ static int f ()
+ {
+ return A::x; // { dg-error "'x' is not a member of 'F'" }
+ }
+ };
+};
+
+int
+main ()
+{
+ int j = B::C<F>::f ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class16.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class16.C
new file mode 100644
index 000000000..25cc40294
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class16.C
@@ -0,0 +1,27 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/36019
+// { dg-do compile }
+
+struct F {
+ static const int y = 0;
+};
+
+struct A {
+ static const int x = 0;
+};
+
+struct B : public A {
+ template <typename A>
+ static int f ()
+ {
+ return A::x; // { dg-error "'x' is not a member of 'F'" }
+ }
+};
+
+int
+main ()
+{
+ int j = B::f<F> ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class17.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class17.C
new file mode 100644
index 000000000..3d5ccec39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class17.C
@@ -0,0 +1,22 @@
+// Origin PR c++/51641
+// { dg-do compile }
+
+struct A {
+ struct B { typedef int X; };
+};
+
+template<class B> struct C : A {
+ B::X q; // Ok: A::B.
+ struct U { typedef int X; };
+ template<class U>
+ struct D;
+};
+
+template<class B>
+template<class U>
+struct C<B>::D {
+ typename U::X r; // { dg-error "" }
+};
+
+C<int>::D<double> y;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class2.C
new file mode 100644
index 000000000..19287a5fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class2.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+};
+
+class B* b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class3.C
new file mode 100644
index 000000000..50a7e331c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class3.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+
+ class B;
+ B *b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class4.C
new file mode 100644
index 000000000..c407692ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class4.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+};
+
+class B *b;
+B *c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class5.C
new file mode 100644
index 000000000..c2413546b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class5.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+};
+
+B* b; // { dg-error "type|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class6.C
new file mode 100644
index 000000000..964253539
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class6.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: Jay Cox <jaycox@gimp.org>
+
+// PR c++/1016: Name lookup for injected friend class
+
+class B;
+
+namespace N {
+ class A {
+ friend class B;
+ B* b;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class7.C
new file mode 100644
index 000000000..a46ae711d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class7.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+};
+
+class C {
+ friend class B;
+};
+
+B *b; // { dg-error "type|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class8.C
new file mode 100644
index 000000000..ea4e2f1bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class8.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+namespace N {
+ class A {
+ friend class B;
+ };
+}
+
+class N::B { // { dg-error "not name a class" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class9.C
new file mode 100644
index 000000000..de86b1269
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-class9.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+namespace N {
+ class A {
+ friend class B;
+ };
+}
+
+using N::B; // { dg-error "declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C
new file mode 100644
index 000000000..8cdb235e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C
@@ -0,0 +1,8 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+ B<int> *b; // { dg-error "type|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C
new file mode 100644
index 000000000..2134635a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+namespace N {
+ class A {
+ template <class T> friend class B;
+ };
+}
+
+template <class T> class N::B { // { dg-error "not name a class" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C
new file mode 100644
index 000000000..6e8cbdbb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+namespace N {
+ class A {
+ template <class T> friend class B;
+ };
+}
+
+using N::B; // { dg-error "declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C
new file mode 100644
index 000000000..56ba76b3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+};
+
+class B* b; // { dg-error "argument required|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C
new file mode 100644
index 000000000..3f96622ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+ template <class T> class B;
+ B<int> *b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C
new file mode 100644
index 000000000..3d085e224
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+};
+
+B<int> *b; // { dg-error "type|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C
new file mode 100644
index 000000000..e6b30b291
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+};
+
+template <class T> class B;
+B<int>* b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C
new file mode 100644
index 000000000..2072695ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class B;
+namespace N {
+ class A {
+ template <class T> friend class B;
+ B* b;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C
new file mode 100644
index 000000000..19dd95248
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+};
+
+class C {
+ template <class T> friend class B;
+};
+
+B<int> *b; // { dg-error "type|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C
new file mode 100644
index 000000000..247c78cf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ template <class T> friend class B;
+};
+
+class C {
+ friend class B; // { dg-error "argument required|friend" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C
new file mode 100644
index 000000000..783139b66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+class A {
+ friend class B;
+};
+
+class C {
+ template <class T> friend class B; // { dg-error "not a template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-var1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-var1.C
new file mode 100644
index 000000000..6be32b581
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/hidden-var1.C
@@ -0,0 +1,19 @@
+// Origin PR c++/45625
+// { dg-do compile }
+
+struct Outer
+{
+ static const int value = 1 ;
+
+ template< int value >
+ struct Inner
+ {
+ static const int*
+ get_value()
+ {
+ return &value ;// { dg-error "lvalue required" }
+ }
+ };
+};
+
+template class Outer::Inner<2>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/java1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/java1.C
new file mode 100644
index 000000000..0d9b22ee1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/java1.C
@@ -0,0 +1,68 @@
+// { dg-do compile }
+// { dg-options "-fdollars-in-identifiers" }
+// Origin: Giovanni Bajo <giovannibajo at libero dot it>
+// Make sure that Java special functions can be called correctly.
+
+extern "Java"
+{
+ typedef __java_int jint;
+ namespace java
+ {
+ namespace lang
+ {
+ class Class;
+ class Object;
+ class Throwable {};
+ class Foo;
+ }
+ }
+}
+
+typedef struct java::lang::Object* jobject;
+typedef struct java::lang::Throwable* jthrowable;
+typedef class java::lang::Class* jclass;
+using java::lang::Foo;
+
+class Foo : public java::lang::Throwable
+{
+public:
+ static ::java::lang::Class class$;
+};
+
+
+/*
+ * Step 1: no declarations. A declaration for _Jv_Throw is created.
+ */
+
+void Bar1(void)
+{
+ Foo* f = new java::lang::Foo; // { dg-error "call to Java constructor" }
+ throw (f);
+}
+
+
+/*
+ * Step 2: constructor declaration
+ */
+
+extern "C" jobject _Jv_AllocObject (jclass) __attribute__((__malloc__));
+
+void Bar2(void)
+{
+ Foo* f = new java::lang::Foo;
+ throw (f);
+}
+
+
+/*
+ * Step 3: overloads
+ */
+
+jobject _Jv_AllocObject (jclass, jint, float) __attribute__((__malloc__));
+void _Jv_Throw (int, float) __attribute__ ((__noreturn__));
+
+void Bar3(void)
+{
+ Foo* f = new java::lang::Foo; // { dg-error "should never be overloaded" }
+ throw (f); // { dg-error "should never be overloaded" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/java2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/java2.C
new file mode 100644
index 000000000..26fd36922
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/java2.C
@@ -0,0 +1,47 @@
+// { dg-do compile }
+// { dg-options "-fdollars-in-identifiers" }
+// Origin: Giovanni Bajo <giovannibajo at libero dot it>
+// Make sure that Java special functions can be called correctly.
+// (continue from java1.C)
+
+extern "Java"
+{
+ typedef __java_int jint;
+ namespace java
+ {
+ namespace lang
+ {
+ class Class;
+ class Object;
+ class Throwable {};
+ class Foo;
+ }
+ }
+}
+
+typedef struct java::lang::Object* jobject;
+typedef struct java::lang::Throwable* jthrowable;
+typedef class java::lang::Class* jclass;
+using java::lang::Foo;
+
+class Foo : public java::lang::Throwable
+{
+public:
+ static ::java::lang::Class class$;
+};
+
+/*
+ * Step 4: Manual declaration of _Jv_Throw
+ * This is the last case we need to test. In the other file we're testing
+ * the compiler is able to generate an artifical declaration for this
+ * function, so we need to test here if it works with a normal declaration.
+ */
+
+extern "C" jobject _Jv_AllocObject (jclass) __attribute__((__malloc__));
+extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__));
+
+void Bar4(void)
+{
+ Foo* f = new java::lang::Foo;
+ throw (f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig1.C
new file mode 100644
index 000000000..727372719
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10026. We ICE'd
+
+class X;
+
+void foo() {
+ X x(1); // { dg-error "incomplete type" "" }
+ bar(x); // { dg-error "not declared" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig10.C
new file mode 100644
index 000000000..f2fce9cf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig10.C
@@ -0,0 +1,12 @@
+// Test for proper handling of class-scope enums.
+
+struct A
+{
+ enum E { e };
+ friend void f (E);
+};
+
+int main()
+{
+ f(A::e);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig11.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig11.C
new file mode 100644
index 000000000..dab853bf0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig11.C
@@ -0,0 +1,12 @@
+// Test that we treat unions like other classes in arg-dep lookup.
+
+union U
+{
+ friend void f (U);
+};
+
+int main()
+{
+ U u;
+ f(u);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig12.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig12.C
new file mode 100644
index 000000000..c13589939
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig12.C
@@ -0,0 +1,18 @@
+// PR c++/41305
+// We got into infinite recursion instantiating the B<U> series.
+
+template <class T> struct A { };
+template <class T, class U = A<T> > struct B;
+template <class T> struct C { };
+
+template <class T, class U> struct B: C<B<U> >
+{
+ friend void f(B) { }
+};
+
+B<int> b;
+
+int main()
+{
+ f(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig13.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig13.C
new file mode 100644
index 000000000..625a181f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig13.C
@@ -0,0 +1,16 @@
+// PR c++/42687
+// DR 705
+
+namespace N
+{
+ struct S { };
+ void f(const S &) { }
+}
+
+void f(const N::S &) { }
+
+int main()
+{
+ N::S v;
+ (f)(v); // no ambiguity: ADL is prevented with (), only ::f is considered
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig2.C
new file mode 100644
index 000000000..04f952589
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig2.C
@@ -0,0 +1,15 @@
+struct S
+{
+ template <typename T> void operator() (T) {}
+};
+
+namespace N
+{
+ S s;
+ struct A {} a;
+}
+
+using N::s;
+
+void f () { s(N::a); }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig3.C
new file mode 100644
index 000000000..c5dedbe70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig3.C
@@ -0,0 +1,13 @@
+extern "C" void abort ();
+
+struct S {
+};
+void f(S, int) { abort(); }
+void f(S, double) {}
+
+S s;
+
+int main() {
+ extern void f(S, int);
+ f(s, 3.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig4.C
new file mode 100644
index 000000000..49fa5eaa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig4.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Oct 2004 <nathan@codesourcery.com>
+
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// Incorrect koenig lookup
+
+struct A {};
+
+struct B {
+ static void foo();
+ static void bar(const A &);
+};
+
+void bar(const A &){}
+
+void B::foo () {
+ A a;
+ bar (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig5.C
new file mode 100644
index 000000000..c44543bd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig5.C
@@ -0,0 +1,49 @@
+// Koenig lookup is not defined as intended in the std. DR 218 gives
+// an indication of what is meant. This test case encapsulates the
+// current conservative behaviour
+
+// Copyright (C) 2006 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Aug 2006 <nathan@codesourcery.com>
+
+namespace N
+{
+ struct A {};
+ void One (...); // { dg-message "N::One" }
+ void (*Two) (...); // { dg-message "N::Two" }
+ namespace Three {} // { dg-message "N::Three" }
+}
+
+namespace M
+{
+ struct B {};
+ struct One {}; // { dg-message "M::One" }
+ void (*Two) (...); // { dg-message "M::Two" }
+ void Three (...); // { dg-message "M::Three" }
+}
+
+namespace O
+{
+ struct C {};
+ void Two (...); // { dg-message "O::Two" }
+}
+
+void g (N::A *a, M::B *b, O::C *c)
+{
+ One (a); // ok
+ One (a, b); // ok
+ One (b); // { dg-error "not declared" }
+ // { dg-message "suggested alternatives" "suggested alternative for One" { target *-*-* } 34 }
+
+ Two (c); // ok
+ Two (a, c); // ok
+ Two (a); // { dg-error "not declared" }
+ // { dg-message "suggested alternatives" "suggested alternative for Two" { target *-*-* } 39 }
+ Two (a, a); // error masked by earlier error
+ Two (b); // error masked by earlier error
+ Two (a, b); // error masked by earlier error
+
+ Three (b); // ok
+ Three (a, b); // ok
+ Three (a); // { dg-error "not declared" }
+ // { dg-message "suggested alternatives" "suggested alternative for Three" { target *-*-* } 47 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig6.C
new file mode 100644
index 000000000..9fdf771e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig6.C
@@ -0,0 +1,18 @@
+// PR c++/17365
+// ADL should not find B::N.
+
+namespace A
+{
+ namespace B
+ {
+ template <typename T> struct N {int n_;};
+ }
+ template <typename T> int N( T p ) { return p->n_; }
+ template <typename T> void f( T p ) { N(p); } // #1
+}
+int main()
+{
+ A::B::N<int> n;
+ A::f(&n);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig7.C
new file mode 100644
index 000000000..bc54ba96b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig7.C
@@ -0,0 +1,12 @@
+// PR c++/34870
+
+template <typename T>
+struct Foo
+{
+ friend void func(const Foo &) {}
+};
+
+void check(const Foo<int> & x)
+{
+ func(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig8.C
new file mode 100644
index 000000000..b5558552d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig8.C
@@ -0,0 +1,14 @@
+// PR c++/42026, DR 239
+// The local extern declaration prevents arg-dependent lookup.
+// { dg-do link }
+
+namespace NS {
+ class T { };
+ void g(T, int);
+}
+NS::T parm;
+void g(NS::T, float) { }
+int main() {
+ extern void g(NS::T, float);
+ g(parm, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig9.C
new file mode 100644
index 000000000..f867a32ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/koenig9.C
@@ -0,0 +1,25 @@
+// Test for sensible handling of template-ids with arg-dep lookup.
+// This is still an open issue.
+
+namespace N
+{
+ struct A { };
+ void f(void (*)(int, N::A));
+}
+
+namespace M
+{
+ struct B { };
+ void f(void (*)(B, N::A));
+}
+
+template <class T>
+void g(T, N::A);
+
+void g();
+
+int main()
+{
+ f(g<int>);
+ f(g<M::B>);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage1.C
new file mode 100644
index 000000000..aa6983c54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage1.C
@@ -0,0 +1,4 @@
+// DR 563
+
+extern int i; // { dg-message "linkage" }
+extern "C" int i; // { dg-error "linkage" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage2.C
new file mode 100644
index 000000000..994264d3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/linkage2.C
@@ -0,0 +1,7 @@
+// PR c++/27227
+
+namespace x {
+ extern "C" const int y;
+}
+using x::y;
+extern "C" int const y=0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/main1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/main1.C
new file mode 100644
index 000000000..1de834235
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/main1.C
@@ -0,0 +1,3 @@
+struct main {};
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/member1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/member1.C
new file mode 100644
index 000000000..82bb657f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/member1.C
@@ -0,0 +1,11 @@
+// PR c++/14186
+
+struct Base
+{
+ enum { Derived };
+};
+
+class Derived : public Base
+{
+ Derived();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash1.C
new file mode 100644
index 000000000..6ee4be350
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash1.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Jakub Jelinek <jakub@redhat.com>
+// PR c++/5402
+
+struct A
+{
+ struct B {};
+};
+
+struct C
+{
+ typedef int B;
+};
+
+struct D : A
+{
+ struct E : C {};
+ struct B {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash10.C
new file mode 100644
index 000000000..0a089be25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash10.C
@@ -0,0 +1,8 @@
+// PR c++/38313
+
+struct foo { };
+struct bar { };
+
+struct baz {
+ static foo (bar)();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash2.C
new file mode 100644
index 000000000..c200eeebd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: Sven Bilke <bilkes@mail.nih.gov>
+// PR c++/9777
+
+struct A
+{
+ struct X {};
+ struct Y { void X(); };
+};
+
+struct B : A
+{
+ struct Y : A::Y {};
+ struct X : A::X {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash3.C
new file mode 100644
index 000000000..eb52a7c10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash3.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/12102
+
+struct A
+{
+ struct C {} C;
+};
+
+struct B : A
+{
+ struct C {} C;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash4.C
new file mode 100644
index 000000000..490f7500e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash4.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18100: Invalid nested type.
+
+struct A
+{
+ template<int> struct A {}; // { dg-error "same name" }
+};
+
+A::A<0> a; // { dg-error "not a template|constructor" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash5.C
new file mode 100644
index 000000000..74595c268
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash5.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// C++ Standard, 3.3, clause 4:
+// "[Note: a namespace name or a class template name must be unique in its
+// declarative region (7.3.2, clause 14). ]"
+
+namespace N
+{ // { dg-message "previous declaration" }
+}
+
+class N; // { dg-error "redeclared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash6.C
new file mode 100644
index 000000000..6918142f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash6.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// C++ Standard, 3.3, clause 4:
+// "[Note: a namespace name or a class template name must be unique in its
+// declarative region (7.3.2, clause 14). ]"
+
+class N; // { dg-message "previous declaration" }
+
+namespace N
+{ // { dg-error "redeclared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash7.C
new file mode 100644
index 000000000..5c0690aa8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash7.C
@@ -0,0 +1,11 @@
+// PR c++/28513
+
+class foo { // { dg-error "changes meaning" }
+public:
+ typedef int bar;
+};
+
+class baz {
+public:
+ foo::bar foo; // { dg-error "declaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash8.C
new file mode 100644
index 000000000..40c487d6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash8.C
@@ -0,0 +1,8 @@
+// PR c++/38278
+
+struct foo { };
+void bar();
+
+struct baz {
+ static foo (bar)();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash9.C
new file mode 100644
index 000000000..1e04fafd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/name-clash9.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR c++/48010
+
+struct A
+{
+ struct type {}; // { dg-message "previous" }
+ typedef int type; // { dg-error "conflicts" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested1.C
new file mode 100644
index 000000000..c8988e278
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested1.C
@@ -0,0 +1,25 @@
+// Build don't link:
+//
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Raymond <raymond@magma.magma-da.com>.
+//
+// PR c++/47 The parser failed to resolve 'B' in the return type of
+// A::C::D::foo.
+
+class A {
+public:
+ class B;
+ class C;
+};
+
+class A::B {
+};
+
+class A::C {
+ class D;
+};
+
+class A::C::D {
+public:
+ B* foo();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested2.C
new file mode 100644
index 000000000..361a0c75d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/nested2.C
@@ -0,0 +1,6 @@
+// PR c++/51586
+
+union U
+{
+ union U { int i; }; // { dg-error "same name" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/new1.C
new file mode 100644
index 000000000..11a6d97dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/new1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// Origin: <igodard at rational dot com>
+// PR c++/2518: operator new must not be looked up in local scope
+
+int main() {
+ int i;
+ void* operator new(__SIZE_TYPE__ s, int* p);
+ int* e = new(&i) int; // { dg-error "no matching function" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+ int* f = new int;
+ return 0;
+}
+
+// { dg-message "operator new|candidate expects" "" { target *-*-* } 0 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/new2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/new2.C
new file mode 100644
index 000000000..d468182c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/new2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// Reject [de-]allocation functions declared in a namespace, or
+// declared as static.
+
+namespace A {
+ void* operator new(__SIZE_TYPE__ s, int* p); // { dg-error "namespace" }
+ void operator delete(void*); // { dg-error "namespace" }
+}
+
+static void* operator new(__SIZE_TYPE__ s, int* p); // { dg-error "static" }
+static void operator delete(void*); // { dg-error "static" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns1.C
new file mode 100644
index 000000000..feeaf751c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns1.C
@@ -0,0 +1,22 @@
+// PR c++/12862
+
+typedef int Thingo;
+
+namespace A
+{
+ void
+ Thingo();
+}
+
+void
+A::Thingo()
+{
+ ;
+}
+
+int
+main()
+{
+ A::Thingo();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns2.C
new file mode 100644
index 000000000..2ad2ec0e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns2.C
@@ -0,0 +1,17 @@
+// PR c++/18161
+
+namespace m
+{
+ namespace n
+ {
+ }
+}
+
+namespace n
+{
+}
+
+namespace o
+{
+ namespace n = ::m::n;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns3.C
new file mode 100644
index 000000000..144cba73d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns3.C
@@ -0,0 +1,5 @@
+// PR c++/32898
+
+namespace N { }
+
+int N::i; // { dg-error "should have been declared inside" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns4.C
new file mode 100644
index 000000000..aabfcfcb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ns4.C
@@ -0,0 +1,21 @@
+// PR c++/43145
+// { dg-do link }
+
+namespace N {
+ void f();
+}
+
+void N::f()
+{
+ extern int i;
+ extern void g();
+ i = 1;
+ g();
+}
+
+namespace N {
+ int i;
+ void g() { }
+}
+
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/pr6936.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/pr6936.C
new file mode 100644
index 000000000..377fbcce1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/pr6936.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// PR c++/6936
+
+struct Baser
+{
+ enum { j, i }; // { dg-error "inaccessible" }
+};
+
+struct Base : Baser
+{
+ static void j();
+ static void i();
+};
+
+struct Derv : Base
+{
+ using Baser::j;
+private:
+ using Baser::i;
+};
+
+int k = Derv::j;
+int l = Derv::i; // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/pretty1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/pretty1.C
new file mode 100644
index 000000000..a03bd3c3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/pretty1.C
@@ -0,0 +1 @@
+void foo() { for ( __PRETTY_FUNCTION__ ; ; ) ; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ptrmem1.C
new file mode 100644
index 000000000..5bdef2621
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/ptrmem1.C
@@ -0,0 +1,15 @@
+struct A {
+ virtual void f ();
+};
+
+struct B : public A {
+};
+
+struct C : public A {
+};
+
+struct D : public B, C {
+ virtual void f ();
+};
+
+void (D::*p)() = &D::f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/redecl1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/redecl1.C
new file mode 100644
index 000000000..436316ca0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/redecl1.C
@@ -0,0 +1,7 @@
+// PR c++/14668
+
+class A {}; // { dg-error "" }
+class B {
+ static A *A; // { dg-error "" }
+};
+A *B::A = 0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scope-operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scope-operator1.C
new file mode 100644
index 000000000..fde36f01e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scope-operator1.C
@@ -0,0 +1,20 @@
+/* PR c++/250 */
+/* { dg-do compile } */
+
+template <class T> void Bar(T *p)
+{
+}
+
+template <class T> class Foo
+{
+public:
+ Foo(T *p) { Bar(p); }
+ // The global scope operator wasn't respected in this case under gcc 3.0
+ void Bar(T *p) { ::Bar<T>(p); }
+};
+
+int main()
+{
+ double* d;
+ Foo<double> f(d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped1.C
new file mode 100644
index 000000000..f1d3f403e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped1.C
@@ -0,0 +1,22 @@
+// Test that explicitly scoped references to static members work even if
+// they belong to an inaccessible base.
+
+struct A
+{
+ static int i1;
+ int i2; // { dg-error "inaccessible" "" }
+ static void f1 ();
+ void f2 ();
+};
+
+struct B: private A { };
+struct C: public B
+{
+ void g ()
+ {
+ ::A::i1 = 1;
+ ::A::i2 = 1; // { dg-error "(access)|(context)" "" }
+ ::A::f1 ();
+ ::A::f2 (); // { dg-error "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped2.C
new file mode 100644
index 000000000..99cedcec8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// Seg faulted.
+
+struct Base
+{
+};
+
+struct Derived : Base
+{
+ void Foo ()
+ {
+ Base::Baz (); // { dg-error "is not a member" "" }
+
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped3.C
new file mode 100644
index 000000000..12ef8c8a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped3.C
@@ -0,0 +1,23 @@
+
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com>
+
+// PR 7964. ICE with scoped method call
+
+struct A {
+ virtual void ostr() const;
+};
+
+class B : public virtual A {};
+
+template<typename T>
+struct C : public B
+{
+ void ostr() const
+ { B::ostr(); }
+};
+
+
+template struct C<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped4.C
new file mode 100644
index 000000000..2d9d90a17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped4.C
@@ -0,0 +1,15 @@
+/* PR c++/754 */
+/* { dg-do compile } */
+
+namespace foo
+{
+ namespace bar
+ {
+ enum x {foo
+ };
+ enum {ubit0 = 0x0001};
+ // Used to get a parse error before "::" token.
+ int i=foo::bar::ubit0;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped5.C
new file mode 100644
index 000000000..a4aa7298f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: pepeaty@yahoo.com
+
+// PR c++/10230: ICE while determining if refered non-static member
+// is from a base type of the current class.
+
+class A {
+public:
+ class B {
+ public:
+ int a;
+ };
+};
+
+class C {
+public:
+ void f(void) { sizeof(A::B::a); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped6.C
new file mode 100644
index 000000000..51393961a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped6.C
@@ -0,0 +1,17 @@
+template <typename X>
+class Foo {
+ int i;
+public:
+ Foo() {
+ X::explode(); // { dg-error "" }
+ }
+};
+
+class Bar {
+ Foo<int> foo_;
+public:
+ Bar() {} // { dg-message "required" }
+};
+
+template class Foo<int>;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped7.C
new file mode 100644
index 000000000..a9d70d06e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped7.C
@@ -0,0 +1,20 @@
+//PR c++/11507
+// Origin: kai-gcc-bugs@khms.westfalen.de and bangerth@dealii.org
+//The new parser used to fail on this.
+
+// { dg-do compile }
+
+namespace NS
+{
+ void foo(bool arg1);
+}
+
+namespace M {
+ namespace K {
+ bool Bc(bool x);
+ }
+
+ void bar() {
+ NS::foo (K::Bc(true)); // GCC could not find K or Bc.
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped8.C
new file mode 100644
index 000000000..2764f75c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/scoped8.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10371: Incorrect tree node built in
+// finish_non_static_data_member.
+
+struct A
+{
+ int i; // { dg-error "non-static" }
+};
+
+template <int> struct B
+{
+ int foo() { return A::i; } // { dg-error "this location" }
+};
+
+template struct B<0>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-1.C
new file mode 100644
index 000000000..aa0c5f9be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-1.C
@@ -0,0 +1,16 @@
+// PR c++/13594 (secondary)
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace fool {
+ inline namespace foo {
+ template <class T> void swap(T, T);
+ }
+ template <class T> void swap(T);
+}
+
+int main() {
+ // we used to fail to look up the associated namespace here
+ fool::swap(1, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-2.C
new file mode 100644
index 000000000..d9f99a8d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-2.C
@@ -0,0 +1,24 @@
+// PR c++/13594
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace foo {
+ inline namespace foo_impl {
+ class T; // { dg-message "T" "" }
+ }
+}
+namespace bar {
+ inline namespace bar_impl {
+ class T; // { dg-message "T" "" }
+ }
+ using namespace foo;
+}
+namespace baz {
+ using namespace foo;
+ using namespace bar;
+}
+
+foo::T *t1;
+bar::T *t2;
+baz::T *t3; // { dg-error "(ambiguous|does not name a type)" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-3.C
new file mode 100644
index 000000000..7679c6f1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-3.C
@@ -0,0 +1,18 @@
+// PR c++/13659
+
+// { dg-options "" }
+// { dg-do compile }
+
+namespace bar {
+ inline namespace foo {
+ template <class T> void f(T, T);
+ }
+ template <class T> void f(T);
+}
+
+int main() {
+ // Make sure both declarations are brought in.
+ using bar::f;
+ f(1);
+ f(1, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-4.C
new file mode 100644
index 000000000..5ea17844a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-4.C
@@ -0,0 +1,8 @@
+// PR c++/16301
+
+// { dg-do compile }
+
+namespace NS2
+{
+ using namespace NS1 __attribute__ ((strong)); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-5.C
new file mode 100644
index 000000000..555adb0c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/strong-using-5.C
@@ -0,0 +1,26 @@
+// PR c++/33486
+
+// { dg-options "" }
+
+namespace A
+{
+ inline namespace B
+ {
+ struct T
+ {
+ struct U { };
+ U f();
+ };
+ }
+
+ inline namespace C
+ {
+ void g (T::U);
+ }
+}
+
+int main()
+{
+ A::T t;
+ g(t.f());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct-hack1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct-hack1.C
new file mode 100644
index 000000000..e84d65b33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct-hack1.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Apr 2003 <nathan@codesourcery.com>
+
+// PR 10405. ICE
+
+#define MEM_ENUM(name) int name; enum name {};
+
+struct Base
+{
+ MEM_ENUM (a)
+ MEM_ENUM (b)
+ MEM_ENUM (c)
+ MEM_ENUM (d)
+ MEM_ENUM (e)
+ MEM_ENUM (f)
+ MEM_ENUM (g)
+ MEM_ENUM (h)
+ MEM_ENUM (i)
+ MEM_ENUM (j)
+ MEM_ENUM (k)
+ MEM_ENUM (l)
+ MEM_ENUM (m)
+ MEM_ENUM (n)
+ MEM_ENUM (o)
+ MEM_ENUM (p)
+ MEM_ENUM (q)
+ MEM_ENUM (r)
+ MEM_ENUM (s)
+ MEM_ENUM (t)
+ MEM_ENUM (u)
+ MEM_ENUM (v)
+ MEM_ENUM (w)
+ };
+
+struct D : Base {};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct1.C
new file mode 100644
index 000000000..7c1e38c18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct1.C
@@ -0,0 +1,14 @@
+// Various struct lookup tests. We didn't used to complain about
+// the definition of C.
+
+struct A;
+typedef struct A B; // { dg-message "previous declaration" }
+struct B; // { dg-error "using typedef-name" }
+
+typedef struct { int i; } C; // { dg-message "previous declaration" }
+struct C; // { dg-error "using typedef-name" }
+
+struct D;
+typedef struct D D;
+typedef struct D { int i; } D;
+typedef struct D D;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct2.C
new file mode 100644
index 000000000..a66f403c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/struct2.C
@@ -0,0 +1,7 @@
+// PR c++/14510
+
+struct c {};
+namespace A {
+ int c(struct c*req);
+}
+int A::c(struct c*req) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/suggestions1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/suggestions1.C
new file mode 100644
index 000000000..1185d5841
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/suggestions1.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+namespace N { namespace M { int foo; } } // { dg-message "N::M::foo" }
+int f (void) { return N::foo; } // { dg-error "not a member" }
+// { dg-message "suggested alternative" "missing namespace" { target *-*-* } 4 }
+
+int g (void) { return ::foo; } // { dg-error "not been declared" }
+// { dg-message "suggested alternative" "omitted namespace" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template1.C
new file mode 100644
index 000000000..44b599a6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template1.C
@@ -0,0 +1,23 @@
+/* PR c++/3009 */
+/* { dg-do run } */
+// According to 14.6.2.4 of C++ Standard:
+// "If a base class is a dependent type, a member of that
+// class cannot hide a name declared within a template, or a
+// name from the template's enclosing scopes."
+
+class B {
+public:
+ int foo() { return 1; }
+};
+
+int foo() { return 0; }
+
+template <class T> class C : public T {
+public:
+ int caller() { return foo(); } // This must be ::foo, not B::foo.
+};
+
+int main() {
+ C<B> c;
+ return c.caller(); // Returns 1 if we got the wrong one.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template2.C
new file mode 100644
index 000000000..0e8921261
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template2.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10199. Lookup problems
+
+class X {
+public:
+ template<int d>
+ int bar ();
+};
+
+template<int x>
+int fooo ();
+
+template<class T>
+void bar (T& g)
+{
+ int kk = fooo<17>(); // OK
+ X x;
+ int k = x.bar<17>(); // Not OK
+}
+
+int main ()
+{
+ X x;
+ int k=x.bar<17>(); // OK
+ int n;
+ bar(n);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/template3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template3.C
new file mode 100644
index 000000000..e5f6f18ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/template3.C
@@ -0,0 +1,35 @@
+// Origin PR c++/47957
+// { dg-do compile }
+
+struct S
+{
+ int m;
+
+ S()
+ : m(0)
+ {
+ }
+};
+
+struct Base
+{
+ typedef S T;
+};
+
+template<class T>
+struct Derived : public Base
+{
+ int
+ foo()
+ {
+ T a; // This is Base::T, not the template parameter.
+ return a.m;
+ }
+};
+
+int
+main()
+{
+ Derived<char> d;
+ return d.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/this1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/this1.C
new file mode 100644
index 000000000..20051bf75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/this1.C
@@ -0,0 +1,8 @@
+// PR c++/27581
+// { dg-do compile }
+
+struct A
+{
+ template<int> static void foo();
+ static void bar() { this->A::foo<0>(); } // { dg-error "unavailable" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage1.C
new file mode 100644
index 000000000..db7117656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage1.C
@@ -0,0 +1,18 @@
+/* PR c++/2437 */
+/* { dg-do run } */
+
+// Test of two-stage name lookup.
+
+int g(double) { return 0; }
+
+template <class T> struct X
+{
+ int f() { return g(2); } // should call g(double)
+};
+
+inline int g(int) { return 1; }
+
+int main()
+{
+ return X<int>().f(); // should call g(double), but used to call g(int)
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage2.C
new file mode 100644
index 000000000..67d8ab521
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// PR c++/2922
+
+char& f(char);
+
+template<class T>
+void g(T t)
+{
+ char& c1 = f(1); // not dependent
+ char& c2 = f(t); // dependent
+}
+
+int&f (int);
+
+int main()
+{
+ g(2); // two f(char)
+ g('a'); // two f(char)
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage3.C
new file mode 100644
index 000000000..fff853c1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// PR c++/2922
+
+namespace tpl_ {
+
+template<class T>
+char test(T);
+
+template<class T>
+struct check
+{
+ static T const t;
+ enum { value = 1 == sizeof(test(t)) };
+};
+
+double test(int);
+
+}
+
+bool const two_phase_lookup_supported = tpl_::check<int>::value;
+
+int compile_time_assert[two_phase_lookup_supported ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage4.C
new file mode 100644
index 000000000..bbb44afa0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage4.C
@@ -0,0 +1,20 @@
+
+// Contributed by Douglas Gregor <doug.gregor@gmail.com>
+
+template<class T> struct wrap {};
+
+template<typename T> bool& operator==(wrap<T>, wrap<T>);
+
+template<typename T>
+void g(T, wrap<wrap<int> > x)
+{
+ bool& b = x == x; // { dg-bogus "invalid initialization of reference" "" { xfail *-*-*} }
+}
+
+template<typename T> int& operator==(wrap<wrap<T> >, wrap<wrap<T> >);
+
+void h()
+{
+ wrap<wrap<int> > x;
+ g(17, x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage5.C
new file mode 100644
index 000000000..bfc405b99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/two-stage5.C
@@ -0,0 +1,19 @@
+// { dg-do run }
+extern "C" void abort ();
+
+namespace N {
+template <class T> T foo (T) { return T (); }
+template <class T> T bar (T t) { return foo (t); }
+}
+
+struct S { S (int i = 0): i_ (i) { } int i_; };
+
+namespace N {
+/* template <> */ S foo (S) { return S (1); }
+}
+
+int main ()
+{
+ if (1 == N::bar (S()).i_)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/typedef1.C
new file mode 100644
index 000000000..f712fc25a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/typedef1.C
@@ -0,0 +1,32 @@
+// PR c++/33516
+// { dg-do compile }
+
+struct S1;
+typedef S1 T1;
+struct S1 {
+ typedef int U;
+ T1::U i;
+};
+struct S2;
+typedef S2 T2;
+struct S2 {
+ typedef int U;
+};
+T2::U j;
+struct S3;
+typedef S3 T3;
+struct S3 {
+ typedef int U;
+ S3::U i;
+};
+
+void
+foo ()
+{
+ S1 s1;
+ S2 s2;
+ S3 s3;
+ s1.i = 6;
+ j = 7;
+ s3.i = 8;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/used-before-declaration.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/used-before-declaration.C
new file mode 100644
index 000000000..b51d270c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/used-before-declaration.C
@@ -0,0 +1,5 @@
+// Copyroght (C) 2003 Free Software Foundation
+// Origin: PR/12832, Jonathan Wakely <redi@gcc.gnu.org>
+
+void f() { g(); } // { dg-error "not declared" "" }
+void g() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using-10.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using-10.C
new file mode 100644
index 000000000..1ca8a7832
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using-10.C
@@ -0,0 +1,22 @@
+// PR c++/13659
+
+// { dg-do compile }
+
+namespace foo1 {
+ template <class T> void f(T);
+}
+namespace foo2 {
+ template <class T> void f(T, T);
+}
+namespace foo {
+ using namespace foo1;
+ using namespace foo2;
+}
+
+// Make sure we bring in both declarations.
+using foo::f;
+
+int main() {
+ f(1);
+ f(1, 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using.C
new file mode 100644
index 000000000..30e22c067
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+struct X { };
+struct Y { };
+struct Z { };
+
+struct Base {
+ X f() { return X(); }
+ Y f() const { return Y(); }
+};
+
+struct Derived : Base {
+ using Base::f;
+ Z f(int) { return Z(); }
+};
+
+int main()
+{
+ Derived d;
+ X x = d.f(); // { dg-bogus "Y" "" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using11.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using11.C
new file mode 100644
index 000000000..9eb7e9fe7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using11.C
@@ -0,0 +1,9 @@
+namespace N1 {
+ enum e { a };
+ void e(char);
+}
+
+void f() {
+ using N1::e;
+ enum e x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using12.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using12.C
new file mode 100644
index 000000000..4aa5ce681
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using12.C
@@ -0,0 +1,4 @@
+// PR c++/16707
+
+int i;
+using N::i; // { dg-error "'N' has not been declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using13.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using13.C
new file mode 100644
index 000000000..c102fdcf8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using13.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Stefan Straßer <sstrasser@systemhaus-gruppe.de>
+
+// PR c++/20240:
+
+namespace A { int a; }
+
+namespace C{
+ int a;
+ using A::a; // { dg-error "already declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using14.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using14.C
new file mode 100644
index 000000000..c953bccc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using14.C
@@ -0,0 +1,9 @@
+// PR c++/21784
+// { dg-options "" }
+
+namespace mine
+{
+ int cpow;
+}
+
+using mine::cpow;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using15.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using15.C
new file mode 100644
index 000000000..b5ca3a876
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using15.C
@@ -0,0 +1,10 @@
+// PR c++/27933
+// { dg-do compile }
+
+template<int> struct A
+{
+ int i;
+ A() { using i; } // { dg-error "nested-name-specifier|declared" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using16.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using16.C
new file mode 100644
index 000000000..8a36504ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using16.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+namespace M {
+ struct S {}; // { dg-message "struct M::S" "candidate 1" }
+}
+
+namespace N {
+ int S;
+ struct S {}; // { dg-message "struct N::S" "candidate 2" }
+}
+
+using namespace M;
+using namespace N;
+
+struct ::S s; // { dg-bogus "ambiguous.*ambiguous" "duplicate error" }
+// { dg-error "reference to 'S' is ambiguous|invalid type" "" { target *-*-* } 17 }}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using17.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using17.C
new file mode 100644
index 000000000..9019dabf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using17.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+namespace M {
+ struct S {}; // { dg-message "struct M::S" "candidate 2" }
+}
+
+int S;
+struct S {}; // { dg-message "candidates are: struct S" "candidate 1" }
+
+using namespace M;
+
+struct S s; // { dg-error "reference to 'S' is ambiguous|invalid type in declaration" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using18.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using18.C
new file mode 100644
index 000000000..d64fbc6e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using18.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+namespace N1 {
+ void f ();
+ struct f; // { dg-message "" "candidate" }
+}
+
+namespace N2 {
+ void f (int);
+ struct f; // { dg-message "" "candidate" }
+}
+
+namespace M {
+ using namespace N1;
+ using namespace N2;
+}
+
+using M::f; // { dg-error "ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using19.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using19.C
new file mode 100644
index 000000000..973998bc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using19.C
@@ -0,0 +1,21 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+
+// C++ Standard, 7.3.3, clause 10:
+// "Since a using-declaration is a declaration, the restrictions on
+// declarations of the same name in the same declarative region (3.3) also
+// apply to using-declarations."
+
+namespace M
+{
+ union A;
+ void B();
+}
+
+void A();
+union B;
+
+using M::A;
+using M::B;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using2.C
new file mode 100644
index 000000000..cd878b9fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using2.C
@@ -0,0 +1,45 @@
+// Copyright (C) 2001, 2002, 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+
+// { dg-do compile }
+
+namespace N
+{
+ template<int> void f() {}
+}
+
+using N; // { dg-error "(using-declaration)|(nested-name)" "" }
+using ::N; // { dg-error "using-declaration" "" }
+using N::f< 0 >; // { dg-error "using-declaration" "" }
+
+struct A {
+ template <class T> void f(T);
+ template <class T> struct X { };
+};
+
+struct B : A {
+ using A::X; // OK
+ using A::f; // OK
+};
+
+struct C : A {
+ using A::f<double>; // { dg-error "using-declaration" "" }
+ using A::X<int>; // { dg-error "using-declaration" "" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using20.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using20.C
new file mode 100644
index 000000000..f1be41fea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using20.C
@@ -0,0 +1,18 @@
+// PR c++/40476
+
+namespace A
+{
+ int i; // { dg-message "i" }
+}
+using namespace A;
+namespace B
+{
+ namespace B2
+ {
+ int i; // { dg-message "i" }
+ }
+ using namespace B2;
+}
+using namespace B;
+
+int j = ::i; // { dg-error "ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using21.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using21.C
new file mode 100644
index 000000000..3db97b4b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using21.C
@@ -0,0 +1,13 @@
+// PR c++/40799
+
+namespace Bar {
+ typedef int A;
+}
+class CollectionDeleteGuard {
+public:
+ CollectionDeleteGuard(int);
+};
+CollectionDeleteGuard::CollectionDeleteGuard(int)
+{
+ using Bar::A;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using22.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using22.C
new file mode 100644
index 000000000..2396f9ab1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using22.C
@@ -0,0 +1,17 @@
+// PR c++/39786
+
+namespace A {
+ char (*f(char *p))[13] { return 0; }
+}
+
+namespace B {
+ namespace C {
+ char (*f(int p))[42] { return 0; }
+ }
+ using namespace C;
+}
+
+using namespace B;
+using namespace A;
+
+char x[sizeof *::f(0) == 42 ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using23.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using23.C
new file mode 100644
index 000000000..5dd8d8594
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using23.C
@@ -0,0 +1,13 @@
+// PR c++/50742
+
+typedef int A;
+
+void f(int i)
+{
+ switch (i)
+ {
+ case 0:
+ using ::A;
+ default:;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using24.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using24.C
new file mode 100644
index 000000000..4413be1f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using24.C
@@ -0,0 +1,12 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A { int next; };
+struct B { int next; };
+struct C : B { using B::next; };
+
+struct D : A, C
+{
+ using C::next;
+ void f() { next = 1; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using25.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using25.C
new file mode 100644
index 000000000..eb605700d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using25.C
@@ -0,0 +1,28 @@
+// PR c++/26256
+// { dg-do run }
+
+struct A
+{
+ int next;
+};
+
+struct B
+{
+ int next;
+};
+
+struct C : public A, public B
+{
+ using A::next;
+};
+
+void foo(C& c) { c.next = 42; }
+
+int main()
+{
+ C c;
+ foo (c);
+ c.B::next = 12;
+ if (c.next != 42 || c.A::next != 42 || c.B::next != 12)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using26.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using26.C
new file mode 100644
index 000000000..141d14581
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using26.C
@@ -0,0 +1,27 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A
+{
+ double next;
+};
+
+struct B
+{
+private:
+ int next; // { dg-error "private" }
+};
+
+struct C
+{
+ int next;
+};
+
+struct D : A, B, C // { dg-error "context" }
+{
+ using B::next;
+ void f()
+ {
+ next = 12;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using27.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using27.C
new file mode 100644
index 000000000..c94cf6ea1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using27.C
@@ -0,0 +1,48 @@
+// PR c++/26256
+// { dg-do run }
+
+struct A
+{
+ typedef int type;
+};
+
+struct B
+{
+ typedef double type;
+};
+
+struct C : A, B
+{
+ using A::type;
+ type d;
+
+ void f()
+ {
+ type e;
+ if (sizeof (type) != sizeof (A::type))
+ __builtin_abort();
+ }
+
+ void g();
+};
+
+void C::g()
+{
+ type x;
+ if (sizeof (type) != sizeof (A::type))
+ __builtin_abort();
+}
+
+int main ()
+{
+ if (sizeof (C::type) != sizeof (A::type))
+ __builtin_abort();
+
+ if (sizeof (C::d) != sizeof (A::type))
+ __builtin_abort();
+
+ C::type x;
+ C c;
+ c.f();
+ c.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using28.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using28.C
new file mode 100644
index 000000000..ae4067a23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using28.C
@@ -0,0 +1,11 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A { int f; };
+struct B { int f; };
+struct C : A, B { using B::f; };
+
+struct D : C
+{
+ void g() { f = 1; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using29.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using29.C
new file mode 100644
index 000000000..428021cf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using29.C
@@ -0,0 +1,81 @@
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+struct B
+{
+ int i;
+};
+
+struct C : A, B
+{
+ using A::i; // { dg-message "previous" }
+ using B::i; // { dg-error "redeclaration" }
+};
+
+struct E
+{
+ typedef int type;
+};
+
+struct F
+{
+ typedef int type;
+};
+
+struct G : E, F
+{
+ using E::type; // { dg-message "previous" }
+ using F::type; // { dg-error "redeclaration" }
+};
+
+struct H
+{
+ typedef int type;
+};
+
+struct I : H
+{
+ typedef int type; // { dg-message "previous" }
+ using H::type; // { dg-error "conflicts" }
+};
+
+struct I2 : H
+{
+ using H::type; // { dg-message "previous" }
+ typedef int type; // { dg-error "conflicts" }
+};
+
+struct J
+{
+ struct type {};
+};
+
+struct K : J
+{
+ struct type {}; // { dg-message "previous" }
+ using J::type; // { dg-error "conflicts" }
+};
+
+struct L : J
+{
+ using J::type; // { dg-message "previous" }
+ struct type {}; // { dg-error "conflicts" }
+};
+
+struct M
+{
+ typedef int type;
+ struct type2 {};
+};
+
+struct N : M
+{
+ using M::type; // { dg-message "previous" }
+ using M::type; // { dg-error "redeclaration" }
+ using M::type2; // { dg-message "previous" }
+ using M::type2; // { dg-error "redeclaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using3.C
new file mode 100644
index 000000000..f36427597
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using3.C
@@ -0,0 +1,12 @@
+// PR c++/9798
+
+namespace std { }
+namespace STL { using namespace std; }
+namespace std {
+ using namespace STL;
+}
+namespace STL {
+ struct A {
+ void B() { using namespace std; }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using30.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using30.C
new file mode 100644
index 000000000..3fbe96c3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using30.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct H { typedef int type; };
+struct J : H
+{
+ struct type {}; // { dg-message "previous" }
+ using H::type; // { dg-error "conflicts" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using31.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using31.C
new file mode 100644
index 000000000..3b1f6e90e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using31.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct H2 { int f (); };
+struct J2 : H2
+{
+ struct f {};
+ using H2::f;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using32.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using32.C
new file mode 100644
index 000000000..cc0e96ca6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using32.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+struct T { struct type {}; };
+struct T2 : T { using T::type; };
+struct T3 : T2
+{
+ struct type {};
+ type t;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using33.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using33.C
new file mode 100644
index 000000000..a80be0364
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using33.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+
+template <class T>
+struct Foo
+{
+ int k (float) {return 0;}
+};
+
+template <class T>
+struct Baz
+{
+ int k (int) {return 1;}
+};
+
+template <class T>
+struct Bar : Foo<T> , Baz<T>
+{
+ using Foo<T>::k;
+ using Baz<T>::k;
+};
+
+int main()
+{
+ Bar<int> bar;
+ return bar.k( 1.0f );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using34.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using34.C
new file mode 100644
index 000000000..79c019d02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using34.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+struct A { int f (); };
+struct B : A
+{
+ using A::f;
+ struct f {};
+ void g() { f(); struct f ff; }
+ struct f ff;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using35.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using35.C
new file mode 100644
index 000000000..e7e82741d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using35.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+struct A { typedef int type; };
+struct B { typedef int type; };
+struct C : B { using B::type; };
+
+struct D : A, C
+{
+ using C::type;
+ void f() { type t = 0;}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using36.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using36.C
new file mode 100644
index 000000000..966c60b89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using36.C
@@ -0,0 +1,31 @@
+// PR c++/25994
+// { dg-do run }
+
+struct B1
+{
+ void f (char) {}
+ void f (double) { __builtin_abort(); }
+};
+
+struct B2
+{
+ void f (double) { __builtin_abort(); }
+ void f (int) {}
+};
+
+struct D : public B1, public B2
+{
+ using B1::f;
+ using B2::f;
+ void g ()
+ {
+ f ('a'); // should call B1::f(char)
+ f (33); // should call B2::f(int)
+ }
+};
+
+int main()
+{
+ D d;
+ d.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using37.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using37.C
new file mode 100644
index 000000000..a71206e89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using37.C
@@ -0,0 +1,22 @@
+// PR c++/30195
+// { dg-do run }
+
+template<class T> struct B
+{
+ void foo(T) {}
+};
+
+template<class T>
+struct D : B<int>, B<double>
+{
+ using B<int>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+};
+
+int main()
+{
+ D<int> x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using38.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using38.C
new file mode 100644
index 000000000..377fbcce1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using38.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// PR c++/6936
+
+struct Baser
+{
+ enum { j, i }; // { dg-error "inaccessible" }
+};
+
+struct Base : Baser
+{
+ static void j();
+ static void i();
+};
+
+struct Derv : Base
+{
+ using Baser::j;
+private:
+ using Baser::i;
+};
+
+int k = Derv::j;
+int l = Derv::i; // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using39.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using39.C
new file mode 100644
index 000000000..56ae89a4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using39.C
@@ -0,0 +1,63 @@
+// { dg-do run }
+
+template <class T>
+struct A
+{
+ int f() { return 1; }
+};
+
+template <class T>
+struct B : A<T>
+{
+ int f() { return 2; }
+
+ using A<T>::f;
+ void g()
+ {
+ if (A<T>::f() != 1 )
+ __builtin_abort();
+
+ if( B<T>::f() != 2 )
+ __builtin_abort();
+
+ if( this->f() != 2 )
+ __builtin_abort();
+ }
+};
+
+template <class T>
+struct C
+{
+ int h( int i ) { return 1; }
+ int h( double d ) { return 2; }
+};
+
+template <class T>
+struct D : private C<T>
+{
+ using C<T>::h;
+ int h( char c ) { return 0; }
+ int h() { return 3; }
+};
+
+int main()
+{
+ B<int> b;
+ b.g();
+ b.f();
+ b.A<int>::f();
+ b.B<int>::f();
+
+ D<int> d;
+ if( d.h( 'a' ) != 0 )
+ __builtin_abort();
+
+ if( d.h( 3 ) != 1 )
+ __builtin_abort();
+
+ if( d.h( 3.14 ) != 2 )
+ __builtin_abort();
+
+ if( d.h() != 3 )
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using4.C
new file mode 100644
index 000000000..a6421c875
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using4.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
+
+// PR c++/9432: ICE in validate_nonmember_using_decl when decl is a
+// SCOPE_REF.
+
+template <class T> struct Foo;
+template <class T>
+struct Bar : public Foo<T> {
+ void foo()
+ {
+ using Foo<T>::i; // { dg-error "not a namespace" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using40.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using40.C
new file mode 100644
index 000000000..1bcdd0dbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using40.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+struct Base
+{
+ void f();
+ typedef int type;
+ struct Type {};
+ int i;
+ static int j;
+};
+
+struct A : Base
+{
+ using Base::f; // { dg-message "previous declaration" }
+ using Base::f; // { dg-error "redeclaration" }
+
+ using Base::type; // { dg-message "previous declaration" }
+ using Base::type; // { dg-error "redeclaration" }
+
+ using Base::Type; // { dg-message "previous declaration" }
+ using Base::Type; // { dg-error "redeclaration" }
+
+ using Base::i; // { dg-message "previous declaration" }
+ using Base::i; // { dg-error "redeclaration" }
+
+ using Base::j; // { dg-message "previous declaration" }
+ using Base::j; // { dg-error "redeclaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using41.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using41.C
new file mode 100644
index 000000000..dcc618ba5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using41.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+template <class T>
+struct Base
+{
+ void f();
+};
+
+template <class T>
+struct A : Base<T>
+{
+ using Base<T>::f; // { dg-message "previous declaration" }
+ using Base<T>::f; // { dg-error "redeclaration" }
+};
+
+template <class T, class U>
+struct B : Base<T>, Base<U>
+{
+ using Base<T>::f;
+ using Base<U>::f;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using42.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using42.C
new file mode 100644
index 000000000..bca65acc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using42.C
@@ -0,0 +1,26 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct B
+{
+ void foo(T) {}
+};
+
+template<class T>
+struct Out
+{
+ struct D : B<T>, B<double>
+ {
+ using B<T>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+ };
+};
+
+int main()
+{
+ Out<int>::D x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using44.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using44.C
new file mode 100644
index 000000000..d754befd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using44.C
@@ -0,0 +1,28 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct B
+{
+ void foo(char) { __builtin_abort(); }
+ void foo(short) { __builtin_abort(); }
+ void foo(T) {}
+};
+
+template<class T>
+struct Out
+{
+ struct D : B<T>, B<double>
+ {
+ using B<T>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+ };
+};
+
+int main()
+{
+ Out<int>::D x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using45.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using45.C
new file mode 100644
index 000000000..c92b794d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using45.C
@@ -0,0 +1,33 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct A
+{
+ int f(int) { return 0; }
+ int f(double) { return 1; }
+ int f(char) { return 2; }
+};
+
+template <class T>
+struct B : A<T>
+{
+ using A<T>::f;
+ int f(int) { return 3; }
+};
+
+int main()
+{
+ B<int> b;
+ if( b.f( 42 ) != 3 )
+ __builtin_abort();
+
+ if( b.f( 3.14 ) != 1 )
+ __builtin_abort();
+
+ if( b.f( 'a' ) != 2 )
+ __builtin_abort();
+
+ if( b.A<int>::f( 42 ) != 0 )
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using46.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using46.C
new file mode 100644
index 000000000..6f0f5bca0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using46.C
@@ -0,0 +1,62 @@
+// PR c++/51141
+// { dg-do compile }
+// { dg-options "-fpermissive -w -Werror" }
+
+typedef int size_t;
+template < size_t, size_t > struct AlignedBuffer {};
+
+template < typename > class VectorBufferBase
+{
+public:
+ allocateBuffer (size_t) {
+ }
+ buffer () {
+ }
+ *m_buffer;
+ size_t m_capacity;
+};
+
+template < typename T, size_t > class VectorBuffer:VectorBufferBase < T >
+{
+ typedef VectorBufferBase < T > Base;
+
+public:
+ VectorBuffer () {
+ }
+ allocateBuffer (size_t) {
+ m_capacity = 0;
+ }
+ Base::buffer;
+ Base::m_buffer;
+ Base::m_capacity;
+ size_t m_inlineBufferSize;
+
+ AlignedBuffer < 0, __alignof__ (T) > m_inlineBuffer;
+};
+
+template < typename T, size_t > class Vector
+{
+ typedef VectorBuffer < T,
+ 0 > Buffer;
+public:
+ void shrinkCapacity (size_t);
+
+ clear () {
+ shrinkCapacity (0);
+ }
+ Buffer m_buffer;
+};
+
+template < typename T, size_t inlineCapacity > void Vector < T,
+ inlineCapacity >::shrinkCapacity (size_t)
+{
+ m_buffer.allocateBuffer (0);
+}
+
+struct PatternDisjunction;
+struct YarrPattern {
+ reset () {
+ m_disjunctions.clear ();
+ }
+ Vector < PatternDisjunction *, 0 > m_disjunctions;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using47.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using47.C
new file mode 100644
index 000000000..c81864705
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using47.C
@@ -0,0 +1,29 @@
+// PR c++/51152
+// { dg-do compile }
+
+struct A
+{
+ int a;
+};
+
+struct B
+{
+ int b1;
+ int b2;
+ A b3;
+};
+
+struct C : B
+{
+ typedef int R;
+ typedef int S;
+ typedef int T;
+ using B::b1;
+ using B::b2;
+ using B::b3;
+ void f()
+ {
+ b3.a;
+ b3.~A();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using48.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using48.C
new file mode 100644
index 000000000..e6dc3fab7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using48.C
@@ -0,0 +1,23 @@
+// PR c++/51190
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+template<typename> struct B
+{
+ A* p;
+};
+
+template<typename T> struct C : B<T>
+{
+ using B<T>::p;
+
+ C() { p->i; }
+
+ int i1, i2, i3, i4, i5;
+};
+
+C<A> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using49.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using49.C
new file mode 100644
index 000000000..391476ac4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using49.C
@@ -0,0 +1,20 @@
+// PR c++/51188
+// { dg-do compile }
+
+#include <utility>
+class XBase {
+public:
+ virtual ~XBase() = 0;
+ enum ImpMode { Imp1, Imp2, Imp3 };
+};
+class X : public XBase {
+ class XBlock {};
+ using XBase::ImpMode;
+ using XBase::Imp3;
+ using XBase::Imp1;
+ using XBase::Imp2;
+ int _XBlocked;
+ std::pair<int,int> getImp(void) const {
+ return (std::make_pair(0, static_cast<int>(X::Imp1)));
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using5.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using5.C
new file mode 100644
index 000000000..b443b9774
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using5.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10554: ICE for member using declaration with failed
+// scope name lookup.
+
+template <typename> struct A
+{
+ typedef A X;
+ void foo();
+};
+
+template <typename T> struct B : A<T>
+{
+ using X::foo; // { dg-error "declared|nested-name-specifier|non-member" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using50.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using50.C
new file mode 100644
index 000000000..d525a472b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using50.C
@@ -0,0 +1,15 @@
+// PR c++/51319
+// { dg-do compile }
+
+template<int> struct X {};
+
+struct Base
+{
+ enum { a = 1 };
+};
+
+struct Der : Base
+{
+ using Base::a;
+ typedef X<(int)a> Y;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using51.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using51.C
new file mode 100644
index 000000000..8e3e56b05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using51.C
@@ -0,0 +1,18 @@
+// PR c++/51382
+// { dg-do compile }
+// { dg-options "-Wno-deprecated" }
+
+template< int Value >
+struct Base
+{
+ enum { b_e = Value };
+};
+
+template< typename Type >
+struct Derived : Type
+{
+ Type::b_e;
+ enum { d_e = b_e };
+};
+
+int v = (int)Derived< Base< 3 > >::d_e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using52.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using52.C
new file mode 100644
index 000000000..bf2620714
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using52.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// PR c++/52645
+
+class A
+{
+protected:
+ struct B {};
+};
+
+class C : A
+{
+protected:
+ using A::B;
+
+ struct D : public B {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using53.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using53.C
new file mode 100644
index 000000000..a108b50ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using53.C
@@ -0,0 +1,53 @@
+// PR c++/20420
+
+class B
+{
+protected:
+ enum E { E1, E2, E3 };
+ struct S { int i; E e; };
+};
+
+class D : private B
+{
+public:
+ using B::E; // { dg-message "previous" }
+ using B::S; // { dg-message "previous" }
+
+private:
+ enum E {}; // { dg-error "conflicts" }
+ struct S {}; // { dg-error "conflicts" }
+};
+
+template<typename T>
+class BT
+{
+protected:
+ enum E { E1, E2, E3 };
+ struct S { int i; E e; };
+};
+
+template<typename T>
+class DT : private BT<T>
+{
+public:
+ using BT<T>::E; // { dg-message "previous" }
+ using BT<T>::S; // { dg-message "previous" }
+
+private:
+ enum E {}; // { dg-error "conflicts" }
+ struct S {}; // { dg-error "conflicts" }
+};
+
+template class DT<int>;
+
+namespace N
+{
+ int i;
+}
+
+void
+f ()
+{
+ using N::i;
+ using N::i; // { dg-error "declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using6.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using6.C
new file mode 100644
index 000000000..416f0b525
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9022, nested namespace in using declaration
+
+namespace gnu {
+ namespace gcc {
+ }
+}
+using gnu::gcc; // { dg-error "namespace" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using7.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using7.C
new file mode 100644
index 000000000..0c75a2df6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using7.C
@@ -0,0 +1,12 @@
+template <typename T, bool=T::X> struct A
+{
+ int i;
+};
+
+template <typename T> struct B : A<T> // { dg-error "incomplete" }
+{
+ using A<T>::i; // { dg-error "incomplete" "incomplete" }
+ // { dg-error "using" "using" { target *-*-* } 8 }
+};
+
+B<void> b; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using8.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using8.C
new file mode 100644
index 000000000..26eb4d325
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using8.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// Origin: Bill Clarke <llib at computer dot org>
+// PR c++/11097: using declartion for a converter operator to a nested class
+// in a base type
+
+template <typename T>
+struct A
+{
+ struct Nested {};
+ operator Nested*();
+};
+
+template <typename T>
+struct B : A<T>
+{
+ using A<T>::operator typename A<T>::Nested*;
+};
+
+template struct B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lookup/using9.C b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using9.C
new file mode 100644
index 000000000..fd3e78863
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lookup/using9.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// Origin: C++ Standard Draft (7.3.3/12)
+// PR c++/2294: using declarations should not conflict, but only cause
+// an ambiguous overload set to be created.
+
+namespace B {
+ void f(int); // { dg-message "note" }
+ void f(double); // { dg-message "note" }
+}
+
+namespace C {
+ void f(int); // { dg-message "note" }
+ void f(double); // { dg-message "note" }
+ void f(char); // { dg-message "note" }
+}
+
+void h()
+{
+ using B::f;
+ using C::f;
+ f('h');
+ f(1); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+ void f(int); // { dg-error "previous declaration" }
+}
+
+void m()
+{
+ void f(int);
+ using B::f; // { dg-error "previous declaration" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080709_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080709_0.C
new file mode 100644
index 000000000..55ae8c9ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080709_0.C
@@ -0,0 +1,11 @@
+// { dg-lto-do run }
+
+class Init {
+};
+
+int f(Init *a) {
+}
+
+int main(void){
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080829_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080829_0.C
new file mode 100644
index 000000000..0890cf66d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080829_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do assemble }
+
+/* The replacement of cos+sin with __builtin_cexpi done by
+ pass_cse_sincos was using a builtin for which we had no attributes.
+ This was causing the operand scanner to materialize a VDEF at the
+ builtin call-site which was not marked for renaming, thus tripping
+ up the SSA verifier. */
+extern "C" { extern double cos (double); extern double sin (double); }
+double func(double &in) { return cos(in) + sin(in); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080904_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080904_0.C
new file mode 100644
index 000000000..0161a00be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080904_0.C
@@ -0,0 +1,37 @@
+// { dg-lto-do run }
+
+/* This test will fail to link if the vtable for Derived is not emitted. */
+
+class Base {
+public:
+ Base(char *buf, unsigned len)
+ : _buf(buf),
+ _len(len)
+ {}
+
+ virtual int length () { return _len; }
+
+private:
+ char * _buf;
+ unsigned _len;
+};
+
+class Derived : public Base {
+public:
+ Derived(char *buf, unsigned len)
+ : Base(buf, len),
+ _ctr(len)
+ {}
+
+ virtual int length () { return _ctr; }
+
+private:
+ unsigned _ctr;
+};
+
+int main ()
+{
+ Derived *d = new Derived (new char[256], 256);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080907_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080907_0.C
new file mode 100644
index 000000000..9a4552310
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080907_0.C
@@ -0,0 +1,3 @@
+// { dg-lto-do assemble }
+struct Foo { void func (); }; Foo & bar () { } struct Baz { Baz (Baz &); };
+Baz dummy() { bar().func(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-1_0.C
new file mode 100644
index 000000000..8b761c084
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-1_0.C
@@ -0,0 +1,36 @@
+/* { dg-lto-do run } */
+extern "C" { extern void *memcpy (void *, const void *, unsigned); }
+
+inline int
+bci (const float &source)
+{
+ int dest;
+ memcpy (&dest, &source, sizeof (dest));
+ return dest;
+}
+
+inline float
+bcf (const int &source)
+{
+ float dest;
+ memcpy (&dest, &source, sizeof (dest));
+ return dest;
+}
+
+float
+Foo ()
+{
+ const int foo = bci (0.0f);
+ int bar = foo;
+ const int baz = foo & 1;
+ if (!baz && (foo & 2))
+ bar = 0;
+ return bcf (bar);
+}
+
+int main ()
+{
+ if (Foo () != 0.0)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-2_0.C
new file mode 100644
index 000000000..7042b3d08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-2_0.C
@@ -0,0 +1,3 @@
+/* { dg-lto-do assemble } */
+struct Foo { double x[3]; };
+Foo func() { Foo f = { { 0, 0, 0 } }; return f; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-3_0.C
new file mode 100644
index 000000000..dac3cddb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080908-3_0.C
@@ -0,0 +1,16 @@
+/* { dg-lto-do run } */
+
+volatile double bar;
+
+int foo()
+{
+ double baz = -__builtin_huge_val();
+ return baz <= -bar;
+}
+
+int main()
+{
+ if (foo () != 1)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080909-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080909-1_0.C
new file mode 100644
index 000000000..245ca58f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080909-1_0.C
@@ -0,0 +1,3 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-flto}} }
+int *i = (int[]) {0};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080910-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080910-1_0.C
new file mode 100644
index 000000000..48e9e5d15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080910-1_0.C
@@ -0,0 +1,2 @@
+// { dg-lto-do assemble }
+struct Foo { Foo(int); }; void func() { new Foo(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912-1_0.C
new file mode 100644
index 000000000..ebead90e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912-1_0.C
@@ -0,0 +1,3 @@
+// { dg-lto-do assemble }
+struct Foo { double x[3]; };
+Foo func() { Foo f = { { 0, 0, 0 } }; return f; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912_0.C
new file mode 100644
index 000000000..7b3039fbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080912_0.C
@@ -0,0 +1,4 @@
+// { dg-lto-do assemble }
+class Foo { virtual void f(); };
+class Bar:public Foo { };
+void func() { Bar(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080915_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080915_0.C
new file mode 100644
index 000000000..3789765a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080915_0.C
@@ -0,0 +1,29 @@
+// { dg-lto-do assemble }
+struct Foo {
+ static const int dummy;
+
+ int bit_field:1;
+ int dummy2:1;
+ int dummy3:1;
+};
+
+struct Bar {
+ Foo foo;
+};
+
+int func(const Bar& b) {
+ return b.foo.bit_field;
+}
+
+struct Baz {
+ Bar& operator*() {}
+};
+
+void func1(Baz baz, int i, Bar bar) {
+ i || func(bar);
+ *baz = bar;
+}
+
+void func2(Baz baz, Bar bar) {
+ func1(baz, 0, bar);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080916_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080916_0.C
new file mode 100644
index 000000000..3c900cd43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080916_0.C
@@ -0,0 +1,12 @@
+/* { dg-lto-do assemble } */
+
+enum _Ios_Fmtflags {
+ _S_boolalpha };
+
+class ios_base {
+ static const _Ios_Fmtflags boolalpha = _S_boolalpha;
+ _Ios_Fmtflags _M_flags;
+};
+
+ios_base& g() {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080917_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080917_0.C
new file mode 100644
index 000000000..2f4f33bd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080917_0.C
@@ -0,0 +1,29 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-O2 -flto -funsigned-char}} }
+int
+foo (char *s, int flag)
+{
+ for (;;)
+ {
+ unsigned char c;
+ if (flag)
+ c = *s;
+ else
+ c = *s;
+ return c;
+ }
+}
+
+int
+baz (const char *s, int flag)
+{
+ for (;;)
+ {
+ unsigned char c;
+ if (flag)
+ c = *s;
+ else
+ c = *s;
+ return c;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080924_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080924_0.C
new file mode 100644
index 000000000..b1e381351
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080924_0.C
@@ -0,0 +1,16 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-O2 -flto -fno-strict-aliasing}} }
+
+namespace ns
+{
+ template <class> class hash_set { };
+}
+
+struct Foo
+{
+ long long f1, f2, f3;
+};
+
+void func(ns::hash_set<int>) {
+ Foo foo = { 0, 0, 0 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20080926_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080926_0.C
new file mode 100644
index 000000000..d6a7bbffc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20080926_0.C
@@ -0,0 +1,4 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-O2 -flto -fno-strict-aliasing}} }
+extern int foo();
+void bar() { try { int i = foo(); } catch(int) { } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081008_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081008_0.C
new file mode 100644
index 000000000..258265a4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081008_0.C
@@ -0,0 +1,36 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-flto}} }
+
+struct Foo
+{
+ virtual void func() = 0;
+};
+
+struct Bar
+{
+ Foo *field;
+ void func2();
+};
+
+struct Baz
+{
+ Bar &bar();
+ Baz();
+};
+
+struct Zonk
+{
+ virtual ~Zonk() {
+ }
+ virtual void func3() = 0;
+};
+
+void Mumble(Zonk *) {
+}
+
+extern "C"
+{
+ void __attribute__ ((nothrow)) __cxa_pure_virtual() {
+ Baz().bar().func2();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022.h
new file mode 100644
index 000000000..bccd2ad7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022.h
@@ -0,0 +1,8 @@
+class foo
+{
+public:
+ int bar ()
+ {
+ return 0;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_0.C
new file mode 100644
index 000000000..219f92d6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_0.C
@@ -0,0 +1,11 @@
+#include "20081022.h"
+
+int
+f (foo * a)
+{
+ return a->bar ();
+}
+
+main()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_1.C
new file mode 100644
index 000000000..94c5aecfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081022_1.C
@@ -0,0 +1,7 @@
+#include "20081022.h"
+
+int
+g (foo * a)
+{
+ return a->bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081023_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081023_0.C
new file mode 100644
index 000000000..ab3fc36f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081023_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do link }
+extern inline void __attribute__ ((__always_inline__)) func (void)
+{
+}
+
+void
+f (void)
+{
+ func ();
+}
+
+main()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-1_0.C
new file mode 100644
index 000000000..711533600
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-1_0.C
@@ -0,0 +1,6 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} }
+// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions" }
+void func(); class Foo { };
+void bar() { try { func(); } catch (Foo) { } };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-2_0.C
new file mode 100644
index 000000000..dc43286bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109-2_0.C
@@ -0,0 +1,15 @@
+/* { dg-lto-do assemble } */
+extern void func(int);
+
+struct Foo
+{
+ void bar() {
+ static int local;
+ func(local);
+ }
+ void baz();
+};
+
+void Foo::baz() {
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_0.C
new file mode 100644
index 000000000..93cfc67ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_0.C
@@ -0,0 +1,28 @@
+extern "C" { void abort (void);}
+int foo (int);
+
+class A
+{
+ int x;
+
+public:
+ A() { x = 2304; }
+ ~A() { if (x != 2305) abort (); }
+ void inc () { x++; }
+};
+
+
+int main()
+{
+ A x;
+ x.inc();
+ try
+ {
+ foo (0);
+ abort (); // Should not execute
+ }
+ catch (int e)
+ {
+ return 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_1.C
new file mode 100644
index 000000000..3395e1355
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081109_1.C
@@ -0,0 +1,4 @@
+int foo (int x)
+{
+ throw 10;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_0.C
new file mode 100644
index 000000000..99e024f9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_0.C
@@ -0,0 +1,27 @@
+/* { dg-lto-do link } */
+
+class C {
+ public:
+ C();
+ virtual ~C();
+ virtual void foo();
+};
+void bar() {
+ new C();
+}
+
+C::C() {
+
+}
+
+C::~C() {
+
+}
+
+void C::foo() {
+}
+
+int main(void)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_1.C
new file mode 100644
index 000000000..fc654fe91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118-1_1.C
@@ -0,0 +1,12 @@
+class C {
+ public:
+ C();
+ virtual ~C();
+ virtual void foo();
+};
+class D {
+ ~D();
+ C lexer_;
+};
+D::~D() {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_0.C
new file mode 100644
index 000000000..7be32b6e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_0.C
@@ -0,0 +1,21 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+
+/* We used to ICE because of dangling pointers. */
+
+class object
+{
+public:
+ virtual ~object() {}
+};
+
+class foo : public object
+{
+ virtual int method(void);
+};
+
+int
+foo::method(void)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_1.C
new file mode 100644
index 000000000..a1bf08186
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081118_1.C
@@ -0,0 +1,21 @@
+class object {
+public:
+ virtual ~object() {}
+};
+
+class bar : public object
+{
+ static bar *method(void);
+};
+
+class quxx : public bar
+{
+ public:
+ static void method();
+};
+
+bar*
+bar::method (void)
+{
+ quxx::method();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1.h
new file mode 100644
index 000000000..be193581d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1.h
@@ -0,0 +1,8 @@
+namespace __gnu_cxx
+{
+ template < typename _Tp > class new_allocator
+ {
+ public:
+ unsigned max_size () const throw ();
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_0.C
new file mode 100644
index 000000000..ca1455e49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_0.C
@@ -0,0 +1,13 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+
+#include "20081119-1.h"
+
+extern __gnu_cxx::new_allocator<int> X;
+
+int
+f (__gnu_cxx::new_allocator<int> * a)
+{
+ return a->max_size () + X.max_size();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_1.C
new file mode 100644
index 000000000..c2ba78d6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119-1_1.C
@@ -0,0 +1,9 @@
+#include "20081119-1.h"
+
+__gnu_cxx::new_allocator<int> X;
+
+int
+f (__gnu_cxx::new_allocator<int> a)
+{
+ return a.max_size ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_0.C
new file mode 100644
index 000000000..c77a43098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_0.C
@@ -0,0 +1,24 @@
+class foo {
+ public:
+ foo () {}
+ virtual ~foo() {}
+ virtual void m() {}
+};
+
+template<typename t>
+class bar : public foo {
+ public:
+ bar () {}
+};
+
+void
+f1 (bar<int> *p)
+{
+ p->m();
+}
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_1.C
new file mode 100644
index 000000000..71a2a5c02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081119_1.C
@@ -0,0 +1,18 @@
+class foo {
+ public:
+ foo () {}
+ virtual ~foo() {}
+ virtual void m() {}
+};
+
+template<typename t>
+class bar : public foo {
+ public:
+ bar () {}
+};
+
+void
+f2 (bar<int> *p)
+{
+ p->m();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_0.C
new file mode 100644
index 000000000..682733778
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_0.C
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -r -nostdlib}} }
+extern "C"
+{
+ extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int)
+ {
+ }
+}
+static __typeof(pthread_equal)
+ __gthrw_pthread_equal __attribute__((__weakref__("pthread_equal")));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_1.C
new file mode 100644
index 000000000..e7e24a58b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-1_1.C
@@ -0,0 +1,8 @@
+extern "C"
+{
+ extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int)
+ {
+ }
+}
+static __typeof(pthread_equal)
+ __gthrw_pthread_equal __attribute__((__weakref__("pthread_equal")));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_0.C
new file mode 100644
index 000000000..3efe26c01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_0.C
@@ -0,0 +1,13 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -r -nostdlib}} }
+template < typename > struct Foo
+{
+ inline void rdstate() {
+ }
+};
+
+extern template struct Foo<int>;
+
+struct Bar:virtual public Foo<int>
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_1.C
new file mode 100644
index 000000000..242d50a41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081120-2_1.C
@@ -0,0 +1,11 @@
+template < typename > struct Foo
+{
+ inline void rdstate() {
+ }
+};
+
+extern template struct Foo<int>;
+
+struct Bar:virtual public Foo<int>
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_0.C
new file mode 100644
index 000000000..4cbc25338
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} }
+
+int
+f(void)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_1.C
new file mode 100644
index 000000000..aef512e8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081123_1.C
@@ -0,0 +1,16 @@
+struct foo {
+ const int* int_array;
+ const void* default_instance;
+};
+struct bar {
+ static const bar& _default_instance;
+ static const foo _internal_foo;
+};
+struct quxx {
+ static int trouble[];
+};
+int quxx::trouble[] = { };
+const foo bar::_internal_foo = {
+ quxx::trouble,
+ &bar::_default_instance
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125.h
new file mode 100644
index 000000000..bc470040a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125.h
@@ -0,0 +1,15 @@
+class base
+{
+ public:
+ base() {}
+ virtual ~base() {}
+ static base *factory (void);
+};
+
+class object : public base
+{
+ public:
+ object() {}
+ object (int);
+ virtual void key_method (void);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_0.C
new file mode 100644
index 000000000..629c2b3d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_0.C
@@ -0,0 +1,18 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -flto-partition=1to1}} }
+#include "20081125.h"
+
+object::object (int x)
+{
+}
+
+void
+object::key_method (void)
+{
+}
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_1.C
new file mode 100644
index 000000000..d52b9edca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081125_1.C
@@ -0,0 +1,7 @@
+#include "20081125.h"
+
+base *
+base::factory(void)
+{
+ return new object ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_0.C
new file mode 100644
index 000000000..a5200ff4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_0.C
@@ -0,0 +1,2 @@
+struct Foo { Foo(); };
+static void func() { new Foo(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_1.C
new file mode 100644
index 000000000..6488ac8d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081127_1.C
@@ -0,0 +1,3 @@
+struct Foo { Foo(); };
+Foo::Foo() { }
+main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_0.C
new file mode 100644
index 000000000..e92d89a4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_0.C
@@ -0,0 +1,5 @@
+extern void f();
+extern void g();
+struct Foo { static inline void Bar() { f(); } };
+static void Func() { Foo::Bar(); }
+int main() { g (); Func(); return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_1.C
new file mode 100644
index 000000000..83de109ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081203_1.C
@@ -0,0 +1,4 @@
+void f () {}
+struct Foo { static inline void Bar() { f(); } };
+static void Func() { Foo::Bar(); }
+void g () { Func (); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_0.C
new file mode 100644
index 000000000..b87006a6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_0.C
@@ -0,0 +1,15 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */
+
+/* Tests for the absence during linking of:
+ lto1: error: type of '_ZTVN10__cxxabiv120__si_class_type_infoE' does
+ not match original declaration */
+
+struct Foo { virtual ~Foo(); };
+namespace __cxxabiv1
+{
+ struct __si_class_type_info: public Foo { };
+ struct Baz: public Foo { virtual void Func(); };
+ void Baz::Func() { }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_1.C
new file mode 100644
index 000000000..20627b5c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-1_1.C
@@ -0,0 +1,3 @@
+struct Foo { virtual ~Foo(); };
+struct Bar:public Foo { Bar() { } };
+void Func() { new Bar(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_0.C
new file mode 100644
index 000000000..81a42693c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_0.C
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -flto-partition=1to1 -O3}} }
+extern void foo (void);
+
+int
+main ()
+{
+ foo ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_1.C
new file mode 100644
index 000000000..676b9b27d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081204-2_1.C
@@ -0,0 +1,14 @@
+namespace {
+class c
+{
+ public:
+ c () {}
+ virtual ~c() {}
+};
+};
+
+void
+foo (void)
+{
+ c x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_0.C
new file mode 100644
index 000000000..3744a9ac4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_0.C
@@ -0,0 +1,18 @@
+/* { dg-lto-do link } */
+
+class foo {
+ public:
+ foo ();
+ virtual ~foo ();
+};
+
+foo::foo ()
+{
+}
+
+int
+main ()
+{
+ foo dummy;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_1.C
new file mode 100644
index 000000000..83eee3e46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081209_1.C
@@ -0,0 +1,9 @@
+class foo {
+ public:
+ foo ();
+ virtual ~foo ();
+};
+
+foo::~foo ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1.h
new file mode 100644
index 000000000..f9a8ca755
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1.h
@@ -0,0 +1,6 @@
+class foo {
+ public:
+ foo () {}
+ virtual ~foo () {}
+ virtual void key_method (void);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_0.C
new file mode 100644
index 000000000..89c06acf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_0.C
@@ -0,0 +1,19 @@
+#include "20081211-1.h"
+
+foo *
+create_foo (void)
+{
+ return new foo;
+}
+
+void
+destroy_foo (foo *p)
+{
+ delete p;
+}
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_1.C
new file mode 100644
index 000000000..124d69a7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081211-1_1.C
@@ -0,0 +1,6 @@
+#include "20081211-1.h"
+
+void
+foo::key_method (void)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-1_0.C
new file mode 100644
index 000000000..c91872bd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-1_0.C
@@ -0,0 +1,28 @@
+class base1
+{
+ public:
+ base1 () {}
+ virtual ~base1 () {}
+};
+
+class base2
+{
+ public:
+ base2 () {}
+ virtual ~base2 () {}
+};
+
+class mi_class : public base1, base2
+{
+ public:
+ mi_class () {}
+ ~mi_class () {}
+};
+
+mi_class dummy;
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-2_0.C
new file mode 100644
index 000000000..a47b0b578
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081217-2_0.C
@@ -0,0 +1,20 @@
+struct A {
+ virtual int foo() {}
+};
+struct B {
+ virtual int f() {return 1; }
+};
+struct C : public A, public B {
+ C();
+ virtual int f() { return 0; }
+};
+
+C::C()
+{
+}
+
+main()
+{
+ C c;
+ return c.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_0.C
new file mode 100644
index 000000000..8f2c2e07e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_0.C
@@ -0,0 +1,73 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -O2}} }
+// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib" }
+
+typedef long int ptrdiff_t;
+extern "C"
+{
+ typedef struct
+ {
+ }
+ __mbstate_t;
+ namespace std
+ {
+ class exception
+ {
+ };
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Alloc > class allocator;
+ template < class _CharT > struct char_traits;
+}
+typedef __mbstate_t mbstate_t;
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ using::mbstate_t;
+ typedef ptrdiff_t streamsize;
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT > >class basic_istream;
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT >, typename _Alloc =
+ allocator < _CharT > >class basic_stringbuf;
+ class ios_base
+ {
+ public:class failure:public exception
+ {
+ };
+ virtual ~ ios_base ();
+ };
+ template < typename _CharT, typename _Traits > class basic_streambuf
+ {
+ };
+template < typename _CharT, typename _Traits > class basic_ios:public
+ ios_base
+ {
+ };
+template < typename _CharT, typename _Traits > class basic_istream:virtual public basic_ios < _CharT,
+ _Traits
+ >
+ {
+ typedef basic_streambuf < _CharT, _Traits > __streambuf_type;
+ protected:streamsize _M_gcount;
+ public: explicit basic_istream (__streambuf_type * __sb):_M_gcount (streamsize
+ (0))
+ {
+ }
+ };
+template < typename _CharT, typename _Traits, typename _Alloc > class basic_stringbuf:public basic_streambuf < _CharT,
+ _Traits
+ >
+ {
+ };
+ template < typename V, typename I, typename S = std::mbstate_t > struct character
+ {
+ };
+ typedef character < unsigned short, unsigned int >pod_ushort;
+ typedef basic_stringbuf < pod_ushort > stringbuf_type;
+ typedef basic_istream < pod_ushort > istream_type;
+ stringbuf_type strbuf01;
+ istream_type stream (&strbuf01);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_1.C
new file mode 100644
index 000000000..1bb96ef37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20081219_1.C
@@ -0,0 +1,42 @@
+typedef struct
+{
+}
+__mbstate_t;
+typedef __mbstate_t mbstate_t;
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ using::mbstate_t;
+ typedef int *__c_locale;
+ class locale
+ {
+ class facet;
+ };
+ class locale::facet
+ {
+ };
+template < typename _CharT > class numpunct:public locale::facet
+ {
+ void _M_initialize_numpunct (__c_locale __cloc = __null);
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ template < typename V, typename I, typename S = std::mbstate_t > struct character
+ {
+ };
+}
+
+namespace __gnu_test
+{
+ using __gnu_cxx::character;
+ typedef character < unsigned short, unsigned int >pod_ushort;
+}
+namespace std
+{
+ using __gnu_test::pod_ushort;
+ template <> void numpunct <
+ pod_ushort >::_M_initialize_numpunct (__c_locale)
+ {
+ pod_ushort *__truename = new pod_ushort[4 + 1];
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090106_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090106_0.C
new file mode 100644
index 000000000..8c4d3952e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090106_0.C
@@ -0,0 +1,203 @@
+// { dg-lto-do link }
+typedef long unsigned int size_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::size_t;
+ template<typename _Tp>
+ struct __is_char
+ {
+ };
+# 422 "/usr/include/c++/4.4.0/bits/cpp_type_traits.h" 3
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<bool, typename>
+ struct __enable_if
+ {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class new_allocator
+ {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ };
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ };
+ template<typename _CharT>
+ struct char_traits
+ {
+ typedef _CharT char_type;
+ static std::size_t
+ length(const char_type* __s);
+ };
+ template<typename _CharT>
+ std::size_t
+ char_traits<_CharT>::
+ length(const char_type* __p)
+ {
+ }
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string
+ {
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class __versa_string;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ struct __vstring_utility
+ {
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class __rc_string_base
+ {
+ typedef __vstring_utility<_CharT, _Traits, _Alloc> _Util_Base;
+ typedef typename _Util_Base::_CharT_alloc_type _CharT_alloc_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ struct _Rep
+ {
+ union
+ {
+ };
+ static _Rep*
+ _S_create(size_type, size_type, const _Alloc&);
+ };
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ typename __rc_string_base<_CharT, _Traits, _Alloc>::_Rep*
+ __rc_string_base<_CharT, _Traits, _Alloc>::_Rep::
+ _S_create(size_type __capacity, size_type __old_capacity,
+ const _Alloc& __alloc)
+ {
+ };
+}
+template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
+ typename _Alloc = std::allocator<_CharT> >
+class basic_string
+ : public __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc> {
+};
+template<typename _CharT, typename _Traits, typename _Alloc>
+ operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
+ const std::basic_string<_CharT, _Traits, _Alloc>& __rhs)
+ {
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct __uninitialized_copy
+ {
+ template<typename _InputIterator, typename _ForwardIterator>
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ }
+ };
+ template<typename _InputIterator, typename _ForwardIterator>
+ uninitialized_copy(_InputIterator __first, _InputIterator __last,
+ _ForwardIterator __result)
+ {
+ }
+ class locale
+ {
+ class facet;
+ };
+ class locale::facet
+ {
+ };
+ class ios_base
+ {
+ template<typename _CharT2>
+ friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
+ istreambuf_iterator<_CharT2> >::__type
+ find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
+ const _CharT2&);
+ };
+ template<typename _CharT, typename _OutIter>
+ class num_put : public locale::facet
+ {
+ typedef _CharT char_type;
+ typedef _OutIter iter_type;
+ template<typename _ValueT>
+ iter_type
+ _M_insert_float(iter_type, ios_base& __io, char_type __fill,
+ char __mod, _ValueT __v) const;
+ };
+ template<typename _CharT, typename _OutIter>
+ template<typename _ValueT>
+ _OutIter
+ num_put<_CharT, _OutIter>::
+ _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
+ _ValueT __v) const
+ {
+ }
+ template<typename _CharT, typename _OutIter>
+ class basic_ios : public ios_base
+ {
+ };
+ template<typename _CharT, typename _Traits>
+ class basic_istream : virtual public basic_ios<_CharT, _Traits>
+ {
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ template<typename _ValueT>
+ __istream_type&
+ _M_extract(_ValueT& __v);
+ };
+ template<typename _CharT, typename _Traits>
+ template<typename _ValueT>
+ basic_istream<_CharT, _Traits>&
+ basic_istream<_CharT, _Traits>::
+ _M_extract(_ValueT& __v)
+ {
+ }
+ class hash_map
+ {
+ };
+}
+class CDE {
+ public:
+ virtual ~CDE() { }
+};
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
+ typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
+ class map
+ {
+ };
+ template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
+ operator==(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
+ { return !(__x < __y); }
+}
+namespace xyz {
+class XYZ;
+};
+class ABC {
+ public:
+ virtual ~ABC() { }
+};
+class FGH : public CDE, public ABC {
+ public:
+ explicit FGH(CDE* efg);
+};
+namespace {
+class LMN : public FGH {
+ LMN(CDE* efg, xyz::XYZ* hij) : FGH(efg) { }
+};
+}
+main(){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090112_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090112_0.C
new file mode 100644
index 000000000..b9dc24bc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090112_0.C
@@ -0,0 +1,11 @@
+// { dg-lto-do run }
+const char *func(int val) {
+ switch (val) {
+ case 2147483647: return "foo";
+ default: return "";
+ }
+}
+
+int main() {
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090128_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090128_0.C
new file mode 100644
index 000000000..d03cfc6a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090128_0.C
@@ -0,0 +1,88 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-fpreprocessed -O2 -flto -flto-partition=1to1 -funsigned-char}} }
+typedef unsigned char uint8;
+extern const uint8 array[256];
+static inline bool
+g (unsigned char c)
+{
+ return array[c] & 0x80;
+}
+
+class Class1
+{
+ static bool f1 (char **dst, const char *end, char c);
+ static bool f2 (const char *map, const char **src, char **dst,
+ const char *end);
+ static bool f3 (const char *src, char *dst, const char *end);
+};
+
+enum JTipL
+{
+ KXHR8 = 0, KXNU3, KX_HASH, KXYYZ, KXFI9, KXX3, KXAFA, KXV4Z, KXZ11,
+};
+
+static const char
+ p9t42[256] = { KXYYZ, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXAFA, KXX3, KX_HASH, KXAFA,
+ KXFI9, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXV4Z, KXAFA, KXAFA,
+ KXAFA, KXV4Z, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXHR8, KXX3, KXV4Z, KXX3, KXNU3,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXX3, KXX3, KXX3, KXX3, KXAFA, KXX3, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA,
+ KXAFA, KXAFA, KXAFA, KXAFA, KXX3, KXX3, KXX3, KXAFA, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+ KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3,
+};
+
+inline bool
+Class1::f2 (const char *map, const char **src, char **dst,
+ const char *end)
+{
+ if (g ((*src)[1]) && g ((*src)[2]))
+ {
+ char c = (static_cast < unsigned char >((*src)[1])) & 0xf;
+ if (map[c] == KXAFA)
+ {
+ }
+ else if (f1 (dst, end, c))
+ {
+ }
+ }
+ return true;
+}
+
+bool
+Class1::f3 (const char *src, char *dst, const char *end)
+{
+ while (dst < end)
+ {
+ char c = *src;
+ char m = p9t42[c];
+ switch (m)
+ {
+ case KXYYZ:
+ *dst = '\0';
+ case KXFI9:
+ if (!f2 (p9t42, &src, &dst, end))
+ ;
+ }
+ }
+ return false;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090221_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090221_0.C
new file mode 100644
index 000000000..5bf031906
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090221_0.C
@@ -0,0 +1,53 @@
+// { dg-lto-do assemble }
+extern void some_function (const char *);
+extern bool some_other_function ();
+
+struct Foo
+{
+ long long a;
+ int b;
+};
+
+bool Foo_eq(Foo x, Foo y)
+{
+ return x.a == y.a && x.b == y.b;
+}
+
+struct Bar
+{
+ Foo a;
+ int b;
+};
+
+struct Baz
+{
+ Bar a;
+ Baz(Bar &a):a(a) { }
+};
+
+struct Zonk
+{
+ Baz baz;
+
+ Bar func_1(const Bar & bar) {
+ if (Foo_eq(bar.a, baz.a.a) && bar.b == baz.a.b || some_other_function ())
+ return bar;
+ }
+
+ void func_2(const Baz & baz) {
+ func_1(baz.a);
+ some_function(__PRETTY_FUNCTION__);
+ }
+};
+
+void func() {
+ Bar bar;
+ Zonk *rep;
+ rep->func_1(bar);
+ rep->func_2(Baz(bar));
+}
+
+void foo ()
+{
+ func();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_0.C
new file mode 100644
index 000000000..d65d490d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_0.C
@@ -0,0 +1,10 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+struct Foo {
+ bool Mumble();
+ static void Bar() { if (foo_->Mumble()) foo_ = 0; }
+ static void Baz() { Bar(); }
+ static Foo *foo_;
+};
+void Unused() { Foo::Bar(); Foo::Baz(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_1.C
new file mode 100644
index 000000000..0ccaf3c82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090302_1.C
@@ -0,0 +1,7 @@
+struct Foo {
+ bool Mumble();
+ static void Bar() { if (foo_->Mumble()) foo_ = 0; }
+ static void Baz() { Bar(); }
+ static Foo *foo_;
+};
+Foo *Foo::foo_;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090303_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090303_0.C
new file mode 100644
index 000000000..88bd6ad9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090303_0.C
@@ -0,0 +1,24 @@
+/* { dg-lto-do run } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} } */
+/* { dg-lto-options {{-flto -flto-partition=1to1}} { target sparc*-*-* } } */
+/* { dg-suppress-ld-options {-fPIC} } */
+void foobar(int *, int* __x) ;
+int test_ints[30];
+int j;
+
+void foobar (int *x, int *y)
+{
+ *x = *y = 0;
+}
+
+void Test() {
+ int int_set_;
+ foobar (&int_set_, &test_ints[j]);
+}
+main()
+{
+ Test();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1.h
new file mode 100644
index 000000000..389d94f00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1.h
@@ -0,0 +1,22 @@
+typedef unsigned long uint32;
+typedef int JSIntn;
+#define JS_DLL_CALLBACK
+typedef JSIntn JSBool;
+typedef struct JSContext JSContext;
+typedef struct JSObject JSObject;
+typedef long long JSInt64;
+typedef JSInt64 JSWord;
+typedef JSWord jsword;
+typedef jsword jsval;
+
+typedef JSBool
+(* JS_DLL_CALLBACK JSPropertyOp)(JSContext *cx, JSObject *ojb, jsval id,
+ jsval *vp);
+
+struct JSClass {
+ const char *name;
+ uint32 flags;
+ JSPropertyOp addProperty;
+};
+
+extern struct JSClass K;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_0.C
new file mode 100644
index 000000000..6d4032724
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_0.C
@@ -0,0 +1,34 @@
+/* { dg-lto-do run } */
+#include "20090311-1.h"
+bool flag;
+
+struct B {
+ int a;
+ enum { ANOTHER, ONE } f2_;
+ float c;
+};
+
+extern struct B x[];
+
+struct C {
+ int x;
+ struct B *p;
+ float d;
+};
+
+C c = { 0, 0, 3.4 };
+
+struct A {
+ enum { UNO, DOS, TRES } f1_;
+ int x;
+};
+
+A a;
+
+extern int foo();
+main()
+{
+ a.x = 4 + c.x;
+ foo();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_1.C
new file mode 100644
index 000000000..520aa957a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311-1_1.C
@@ -0,0 +1,28 @@
+#include "20090311-1.h"
+
+struct A {
+ enum { UNO, DOS, TRES } f1_;
+ int x;
+};
+
+struct B;
+
+extern struct B x[];
+
+struct C {
+ int x;
+ struct B *p;
+ float d;
+};
+
+extern A a;
+extern B b;
+extern bool flag;
+extern C c;
+
+int foo()
+{
+ if (!flag)
+ return a.x - c.x;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_0.C
new file mode 100644
index 000000000..cc54bbfdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_0.C
@@ -0,0 +1,13 @@
+class C1 {
+public: virtual ~C1() {
+}
+};
+class C2 : public C1 {
+public:
+ C2(void *q);
+ virtual void A();
+};
+int main(int argc, char **argv) {
+ C2 h(0);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_1.C
new file mode 100644
index 000000000..e78da7223
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090311_1.C
@@ -0,0 +1,13 @@
+class C1 {
+public: virtual ~C1() {
+}
+};
+class C2 : public C1 {
+ C2(void *q);
+ virtual void A();
+};
+void C2::A() {
+}
+C2::C2(void *q)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312.h
new file mode 100644
index 000000000..c902e93c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312.h
@@ -0,0 +1,2 @@
+enum Values { ONE, TWO, THREE };
+typedef const char * (* JSErrorCallback)(void *, const char *, const int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_0.C
new file mode 100644
index 000000000..b2222c2aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_0.C
@@ -0,0 +1,14 @@
+#include "20090312.h"
+
+extern "C" {
+ extern enum Values x;
+ extern JSErrorCallback p;
+};
+
+main()
+{
+ if ( x == ONE && p == 0)
+ return 0;
+
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_1.C
new file mode 100644
index 000000000..a0f9085f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090312_1.C
@@ -0,0 +1,21 @@
+#include "20090312.h"
+
+/* This file should be compiled with the C front end. This
+ should be testing what happens when LTO merges enum types and function
+ prototypes compiled by the C and C++ FEs. Since both FEs generate
+ slightly different representations for these, LTO was emitting an
+ ODR violation error.
+
+ Once dejagnu can deal with multiple languages in a single test, remove
+ the __cplusplus checks and force this file to be compiled with the
+ C front end. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JSErrorCallback p = 0;
+enum Values x = ONE;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_0.C
new file mode 100644
index 000000000..cba9d054f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_0.C
@@ -0,0 +1,6 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} }
+// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" }
+
+int X;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_1.C
new file mode 100644
index 000000000..088792b2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090313_1.C
@@ -0,0 +1,12 @@
+struct Foo {
+ virtual void X();
+ virtual void Y();
+};
+struct Bar: public Foo {
+ Bar(Foo *);
+ void Y();
+};
+void Baz() {
+ Foo f;
+ Bar b(&f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_0.C
new file mode 100644
index 000000000..930fb16e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do run }
+struct Foo {
+ bool Mumble() { return true; }
+ static void Bar() { if (foo_->Mumble()) foo_ = 0; }
+ static void Baz() { Bar(); }
+ static Foo *foo_;
+};
+Foo *Foo::foo_;
+main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_1.C
new file mode 100644
index 000000000..0a2fba552
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20090315_1.C
@@ -0,0 +1,7 @@
+struct Foo {
+ bool Mumble() { return true; }
+ static void Bar() { if (foo_->Mumble()) foo_ = 0; }
+ static void Baz() { Bar(); }
+ static Foo *foo_;
+};
+void Unused() { Foo::Bar(); Foo::Baz(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-1_0.C
new file mode 100644
index 000000000..c63b079d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-1_0.C
@@ -0,0 +1,59 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC -flto}} }
+// { dg-extra-ld-options "-fPIC -r -nostdlib" }
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> >
+ class istreambuf_iterator;
+ typedef basic_ostream<char> ostream;
+ template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
+ class num_get;
+ class locale {
+ class facet;
+ };
+ class locale::facet {
+ };
+ enum _Ios_Iostate { _S_beg = 0, _S_cur = 1, _S_end = 2,
+ _S_ios_seekdir_end = 1L << 16 };
+ class ios_base {
+ public:
+ typedef _Ios_Iostate iostate;
+ };
+ template<typename _CharT, typename _InIter>
+ class num_get : public locale::facet {
+ typedef _InIter iter_type;
+ template<typename _ValueT> iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&,
+ ios_base::iostate&, _ValueT&) const;
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+ };
+ extern template class num_get<char>;
+ template<typename _CharT, typename _Traits>
+ class basic_ios : public ios_base {
+ typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
+ __num_get_type;
+ const __num_get_type* _M_num_get;
+ };
+ template<typename _CharT, typename _Traits>
+ class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
+ public:
+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
+ __ostream_type& operator<<(double __f) { }
+ };
+ typedef double Real;
+ class Vector {
+ public:
+ Real operator[](int n) const { }
+ };
+ std::ostream& operator<<(std::ostream& s, const Vector& vec)
+ {
+ int i;
+ s << vec[i] << ')';
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-2_0.C
new file mode 100644
index 000000000..bf936bf53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-2_0.C
@@ -0,0 +1,21 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC}} }
+// { dg-extra-ld-options "-fPIC -r -nostdlib" }
+
+class DataArray {
+ int max() const { }
+};
+template < class HashItem >
+class DataHashTable {
+ template < class ElemHashItem >
+ class Element { };
+ typedef Element< HashItem > Elem;
+ DataArray m_elem;
+};
+class Name { };
+class NameSet {
+ DataHashTable < Name > hashtab;
+};
+NameSet p;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-3_0.C
new file mode 100644
index 000000000..4bff78b49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091002-3_0.C
@@ -0,0 +1,16 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC}} }
+// { dg-extra-ld-options "-fPIC -r -nostdlib" }
+
+template < class T >
+class DataArray {
+ int max() const { }
+};
+class Name { };
+class DataHashTable {
+ template < class ElemHashItem > class Element { };
+ DataArray < Element < Name > > m_elem;
+};
+DataHashTable p;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_0.C
new file mode 100644
index 000000000..649e35cb8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_0.C
@@ -0,0 +1,36 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC -O -flto}} }
+
+typedef double Real;
+class Vector {
+ int dimen;
+ Real* val;
+public:
+ Vector& operator=(const Vector& vec);
+ Vector(int p_dimen, Real *p_val)
+ : dimen(p_dimen), val(p_val) { }
+ int dim() const;
+};
+class DVector : public Vector {
+public:
+ void reDim(int newdim);
+ explicit DVector(const Vector& old);
+ DVector& operator=(const Vector& vec) {
+ reDim(vec.dim());
+ Vector::operator=(vec);
+ }
+};
+Vector& Vector::operator=(const Vector& vec)
+{
+ dimen = vec.dimen;
+ val = vec.val;
+}
+int Vector::dim() const { return dimen; }
+DVector::DVector(const Vector& old) : Vector(0, 0)
+{
+ *this = old;
+}
+void DVector::reDim(int newdim) {}
+int main() {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_1.C
new file mode 100644
index 000000000..0328abaae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-1_1.C
@@ -0,0 +1,26 @@
+typedef double Real;
+class Vector {
+ int dimen;
+ Real* val;
+public:
+ Vector& operator=(const Vector& vec);
+ Vector(int p_dimen, Real *p_val)
+ : dimen(p_dimen), val(p_val) { }
+ int dim() const;
+};
+class DVector : public Vector {
+public:
+ void reDim(int newdim);
+ explicit DVector(const Vector& old);
+ DVector& operator=(const Vector& vec) {
+ reDim(vec.dim());
+ Vector::operator=(vec);
+ }
+};
+class SLUFactor {
+ DVector vec;
+ void solveRight (Vector& x, const Vector& b);
+};
+void SLUFactor::solveRight (Vector& x, const Vector& b) {
+ vec = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_0.C
new file mode 100644
index 000000000..cc1204e6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_0.C
@@ -0,0 +1,30 @@
+// { dg-lto-do link }
+// { dg-require-effective-target fpic }
+// { dg-lto-options {{-fPIC -O -flto}} }
+
+typedef double Real;
+class Vector {
+ int dimen;
+ Real* val;
+public:
+ Vector& operator=(const Vector& vec);
+ Vector(int p_dimen, Real *p_val)
+ : dimen(p_dimen), val(p_val) { }
+ int dim() const;
+};
+class DVector : public Vector {
+public:
+ void reDim(int newdim);
+ explicit DVector(const Vector& old);
+ DVector& operator=(const Vector& vec) {
+ reDim(vec.dim());
+ Vector::operator=(vec);
+ }
+};
+class SLUFactor {
+ DVector vec;
+ void solveRight (Vector& x, const Vector& b);
+};
+void SLUFactor::solveRight (Vector& x, const Vector& b) {
+ vec = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_1.C
new file mode 100644
index 000000000..9bbcd51f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-2_1.C
@@ -0,0 +1,32 @@
+typedef double Real;
+class Vector {
+ int dimen;
+ Real* val;
+public:
+ Vector& operator=(const Vector& vec);
+ Vector(int p_dimen, Real *p_val)
+ : dimen(p_dimen), val(p_val) { }
+ int dim() const;
+};
+class DVector : public Vector {
+public:
+ void reDim(int newdim);
+ explicit DVector(const Vector& old);
+ DVector& operator=(const Vector& vec) {
+ reDim(vec.dim());
+ Vector::operator=(vec);
+ }
+};
+Vector& Vector::operator=(const Vector& vec)
+{
+ dimen = vec.dimen;
+ val = vec.val;
+}
+int Vector::dim() const { return dimen; }
+DVector::DVector(const Vector& old) : Vector(0, 0)
+{
+ *this = old;
+}
+void DVector::reDim(int newdim) {}
+int main() {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_0.C
new file mode 100644
index 000000000..124eea5e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_0.C
@@ -0,0 +1,18 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-O -flto}} }
+
+extern "C" double sqrt (double __x) throw ();
+typedef double VECTOR[3];
+enum { X = 0, Y = 1, Z = 2, T = 3 };
+inline void VLength(double& a, const VECTOR b)
+{
+ a = sqrt(b[X] * b[X] + b[Y] * b[Y] + b[Z] * b[Z]);
+}
+void
+determine_subpatch_flatness(void)
+{
+ double temp1;
+ VECTOR TempV;
+ VLength(temp1, TempV);
+ VLength(temp1, TempV);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_1.C
new file mode 100644
index 000000000..641c7495b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091004-3_1.C
@@ -0,0 +1,16 @@
+extern "C" double sqrt (double __x) throw ();
+typedef double VECTOR[3];
+enum { X = 0, Y = 1, Z = 2, T = 3 };
+inline void VLength(double& a, const VECTOR b)
+{
+ a = sqrt(b[X] * b[X] + b[Y] * b[Y] + b[Z] * b[Z]);
+}
+int
+All_Torus_Intersections(void)
+{
+ double len;
+ VECTOR D;
+ VLength(len, D);
+ VLength(len, D);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-1_0.C
new file mode 100644
index 000000000..cb3f20a4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-1_0.C
@@ -0,0 +1,13 @@
+// { dg-lto-do link }
+// { dg-extra-ld-options "-fwhole-program" }
+
+template <int dim>
+struct AutoDerivativeFunction {
+ virtual void gradient_list (void);
+};
+template <int dim>
+void AutoDerivativeFunction<dim>::gradient_list (void)
+{
+}
+template class AutoDerivativeFunction<1>;
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-2_0.C
new file mode 100644
index 000000000..29ed9b6b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091022-2_0.C
@@ -0,0 +1,12 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-O3 -flto -Winline}} }
+
+#include <string>
+
+int
+main()
+{
+ std::string i;
+ i = "abc";
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_0.C
new file mode 100644
index 000000000..5c74f29cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_0.C
@@ -0,0 +1,11 @@
+// { dg-lto-do link }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+#include "20091026-1_a.h"
+cObject *cHead::find(const char *objname) const
+{
+ return firstchildp;
+}
+class cNetworkType : public cObject { };
+cNetworkType *networktype;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_1.C
new file mode 100644
index 000000000..28816100e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_1.C
@@ -0,0 +1,14 @@
+#include "20091026-1_a.h"
+extern cHead networks;
+class cNetworkType;
+inline cNetworkType *findNetwork(const char *s)
+{
+ return (cNetworkType *)networks.find(s);
+}
+int run(const char *opt_network_name)
+{
+ cNetworkType *network = findNetwork(opt_network_name);
+ if (!network)
+ throw 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_a.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_a.h
new file mode 100644
index 000000000..314dd9610
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091026-1_a.h
@@ -0,0 +1,9 @@
+class cObject {
+public:
+ cObject *firstchildp;
+};
+class cHead : public cObject {
+public:
+ cObject *find(const char *objname) const;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.C
new file mode 100644
index 000000000..3bdfd9d56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.C
@@ -0,0 +1,3 @@
+// { dg-lto-do link }
+#include "20091210-1_0.h"
+void Base::f() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.h
new file mode 100644
index 000000000..a46f3c2db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_0.h
@@ -0,0 +1,9 @@
+struct Base1 {
+ virtual ~Base1() {}
+};
+struct Base2 {
+ virtual void f() = 0;
+};
+struct Base : Base1, Base2 {
+ virtual void f();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_1.C
new file mode 100644
index 000000000..4fb15cd5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091210-1_1.C
@@ -0,0 +1,9 @@
+#include "20091210-1_0.h"
+
+struct Foo : Base {
+ virtual void g();
+};
+
+void Foo::g() {}
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20091219_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091219_0.C
new file mode 100644
index 000000000..b76a95a9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20091219_0.C
@@ -0,0 +1,17 @@
+// { dg-lto-do run }
+// { dg-lto-options {{-O3 -flto}} }
+
+#include <string>
+#include <map>
+
+int main ()
+{
+ typedef std::map<int, std::string> Map;
+ static Map m;
+
+ Map::const_iterator it = m.find(0);
+ if (it != m.end())
+ std::string s = it->second;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302.h
new file mode 100644
index 000000000..7260be10c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302.h
@@ -0,0 +1,9 @@
+typedef float mm128 __attribute ((vector_size (16)));
+
+template <class T>
+struct A
+{
+ static T t;
+};
+
+void f (mm128 *);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_0.C
new file mode 100644
index 000000000..0551e6ebc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_0.C
@@ -0,0 +1,9 @@
+// Test for ABI forward-compatibility aliases with LTO.
+// { dg-skip-if "" { { ! { i?86-*-* x86_64-*-* } } || { *-*-darwin* } } { "*" } { "" } }
+// { dg-lto-options {"-flto -fabi-version=2"} }
+
+#include "20100302.h"
+
+void f(mm128 *) { }
+
+template <> mm128 A<mm128>::t = { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_1.C
new file mode 100644
index 000000000..48548b63a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100302_1.C
@@ -0,0 +1,8 @@
+// { dg-options "-fabi-version=0" }
+
+#include "20100302.h"
+
+int main()
+{
+ f(& A<mm128>::t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-1_0.C
new file mode 100644
index 000000000..f6a741dad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-1_0.C
@@ -0,0 +1,38 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-g -flto}} }
+
+namespace llvm
+{
+ class Function;
+ class MachineCodeInfo;
+ class ExecutionEngine
+ {
+ };
+ class JIT : public ExecutionEngine
+ {
+ void runJITOnFunction (Function * F, MachineCodeInfo * MCI = 0);
+ };
+ class JITEventListener
+ {
+ public:
+ JITEventListener ()
+ {
+ }
+ virtual ~JITEventListener ();
+ };
+}
+
+using namespace llvm;
+void
+JIT::runJITOnFunction (Function * F, MachineCodeInfo * MCI)
+{
+ class MCIListener:public JITEventListener
+ {
+ MachineCodeInfo *const MCI;
+ public:
+ MCIListener (MachineCodeInfo * mci):MCI (mci)
+ {
+ }
+ };
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-2_0.C
new file mode 100644
index 000000000..2ab6bdc56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-2_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-flto -g}} }
+
+struct A
+{
+ virtual ~A();
+};
+
+void foo()
+{
+ struct B : A {};
+ B b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-3_0.C
new file mode 100644
index 000000000..49564a586
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100423-3_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do assemble }
+// { dg-lto-options {{-flto -g}} }
+
+inline int foo()
+{
+ static union { int i; };
+ return i;
+}
+
+void bar()
+{
+ foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100519-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100519-1_0.C
new file mode 100644
index 000000000..bc2ddf140
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100519-1_0.C
@@ -0,0 +1,23 @@
+// { dg-lto-do link }
+
+template <typename Ordinal>
+struct DirectSerializationTraits
+{
+ static void fromCountToDirectBytes(const Ordinal count) {}
+};
+template<typename Ordinal> class SerializationTraits
+ : public DirectSerializationTraits<Ordinal> { };
+template <typename Ordinal>
+class ConstValueTypeSerializationBuffer
+{
+public:
+ ConstValueTypeSerializationBuffer(const Ordinal count)
+ {
+ typedef SerializationTraits<Ordinal> SerT;
+ SerT::fromCountToDirectBytes(count);
+ }
+};
+int main ()
+{
+ ConstValueTypeSerializationBuffer<int> charSendBuffer(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_0.C
new file mode 100644
index 000000000..8fe11a2f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_0.C
@@ -0,0 +1,14 @@
+/* { dg-lto-do link } */
+
+extern "C" {
+ typedef struct {} CvImage;
+ extern CvImage* Cv_ImageNew(void);
+}
+void __attribute__((noinline,noclone))
+_Raytrace(CvImage* LImage) { __asm volatile (""); }
+int main(int LArgC, char** LArgV)
+{
+ CvImage* LImage = Cv_ImageNew();
+ _Raytrace(LImage);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_1.c b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_1.c
new file mode 100644
index 000000000..fddce5d4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100603-1_1.c
@@ -0,0 +1,2 @@
+typedef struct {} CvImage;
+CvImage* Cv_ImageNew(void) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100721-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100721-1_0.C
new file mode 100644
index 000000000..09132e599
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100721-1_0.C
@@ -0,0 +1,9 @@
+/* { dg-lto-do assemble } */
+
+static inline int __gthread_active_p (void) { }
+template <int rank, int dim> class Tensor;
+template <int dimension> struct G;
+template <int dim> class T {
+ typedef void A;
+ typedef Tensor<1,dim> F[G<dim>::v];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100722-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100722-1_0.C
new file mode 100644
index 000000000..72393950d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100722-1_0.C
@@ -0,0 +1,5 @@
+/* { dg-lto-do assemble } */
+
+template <class T> void void_cast_register(T *) __attribute__ ((used));
+template <class T> void void_cast_register(T *) { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100723-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100723-1_0.C
new file mode 100644
index 000000000..d39963593
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100723-1_0.C
@@ -0,0 +1,12 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options {{-fcompare-debug -flto -flto-partition=none} {-fcompare-debug -flto -flto-partition=1to1}} } */
+
+struct S {
+ virtual void f() { }
+};
+
+int main(int, char *[])
+{
+ S s;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20100724-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100724-1_0.C
new file mode 100644
index 000000000..084c07f08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20100724-1_0.C
@@ -0,0 +1,7 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options {{-ftoplevel-reorder -flto -flto-partition=none} {-ftoplevel-reorder -flto -flto-partition=1to1}} } */
+/* { dg-extra-ld-options {-r -nostdlib} } */
+
+struct Foo { virtual ~Foo(); };
+struct Bar:public Foo { Bar() { } };
+void Func() { new Bar(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101009-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101009-1_0.C
new file mode 100644
index 000000000..b7cc5bc47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101009-1_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do link }
+
+template < typename > struct X
+{
+ template < typename > static int test ();
+ static const int i = sizeof (test < int >());
+};
+
+template struct X < int >;
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-1_0.C
new file mode 100644
index 000000000..6eb40efc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-1_0.C
@@ -0,0 +1,109 @@
+// { dg-lto-do link }
+
+typedef long size_t;
+template < class, class > struct pair
+{
+}
+;
+template < typename > class allocator;
+template < typename > struct equal_to;
+
+template < class > struct hash;
+template
+<
+class, class, class, class, class, class > struct dense_hashtable_iterator;
+template
+<
+class,
+ class, class, class, class, class > struct dense_hashtable_const_iterator;
+template
+<
+class
+Value,
+ class
+ Key,
+ class
+ HashFcn,
+ class ExtractKey, class EqualKey, class Alloc > class dense_hashtable
+{
+public:
+ typedef Key key_type;
+ typedef Value value_type;
+ typedef size_t size_type;
+ typedef
+ dense_hashtable_iterator
+ < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > iterator;
+ typedef
+ dense_hashtable_const_iterator
+ < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > const_iterator;
+ static const size_type ILLEGAL_BUCKET = (-1);
+ pair < size_type, size_type > find_position (key_type)
+ {
+ size_type insert_pos = ILLEGAL_BUCKET;
+ }
+ pair < iterator, bool > insert_noresize (value_type obj)
+ {
+ pair < size_type, size_type > pos = find_position ((obj));
+ }
+ pair < iterator, bool > insert (value_type & obj)
+ {
+ insert_noresize (obj);
+ }
+ ExtractKey get_key;
+}
+
+;
+template
+<
+class
+Value,
+ class
+ HashFcn
+ =
+ hash
+ <
+ Value
+ >,
+ class
+ EqualKey
+ =
+ equal_to < Value >, class Alloc = allocator < Value > >class dense_hash_set
+{
+ struct Identity
+ {
+ }
+ ;
+ typedef
+ dense_hashtable < Value, Value, HashFcn, Identity, EqualKey, Alloc > ht;
+ ht rep;
+public:
+ typedef typename ht::value_type value_type;
+ typedef typename ht::const_iterator iterator;
+ pair < iterator, bool > insert (value_type obj)
+ {
+ pair < typename ht::iterator, bool > p = rep.insert (obj);
+ }
+}
+
+;
+class blah_46
+{
+}
+;
+struct foo_10:dense_hash_set < blah_46 >
+{
+}
+;
+class foo_14
+{
+ void hmmmmh_5 (blah_46);
+ foo_10 negative_rrrrrrr_type_data_;
+}
+;
+void
+foo_14::hmmmmh_5 (blah_46 hahaha_id)
+{
+ negative_rrrrrrr_type_data_.insert (hahaha_id);
+}
+
+int main () { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-2_0.C
new file mode 100644
index 000000000..c68bcd632
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-2_0.C
@@ -0,0 +1,32 @@
+// { dg-lto-do link }
+
+typedef int size_t;
+template < size_t _Nw > struct _Base_bitset
+{
+ typedef unsigned _WordT;
+ _WordT _M_w[_Nw];
+ void _M_do_set ()
+ {
+ for (size_t __i;;)
+ _M_w[__i] = static_cast < _WordT > (0);
+ }
+};
+
+template < size_t > class bitset:
+_Base_bitset < ((sizeof (unsigned)) + ((sizeof (unsigned)) ? : 1)) >
+{
+public:
+ bitset set ()
+ {
+ _M_do_set ();
+ }
+};
+
+void
+test01 ()
+{
+ bitset < 96 > z6;
+ z6.set ();
+}
+
+int main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-3_0.C
new file mode 100644
index 000000000..ed3b8d6bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-3_0.C
@@ -0,0 +1,5 @@
+// { dg-lto-do link }
+// { dg-lto-options { "-flto -std=c++0x" } }
+
+decltype(nullptr) a;
+int main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-4_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-4_0.C
new file mode 100644
index 000000000..01beb2167
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101010-4_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -std=c++0x -flto -r -nostdlib } { -std=c++0x -flto -g -r -nostdlib } } }
+
+typedef decltype(nullptr) nullptr_t;
+class shared_ptr {
+public:
+ shared_ptr(nullptr_t __p);
+};
+shared_ptr p = nullptr;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-1_0.C
new file mode 100644
index 000000000..d2f599e40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-1_0.C
@@ -0,0 +1,16 @@
+// { dg-lto-do run }
+
+static const char *fname;
+struct S
+{
+ S () { fname = __func__; }
+};
+extern "C" void abort (void);
+int
+main ()
+{
+ S tmp;
+ if (fname[0] != 'S')
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-2_0.C
new file mode 100644
index 000000000..0b2a52c61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101014-2_0.C
@@ -0,0 +1,8 @@
+// { dg-lto-do assemble }
+
+template<class T, unsigned long l>
+inline unsigned long foo (T (&)[l]) { return l; }
+
+struct S { char *s[4]; S (); };
+
+S::S () { typedef int T[foo (s) == 4 ? 1 : -1]; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-1_0.C
new file mode 100644
index 000000000..a3b296ee0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-1_0.C
@@ -0,0 +1,31 @@
+// { dg-lto-do assemble }
+
+class DOMString { };
+class DocumentImpl;
+class NodeImpl {
+public:
+ static const DOMString&
+ mapPrefix(const DOMString &prefix, const DOMString &namespaceURI, short nType);
+ static DOMString getXmlnsURIString();
+};
+class DOM_Node {
+public:
+ enum NodeType { ATTRIBUTE_NODE = 2 };
+};
+class AttrImpl: public NodeImpl {
+public:
+ AttrImpl(DocumentImpl *ownerDocument, const DOMString &aName);
+};
+class AttrNSImpl: public AttrImpl {
+ AttrNSImpl(DocumentImpl *ownerDoc, const DOMString &namespaceURI, const DOMString &qualifiedName);
+};
+AttrNSImpl::AttrNSImpl(DocumentImpl *ownerDoc,
+ const DOMString &fNamespaceURI,
+ const DOMString &qualifiedName)
+ : AttrImpl(ownerDoc, qualifiedName)
+{
+ DOMString xmlnsURI = NodeImpl::getXmlnsURIString();
+ DOMString prefix;
+ bool xmlnsAlone = false;
+ const DOMString& URI = xmlnsAlone ? xmlnsURI : mapPrefix(prefix, fNamespaceURI, DOM_Node::ATTRIBUTE_NODE);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-2_0.C
new file mode 100644
index 000000000..9015f53a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101015-2_0.C
@@ -0,0 +1,6 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto } { -g -flto } } }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+struct Base { ~Base (); };
+void fun(void) { struct Deriv : Base { } x; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.C
new file mode 100644
index 000000000..e92bcf8ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.C
@@ -0,0 +1,8 @@
+// { dg-lto-do link }
+
+#include "20101020-1_0.h"
+A::A ()
+{
+ foo (&A::bar);
+}
+int main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.h
new file mode 100644
index 000000000..2de1d3c76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_0.h
@@ -0,0 +1,23 @@
+struct A;
+typedef void (A::*Am1) (void *);
+typedef void (A::*Am2) ();
+
+struct B
+{
+ Am2 am2;
+};
+
+struct A
+{
+ A ();
+ struct B b;
+ struct C *c;
+ struct D *d;
+ void foo (Am1);
+ void bar (void *);
+};
+
+struct C
+{
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_1.C
new file mode 100644
index 000000000..5c83fbfdb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101020-1_1.C
@@ -0,0 +1,11 @@
+#include "20101020-1_0.h"
+struct D
+{
+};
+void A::bar (void *)
+{
+}
+void A::foo (Am1)
+{
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_0.C
new file mode 100644
index 000000000..93a1cf3af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_0.C
@@ -0,0 +1,5 @@
+typedef struct { int i; } T1;
+typedef T1 T2;
+extern T1 a;
+extern T2 b;
+int main() { return a.i + b.i; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_1.c b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_1.c
new file mode 100644
index 000000000..628e89b6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20101126-1_1.c
@@ -0,0 +1,4 @@
+typedef struct { int i; } T1;
+typedef T1 T2;
+T1 a;
+T2 b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/20110311-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/20110311-1_0.C
new file mode 100644
index 000000000..c63951e5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/20110311-1_0.C
@@ -0,0 +1,51 @@
+/* { dg-lto-do link } */
+/* { dg-extra-ld-options "-r -nostdlib" } */
+
+struct NullType {};
+
+template <class T, class U>
+struct TList
+{
+ typedef T Head;
+ typedef U Tail;
+};
+
+template <class T>
+struct TListLength {};
+
+template <class T, class U>
+struct TListLength<TList<T,U> >
+{
+ enum
+ {
+ Ret = 1 + TListLength<U>::Ret
+ };
+};
+
+template <>
+struct TListLength<NullType>
+{
+ enum
+ {
+ Ret = 0
+ };
+};
+
+template <class Moves>
+class DDQMC
+{
+public:
+ int* moves[TListLength<Moves>::Ret];
+ inline DDQMC();
+private:
+};
+
+template <class Moves>
+DDQMC<Moves>::DDQMC()
+{
+}
+
+int main()
+{
+ typedef DDQMC< TList<float, TList<int, NullType> > > mytype;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/README b/gcc-4.9/gcc/testsuite/g++.dg/lto/README
new file mode 100644
index 000000000..1a13dd92c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/README
@@ -0,0 +1,35 @@
+This directory contains tests for link-time optimization (LTO).
+Tests in this directory may span multiple files, so the naming of
+the files is significant.
+
+The name of every file must end with '_N' where N is an integer.
+All the files with the same name base and different _N suffixes
+will be compiled separately and linked together to form the final
+executable.
+
+By default, each set of files will be compiled with list of
+options listed in LTO_OPTIONS (../../lib/lto.exp), which can be
+overwritten in the shell environment or using the 'dg-lto-options'
+command in the main file of the set (i.e., the file with _0
+suffix).
+
+For example, given the files a_0.C a_1.C a_2.C, they will be
+compiled as:
+
+$ g++ -c <flags> a_0.C
+$ g++ -c <flags> a_1.C
+$ g++ -c <flags> a_2.C
+$ g++ -o <executable> a_0.o a_1.o a_2.o
+
+Tests that do not need more than one file are a special case
+where there is a single file named 'foo_0.C'.
+
+The only supported dg-lto-do option are 'assemble', 'run' and 'link'.
+Additionally, these can only be used in the main file. If
+'assemble' is used, only the individual object files are
+generated. If 'link' is used, the final executable is generated
+but not executed (in this case, function main() needs to exist
+but it does not need to do anything). If 'run' is used, the
+final executable is generated and the resulting binary executed.
+
+The default value for dg-lto-do is 'run'.
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/lto.exp b/gcc-4.9/gcc/testsuite/g++.dg/lto/lto.exp
new file mode 100644
index 000000000..4d7d727b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/lto.exp
@@ -0,0 +1,60 @@
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+#
+# Contributed by Diego Novillo <dnovillo@google.com>
+
+
+# Test link-time optimization across multiple files.
+#
+# Programs are broken into multiple files. Each one is compiled
+# separately with LTO information. The final executable is generated
+# by collecting all the generated object files using regular LTO or WHOPR.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# Load procedures from common libraries.
+load_lib standard.exp
+load_lib g++.exp
+load_lib target-libpath.exp
+
+# Load the language-independent compabibility support procedures.
+load_lib lto.exp
+
+# If LTO has not been enabled, bail.
+if { ![check_effective_target_lto] } {
+ return
+}
+
+g++_init
+lto_init no-mathlib
+
+# Define an identifier for use with this suite to avoid name conflicts
+# with other lto tests running at the same time.
+set sid "cp_lto"
+
+# Main loop.
+foreach src [lsort [find $srcdir/$subdir *_0.\[cC\]]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+
+ lto-execute $src $sid
+}
+
+lto_finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr40818_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr40818_0.C
new file mode 100644
index 000000000..8430f9cd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr40818_0.C
@@ -0,0 +1,11 @@
+// { dg-lto-do assemble }
+// Test case from Eugene A. Strizhov.
+
+extern int i;
+struct S { S (); };
+
+S::S ()
+{
+ enum { fifty = 0x50 };
+ if (i > fifty);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_0.C
new file mode 100644
index 000000000..e422daa69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_0.C
@@ -0,0 +1,22 @@
+// { dg-lto-do run }
+// { dg-lto-options { { -flto -g } { -flto -flto-partition=none -g } } }
+
+#include <typeinfo>
+
+struct B {
+ virtual void b() {}
+};
+
+static B* f() {
+ struct D : public B {
+ };
+
+ return new D;
+}
+
+extern B* g();
+
+int main () {
+ if (typeid (*f()) == typeid (*g()))
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_1.C
new file mode 100644
index 000000000..638479e74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr42987_1.C
@@ -0,0 +1,14 @@
+struct B {
+ virtual void b() {}
+};
+
+static B* f() {
+ struct D : public B {
+ };
+
+ return new D;
+}
+
+B* g() {
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621.h
new file mode 100644
index 000000000..81a764225
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621.h
@@ -0,0 +1,8 @@
+struct S
+{
+ void m ();
+ virtual void v1 ();
+ virtual void v2 ();
+};
+
+extern S s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_0.C
new file mode 100644
index 000000000..746079cdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_0.C
@@ -0,0 +1,10 @@
+// { dg-lto-do assemble }
+// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r" }
+#include "pr45621.h"
+
+void
+foo ()
+{
+ s.v1 ();
+ s.m ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_1.C
new file mode 100644
index 000000000..2ada6a879
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45621_1.C
@@ -0,0 +1,13 @@
+#include "pr45621.h"
+
+void
+S::v1 ()
+{
+ v2 ();
+}
+
+void
+S::m ()
+{
+ v1 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_0.C
new file mode 100644
index 000000000..349f5c2c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_0.C
@@ -0,0 +1,28 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-O3 -Wno-multichar}} }
+// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" }
+
+ extern "C" {
+ typedef struct __locale_struct {
+ }
+ *__locale_t;
+ }
+ typedef void * POVMSContext;
+ struct POVMSData {
+ };
+ int POVMS_OpenContext (POVMSContext *contextrefptr);
+ enum {
+ kPOVMsgIdent_InitInfo = 'InIn', kPOVMsgIdent_RenderOptions = 'ROpt', kPOVMsgIdent_RenderAll = 'RAll', kPOVMsgIdent_RenderArea = 'RAre', kPOVMsgIdent_RenderPause = 'RPau', kPOVMsgIdent_RenderStop = 'RSto', kPOVMsgIdent_RenderStarted = 'RRun', kPOVMsgIdent_RenderDone = 'REnd', kPOVMsgIdent_FrameStatistics = 'FSta', kPOVMsgIdent_ParseStatistics = 'PSta', kPOVMsgIdent_RenderStatistics = 'RSta', kPOVMsgIdent_Progress = 'Prog', kPOVMsgIdent_Warning = 'Warn', kPOVMsgIdent_Error = 'ErrW', kPOVMsgIdent_FatalError = 'ErrF', kPOVMsgIdent_Debug = 'Dbug' };
+ namespace pov {
+ }
+ using namespace pov;
+ namespace pov {
+ int pre_init_flag = 0;
+ }
+ POVMSContext POVMS_Render_Context = __null;
+ void povray_init() {
+ if (pre_init_flag == 0) {
+ int err;
+ err = POVMS_OpenContext(&POVMS_Render_Context);
+ }
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_1.C
new file mode 100644
index 000000000..c5e2db061
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-1_1.C
@@ -0,0 +1,77 @@
+ extern "C" {
+ typedef struct _IO_FILE FILE;
+ extern struct _IO_FILE *stderr;
+ extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...);
+ }
+ enum {
+ kPOVMSObjectClassID = 'OCLA', kPOVMSMessageClassID = 'MCLA', kPOVMSMessageIdentID = 'MIDE', kPOVMSSourceAddressID = 'MSRC', kPOVMSDestinationAddressID = 'MDST', kPOVMSMessageTimeoutID = 'TOUT', kPOVMSMessageErrorID = 'MERR' };
+ typedef void * POVMSContext;
+ typedef struct POVMSData POVMSObject, *POVMSObjectPtr;
+ typedef struct POVMSData POVMSAttribute, *POVMSAttributePtr;
+ struct POVMSData {
+ union {
+ struct POVMSNode *root;
+ };
+ };
+ struct POVMSNode {
+ struct POVMSNode *next;
+ unsigned int key;
+ struct POVMSData data;
+ };
+ int POVMSObject_New (POVMSObjectPtr object, unsigned int objclass);
+ int POVMSObject_Set (POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key);
+ int POVMSAttr_Copy (POVMSAttributePtr sourceattr, POVMSAttributePtr destattr);
+ int POVMSUtil_GetType (POVMSObjectPtr object, unsigned int key, unsigned int *typevalue);
+ namespace pov_base {
+ enum {
+ kNoError = 0, kNoErr = kNoError, kParamErr = -1, kMemFullErr = -2, kOutOfMemoryErr = kMemFullErr, kInvalidDataSizeErr = -3, kCannotHandleDataErr = -4, kNullPointerErr = -5, kChecksumErr = -6, kParseErr = -7, kCannotOpenFileErr = -8, kInvalidDestAddrErr = -9, kCannotConnectErr = -10, kDisconnectedErr = -11, kHostDisconnectedErr = -12, kNetworkDataErr = -13, kNetworkConnectionErr = -14, kObjectAccessErr = -15, kVersionErr = -16, kFileDataErr = -17, kAuthorisationErr = -18, kDataTypeErr = -19, kTimeoutErr = -20, kInvalidContextErr = -21 };
+ }
+ using namespace pov_base;
+ struct POVMSContextData {
+ };
+ int POVMS_AssertFunction (int cond, const char *str, const char *filename, int line);
+ int POVMS_OpenContext(POVMSContext *contextrefptr) {
+ POVMSContextData *context = __null;
+ if(contextrefptr == __null) return kParamErr;
+ if(POVMS_AssertFunction(context != __null, "POVMS_Open_Context failed, out of memory", "povms.cpp", 283) == false) return kMemFullErr;
+ return kNoErr;
+ }
+ int POVMS_AssertFunction(int cond, const char *str, const char *filename, int line) {
+ if(cond == false) {
+ fprintf(stderr, "POVMS_ASSERT failed in %s line %d: %s\n", filename, (int)line, str);
+ }
+ }
+ int POVMSObject_Copy(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) {
+ POVMSNode *cur = __null;
+ POVMSAttribute attr;
+ unsigned int t;
+ int ret = kNoErr;
+ if(sourceobject == destobject) return kParamErr;
+ if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t) != kNoErr) return kObjectAccessErr;
+ if(POVMSObject_New(destobject, t) != kNoErr) return kObjectAccessErr;
+ for(cur = sourceobject->root;
+ cur != __null;
+ cur = cur->next) {
+ if(POVMS_AssertFunction(POVMSAttr_Copy(&(cur->data), &attr) == kNoErr, "POVMSObject_Copy failed, out of memory", "povms.cpp", 2028) == false) {
+ }
+ if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Copy failed, out of memory", "povms.cpp", 2034) == false) {
+ }
+ }
+ return ret;
+ }
+ int POVMSObject_Merge(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) {
+ POVMSNode *cur = __null;
+ POVMSAttribute attr;
+ unsigned int t1, t2;
+ int ret = kNoErr;
+ if(destobject == __null) return kParamErr;
+ if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t1) != kNoErr) return kObjectAccessErr;
+ if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t2) != kNoErr) return kObjectAccessErr;
+ for(cur = sourceobject->root;
+ cur != __null;
+ cur = cur->next) {
+ if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2090) == false) {
+ }
+ }
+ return ret;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_0.C
new file mode 100644
index 000000000..549741902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_0.C
@@ -0,0 +1,119 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-O3 -Wno-multichar}} }
+// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" }
+ extern "C" {
+ typedef struct {
+ union {
+ }
+ __value;
+ }
+ __mbstate_t;
+ struct _IO_marker {
+ };
+ extern "C" {
+ }
+ };
+ namespace pov_base {
+ class IOBase {
+ };
+ }
+ namespace pov {
+ typedef double VECTOR[3];
+ enum {
+ X = 0, Y = 1, Z = 2, T = 3 };
+ inline void Assign_Vector(VECTOR d, VECTOR s) {
+ }
+ typedef float BBOX_VAL;
+ typedef BBOX_VAL BBOX_VECT[3];
+ typedef struct Bounding_Box_Struct BBOX;
+ struct Bounding_Box_Struct {
+ };
+ inline void Make_BBox_from_min_max(BBOX& BBox, BBOX_VECT mins, BBOX_VECT maxs) {
+ }
+ typedef long long COUNTER;
+ inline double DBL_Counter(COUNTER x) {
+ }
+ struct Image_Struct {
+ union {
+ }
+ data;
+ };
+ struct Density_file_Data_Struct {
+ union {
+ }
+ Vals;
+ };
+ struct Pigment_Struct {
+ union {
+ struct {
+ }
+ Brick;
+ struct {
+ }
+ Fractal;
+ struct {
+ }
+ Function;
+ }
+ Vals;
+ };
+ typedef enum shelltype {
+ PRE_SCENE_SHL = 0, PRE_FRAME_SHL, POST_FRAME_SHL, POST_SCENE_SHL, USER_ABORT_SHL, FATAL_SHL, MAX_SHL }
+ SHELLRET;
+ }
+ typedef void * POVMSContext;
+ struct POVMSData {
+ };
+ int POVMS_OpenContext (POVMSContext *contextrefptr);
+ namespace pov_base {
+ enum {
+ kFalseErr = 1, kOutOfSyncErr = 2, kNotNowErr = kOutOfSyncErr, kQueueFullErr = 3 };
+ }
+ namespace pov_base {
+ class OTextStream {
+ };
+ }
+ enum {
+ kPOVMsgClass_RenderControl = 'Ctrl', kPOVMsgClass_RenderOutput = 'Outp', kPOVMsgClass_IniOptions = 'IniO', kPOVMsgClass_Miscellaneous = 'Misc' };
+ namespace pov_base {
+ class PlatformBase {
+ };
+ }
+ class POVMS_Container {
+ template<class T> void Read(T& stream) {
+ }
+ };
+ class POVMS_MessageReceiver {
+ private: class HandlerOO {
+ };
+ protected: template<class T> class MemberHandlerOO : public HandlerOO {
+ };
+ class FunctionHandlerOO : public HandlerOO {
+ };
+ template<class T> void InstallFront(unsigned int hclass, unsigned int hid, T *cptr, typename MemberHandlerOO<T>::MemberHandlerPtr hptr) {
+ }
+ };
+ namespace pov_base {
+ class TextStreamBuffer {
+ };
+ }
+ namespace pov_frontend {
+ using namespace pov_base;
+ class MessageOutput : public POVMS_MessageReceiver {
+ };
+ class DefaultPlatformBase : public PlatformBase {
+ };
+ }
+ using namespace pov;
+ namespace pov {
+ int pre_init_flag = 0;
+ }
+ POVMSContext POVMS_Render_Context = __null;
+ int main(int argc, char **argv) {
+ }
+ void povray_init() {
+ if (pre_init_flag == 0) {
+ int err;
+ err = POVMS_OpenContext(&POVMS_Render_Context);
+ }
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_1.C
new file mode 100644
index 000000000..23ba08aec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45679-2_1.C
@@ -0,0 +1,100 @@
+extern "C" {
+ typedef struct __locale_struct {
+ }
+ *__locale_t;
+ union wait {
+ };
+ extern "C" {
+ }
+ typedef struct _IO_FILE FILE;
+ typedef struct {
+ union {
+ }
+ __value;
+ }
+ _G_fpos64_t;
+ struct _IO_marker {
+ }
+ _IO_cookie_io_functions_t;
+ extern struct _IO_FILE *stderr;
+ extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...);
+ }
+ enum {
+ kPOVMSObjectClassID = 'OCLA', kPOVMSMessageClassID = 'MCLA', kPOVMSMessageIdentID = 'MIDE', kPOVMSSourceAddressID = 'MSRC', kPOVMSDestinationAddressID = 'MDST', kPOVMSMessageTimeoutID = 'TOUT', kPOVMSMessageErrorID = 'MERR' };
+ typedef void * POVMSContext;
+ typedef struct POVMSData POVMSObject, *POVMSObjectPtr;
+ typedef struct POVMSData POVMSAttribute, *POVMSAttributePtr;
+ typedef struct POVMSData POVMSAttributeList, *POVMSAttributeListPtr;
+ struct POVMSData {
+ int size;
+ union {
+ void *ptr;
+ struct POVMSNode *root;
+ };
+ };
+ struct POVMSNode {
+ struct POVMSNode *next;
+ unsigned int key;
+ struct POVMSData data;
+ };
+ int POVMSObject_Set (POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key);
+ int POVMSAttr_Copy (POVMSAttributePtr sourceattr, POVMSAttributePtr destattr);
+ int POVMSUtil_GetType (POVMSObjectPtr object, unsigned int key, unsigned int *typevalue);
+ namespace pov_base {
+ enum {
+ kNoError = 0, kNoErr = kNoError, kParamErr = -1, kMemFullErr = -2, kOutOfMemoryErr = kMemFullErr, kInvalidDataSizeErr = -3, kCannotHandleDataErr = -4, kNullPointerErr = -5, kChecksumErr = -6, kParseErr = -7, kCannotOpenFileErr = -8, kInvalidDestAddrErr = -9, kCannotConnectErr = -10, kDisconnectedErr = -11, kHostDisconnectedErr = -12, kNetworkDataErr = -13, kNetworkConnectionErr = -14, kObjectAccessErr = -15, kVersionErr = -16, kFileDataErr = -17, kAuthorisationErr = -18, kDataTypeErr = -19, kTimeoutErr = -20, kInvalidContextErr = -21 };
+ }
+ using namespace pov_base;
+ struct POVMSContextData {
+ };
+ int POVMS_AssertFunction (int cond, const char *str, const char *filename, int line);
+ int POVMS_OpenContext(POVMSContext *contextrefptr) {
+ POVMSContextData *context = __null;
+ if(contextrefptr == __null) return kParamErr;
+ if(POVMS_AssertFunction(context != __null, "POVMS_Open_Context failed, out of memory", "povms.cpp", 283) == false) return kMemFullErr;
+ return kNoErr;
+ }
+ int POVMS_AssertFunction(int cond, const char *str, const char *filename, int line) {
+ if(cond == false) {
+ fprintf(stderr, "POVMS_ASSERT failed in %s line %d: %s\n", filename, (int)line, str);
+ }
+ }
+ int POVMSObject_Copy(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) {
+ POVMSNode *cur = __null;
+ POVMSAttribute attr;
+ unsigned int t1, t2;
+ int ret = kNoErr;
+ if(destobject == __null) return kParamErr;
+ if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t1) != kNoErr) return kObjectAccessErr;
+ if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t2) != kNoErr) return kObjectAccessErr;
+ if(t1 != t2) return kDataTypeErr;
+ for(cur = sourceobject->root;
+ cur != __null;
+ cur = cur->next) {
+ if(POVMS_AssertFunction(POVMSAttr_Copy(&(cur->data), &attr) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2084) == false) {
+ }
+ if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2090) == false) {
+ }
+ }
+ return ret;
+ }
+ int POVMSObject_Set(POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key) {
+ }
+ int POVMSAttrList_Copy(POVMSAttributeListPtr sourcelist, POVMSAttributeListPtr destlist) {
+ int cnt;
+ int err = kNoErr;
+ if(sourcelist == __null) return kParamErr;
+ if(destlist == __null) return kParamErr;
+ if(sourcelist == destlist) return kParamErr;
+ if(sourcelist->size < 0) return kParamErr;
+ if(sourcelist->size > 0) {
+ if(sourcelist->ptr != __null) {
+ if(POVMS_AssertFunction(destlist->ptr != __null, "POVMSAttrList_Copy failed, out of memory", "povms.cpp", 3020) == false) return -1;
+ }
+ for(cnt = 0;
+ cnt < sourcelist->size;
+ cnt++) {
+ }
+ }
+ return err;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45983_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45983_0.C
new file mode 100644
index 000000000..a2c9ba609
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr45983_0.C
@@ -0,0 +1,20 @@
+// PR c++/45983
+
+template <int N>
+class T1 {
+ int m[N];
+ typedef float scalar_type_t;
+ typedef scalar_type_t scalar_array_t[1];
+ const scalar_array_t &decay(void) const;
+};
+class T2 {
+public:
+ float vals[1];
+ float get_value(void) const { return vals[0]; }
+};
+T2 channel_params;
+float output_audio(void) {
+ return channel_params.get_value();
+}
+
+int main(){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr47333.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr47333.C
new file mode 100644
index 000000000..60873ca07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr47333.C
@@ -0,0 +1,944 @@
+namespace std
+{
+ typedef unsigned int size_t;
+ typedef int ptrdiff_t;
+
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+
+ template<typename _Alloc>
+ class allocator;
+
+ template<class _CharT>
+ struct char_traits;
+
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_string;
+
+ template<> struct char_traits<char>;
+
+ typedef basic_string<char> string;
+
+ template<> struct char_traits<wchar_t>;
+
+ typedef basic_string<wchar_t> wstring;
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+
+ template<typename _Tp>
+ inline _Tp*
+ __addressof(_Tp& __r)
+ {
+ return reinterpret_cast<_Tp*>
+ (&const_cast<char&>(reinterpret_cast<const volatile char&>(__r)));
+ }
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+
+ _T1 first;
+ _T2 second;
+
+ pair()
+ : first(), second() { }
+
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct input_iterator_tag { };
+
+ struct output_iterator_tag { };
+
+ struct forward_iterator_tag : public input_iterator_tag { };
+
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ };
+}
+
+struct _IO_FILE;
+
+typedef struct _IO_FILE FILE;
+
+typedef struct _IO_FILE __FILE;
+
+typedef __builtin_va_list __gnuc_va_list;
+
+typedef unsigned int size_t;
+typedef unsigned int wint_t;
+
+typedef struct
+{
+ int __count;
+ union
+ {
+ unsigned int __wch;
+ char __wchb[4];
+ } __value;
+} __mbstate_t;
+
+
+typedef __mbstate_t mbstate_t;
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::mbstate_t;
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ typedef long long streamoff;
+
+ typedef ptrdiff_t streamsize;
+ template<typename _StateT>
+ class fpos
+ {
+ private:
+ streamoff _M_off;
+ _StateT _M_state;
+
+ public:
+
+ fpos()
+ : _M_off(0), _M_state() { }
+ fpos(streamoff __off)
+ : _M_off(__off), _M_state() { }
+
+ operator streamoff() const { return _M_off; }
+
+ };
+
+ typedef fpos<mbstate_t> streampos;
+
+ typedef fpos<mbstate_t> wstreampos;
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT>
+ struct _Char_types
+ {
+ typedef unsigned long int_type;
+ typedef std::streampos pos_type;
+ typedef std::streamoff off_type;
+ typedef std::mbstate_t state_type;
+ };
+ template<typename _CharT>
+ struct char_traits
+ {
+ typedef _CharT char_type;
+ typedef typename _Char_types<_CharT>::int_type int_type;
+ typedef typename _Char_types<_CharT>::pos_type pos_type;
+ typedef typename _Char_types<_CharT>::off_type off_type;
+ typedef typename _Char_types<_CharT>::state_type state_type;
+
+ static const char_type*
+ find(const char_type* __s, std::size_t __n, const char_type& __a);
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _CharT>
+ struct char_traits : public __gnu_cxx::char_traits<_CharT>
+ { };
+
+ template<>
+ struct char_traits<char>
+ {
+ typedef char char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n)); }
+ };
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+
+ new_allocator() throw() { }
+
+ new_allocator(const new_allocator&) throw() { }
+
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+
+ ~new_allocator() throw() { }
+
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__n > this->max_size())
+ std::__throw_bad_alloc();
+
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class allocator;
+
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+
+ allocator() throw() { }
+
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+
+ ~allocator() throw() { }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Arg, typename _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
+
+ template<typename _Pair>
+ struct _Select1st : public unary_function<_Pair,
+ typename _Pair::first_type>
+ {
+ typename _Pair::first_type&
+ operator()(_Pair& __x) const
+ { return __x.first; }
+
+ const typename _Pair::first_type&
+ operator()(const _Pair& __x) const
+ { return __x.first; }
+ };
+}
+
+extern "C" {
+
+typedef int __sig_atomic_t;
+
+typedef struct
+ {
+ unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
+ } __sigset_t;
+typedef __sigset_t sigset_t;
+}
+typedef unsigned long int pthread_t;
+
+typedef struct __pthread_internal_slist
+{
+ struct __pthread_internal_slist *__next;
+} __pthread_slist_t;
+
+typedef union
+{
+ struct __pthread_mutex_s
+ {
+ int __lock;
+ unsigned int __count;
+ int __owner;
+ int __kind;
+
+ unsigned int __nusers;
+ __extension__ union
+ {
+ int __spins;
+ __pthread_slist_t __list;
+ };
+
+ } __data;
+ char __size[24];
+ long int __align;
+} pthread_mutex_t;
+
+typedef unsigned int pthread_key_t;
+
+typedef int pthread_once_t;
+
+extern int pthread_once (pthread_once_t *__once_control,
+ void (*__init_routine) (void)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern int pthread_mutex_lock (pthread_mutex_t *__mutex)
+ throw () __attribute__ ((__nonnull__ (1)));
+
+extern int pthread_mutex_unlock (pthread_mutex_t *__mutex)
+ throw () __attribute__ ((__nonnull__ (1)));
+
+typedef pthread_t __gthread_t;
+typedef pthread_key_t __gthread_key_t;
+typedef pthread_once_t __gthread_once_t;
+typedef pthread_mutex_t __gthread_mutex_t;
+
+static __typeof(pthread_once) __gthrw_pthread_once __attribute__ ((__weakref__("pthread_once")));
+
+static __typeof(pthread_mutex_lock) __gthrw_pthread_mutex_lock __attribute__ ((__weakref__("pthread_mutex_lock")));
+
+static __typeof(pthread_mutex_unlock) __gthrw_pthread_mutex_unlock __attribute__ ((__weakref__("pthread_mutex_unlock")));
+
+static volatile int __gthread_active = -1;
+
+static void
+__gthread_trigger (void)
+{
+ __gthread_active = 1;
+}
+
+static inline int
+__gthread_active_p (void)
+{
+ static pthread_mutex_t __gthread_active_mutex = { { 0, 0, 0, 0, 0, { 0 } } };
+ static pthread_once_t __gthread_active_once = 0;
+
+ int __gthread_active_latest_value = __gthread_active;
+
+ if (__builtin_expect (__gthread_active_latest_value < 0, 0))
+ {
+ if (__gthrw_pthread_once)
+ {
+ __gthrw_pthread_mutex_lock (&__gthread_active_mutex);
+ __gthrw_pthread_once (&__gthread_active_once, __gthread_trigger);
+ __gthrw_pthread_mutex_unlock (&__gthread_active_mutex);
+ }
+
+ if (__gthread_active < 0)
+ __gthread_active = 0;
+ __gthread_active_latest_value = __gthread_active;
+ }
+
+ return __gthread_active_latest_value != 0;
+}
+
+typedef int _Atomic_word;
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+
+ static inline _Atomic_word
+ __exchange_and_add(volatile _Atomic_word* __mem, int __val)
+ { return __sync_fetch_and_add(__mem, __val); }
+
+ static inline void
+ __atomic_add(volatile _Atomic_word* __mem, int __val)
+ { __sync_fetch_and_add(__mem, __val); }
+ static inline _Atomic_word
+ __exchange_and_add_single(_Atomic_word* __mem, int __val)
+ {
+ _Atomic_word __result = *__mem;
+ *__mem += __val;
+ return __result;
+ }
+
+ static inline void
+ __atomic_add_single(_Atomic_word* __mem, int __val)
+ { *__mem += __val; }
+
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ return __exchange_and_add(__mem, __val);
+ else
+ return __exchange_and_add_single(__mem, __val);
+ }
+
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add_dispatch(_Atomic_word* __mem, int __val)
+ {
+ if (__gthread_active_p())
+ __atomic_add(__mem, __val);
+ else
+ __atomic_add_single(__mem, __val);
+ }
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string
+ {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+
+ public:
+ typedef _Traits traits_type;
+ typedef typename _Traits::char_type value_type;
+ typedef _Alloc allocator_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ typedef typename _CharT_alloc_type::difference_type difference_type;
+ typedef typename _CharT_alloc_type::reference reference;
+ typedef typename _CharT_alloc_type::const_reference const_reference;
+ typedef typename _CharT_alloc_type::pointer pointer;
+ typedef typename _CharT_alloc_type::const_pointer const_pointer;
+ typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
+ typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
+ const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+
+ private:
+ struct _Rep_base
+ {
+ size_type _M_length;
+ size_type _M_capacity;
+ _Atomic_word _M_refcount;
+ };
+
+ struct _Rep : _Rep_base
+ {
+
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
+ static const size_type _S_max_size;
+ static const _CharT _S_terminal;
+
+ static size_type _S_empty_rep_storage[];
+
+ static _Rep&
+ _S_empty_rep()
+ {
+ void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
+ return *reinterpret_cast<_Rep*>(__p);
+ }
+
+ _CharT*
+ _M_refdata() throw()
+ { return reinterpret_cast<_CharT*>(this + 1); }
+
+ void
+ _M_dispose(const _Alloc& __a)
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ {
+ ;
+ if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
+ -1) <= 0)
+ {
+ ;
+ _M_destroy(__a);
+ }
+ }
+ }
+
+ void
+ _M_destroy(const _Alloc&) throw();
+
+ _CharT*
+ _M_refcopy() throw()
+ {
+ if (__builtin_expect(this != &_S_empty_rep(), false))
+ __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
+ return _M_refdata();
+ }
+ };
+
+ struct _Alloc_hider : _Alloc
+ {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a)
+ : _Alloc(__a), _M_p(__dat) { }
+
+ _CharT* _M_p;
+ };
+
+ private:
+
+ mutable _Alloc_hider _M_dataplus;
+
+ _CharT*
+ _M_data() const
+ { return _M_dataplus._M_p; }
+
+ _Rep*
+ _M_rep() const
+ { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
+
+ void
+ _M_leak_hard();
+
+ public:
+
+ ~basic_string()
+ { _M_rep()->_M_dispose(this->get_allocator()); }
+
+ public:
+
+ allocator_type
+ get_allocator() const
+ { return _M_dataplus; }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ enum _Rb_tree_color { _S_red = false, _S_black = true };
+
+ struct _Rb_tree_node_base
+ {
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+
+ _Rb_tree_color _M_color;
+ _Base_ptr _M_parent;
+ _Base_ptr _M_left;
+ _Base_ptr _M_right;
+
+ static _Base_ptr
+ _S_minimum(_Base_ptr __x)
+ {
+ while (__x->_M_left != 0) __x = __x->_M_left;
+ return __x;
+ }
+
+ static _Const_Base_ptr
+ _S_minimum(_Const_Base_ptr __x)
+ {
+ while (__x->_M_left != 0) __x = __x->_M_left;
+ return __x;
+ }
+
+ static _Base_ptr
+ _S_maximum(_Base_ptr __x)
+ {
+ while (__x->_M_right != 0) __x = __x->_M_right;
+ return __x;
+ }
+
+ static _Const_Base_ptr
+ _S_maximum(_Const_Base_ptr __x)
+ {
+ while (__x->_M_right != 0) __x = __x->_M_right;
+ return __x;
+ }
+ };
+
+ template<typename _Val>
+ struct _Rb_tree_node : public _Rb_tree_node_base
+ {
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ _Val _M_value_field;
+ };
+
+ __attribute__ ((__pure__)) _Rb_tree_node_base*
+ _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
+
+ __attribute__ ((__pure__)) const _Rb_tree_node_base*
+ _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ();
+
+ __attribute__ ((__pure__)) _Rb_tree_node_base*
+ _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ();
+
+ __attribute__ ((__pure__)) const _Rb_tree_node_base*
+ _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ();
+
+ template<typename _Tp>
+ struct _Rb_tree_iterator
+ {
+ typedef _Tp value_type;
+ typedef _Tp& reference;
+ typedef _Tp* pointer;
+
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+
+ typedef _Rb_tree_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
+ typedef _Rb_tree_node<_Tp>* _Link_type;
+
+ _Rb_tree_iterator()
+ : _M_node() { }
+
+ explicit
+ _Rb_tree_iterator(_Link_type __x)
+ : _M_node(__x) { }
+
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+
+ _Base_ptr _M_node;
+ };
+
+ template<typename _Tp>
+ struct _Rb_tree_const_iterator
+ {
+ typedef _Tp value_type;
+ typedef const _Tp& reference;
+ typedef const _Tp* pointer;
+
+ typedef _Rb_tree_iterator<_Tp> iterator;
+
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+
+ typedef _Rb_tree_const_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
+ typedef const _Rb_tree_node<_Tp>* _Link_type;
+
+ _Rb_tree_const_iterator()
+ : _M_node() { }
+
+ explicit
+ _Rb_tree_const_iterator(_Link_type __x)
+ : _M_node(__x) { }
+
+ _Rb_tree_const_iterator(const iterator& __it)
+ : _M_node(__it._M_node) { }
+
+ pointer
+ operator->() const
+ { return std::__addressof(static_cast<_Link_type>
+ (_M_node)->_M_value_field); }
+
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+
+ _Base_ptr _M_node;
+ };
+
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc = allocator<_Val> >
+ class _Rb_tree
+ {
+ typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other
+ _Node_allocator;
+
+ protected:
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+
+ public:
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ typedef const _Rb_tree_node<_Val>* _Const_Link_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Alloc allocator_type;
+
+ const _Node_allocator&
+ _M_get_Node_allocator() const
+ { return *static_cast<const _Node_allocator*>(&this->_M_impl); }
+
+ allocator_type
+ get_allocator() const
+ { return allocator_type(_M_get_Node_allocator()); }
+
+ protected:
+ void
+ _M_put_node(_Link_type __p)
+ { _M_impl._Node_allocator::deallocate(__p, 1); }
+
+ void
+ _M_destroy_node(_Link_type __p)
+ {
+ get_allocator().destroy(std::__addressof(__p->_M_value_field));
+ _M_put_node(__p);
+ }
+
+ protected:
+ template<typename _Key_compare,
+ bool _Is_pod_comparator = __is_pod(_Key_compare)>
+ struct _Rb_tree_impl : public _Node_allocator
+ {
+ _Key_compare _M_key_compare;
+ _Rb_tree_node_base _M_header;
+ size_type _M_node_count;
+
+ private:
+ void
+ _M_initialize()
+ {
+ this->_M_header._M_color = _S_red;
+ this->_M_header._M_parent = 0;
+ this->_M_header._M_left = &this->_M_header;
+ this->_M_header._M_right = &this->_M_header;
+ }
+ };
+
+ _Rb_tree_impl<_Compare> _M_impl;
+
+ protected:
+
+ _Link_type
+ _M_begin()
+ { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); }
+
+ _Link_type
+ _M_end()
+ { return static_cast<_Link_type>(&this->_M_impl._M_header); }
+
+ static _Link_type
+ _S_left(_Base_ptr __x)
+ { return static_cast<_Link_type>(__x->_M_left); }
+
+ static _Link_type
+ _S_right(_Base_ptr __x)
+ { return static_cast<_Link_type>(__x->_M_right); }
+
+ static const_reference
+ _S_value(_Const_Base_ptr __x)
+ { return static_cast<_Const_Link_type>(__x)->_M_value_field; }
+
+ static const _Key&
+ _S_key(_Const_Base_ptr __x)
+ { return _KeyOfValue()(_S_value(__x)); }
+
+ public:
+ typedef _Rb_tree_iterator<value_type> iterator;
+ typedef _Rb_tree_const_iterator<value_type> const_iterator;
+
+ private:
+
+ void
+ _M_erase(_Link_type __x);
+
+ iterator
+ _M_lower_bound(_Link_type __x, _Link_type __y,
+ const _Key& __k);
+
+ const_iterator
+ _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y,
+ const _Key& __k) const;
+
+ public:
+
+ ~_Rb_tree()
+ { _M_erase(_M_begin()); }
+
+ iterator
+ end()
+ { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); }
+
+ const_iterator
+ end() const
+ {
+ return const_iterator(static_cast<_Const_Link_type>
+ (&this->_M_impl._M_header));
+ }
+
+ public:
+ iterator
+ find(const key_type& __k);
+ };
+
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc>
+ void
+ _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
+ _M_erase(_Link_type __x)
+ {
+
+ while (__x != 0)
+ {
+ _M_erase(_S_right(__x));
+ _Link_type __y = _S_left(__x);
+ _M_destroy_node(__x);
+ __x = __y;
+ }
+ }
+
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc>
+ typename _Rb_tree<_Key, _Val, _KeyOfValue,
+ _Compare, _Alloc>::iterator
+ _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
+ _M_lower_bound(_Link_type __x, _Link_type __y,
+ const _Key& __k)
+ {
+ while (__x != 0)
+ if (!_M_impl._M_key_compare(_S_key(__x), __k))
+ __y = __x, __x = _S_left(__x);
+ else
+ __x = _S_right(__x);
+ return iterator(__y);
+ }
+
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc>
+ typename _Rb_tree<_Key, _Val, _KeyOfValue,
+ _Compare, _Alloc>::iterator
+ _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
+ find(const _Key& __k)
+ {
+ iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
+ return (__j == end()
+ || _M_impl._M_key_compare(__k,
+ _S_key(__j._M_node))) ? end() : __j;
+ }
+
+}
+
+namespace std {
+ template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
+ typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
+ class map
+ {
+ public:
+ typedef _Key key_type;
+ typedef _Tp mapped_type;
+ typedef std::pair<const _Key, _Tp> value_type;
+ typedef _Compare key_compare;
+ typedef _Alloc allocator_type;
+
+ private:
+
+ typedef typename _Alloc::template rebind<value_type>::other
+ _Pair_alloc_type;
+
+ typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
+ key_compare, _Pair_alloc_type> _Rep_type;
+
+ _Rep_type _M_t;
+
+ public:
+
+ typedef typename _Rep_type::iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+
+ map()
+ : _M_t() { }
+
+ const_iterator
+ end() const
+ { return _M_t.end(); }
+
+ key_compare
+ key_comp() const
+ { return _M_t.key_comp(); }
+
+ iterator
+ find(const key_type& __x)
+ { return _M_t.find(__x); }
+ };
+}
+
+int main ()
+{
+ typedef std::map<int, std::string> Map;
+ static Map m;
+
+ Map::const_iterator it = m.find(0);
+ if (it != m.end())
+ std::string s = it->second;
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48042_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48042_0.C
new file mode 100644
index 000000000..00b3428e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48042_0.C
@@ -0,0 +1,14 @@
+// { dg-lto-do link }
+// { dg-extra-ld-options "-r -nostdlib -g" }
+
+class A {
+ virtual int x() = 0;
+};
+
+class B:public A {
+ int x();
+};
+
+int B::x() {
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-2_0.C
new file mode 100644
index 000000000..6801b85a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-2_0.C
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+namespace {
+ typedef struct {
+ int x;
+ } Foo;
+}
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-3_0.C
new file mode 100644
index 000000000..ef02dda84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207-3_0.C
@@ -0,0 +1,12 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+void bar(void) {}
+
+void foo(void)
+{
+ typedef enum { ABC } DEF;
+ bar();
+}
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207_0.C
new file mode 100644
index 000000000..e66cb491b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48207_0.C
@@ -0,0 +1,13 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+void bar(int) {}
+
+void foo(void)
+{
+ typedef enum { ABC } DEF;
+ DEF a;
+ bar((int)a);
+}
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48354-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48354-1_0.C
new file mode 100644
index 000000000..b2ae97709
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48354-1_0.C
@@ -0,0 +1,16 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -g -flto } } }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+template<typename T> struct Identity { typedef T type; };
+struct S {
+ typedef void (S::*FP)();
+ FP fp;
+};
+void g();
+void f() {
+ typedef Identity<S>::type Dummy;
+ S s;
+ g();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_0.C
new file mode 100644
index 000000000..6faee75b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_0.C
@@ -0,0 +1,7 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -g -O2 -flto -flto-partition=none } } }
+
+void __attribute__((externally_visible))
+foo (int i)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_1.C
new file mode 100644
index 000000000..5cda1925b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr48508-1_1.C
@@ -0,0 +1,10 @@
+static void
+bar (void)
+{
+ extern void foo (int);
+ foo (0);
+}
+int main()
+{
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51564-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51564-1_0.C
new file mode 100644
index 000000000..5765cb196
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51564-1_0.C
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+typedef int T;
+void foo(void) {}
+int main()
+{
+ foo();
+ using ::T;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51567-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51567-1_0.C
new file mode 100644
index 000000000..87a7e97b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51567-1_0.C
@@ -0,0 +1,27 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+struct _Deque_iterator {
+ int* _M_cur;
+ void foo() {}
+};
+class _Deque_base {
+public:
+ typedef _Deque_iterator iterator;
+ iterator _M_impl;
+};
+class deque : public _Deque_base {
+public:
+ typedef _Deque_base::iterator iterator;
+};
+class OutputContextStack {
+public:
+ deque m_stack;
+ deque::iterator m_stackPosition;
+};
+int main()
+{
+ OutputContextStack s;
+ s.m_stackPosition.foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51572-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51572-2_0.C
new file mode 100644
index 000000000..f7de4f06a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51572-2_0.C
@@ -0,0 +1,16 @@
+// Copy of g++.dg/debug/pr45660
+// { dg-lto-do link }
+// { dg-lto-options { { -g -flto } } }
+
+int
+main ()
+{
+ struct S
+ {
+ typedef void (**T) (void);
+ static T i (void) { return 0; }
+ };
+ S s;
+ if (s.i ())
+ *s.i () = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51573-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51573-1_0.C
new file mode 100644
index 000000000..109bbb99a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51573-1_0.C
@@ -0,0 +1,13 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto } { -flto -g } } }
+
+struct T
+{
+ virtual void m () { }
+};
+int
+main ()
+{
+ bool fn (T);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-1_0.C
new file mode 100644
index 000000000..4c9ef3c8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-1_0.C
@@ -0,0 +1,19 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+struct T;
+struct C
+{
+ typedef ::T T;
+ static T *m ()
+ {
+ static T *d;
+ return d;
+ }
+};
+int
+fn ()
+{
+ C::m ();
+}
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-2_0.C
new file mode 100644
index 000000000..0979674af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-2_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+typedef struct { } X;
+int main ()
+{
+ typedef X **P;
+ P g = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-3_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-3_0.C
new file mode 100644
index 000000000..e84d555a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51650-3_0.C
@@ -0,0 +1,20 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g } } }
+
+struct T;
+struct C
+{
+ typedef ::T T;
+ virtual void E();
+ static T *m ()
+ {
+ static T *d;
+ return d;
+ }
+};
+int
+fn ()
+{
+ C::m ();
+}
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832.h b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832.h
new file mode 100644
index 000000000..fee369335
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832.h
@@ -0,0 +1,6 @@
+template<class...T> struct A
+{
+ static int i;
+};
+
+inline void f() { A<int>::i = 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_0.C
new file mode 100644
index 000000000..f8fd7ab90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_0.C
@@ -0,0 +1,7 @@
+// PR c++/51832
+// { dg-lto-do link }
+// { dg-lto-options { "-std=c++11 -flto -fabi-version=2" } }
+
+#include "pr51832.h"
+
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_1.C
new file mode 100644
index 000000000..6f0137b58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51832_1.C
@@ -0,0 +1 @@
+#include "pr51832.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51992_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51992_0.C
new file mode 100644
index 000000000..f75abd281
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr51992_0.C
@@ -0,0 +1,54 @@
+// PR c++/51992
+// { dg-lto-do assemble }
+
+template<typename Enum>
+class QFlags
+{
+ int i;
+public:
+ inline QFlags(Enum f) : i(f) {}
+};
+class QString {};
+class KComponentData;
+class KConfig
+{
+public:
+ enum OpenFlag {
+ IncludeGlobals = 0x01,
+ CascadeConfig = 0x02,
+ FullConfig = IncludeGlobals|CascadeConfig
+ };
+ typedef QFlags<OpenFlag> OpenFlags;
+};
+template <class T>
+class KSharedPtr {};
+class KSharedConfig : public KConfig
+{
+public:
+ typedef KSharedPtr<KSharedConfig> Ptr;
+ static KSharedConfig::Ptr openConfig(const QString& fileName = QString(),
+ OpenFlags mode = FullConfig,
+ const char *resourceType = "config");
+ static KSharedConfig::Ptr openConfig(const KComponentData &componentData,
+ const QString &fileName = QString(),
+ OpenFlags mode = FullConfig,
+ const char *resourceType = "config");
+};
+typedef KSharedConfig::Ptr KSharedConfigPtr;
+namespace KGlobal
+{
+ KComponentData &mainComponent();
+};
+KSharedConfigPtr KSharedConfig::openConfig(const QString& fileName,
+ OpenFlags flags,
+ const char *resType)
+{
+ return openConfig(KGlobal::mainComponent(), fileName, flags, resType);
+}
+KSharedConfigPtr KSharedConfig::openConfig(const KComponentData &componentData,
+ const QString& fileName,
+ OpenFlags flags,
+ const char *resType)
+{
+ return KSharedConfigPtr();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52035_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52035_0.C
new file mode 100644
index 000000000..3de4ea57b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52035_0.C
@@ -0,0 +1,14 @@
+// PR c++/52035
+// { dg-lto-do assemble }
+
+template <typename T> struct QVector {
+ typedef T* iterator;
+ static void insert(int n);
+ typedef int size_type;
+};
+template <typename T> void QVector<T>::insert(size_type n) {}
+void error()
+{
+ int n;
+ QVector<int>::insert(n);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52400_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52400_0.C
new file mode 100644
index 000000000..b1a7e6634
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52400_0.C
@@ -0,0 +1,18 @@
+// { dg-lto-do run }
+
+extern "C" {
+ static int f4(int);
+
+int f5(int a) {
+ extern int f4(int);
+ return f4(a);
+}
+}
+
+int f4(int a) { return 4+a; }
+
+int main(int argc, char *argv[])
+{
+ int a = f4(1);
+ return !(a == 5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52605_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52605_0.C
new file mode 100644
index 000000000..22540abf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr52605_0.C
@@ -0,0 +1,39 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -g}} }
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+
+ class B : public A
+ {
+ public:
+ int bar (int i)
+ {
+ return foo (i) + 2;
+ }
+ };
+ class B b;
+
+ if (b.bar (get_input ()) != 4)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr53470_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr53470_0.C
new file mode 100644
index 000000000..217c02a48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr53470_0.C
@@ -0,0 +1,26 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -g -flto } } }
+
+class sp_counted_base;
+class shared_count {
+ sp_counted_base *pi_;
+public:
+ template<class Y> shared_count(Y) : pi_() {}
+ ~shared_count() {}
+};
+template<class T> struct shared_ptr {
+ T element_type;
+ template<class Y> shared_ptr(Y) : pn(0) {}
+ shared_count pn;
+};
+template<class> class ECGetterBase;
+template<class T> struct ExtensionCord {
+ struct Holder {
+ ECGetterBase<T> *getter_;
+ };
+ ExtensionCord() : holder_(new Holder) {}
+
+ shared_ptr<Holder> holder_;
+};
+ExtensionCord<int> a;
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_0.c b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_0.c
new file mode 100644
index 000000000..5ab90dddd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_0.c
@@ -0,0 +1,10 @@
+/* { dg-lto-do link } */
+/* { dg-extra-ld-options { -r -nostdlib } } */
+
+float a;
+double sin ();
+speex_resampler_init_frac ()
+{
+ a = sin (0);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_1.C
new file mode 100644
index 000000000..2d0d5bfba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-1_1.C
@@ -0,0 +1,19 @@
+extern "C" double sin (double);
+typedef double UnaryFunType (double);
+class A
+{
+public:
+ int hash ();
+ double lookup (UnaryFunType p1)
+ {
+ int a = hash ();
+ if (p1)
+ return 0;
+ }
+};
+A b;
+void
+math_sin_impl ()
+{
+ b.lookup (sin);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_0.c b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_0.c
new file mode 100644
index 000000000..6511ba5cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_0.c
@@ -0,0 +1,9 @@
+/* { dg-lto-do link } */
+/* { dg-extra-ld-options { -r -nostdlib } } */
+
+float a;
+double sin ();
+update_filter ()
+{
+ a = sin (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_1.C
new file mode 100644
index 000000000..09c365d23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr54625-2_1.C
@@ -0,0 +1,24 @@
+extern "C" double sin (double);
+typedef double (*UnaryFunType) (double);
+class A
+{
+public:
+ int hash ();
+ void lookup (UnaryFunType p1)
+ {
+ int a = hash ();
+ p1 (0);
+ }
+};
+A b, c;
+void
+math_sin_impl ()
+{
+ b.lookup (sin);
+}
+
+void
+js_math_sqrt ()
+{
+ c.lookup (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150.H b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150.H
new file mode 100644
index 000000000..6afe37acc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150.H
@@ -0,0 +1,20 @@
+struct Base {
+ virtual void f() = 0;
+};
+
+struct X : public Base { };
+struct Y : public Base { };
+struct Z : public Base { };
+struct T : public Base { };
+
+struct S : public X, public Y, public Z
+#ifdef XXX
+, public T
+#endif
+{
+ void f()
+#ifdef XXX
+ { }
+#endif
+ ;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_0.C
new file mode 100644
index 000000000..cc21820a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_0.C
@@ -0,0 +1,8 @@
+// { dg-lto-do run }
+#include "pr60150.H"
+
+int main()
+{
+ S s;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_1.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_1.C
new file mode 100644
index 000000000..294e5f00f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60150_1.C
@@ -0,0 +1,4 @@
+// { dg-options "-fno-lto" }
+#include "pr60150.H"
+
+void S::f() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/v1-plugin-api-not-supported_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/v1-plugin-api-not-supported_0.C
new file mode 100644
index 000000000..f79dfae5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/v1-plugin-api-not-supported_0.C
@@ -0,0 +1,54 @@
+// { dg-lto-do run }
+// { dg-require-linker-plugin "" }
+// { dg-lto-options {{-O2 -fuse-linker-plugin -fno-early-inlining}}
+
+extern "C" void abort (void);
+extern "C" void linker_error ();
+
+class A
+{
+public:
+ int data;
+ virtual int foo (int i)
+ {
+ return i + 1;
+ }
+};
+
+class B : public A
+{
+public:
+ virtual int foo (int i)
+ {
+ return i + 2;
+ }
+};
+
+class C : public A
+{
+public:
+ virtual int foo (int i)
+ {
+ linker_error ();
+ return i + 3;
+ }
+};
+
+
+static int middleman (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ if (middleman (&b, get_input ()) != 3)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/20050511-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/20050511-1.C
new file mode 100644
index 000000000..a8929030a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/20050511-1.C
@@ -0,0 +1,70 @@
+/* { dg-do run } */
+/* { dg-options "-w" } */
+/* { dg-options "-O3 -w" { target powerpc*-*-* } } */
+#include <stdio.h>
+#include <stdlib.h>
+
+// The VxWorks kernel headers define their own UINT32
+#if defined __vxworks && !defined __RTP__
+#define UINT32 my_UINT32
+#endif
+
+typedef signed short SINT16 ;
+typedef unsigned long UINT32 ;
+typedef unsigned int UINT ;
+
+class A
+{
+public:
+ union
+ {
+ SINT16 xy[2];
+ UINT32 abXY;
+ };
+ bool operator==(const A& other) const {return abXY == other.abXY;}
+ bool operator!=(const A& other) const {return abXY != other.abXY;}
+};
+
+template <int size> struct pArray { unsigned char u08[16*(((size*1)+15)/16)] __attribute__ ((aligned(16))); };
+
+struct B
+{
+ union {
+ A mvL[2];
+ pArray<1> xyz;
+ };
+} ;
+
+typedef struct
+{
+ UINT w;
+ B b;
+
+}C;
+
+
+UINT32 bar (const C * sPtr)
+{
+ UINT w = sPtr->w;
+ A a;
+
+ a.xy[0] = sPtr->b.mvL[w].xy[0]<<2;
+ a.xy[1] = sPtr->b.mvL[w].xy[1]<<2;
+
+ if (a.xy[0] != ((SINT16) 0xffff << 2))
+ abort ();
+}
+
+int main()
+{
+ A a;
+ C c;
+ a.xy[0] = 0xffff;
+ a.xy[1] = 0xffff;
+ c.w=0;
+ c.b.mvL[0].xy[0] = a.xy[0];
+ c.b.mvL[0].xy[1] = a.xy[1];
+
+ bar (&c);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/alias1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias1.C
new file mode 100644
index 000000000..4836c5be0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias1.C
@@ -0,0 +1,25 @@
+// Test that type punning using an anonymous union works with strict aliasing.
+// { dg-do run }
+// { dg-options "-O2 -fstrict-aliasing" }
+
+extern "C" void abort ();
+
+void f (long i)
+{
+ union
+ {
+ long ui;
+ float uf[20];
+ };
+
+ ui = i;
+ if (uf[0] != 42.0)
+ abort ();
+}
+
+int main ()
+{
+ union U { long i; float f[20]; } u;
+ u.f[0] = 42.0;
+ f (u.i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/alias2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias2.C
new file mode 100644
index 000000000..0b4122471
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias2.C
@@ -0,0 +1,74 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" int printf (const char*, ...);
+
+struct _Deque_iterator {
+ int _M_cur;
+ int x[2];
+ int* _M_node;
+
+ _Deque_iterator() : _M_cur(0), _M_node(0) {}
+ _Deque_iterator(const _Deque_iterator& __x)
+ : _M_cur(__x._M_cur),
+ _M_node(__x._M_node) {}
+};
+
+class _Deque_base
+{
+public:
+ int yy;
+
+ _Deque_base()
+ : _M_start()
+ { _M_initialize_map(); }
+ ~_Deque_base();
+
+ void _M_initialize_map();
+ _Deque_iterator _M_start;
+};
+
+
+_Deque_base::~_Deque_base() {
+ printf ("bb %x %x\n", this, *_M_start._M_node);
+}
+
+void
+_Deque_base::_M_initialize_map()
+{
+ yy = 0x123;
+ printf ("aa %x %x\n", this, yy);
+
+ _M_start._M_node = &yy;
+ _M_start._M_cur = yy;
+}
+
+
+class deque : protected _Deque_base
+{
+public:
+ deque () {}
+ deque(const deque& __x) {}
+ ~deque() {
+ _Deque_iterator i = _M_start;
+ }
+};
+
+
+
+class GeometryAddress {
+public:
+ GeometryAddress(deque addressStack) {}
+};
+
+void yyy (const GeometryAddress& gb)
+{
+}
+
+deque temp1;
+
+int main()
+{
+ yyy (GeometryAddress (temp1));
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/alias3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias3.C
new file mode 100644
index 000000000..dc8accd4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias3.C
@@ -0,0 +1,45 @@
+// { dg-options "-O2" }
+
+// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com>
+// Origin: rsandifo@redhat.com
+
+// PR c++/13387. Alias sets were incorrect
+
+struct C {
+ C(short *p = 0, int i = 0) : ptr (p), index (i) {}
+ short operator*() { return ptr[index]; }
+ short *ptr;
+ int index;
+};
+
+C f1 (C) __attribute__ ((noinline));
+C f1 (C x)
+{
+ return x;
+}
+
+void f2 (short)__attribute__ ((noinline));;
+short s;
+
+void f2 (short s_)
+{
+ s = s_;
+}
+
+C g (C x)__attribute__ ((noinline));
+C g (C x)
+{
+ x = f1 (x);
+ f2 (*x);
+ return x;
+}
+
+int main ()
+{
+ short p[2] = { 0x1234, 0x5678 };
+ C x (p, 1);
+
+ g (x);
+
+ return s != p[1];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/alias4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias4.C
new file mode 100644
index 000000000..6965b8c73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/alias4.C
@@ -0,0 +1,56 @@
+// PR c++/27768
+// Alias grouping was losing some may_aliases, causing us to think
+// the store to w.p was dead.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+int N = 1;
+
+struct VA
+{
+ int *p, *q, *r;
+
+ VA() : p(), q() {}
+ VA(const VA&) : p(), q() {}
+ ~VA() { if (p) --N; }
+};
+
+inline void foo(VA, VA, VA) {}
+
+struct VB
+{
+ VA va;
+
+ VB() {}
+
+ VB(const VB&)
+ {
+ va.p = new int(va.q - va.p);
+ va.r = va.p + (va.q - va.p);
+ foo(va, va, va);
+ }
+};
+
+struct VC : VB { char c; };
+struct V : VC {};
+
+struct WA
+{
+ struct X {};
+ X **p, **q, **r;
+
+ WA() : p() {}
+ ~WA() { if (p) --N; }
+};
+
+struct W : WA {};
+
+int main()
+{
+ {
+ V v, u(v);
+ W w;
+ }
+ return N;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/anchor1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/anchor1.C
new file mode 100644
index 000000000..e24b0a4fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/anchor1.C
@@ -0,0 +1,59 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+// The size of the construction vtable for YFont in YCoreFont was not
+// updated to reflect its actual size. On targets with section anchor
+// support, the vtable for YCoreFont was laid out immediately after
+// that, but the compiler thought it was about 40 bytes closer to the
+// anchor than it actually was.
+
+extern "C" void abort (void);
+
+class refcounted {
+public:
+ int __refcount;
+
+public:
+ refcounted(): __refcount(0) {};
+ virtual ~refcounted() {}
+};
+
+class YFont : public virtual refcounted {
+public:
+ virtual ~YFont() {}
+
+ virtual int ascent() const = 0;
+};
+
+struct XFontStruct {
+};
+
+class YCoreFont : public YFont {
+public:
+ YCoreFont(char const * name);
+ virtual ~YCoreFont();
+
+ virtual int ascent() const { return 2; }
+
+private:
+ XFontStruct * fFont;
+};
+
+YCoreFont::YCoreFont(char const * name) {
+}
+
+YCoreFont::~YCoreFont() {
+}
+
+int foo(YCoreFont *ycf)
+{
+ return ycf->ascent ();
+}
+
+int main()
+{
+ YCoreFont ycf("");
+ if (foo(&ycf) != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/anonunion1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/anonunion1.C
new file mode 100644
index 000000000..445ebaa7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/anonunion1.C
@@ -0,0 +1,25 @@
+// PR c++/5748
+// This testcase ICEd because used flag from the anon union variables
+// was not propagated back to the anon union itself, causing addressof
+// not to be replaced with stack slot.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A {
+ A ();
+ ~A ();
+ int foo ();
+ int bar (void *x, int y);
+};
+
+int A::foo()
+{
+ union {
+ int a;
+ int b;
+ };
+
+ if (bar (&a, sizeof (int)) != 32)
+ return 16;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/array1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/array1.C
new file mode 100644
index 000000000..c63ed22c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/array1.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Nov 2004 <nathan@codesourcery.com>
+
+// PR 18672:ICE gimplifying incomplete array type.
+// Origin: Magnus Fromreide <gcc@magfr.user.lysator.liu.se>
+
+struct A;
+
+struct D {
+ static A ary[];
+};
+extern A ary[];
+
+void Foo (A const *);
+
+void Bar ()
+{
+ Foo (D::ary);
+ Foo (::ary);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/array2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/array2.C
new file mode 100644
index 000000000..b40b052d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/array2.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+struct JArray
+{
+ int data[1];
+};
+void *copyIntoByteArray (struct JArray *dest, __SIZE_TYPE__ offset)
+{
+ void *pdest = dest->data + offset;
+ return pdest;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/asm1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/asm1.C
new file mode 100644
index 000000000..333533526
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/asm1.C
@@ -0,0 +1,9 @@
+// PR c++/6747
+// { dg-do compile }
+// { dg-options "-O" }
+
+void foo()
+{
+ union { double d; char c[sizeof(double)]; } tmp;
+ __asm__ ("" : "=m" (tmp.d)); // { dg-bogus "not directly addressable" "double sized union element should be addressible" { xfail xstormy16-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/asm2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/asm2.C
new file mode 100644
index 000000000..4e3244169
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/asm2.C
@@ -0,0 +1,11 @@
+/* PR inline-asm/15740 */
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+void foo(void)
+{
+ int a, b;
+ a = 1;
+ b = a + 1;
+ asm ("" : : "m" (a));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/bitfield1.C
new file mode 100644
index 000000000..496999613
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/bitfield1.C
@@ -0,0 +1,18 @@
+// PR c++/26534
+// { dg-do run }
+// { dg-options "-w -O2" }
+
+struct X
+{
+ unsigned a:4;
+};
+
+unsigned i;
+
+int main()
+{
+ struct X x = { 63u };
+ i = x.a;
+ if (i != 15)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/bool1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/bool1.C
new file mode 100644
index 000000000..78cdebe32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/bool1.C
@@ -0,0 +1,25 @@
+// PR opt/13869
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+int test ()
+{
+ bool my_bool = true;
+ for (int i = 0; i < 10; ++i)
+ {
+ if (!my_bool)
+ ;
+ else
+ my_bool = false;
+ };
+ return my_bool;
+}
+
+int main ()
+{
+ if (test ())
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins1.C
new file mode 100644
index 000000000..8311436b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins1.C
@@ -0,0 +1,14 @@
+// PR c++/14791
+// Test if builtins with FILE * arguments work
+// { dg-options "-O2 -Wformat" }
+
+typedef struct _FILE FILE;
+FILE *stderr;
+extern "C" int printf (__const char *__restrict, ...);
+extern "C" int fprintf (FILE *__restrict, __const char *__restrict, ...);
+
+int main ()
+{
+ printf ("%d\n", 1, 1); // { dg-warning "too many arguments for format" }
+ fprintf (stderr, "%d\n", 1, 1); // { dg-warning "too many arguments for format" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins2.C
new file mode 100644
index 000000000..658c128d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/builtins2.C
@@ -0,0 +1,11 @@
+// PR c++/49813
+// We should handle asinh as a built-in in C++0x mode, even when strict.
+// { dg-do compile { target c++11 } }
+// { dg-final { scan-assembler-not "asinh" } }
+
+#include <math.h>
+
+int main()
+{
+ double das = asinh(1.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/call1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/call1.C
new file mode 100644
index 000000000..642e02408
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/call1.C
@@ -0,0 +1,21 @@
+// { dg-options "-O2" }
+
+void a (void (*f)())
+{
+ f();
+}
+
+struct RunState
+{
+ static void runcallback() { }
+ static void wait()
+ {
+ a (runcallback);
+ }
+};
+
+int main()
+{
+ RunState::wait();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg1.C
new file mode 100644
index 000000000..dbc81fe9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg1.C
@@ -0,0 +1,36 @@
+// PR optimization/11083
+// Origin: <nick@ilm.com>
+// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// The compiler used to keep unreachable basic blocks after dead edges
+// had been purged, which fooled the LCM code of the GCSE pass.
+
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+extern void *memmove (void *, const void *, unsigned int) throw ();
+
+struct S {
+ int *q;
+
+ S(int *i) : q(i) {}
+};
+
+struct X {
+ int *p;
+
+ void foo(S first, S last) {
+ try { memmove(0, 0, last.q - first.q); }
+ catch(...) { throw; }
+ }
+
+ void bar (const X& x);
+};
+
+void X::bar (const X& x)
+{
+ const unsigned int xlen = S(x.p).q - S(x.p).q;
+
+ if (xlen > 0)
+ foo(S(x.p), S(x.p));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg2.C
new file mode 100644
index 000000000..229f4bc3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg2.C
@@ -0,0 +1,38 @@
+// PR optimization/12215
+// Origin: <nick@ilm.com>
+// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// This used to fail because the CSE pass destroyed the CFG in presence
+// of trapping loads, which led to the deletion of basic blocks.
+
+// { dg-do compile }
+// { dg-options "-O2 -fno-gcse -fnon-call-exceptions" }
+
+
+struct B {
+ ~B() throw() {}
+};
+
+struct X {
+ X(const char*, const B&);
+ ~X() {}
+};
+
+bool m();
+void f(int &i, float &arg0);
+
+void g (const char **argv) {
+ float val;
+ int i = 1;
+
+ try {
+ while ( i < 1 )
+ {
+ X arg(argv[i], B());
+ if (m())
+ throw(0);
+
+ f(i, val);
+ }
+ } catch (...) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg3.C
new file mode 100644
index 000000000..123c2f515
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg3.C
@@ -0,0 +1,61 @@
+// PR optimization/11646
+// Origin: <nick@ilm.com>
+
+// This used to fail because the compiler inadvertently cleared
+// the EDGE_ABNORMAL flag on a EDGE_EH edge and didn't delete
+// unreachable blocks after CSE.
+
+// { dg-do compile }
+// { dg-options "-O -fgcse -fnon-call-exceptions" }
+
+struct C
+{
+ int i;
+};
+
+struct allocator
+{
+ ~allocator() throw() {}
+};
+
+struct _Vector_alloc_base
+{
+ _Vector_alloc_base(const allocator& __a) {}
+ allocator _M_data_allocator;
+ struct C *_M_start, *_M_end_of_storage;
+ void _M_deallocate(struct C* __p, unsigned int __n) {}
+};
+
+struct _Vector_base : _Vector_alloc_base
+{
+ _Vector_base(const allocator& __a) : _Vector_alloc_base(__a) { }
+ ~_Vector_base() { _M_deallocate(0, _M_end_of_storage - _M_start); }
+};
+
+struct vector : _Vector_base
+{
+ vector(const allocator& __a = allocator()) : _Vector_base(__a) {}
+ struct C& operator[](unsigned int __n) { return *_M_start; }
+};
+
+struct A
+{
+ float l() const;
+ A operator-(const A &) const;
+ const A& operator=(float) const;
+};
+
+struct B
+{
+ float d();
+};
+
+float f(const A& a, B& b)
+{
+ vector vc;
+ int index = vc[0].i;
+ A aa;
+ float d = (aa - a).l();
+ if (d > b.d()) aa = 0;
+ return b.d();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg4.C
new file mode 100644
index 000000000..94522ed41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg4.C
@@ -0,0 +1,45 @@
+// PR optimization/13067
+// Origin: <bryner@brianryner.com>
+
+// This used to fail on the tree-ssa because of "out-of-ssa"
+// We might have a valid variable, but not a valid value when trying to find
+// useless statements created by out-of-ssa translation. In this case
+// val will be set to null, then later dereferenced. Bad.
+
+// { dg-do compile }
+// { dg-options "-Os" }
+
+
+
+struct Iterator
+{
+ Iterator operator++();
+};
+
+void GetChar(char* aChar);
+
+void foo(char aChar)
+{
+ char quote;
+ Iterator end;
+
+ while (1) {
+ if (aChar == '"')
+ GetChar(&aChar);
+
+ switch (aChar) {
+ case 'a':
+ ++end;
+ if (quote) {
+ if (quote == aChar) {
+ quote = 0;
+ }
+ } else {
+ quote = aChar;
+ }
+ }
+ }
+}
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg5.C
new file mode 100644
index 000000000..a4bc8eea9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cfg5.C
@@ -0,0 +1,40 @@
+/* PR rtl-optimization/34035 */
+/* Origin: Janis Johnson <janis@gcc.gnu.org> */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -ffast-math -fno-gcse" } */
+
+class One {
+public:
+ One () { e[0] = e[1] = 0.0; }
+ double e[2];
+};
+
+template <class T>
+class Two {
+public:
+ Two();
+private:
+ T *data;
+ int arraySize;
+};
+
+template <class T>
+Two<T>::Two() {
+ data = new T[arraySize];
+}
+
+class Three {
+protected:
+ Two<One> data;
+};
+
+class Four : public Three {
+public:
+ Four ();
+ void Foo (int n);
+};
+
+Four :: Four (){
+ Foo (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cleanup1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cleanup1.C
new file mode 100644
index 000000000..e7c00dc20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cleanup1.C
@@ -0,0 +1,171 @@
+// PR middle-end/6247
+// This testcase was miscompiled on IA-32 because a single stack slot
+// was used for 2 different variables at the same time.
+// The function H::h1 was miscompiled.
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+struct A
+{
+ A () { a = 1; }
+ void a1 () { a++; }
+ bool a2 () { return !--a; }
+ unsigned int a;
+};
+
+struct B : public A
+{
+ B () : b (0) { a1 (); }
+ void b1 ();
+ const char *b;
+};
+
+struct C
+{
+ C ();
+ C (const C &);
+ ~C () { if (c->a2 ()) { if (c == c0) c0 = 0; c->b1 (); } }
+ C &operator= (const C &);
+ static C c1 (const char *x, int y = -1);
+ C (int, bool);
+ void a2 ();
+ B *c;
+ static B *c0;
+};
+
+B *C::c0 = __null;
+
+template <class T> struct D
+{
+ D (const T& t) : d (t) {}
+ D () {}
+ D<T> *next, *prev;
+ T d;
+};
+
+template<class T> struct E
+{
+ D<T> *e;
+ E () : e (0) {}
+ E (D<T> *p) : e (p) {}
+ E (const E<T>& x) : e (x.e) {}
+ const T& operator* () const { return e->d; }
+ T& operator* () { return e->d; }
+ bool operator== (const E<T>& x) const { return e == x.e; }
+ bool operator!= (const E<T>& x) const { return e != x.e; }
+ E<T> operator++ (int) { E<T> x = *this; e = e->next; return x; }
+};
+
+template <class T> struct F : public A
+{
+ F () { f = new D<T>; f->next = f->prev = f; f0 = 0; }
+ ~F () {}
+ D<T> *f;
+ unsigned int f0;
+
+ F (const F<T>& x) : A ()
+ {
+ f = new D<T>; f->next = f->prev = f; f0 = 0;
+ E<T> b (x.f->next);
+ E<T> e (x.f);
+ E<T> i (f);
+ while (b != e)
+ f1 (i, *b++);
+ }
+
+ E<T> f1 (E<T> x, const T& y)
+ {
+ D<T> *p = new D<T> (y);
+ p->next = x.e;
+ p->prev = x.e->prev;
+ x.e->prev->next = p;
+ x.e->prev = p;
+ f0++;
+ return p;
+ }
+};
+
+template <class T> struct G
+{
+ E<T> g1 () { g3 (); return E<T> (g->f); }
+ E<T> g2 (const T& x) { g3 (); return g->f1 (g1 (), x); }
+ void g3 () { if (g->a > 1) { g->a2 (); g = new F<T> (*g); } }
+ F<T>* g;
+};
+
+struct H
+{
+ virtual ~H () {};
+ virtual void h1 ();
+ struct I
+ {
+ I () {}
+ I (C r, C p) : i1 (r), i2 (p) {}
+ C i1, i2;
+ };
+ G<I> h;
+};
+
+void H::h1 ()
+{
+ h.g2 (I (C::c1 ("s1"), C::c1 ("t")));
+ h.g2 (I (C::c1 ("s2"), C::c1 ("t")));
+ h.g2 (I (C::c1 ("s3"), C::c1 ("t")));
+}
+
+void B::b1 ()
+{
+}
+
+C C::c1 (const char *x, int y)
+{
+ C z;
+
+ if (y != -1)
+ abort ();
+ z.c = new B;
+ z.c->b = x;
+ return z;
+}
+
+C::C () : c (__null)
+{
+}
+
+C::C (const C &x)
+{
+ c = x.c;
+ c->a1 ();
+}
+
+int main ()
+{
+ H h;
+ h.h.g = new F<H::I> ();
+ h.h1 ();
+ if (h.h.g->f0 != 3)
+ abort ();
+ D<H::I> *p;
+ int i;
+ for (i = 0, p = h.h.g->f; i < 4; i++, p = p->next)
+ {
+ if (i == 0 && (p->d.i1.c != __null || p->d.i2.c != __null))
+ abort ();
+ if (i > 0
+ && (p->d.i1.c->b[0] != 's'
+ || p->d.i1.c->b[1] != '0' + i
+ || p->d.i1.c->b[2] != '\0'
+ || __builtin_strcmp (p->d.i2.c->b, "t")))
+ abort ();
+ if (p->prev->next != p)
+ abort ();
+ if (p->next->prev != p)
+ abort ();
+ if (i == 3 && p->next != h.h.g->f)
+ abort ();
+ }
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/combine.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/combine.C
new file mode 100644
index 000000000..d01ae78a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/combine.C
@@ -0,0 +1,73 @@
+// { dg-do assemble { target fpic } }
+// { dg-options "-O2 -fweb -fPIC -fvisibility=hidden" }
+// { dg-require-visibility "" }
+
+class QBasicAtomicInt
+{
+public:
+ volatile int _q_value;
+ inline operator int () const {return _q_value;}
+};
+class QVariant;
+class QScriptContext;
+class QScriptEngine;
+class QScriptValue
+{
+public:
+ QVariant toVariant () const;
+};
+class QScriptDebuggerBackendPrivate
+{
+ static QScriptValue trace (QScriptContext *context);
+};
+template <typename T> struct QMetaTypeId { };
+template <typename T> struct QMetaTypeId2
+{
+ static inline int qt_metatype_id ()
+ {
+ return QMetaTypeId<T>::qt_metatype_id () ;
+ }
+};
+template <typename T> inline int qMetaTypeId (T * = 0)
+{
+ return QMetaTypeId2<T>::qt_metatype_id () ;
+}
+class QVariant { };
+template<typename T> inline T qvariant_cast (const QVariant &v)
+{
+ const int vid = qMetaTypeId<T> ((0)) ;
+};
+class QScriptContext
+{
+public:
+ QScriptValue callee () const;
+};
+class QScriptEngine
+{
+public:
+ static bool convertV2 (const QScriptValue &value , int type , void *ptr) ;
+};
+inline bool qscriptvalue_cast_helper (const QScriptValue &value , int type , void *ptr)
+{
+ return QScriptEngine::convertV2 (value, type, ptr) ;
+}
+template<typename T> T qscriptvalue_cast (const QScriptValue &value)
+{
+ T t;
+ const int id = qMetaTypeId<T> () ;
+ if ( qscriptvalue_cast_helper (value, id, &t))
+ return qvariant_cast<T> (value.toVariant ()) ;
+}
+template <> struct QMetaTypeId< QScriptDebuggerBackendPrivate* >
+{
+ static int qt_metatype_id ()
+ {
+ static QBasicAtomicInt metatype_id = { (0) };
+ return metatype_id;
+ }
+};
+QScriptValue QScriptDebuggerBackendPrivate::trace (QScriptContext *context)
+{
+ QScriptValue data = context->callee () ;
+ QScriptDebuggerBackendPrivate *self = qscriptvalue_cast<QScriptDebuggerBackendPrivate*> (data) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex1.C
new file mode 100644
index 000000000..0066c26c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex1.C
@@ -0,0 +1,9 @@
+// PR tree-opt/21994
+// { dg-do compile }
+// { dg-options "-O2" }
+
+_Complex float f(void);
+_Complex float g(void) throw()
+{
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex2.C
new file mode 100644
index 000000000..53fc7e98e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex2.C
@@ -0,0 +1,24 @@
+// PR 22022
+// { dg-do compile }
+// { dg-options "-O2" }
+
+_Complex float f();
+_Complex float g();
+_Complex float h()throw();
+void i(_Complex float)throw();
+
+void j(void)
+{
+ _Complex float x = h();
+ try
+ {
+ try
+ {
+ x = f();
+ }catch (...)
+ {
+ x = g();
+ }
+ }catch(...){}
+ i(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex3.C
new file mode 100644
index 000000000..9a3fdf3f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex3.C
@@ -0,0 +1,24 @@
+// PR 22022
+// { dg-do compile }
+// { dg-options "-O2" }
+
+_Complex float f();
+_Complex float g();
+_Complex float h()throw();
+void i(float)throw();
+
+float j(void)
+{
+ _Complex float x = h();
+ try
+ {
+ try
+ {
+ x = f();
+ }catch (...)
+ {
+ x += g();
+ }
+ }catch(...){}
+ i(__builtin_crealf(x)+__builtin_cimagf(x));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex4.C
new file mode 100644
index 000000000..d6a0be2cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex4.C
@@ -0,0 +1,16 @@
+// PR 24362
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __complex__ double cdouble;
+cdouble elt_zero();
+const cdouble *pointer();
+
+cdouble trace(void)
+{
+ cdouble output = elt_zero();
+ const cdouble *data = pointer();
+ output += data[1];
+ return output;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex5.C
new file mode 100644
index 000000000..0da0738b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex5.C
@@ -0,0 +1,16 @@
+// PR 24365
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __complex__ double cdouble;
+inline cdouble to_complex(double r) {
+ cdouble z;
+ __real__ z = r;
+ return z;
+}
+cdouble elt_zero() {
+ cdouble a = to_complex(0.0);
+ a+=1.0;
+ return a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/complex6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex6.C
new file mode 100644
index 000000000..bedb3ed5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/complex6.C
@@ -0,0 +1,14 @@
+// PR 30168
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct aaa
+{
+ aaa(_Complex float __z) ;
+ _Complex float _M_value;
+};
+aaa::aaa(_Complex float __z)
+{
+ __z*=2.0f;
+ _M_value = __z;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/compound1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/compound1.C
new file mode 100644
index 000000000..cf81e6980
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/compound1.C
@@ -0,0 +1,11 @@
+// PR c++/33709
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class S {
+ virtual void foo ();
+};
+struct T {
+ S *s;
+ void bar (unsigned x) { s = (new S[1]) - x; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cond1.C
new file mode 100644
index 000000000..ae8fa4d45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cond1.C
@@ -0,0 +1,24 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+struct D { int x; };
+struct W
+{
+ W () {}
+ D & operator * () { return d; }
+ D d;
+};
+
+int
+foo (int y)
+{
+ W m;
+ (*m).x = (y > 1 ? y : 0);
+ return (*m).x;
+}
+
+int
+main ()
+{
+ return (foo (6) != 6);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/conj1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/conj1.C
new file mode 100644
index 000000000..b578abbdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/conj1.C
@@ -0,0 +1,18 @@
+// PR target/5740
+// This testcase ICEd on SPARC -m64 because emit_group_load tried
+// to move a DFmode register into DImode register directly.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C
+{
+ C (double y, double z) { __real__ x = y; __imag__ x = z; }
+ double r () const { return __real__ x; }
+ double i () const { return __imag__ x; }
+ __complex__ double x;
+};
+
+C conj (const C& z)
+{
+ return C (z.r (), -z.i ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/conj2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/conj2.C
new file mode 100644
index 000000000..25e832a02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/conj2.C
@@ -0,0 +1,23 @@
+// PR target/6043
+// This testcase ICEd on IA-64 because emit_group_store
+// did not handle loading CONCAT from register group
+// { dg-do compile }
+
+struct C
+{
+ C (double y, double z) { __real__ x = y; __imag__ x = z; }
+ double r () const { return __real__ x; }
+ double i () const { return __imag__ x; }
+ __complex__ double x;
+};
+
+inline C conj (const C& x)
+{
+ return C (x.r (), - x.i ());
+}
+
+void foo (void)
+{
+ C x (1.0, 1.0);
+ conj (x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const1.C
new file mode 100644
index 000000000..834cfd5e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const1.C
@@ -0,0 +1,129 @@
+// This testcase was miscompiled on IA-64 to read from unitialized memory
+// and dereference it.
+// { dg-do run }
+// { dg-options "-O2" }
+
+struct A
+{
+ A () { a = 1; }
+ void a1 () { a++; }
+ bool a2 () { return !--a; }
+ unsigned int a;
+};
+
+struct B {};
+
+template <class T> struct C
+{
+ C () {}
+ C (const T& t) : c (t) {}
+ C<T> *next, *prev;
+ T c;
+};
+
+template <class T> struct D
+{
+ C<T> *d;
+ D () : d (0) {}
+ D (C<T> *x) : d (x) {}
+ D (const D<T>& x) : d (x.d) {}
+ bool operator!= (const D<T>& x) const { return d != x.d; }
+ const T& operator* () const { return d->c; }
+ D<T> operator++ (int) { D<T> t = *this; d = d->next; return t; }
+};
+
+template <class T> struct E
+{
+ C<T> *e;
+ E () : e (0) {}
+ E (C<T> *p) : e (p) {}
+ E (const E<T>& x) : e (x.e) {}
+ E (const D<T>& x) : e (x.e) {}
+ bool operator!= (const E<T>& x) const { return e != x.e; }
+ const T& operator* () const { return e->c; }
+ E<T>& operator++ () { e = e->next; return *this; }
+};
+
+template <class T> struct F : public A
+{
+ C<T> *f;
+ unsigned long f0;
+ F () { f = new C<T>; f->next = f->prev = f; f0 = 0; }
+ F (const F<T>& x) : A ()
+ {
+ f = new C<T>; f->next = f->prev = f; f0 = 0;
+ D<T> b (x.f->next), e (x.f), i (f);
+ while (b != e)
+ f1 (i, *b++);
+ }
+
+ ~F ()
+ {
+ C<T> *p = f->next;
+ while (p != f)
+ {
+ C<T> *x = p->next;
+ delete p;
+ p = x;
+ }
+ delete f;
+ }
+
+ D<T> f1 (D<T> x, const T& y)
+ {
+ C<T> *p = new C<T> (y);
+ p->next = x.d;
+ p->prev = x.d->prev;
+ x.d->prev->next = p;
+ x.d->prev = p;
+ f0++;
+ return p;
+ }
+};
+
+template <class T> struct G
+{
+ F<T> *g;
+ G () { g = new F<T>; }
+ G (const G<T>& x) { g = x.g; g->a1 (); }
+ ~G () {}
+ G<T>& operator= (const G<T>& x) { x.g->a1 (); g = x.g; return *this; }
+ D<T> g1 () { g4 (); return D<T> (g->f); }
+ E<T> g1 () const { return E<T> (g->f); }
+ E<T> g2 () const { return E<T> (g->f->next); }
+ D<T> g3 (const T& x) { g4 (); return g->f1 (g1 (), x); }
+ void g4 () { if (g->a > 1) { g->a2 (); g = new F<T> (*g); } }
+
+ G<T> operator+ (const G<T>& x) const
+ {
+ G<T> x2 (*this);
+ for (E<T> i = x.g2 (); i != x.g1 (); ++i)
+ x2.g3 (*i);
+ return x2;
+ }
+
+ G<T>& operator+= (const G<T>& x)
+ {
+ for (E<T> i = x.g2 (); i != x.g1 (); ++i)
+ g3 (*i);
+ return *this;
+ }
+};
+
+struct H : public G<B>
+{
+ H () {}
+ H (const H& x) : G<B> (x) {}
+ H (const G<B>& x) : G<B> (x) {}
+};
+
+void foo ();
+
+int
+main ()
+{
+ H a = H () + H ();
+ a += H ();
+ H b;
+ b = H () + H ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const2.C
new file mode 100644
index 000000000..b4efbbe35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const2.C
@@ -0,0 +1,42 @@
+// PR optimization/6631
+
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct QSize
+{
+ QSize();
+ QSize( int w, int h );
+ int wd, ht;
+ friend inline const QSize operator+( const QSize &, const QSize & );
+};
+
+inline QSize::QSize()
+{ wd = ht = -1; }
+
+inline QSize::QSize( int w, int h )
+{ wd = w; ht = h; }
+
+inline const QSize operator+( const QSize & s1, const QSize & s2 )
+{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); }
+
+QSize minimumSize()
+{
+ return QSize (100, 200);
+}
+
+QSize totalMinimumSize()
+{
+ QSize s = minimumSize();
+ return s + QSize( 0, 0 );
+}
+
+int main()
+{
+ QSize s = totalMinimumSize();
+ if (s.wd != 100 || s.ht != 200)
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const3.C
new file mode 100644
index 000000000..c7c0a1645
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const3.C
@@ -0,0 +1,44 @@
+// PR optimization/12926
+// This failed on SPARC64 because the assignments to the bit-fields
+// were wrongly swapped in the constructor.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort(void);
+
+typedef __SIZE_TYPE__ size_t;
+
+void *my_out;
+
+struct A
+{
+ enum Type {P, U, S};
+
+ int foo1(void *, const char *);
+ int foo2(int, const Type);
+
+ A (const size_t size, const Type type): mSize(size), mType(type)
+ {
+ foo2(foo1(my_out, "type = "), type);
+ foo2(foo1(my_out, "mType = "), mType);
+ }
+
+ const size_t mSize : 8*sizeof(size_t) - 3;
+ Type mType : 2;
+};
+
+int i;
+
+int A::foo1(void *ios, const char *str) { }
+int A::foo2(int v, const Type t) { i=0; }
+
+int main()
+{
+ A testa(2, A::S);
+
+ if (testa.mType != A::S)
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const4.C
new file mode 100644
index 000000000..883c24b55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const4.C
@@ -0,0 +1,9 @@
+// PR c++/21454
+// Test whether A is put into .rodata section on platforms
+// that have it.
+// { dg-do compile }
+
+const int a[] __attribute__ ((__used__)) = { 0, 1, 2, 3 };
+
+// The MMIX port always switches to the .data section at the end of a file.
+// { dg-final { scan-assembler-not "\\.data(?!\\.rel\\.ro)" { xfail powerpc*-*-aix* mmix-*-* } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const5.C
new file mode 100644
index 000000000..68fe61628
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const5.C
@@ -0,0 +1,13 @@
+// We don't have a good way of determining how ".rodata" is spelled on
+// all targets, so we limit this test to a few common targets where we
+// do know the spelling.
+// { dg-do compile { target i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } }
+// { dg-final { scan-assembler "\\.rodata" } }
+
+template <typename T>
+struct B {
+ int i;
+};
+
+// This declaration should be placed in .rodata.
+const B<int> const_B __attribute__((used)) = { 3 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/const6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/const6.C
new file mode 100644
index 000000000..1a5c79bb1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/const6.C
@@ -0,0 +1,14 @@
+// PR target/39179
+// Make sure that we don't optimize away the load from K::k.
+// { dg-options "-O2" }
+// { dg-final { scan-assembler _ZN1K1kE } }
+
+struct K {
+ static const unsigned k;
+};
+extern "C" void abort (void);
+int main() {
+ if ( K::k != 1 )
+ abort ();
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/copysign-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/copysign-1.C
new file mode 100644
index 000000000..347bec26e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/copysign-1.C
@@ -0,0 +1,10 @@
+// { dg-options "-O2" }
+// { dg-do compile }
+// PR rtl-opt/27883
+// MIPS used to ICE because local flow update
+// was not removing an invalid REG_DEAD.
+
+
+double copysign (double x, double y);
+double GetDouble();
+double a = copysign (1.0, GetDouble());
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/covariant1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/covariant1.C
new file mode 100644
index 000000000..e57cf4c6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/covariant1.C
@@ -0,0 +1,47 @@
+// PR c++/20206
+// { dg-do run }
+// { dg-options "-O0" }
+
+void
+bar (int x)
+{
+ asm ("" : : "g" (x));
+}
+
+struct S { S () {}; virtual ~S () {}; };
+struct T { virtual T *foo (int) {}; };
+struct V : virtual S, virtual T {};
+struct V v;
+struct U : public S, public T
+{
+ bool a;
+ U () {}
+ virtual ~U () {}
+ virtual V *foo (int x)
+ {
+ switch (x)
+ {
+ case 12:
+ break;
+ case 9:
+ bar (7);
+ break;
+ case 10:
+ bar (12);
+ break;
+ case 4:
+ bar (18);
+ break;
+ case 2:
+ bar (26);
+ break;
+ }
+ return &v;
+ }
+};
+U u;
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/crash1.C
new file mode 100644
index 000000000..3526df1dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/crash1.C
@@ -0,0 +1,14 @@
+// PR opt/13681
+// Here we have an out-of-range array index. We should not abort
+// trying to resolve the indirection back to an object.
+
+struct X {
+ double values[1];
+ double & foo (const unsigned int index) { return values[index]; }
+};
+
+void foo() {
+ double d;
+ X h1;
+ h1.foo(1) = d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/crossjump1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/crossjump1.C
new file mode 100644
index 000000000..01abdc071
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/crossjump1.C
@@ -0,0 +1,34 @@
+// PR middle-end/21492
+// { dg-do compile }
+// { dg-options "-Os" }
+// { dg-options "-Os -fPIC" { target fpic } }
+
+extern char *bar (const char *, const char *);
+extern char *baz (char *, const char *);
+extern unsigned int fn (const char *);
+static const struct C { int i; } k = { 0};
+
+struct A
+{
+ ~A ();
+};
+
+char *
+foo (char *x, const char *y)
+{
+ A a;
+ char *c = x;
+
+ if (bar (y, "foo"))
+ {
+ baz (c, "foo");
+ c += fn ("foo");
+ }
+ else if (bar (y, "bar"))
+ {
+ baz (c, "bar");
+ c += fn ("bar");
+ }
+
+ return x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cse1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse1.C
new file mode 100644
index 000000000..be1ad5a11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse1.C
@@ -0,0 +1,12 @@
+// PR optimization/6759
+// This testcase ICEd on SPARC because folded REG_EQUAL
+// note was note stored back and fold_rtx left invalid rtx
+// in it.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ long long a;
+ A (unsigned short d) : a (d) {}
+} x (65535);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cse2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse2.C
new file mode 100644
index 000000000..325169dff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse2.C
@@ -0,0 +1,39 @@
+// This testcase caused ICE on IA-32 in simplify_unary_operation
+// CSE did not assume SUBREGs changing mode from integral to floating.
+// { dg-do run { target i?86-*-* sparc*-*-* x86_64-*-* } }
+// { dg-options "-O2" }
+
+struct A
+{
+ union
+ {
+ float f;
+ unsigned int w;
+ } a;
+
+ static inline const A foo (void)
+ {
+ return A ((unsigned int) (__extension__ ((union { unsigned l; float d; })
+ { l: 0x3f800000 }).d));
+ }
+ inline A (float f) { a.f = f; }
+ A ();
+ inline A (unsigned int w) { a.w = w; }
+};
+
+A::A()
+{
+ *this = foo ();
+}
+
+A a;
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+int main ()
+{
+ if (a.a.w != 1)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/cse3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse3.C
new file mode 100644
index 000000000..a63280716
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/cse3.C
@@ -0,0 +1,48 @@
+// This testcase resulted in invalid code generation on x86_64 targets
+// due to a bug in fold_rtx. For a "true" value, fold_rtx represented it
+// as const_true_rtx in floating-point mode, if the FLOAT_STORE_FLAG_VALUE
+// macro is not defined.
+
+// { dg-do run }
+// { dg-options "-O1 -fno-guess-branch-probability -fcse-follow-jumps -fgcse -frerun-cse-after-loop" }
+
+class StatVal {
+
+ public:
+
+ StatVal(double ev, double va)
+ : m(ev),
+ v(va) {}
+
+ StatVal(const StatVal& other)
+ : m(other.m),
+ v(other.v) {}
+
+ StatVal& operator*=(const StatVal& other) {
+ double A = m == 0 ? 1.0 : v / (m * m);
+ double B = other.m == 0 ? 1.0 : other.v / (other.m * other.m);
+ m = m * other.m;
+ v = m * m * (A + B);
+ return *this;
+ }
+
+ double m;
+ double v;
+};
+
+extern "C" void abort (void);
+
+const StatVal two_dot_three(2, 0.3);
+
+int main(int argc, char **argv) {
+
+ StatVal product3(two_dot_three);
+
+ product3 *= two_dot_three;
+
+ if (product3.v > 2.5)
+ {
+ abort();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/declone1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/declone1.C
new file mode 100644
index 000000000..1f935b7e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/declone1.C
@@ -0,0 +1,21 @@
+// { dg-options "-fdeclone-ctor-dtor -O3" }
+
+struct V {};
+
+template <class T>
+struct A: virtual V {
+ static A* p;
+ A();
+};
+
+template <class T>
+A<T>::A()
+{
+ if (!p)
+ p = new A();
+}
+
+int main()
+{
+ A<int> a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/delay-slot-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/delay-slot-1.C
new file mode 100644
index 000000000..d435873cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/delay-slot-1.C
@@ -0,0 +1,111 @@
+/* PR rtl-optimization/23585 */
+/* Testcase by Matti Rintala <matti.rintala@iki.fi> */
+
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+template <class _Ret, class _Tp>
+class const_mem_fun_t
+{
+public:
+ explicit
+ const_mem_fun_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) {}
+
+ _Ret
+ operator()(const _Tp* __p) const
+ { return (__p->*_M_f)(); }
+private:
+ _Ret (_Tp::*_M_f)() const;
+};
+
+template <class _Ret, class _Tp>
+class const_mem_fun_ref_t
+{
+public:
+ explicit
+ const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
+ : _M_f(__pf) {}
+
+ _Ret
+ operator()(const _Tp& __r) const
+ { return (__r.*_M_f)(); }
+private:
+ _Ret (_Tp::*_M_f)() const;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_t
+{
+public:
+ explicit
+ const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) {}
+
+ _Ret
+ operator()(const _Tp* __p, _Arg __x) const
+ { return (__p->*_M_f)(__x); }
+private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+};
+
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_ref_t
+{
+public:
+ explicit
+ const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
+ : _M_f(__pf) {}
+
+ _Ret
+ operator()(const _Tp& __r, _Arg __x) const
+ { return (__r.*_M_f)(__x); }
+private:
+ _Ret (_Tp::*_M_f)(_Arg) const;
+};
+
+template <class _Ret, class _Tp>
+inline const_mem_fun_t<_Ret, _Tp>
+mem_fun(_Ret (_Tp::*__f)() const)
+{ return const_mem_fun_t<_Ret, _Tp>(__f); }
+
+template <class _Ret, class _Tp>
+inline const_mem_fun_ref_t<_Ret, _Tp>
+mem_fun_ref(_Ret (_Tp::*__f)() const)
+{ return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
+
+template <class _Ret, class _Tp, class _Arg>
+inline const_mem_fun1_t<_Ret, _Tp, _Arg>
+mem_fun(_Ret (_Tp::*__f)(_Arg) const)
+{ return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
+
+template <class _Ret, class _Tp, class _Arg>
+inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
+mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
+{ return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
+
+class Klasse {
+public:
+ void vf0c() const;
+ void vf1c(const int&) const;
+};
+
+int main()
+{
+ Klasse obj;
+ const Klasse& objc = obj;
+
+ mem_fun(&Klasse::vf0c)(&objc);
+ mem_fun(&Klasse::vf1c)(&objc, 1);
+
+ mem_fun_ref(&Klasse::vf0c)(objc);
+ mem_fun_ref(&Klasse::vf1c)(objc, 1);
+ return 0;
+}
+
+void Klasse::vf0c() const
+{}
+
+void Klasse::vf1c(const int&) const
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C
new file mode 100644
index 000000000..f9b4dc2fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+// { dg-final { scan-assembler "xyzzy" } }
+
+struct S { S(); virtual void xyzzy(); };
+inline void foo(S *s) { s->xyzzy(); }
+void bar() { S s; foo(&s); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C
new file mode 100644
index 000000000..cf4842bd4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+/* Using -mshort-calls avoids loading the function addresses in
+ registers and thus getting the counts wrong. */
+// { dg-additional-options "-mshort-calls" {target epiphany-*-*} }
+// Using -mno-abicalls avoids a R_MIPS_JALR .reloc.
+// { dg-additional-options "-mno-abicalls" { target mips*-*-* } }
+// { dg-final { scan-assembler-times "xyzzy" 2 { target { ! { alpha*-*-* hppa*-*-* ia64*-*-hpux* sparc*-*-* *-*-mingw* } } } } }
+// For *-*-mingw* there is additionally one .def match
+// { dg-final { scan-assembler-times "xyzzy" 3 { target *-*-mingw* } } }
+// The IA64 and HPPA compilers generate external declarations in addition
+// to the call so those scans need to be more specific.
+// { dg-final { scan-assembler-times "br\[^\n\]*xyzzy" 2 { target ia64*-*-hpux* } } }
+// { dg-final { scan-assembler-times "xyzzy\[^\n\]*,%r" 2 { target hppa*-*-* } } }
+// If assembler supports explicit relocation directives, the alpha compiler generates
+// literal/lituse_jsr pairs, so the scans need to be more specific.
+// { dg-final { scan-assembler-times "jsr\[^\n\]*xyzzy" 2 { target alpha*-*-* } } }
+// Unless the assembler supports -relax, the 32-bit SPARC compiler generates
+// sethi/jmp instead of just call, so the scans need to be more specific.
+// With subexpressions, Tcl regexp -inline -all returns both the complete
+// match and the subexpressions, so double the count.
+// { dg-final { scan-assembler-times "\(jmp|call\)\[^\n\]*xyzzy" 4 { target sparc*-*-* } } }
+
+struct S { S(); virtual void xyzzy(); };
+struct R { int a; S s; R(); };
+S s;
+R r;
+inline void foo(S *p) { p->xyzzy(); }
+void bar() {foo(&s);}
+void bah() {foo(&r.s);}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C
new file mode 100644
index 000000000..673867361
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class ert_RefCounter {
+ protected:
+ int refCounterE;
+ virtual ~ert_RefCounter() {}
+};
+
+class ebs_Object : virtual public ert_RefCounter {
+};
+
+class dpr_App : public ebs_Object {
+ public:
+ virtual void run();
+};
+
+class dpr_Job : public ebs_Object {};
+
+void dpr_run(ebs_Object& objectA) {
+ ((dpr_App&)objectA).run();
+ dpr_Job jobL;
+ dpr_run(jobL);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C
new file mode 100644
index 000000000..5a24eecbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C
@@ -0,0 +1,16 @@
+// PR lto/53808
+// Devirtualization + inlining should produce a non-virtual
+// call to ~foo.
+// { dg-options "-O -fdevirtualize" }
+// { dg-final { scan-assembler "_ZN3fooD2Ev" } }
+
+struct foo {
+ virtual ~foo();
+};
+struct bar : public foo {
+ virtual void zed();
+};
+void f() {
+ foo *x(new bar);
+ delete x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor1.C
new file mode 100644
index 000000000..0352676c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor1.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+int i;
+
+struct S {
+ S ();
+ S (const S&);
+ ~S ();
+};
+
+S::S () { ++i; }
+S::S (const S&) { ++i; }
+S::~S () { --i; }
+
+inline void f (S) {
+}
+
+int main () {
+ {
+ S s;
+ f (s);
+ }
+
+ return i;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2-aux.cc
new file mode 100644
index 000000000..9e87cc817
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2-aux.cc
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#include "dtor2.h"
+
+A::A () {}
+A::~A () {}
+
+void B::mb () {}
+B::B (int) {}
+B::~B () {}
+
+void C::mc () {}
+C::C (int x) : B (x) {}
+
+D::~D () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.C
new file mode 100644
index 000000000..39b8e6999
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.C
@@ -0,0 +1,13 @@
+// PR c++/42317
+// { dg-do link }
+// { dg-options "-O0" }
+// { dg-additional-sources "dtor2-aux.cc" }
+
+#include "dtor2.h"
+
+D::D (int x) : C (x) {}
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.h b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.h
new file mode 100644
index 000000000..a86940001
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor2.h
@@ -0,0 +1,29 @@
+struct A
+{
+ A ();
+ ~A ();
+};
+
+struct B
+{
+ A b;
+ virtual void mb ();
+ B (int);
+ virtual ~B ();
+};
+
+struct C : public B
+{
+ virtual void mc ();
+ C (int);
+ ~C ();
+};
+
+inline C::~C () {}
+
+struct D : public C
+{
+ A d;
+ D (int);
+ ~D ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor3.C
new file mode 100644
index 000000000..2d9309877
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor3.C
@@ -0,0 +1,11 @@
+// PR c++/42386
+// { dg-do compile }
+// { dg-options "-O2" }
+# 1 "A.h" 1
+#pragma interface
+struct D { virtual bool d () const; };
+struct E { virtual ~E (); virtual void *e () const = 0; };
+struct A : public D, public E { ~A () {} };
+# 5 "dtor3.C" 1
+struct F : public A { void *f () const; void *e () const; };
+void *F::e () const { return __null; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4-aux.cc
new file mode 100644
index 000000000..e3ca43b74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4-aux.cc
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#include "dtor4.h"
+
+S s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.C
new file mode 100644
index 000000000..c58fadfa1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.C
@@ -0,0 +1,13 @@
+// PR tree-optimization/42625
+// { dg-do run }
+// { dg-options "-O1 -fipa-sra" }
+// { dg-additional-sources "dtor4-aux.cc" }
+
+#include "dtor4.h"
+
+int
+main ()
+{
+ S s;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.h b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.h
new file mode 100644
index 000000000..d3b43beab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dtor4.h
@@ -0,0 +1,8 @@
+#include <cassert>
+
+struct S
+{
+ int a, i;
+ S () : i(1) {}
+ __attribute__((noinline)) ~S () { assert (i == 1); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/dump1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/dump1.C
new file mode 100644
index 000000000..d90061fee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/dump1.C
@@ -0,0 +1,768 @@
+// PR c++/57102
+// { dg-options "-O2 -fno-inline -fdump-final-insns" }
+// { dg-do compile { target c++11 } }
+// { dg-final cleanup-saved-temps }
+
+namespace std
+{
+ typedef __SIZE_TYPE__ size_t;
+ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+}
+extern "C++" {
+ void* operator new(std::size_t, void* __p) noexcept;
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template<typename _Tp, _Tp __v>
+ struct integral_constant
+ {
+ static constexpr _Tp value = __v;
+ typedef integral_constant<_Tp, __v> type;
+ };
+ typedef integral_constant<bool, true> true_type;
+ typedef integral_constant<bool, false> false_type;
+ template<bool, typename, typename>
+ struct conditional;
+ template<typename...>
+ struct __or_;
+ template<typename _B1, typename _B2>
+ struct __or_<_B1, _B2>
+ : public conditional<_B1::value, _B1, _B2>::type
+ {};
+ template<typename _B1, typename _B2, typename _B3, typename... _Bn>
+ struct __or_<_B1, _B2, _B3, _Bn...>
+ : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
+ {};
+ template<typename...>
+ struct __and_;
+ template<typename _B1, typename _B2>
+ struct __and_<_B1, _B2>
+ : public conditional<_B1::value, _B2, _B1>::type
+ {};
+ template<typename _Pp>
+ struct __not_
+ : public integral_constant<bool, !_Pp::value>
+ {};
+ template<typename _Tp>
+ struct __success_type
+ { typedef _Tp type; };
+ template<typename>
+ struct remove_cv;
+ template<typename>
+ struct __is_void_helper
+ : public false_type {};
+ template<typename _Tp>
+ struct is_void
+ : public __is_void_helper<typename remove_cv<_Tp>::type>::type
+ {};
+ template<typename>
+ struct __is_integral_helper
+ : public true_type {};
+ template<typename _Tp>
+ struct is_integral
+ : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
+ {};
+ template<typename>
+ struct is_array
+ : public false_type {};
+ template<typename>
+ struct is_lvalue_reference
+ : public false_type {};
+ template<typename>
+ struct is_rvalue_reference
+ : public false_type {};
+ template<typename>
+ struct __is_member_object_pointer_helper
+ : public false_type {};
+ template<typename _Tp>
+ struct is_member_object_pointer
+ : public __is_member_object_pointer_helper<
+ typename remove_cv<_Tp>::type>::type
+ {};
+ template<typename>
+ struct __is_member_function_pointer_helper
+ : public false_type {};
+ template<typename _Tp>
+ struct is_member_function_pointer
+ : public __is_member_function_pointer_helper<
+ typename remove_cv<_Tp>::type>::type
+ {};
+ template<typename _Tp>
+ struct is_enum
+ : public integral_constant<bool, __is_enum(_Tp)>
+ {};
+ template<typename>
+ struct is_function
+ : public false_type {};
+ template<typename _Tp>
+ struct is_reference
+ : public __or_<is_lvalue_reference<_Tp>,
+ is_rvalue_reference<_Tp>>::type
+ {};
+ template<typename _Tp>
+ struct __is_member_pointer_helper
+ : public false_type {};
+ template<typename _Tp>
+ struct is_member_pointer
+ : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
+ {};
+ template<typename>
+ struct is_const
+ : public false_type {};
+ template<typename>
+ struct is_volatile
+ : public false_type {};
+ template<typename>
+ struct add_rvalue_reference;
+ template<typename _Tp>
+ typename add_rvalue_reference<_Tp>::type declval() noexcept;
+ struct __do_is_nary_constructible_impl
+ {
+ template<typename _Tp, typename... _Args, typename
+ = decltype(_Tp(declval<_Args>()...))>
+ static true_type __test(int);
+ };
+ template<typename _Tp, typename... _Args>
+ struct __is_nary_constructible_impl
+ : public __do_is_nary_constructible_impl
+ {
+ typedef decltype(__test<_Tp, _Args...>(0)) type;
+ };
+ template<typename _Tp, typename... _Args>
+ struct __is_nary_constructible
+ : public __is_nary_constructible_impl<_Tp, _Args...>::type
+ {};
+ template<typename _Tp, typename... _Args>
+ struct __is_constructible_impl
+ : public __is_nary_constructible<_Tp, _Args...>
+ {};
+ template<typename _Tp, typename... _Args>
+ struct is_constructible
+ : public __is_constructible_impl<_Tp, _Args...>::type
+ {};
+ template<typename, typename>
+ struct is_same
+ : public true_type {};
+ template<typename _From, typename _To,
+ bool = __or_<is_void<_From>, is_function<_To>,
+ is_array<_To>>::value>
+ struct __is_convertible_helper
+ {
+ template<typename _To1>
+ static void __test_aux(_To1);
+ template<typename _From1, typename _To1,
+ typename = decltype(__test_aux<_To1>(std::declval<_From1>()))>
+ static true_type
+ __test(int);
+ typedef decltype(__test<_From, _To>(0)) type;
+ };
+ template<typename _From, typename _To>
+ struct is_convertible
+ : public __is_convertible_helper<_From, _To>::type
+ {};
+ template<typename _Tp>
+ struct remove_const
+ { typedef _Tp type; };
+ template<typename _Tp>
+ struct remove_volatile
+ { typedef _Tp type; };
+ template<typename _Tp>
+ struct remove_cv
+ {
+ typedef typename
+ remove_const<typename remove_volatile<_Tp>::type>::type type;
+ };
+ template<typename _Tp>
+ struct remove_reference
+ { typedef _Tp type; };
+ template<typename _Tp>
+ struct remove_reference<_Tp&>
+ { typedef _Tp type; };
+ template<typename _Tp,
+ bool = __and_<__not_<is_reference<_Tp>>,
+ __not_<is_void<_Tp>>>::value>
+ struct __add_rvalue_reference_helper
+ { typedef _Tp type; };
+ template<typename _Tp>
+ struct add_rvalue_reference
+ : public __add_rvalue_reference_helper<_Tp>
+ {};
+ template<typename _Unqualified, bool _IsConst, bool _IsVol>
+ struct __cv_selector;
+ template<typename _Unqualified>
+ struct __cv_selector<_Unqualified, false, false>
+ { typedef _Unqualified __type; };
+ template<typename _Qualified, typename _Unqualified,
+ bool _IsConst = is_const<_Qualified>::value,
+ bool _IsVol = is_volatile<_Qualified>::value>
+ class __match_cv_qualifiers
+ {
+ typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
+ public:
+ typedef typename __match::__type __type;
+ };
+ template<typename _Tp>
+ struct __make_unsigned
+ { typedef _Tp __type; };
+ template<typename _Tp,
+ bool _IsInt = is_integral<_Tp>::value,
+ bool _IsEnum = is_enum<_Tp>::value>
+ class __make_unsigned_selector;
+ template<typename _Tp>
+ class __make_unsigned_selector<_Tp, true, false>
+ {
+ typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
+ typedef typename __unsignedt::__type __unsigned_type;
+ typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
+ public:
+ typedef typename __cv_unsigned::__type __type;
+ };
+ template<typename _Tp>
+ struct make_unsigned
+ { typedef typename __make_unsigned_selector<_Tp>::__type type; };
+ template<typename _Tp, typename>
+ struct __remove_pointer_helper
+ { typedef _Tp type; };
+ template<typename _Tp>
+ struct remove_pointer
+ : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
+ {};
+ template<typename _Up,
+ bool _IsArray = is_array<_Up>::value,
+ bool _IsFunction = is_function<_Up>::value>
+ struct __decay_selector;
+ template<typename _Up>
+ struct __decay_selector<_Up, false, false>
+ { typedef typename remove_cv<_Up>::type __type; };
+ template<typename _Tp>
+ class decay
+ {
+ typedef typename remove_reference<_Tp>::type __remove_type;
+ public:
+ typedef typename __decay_selector<__remove_type>::__type type;
+ };
+ template<bool, typename _Tp = void>
+ struct enable_if
+ { typedef _Tp type; };
+ template<typename... _Cond>
+ using _Require = typename enable_if<__and_<_Cond...>::value>::type;
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct conditional
+ { typedef _Iftrue type; };
+ template<typename _Signature>
+ class result_of;
+ template<bool, bool, typename _Functor, typename... _ArgTypes>
+ struct __result_of_impl
+ ;
+ struct __result_of_other_impl
+ {
+ template<typename _Fn, typename... _Args>
+ static __success_type<decltype(
+ std::declval<_Fn>()(std::declval<_Args>()...)
+ )> _S_test(int);
+ };
+ template<typename _Functor, typename... _ArgTypes>
+ struct __result_of_impl<false, false, _Functor, _ArgTypes...>
+ : private __result_of_other_impl
+ {
+ typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
+ };
+ template<typename _Functor, typename... _ArgTypes>
+ struct result_of<_Functor(_ArgTypes...)>
+ : public __result_of_impl<
+ is_member_object_pointer<
+ typename remove_reference<_Functor>::type
+ >::value,
+ is_member_function_pointer<
+ typename remove_reference<_Functor>::type
+ >::value,
+ _Functor, _ArgTypes...
+ >::type
+ {};
+ template<typename _Tp>
+ constexpr _Tp&&
+ forward(typename std::remove_reference<_Tp>::type& __t) noexcept
+ { return static_cast<_Tp&&>(__t); }
+ template<typename _Tp>
+ constexpr typename std::remove_reference<_Tp>::type&&
+ move(_Tp&& __t) noexcept
+ { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
+ template<std::size_t _Int, class _Tp>
+ class tuple_element;
+ struct allocator_arg_t {};
+ constexpr allocator_arg_t allocator_arg = allocator_arg_t();
+ template<typename _Tp>
+ struct __add_ref
+ { typedef _Tp& type; };
+ template<std::size_t _Idx, typename... _Elements>
+ struct _Tuple_impl;
+ template<std::size_t _Idx, typename _Head, typename... _Tail>
+ struct _Tuple_impl<_Idx, _Head, _Tail...>
+ {};
+ template<typename... _Elements>
+ class tuple : public _Tuple_impl<0, _Elements...>
+ {};
+ template<typename _Head, typename... _Tail>
+ struct tuple_element<0, tuple<_Head, _Tail...> >
+ {
+ typedef _Head type;
+ };
+ template<std::size_t __i, typename... _Elements>
+ typename __add_ref<
+ typename tuple_element<__i, tuple<_Elements...>>::type
+ >::type
+ get(tuple<_Elements...>& __t) noexcept;
+ template<std::size_t... _Indexes>
+ struct _Index_tuple
+ {};
+ template<std::size_t _Num>
+ struct _Build_index_tuple
+ {
+ typedef _Index_tuple<> __type;
+ };
+ template<typename _Functor, typename... _Args>
+ typename enable_if<
+ (!is_member_pointer<_Functor>::value
+ && !is_function<typename remove_pointer<_Functor>::type>::value),
+ typename result_of<_Functor(_Args&&...)>::type
+ >::type
+ __invoke(_Functor& __f, _Args&&... __args)
+ {
+ return __f(std::forward<_Args>(__args)...);
+ }
+
+ template<typename _Tp>
+ class reference_wrapper
+ {
+ public:
+ _Tp&
+ get() const noexcept
+ {}
+ template<typename... _Args>
+ typename result_of<_Tp&(_Args&&...)>::type
+ operator()(_Args&&... __args) const
+ {
+ return __invoke(get(), std::forward<_Args>(__args)...);
+ }
+ };
+ template<typename _Tp>
+ inline reference_wrapper<_Tp>
+ ref(_Tp& __t) noexcept
+ {}
+ template<typename _Tp>
+ struct _Maybe_wrap_member_pointer
+ {
+ typedef _Tp type;
+ };
+ template<typename _Signature>
+ struct _Bind_simple;
+ template<typename _Callable, typename... _Args>
+ struct _Bind_simple<_Callable(_Args...)>
+ {
+ typedef typename result_of<_Callable(_Args...)>::type result_type;
+ result_type
+ operator()()
+ {
+ typedef typename _Build_index_tuple<sizeof...(_Args)>::__type _Indices;
+ return _M_invoke(_Indices());
+ }
+ template<std::size_t... _Indices>
+ typename result_of<_Callable(_Args...)>::type
+ _M_invoke(_Index_tuple<_Indices...>)
+ {
+ return std::forward<_Callable>(std::get<0>(_M_bound))(
+ std::forward<_Args>(std::get<_Indices+1>(_M_bound))...);
+ }
+ std::tuple<_Callable, _Args...> _M_bound;
+ };
+ template<typename _Func, typename... _BoundArgs>
+ struct _Bind_simple_helper
+ {
+ typedef _Maybe_wrap_member_pointer<typename decay<_Func>::type>
+ __maybe_type;
+ typedef typename __maybe_type::type __func_type;
+ typedef _Bind_simple<__func_type(typename decay<_BoundArgs>::type...)>
+ __type;
+ };
+ template<typename _Callable, typename... _Args>
+ typename _Bind_simple_helper<_Callable, _Args...>::__type
+ __bind_simple(_Callable&& __callable, _Args&&... __args)
+ ;
+ union _Any_data
+ ;
+ template<typename _Functor>
+ inline _Functor&
+ __callable_functor(_Functor& __f)
+ ;
+ template<typename _Signature>
+ class function;
+ class _Function_base
+ {
+ template<typename _Functor>
+ class _Base_manager
+ {
+ protected:
+ static _Functor*
+ _M_get_pointer(const _Any_data& __source)
+ ;
+ };
+ };
+ template<typename _Signature, typename _Functor>
+ class _Function_handler;
+ template<typename _Res, typename _Functor, typename... _ArgTypes>
+ class _Function_handler<_Res(_ArgTypes...), _Functor>
+ : public _Function_base::_Base_manager<_Functor>
+ {
+ typedef _Function_base::_Base_manager<_Functor> _Base;
+ public:
+ static _Res
+ _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
+ {
+ return (*_Base::_M_get_pointer(__functor))(
+ std::forward<_ArgTypes>(__args)...);
+ }
+ };
+ template<typename _Res, typename... _ArgTypes>
+ class function<_Res(_ArgTypes...)>
+ {
+ typedef _Res _Signature_type(_ArgTypes...);
+ template<typename _Functor>
+ using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
+ (std::declval<_ArgTypes>()...) );
+ template<typename _CallRes, typename _Res1>
+ struct _CheckResult
+ : is_convertible<_CallRes, _Res1> {};
+ template<typename _Functor>
+ using _Callable = _CheckResult<_Invoke<_Functor>, _Res>;
+ template<typename _Cond, typename _Tp>
+ using _Requires = typename enable_if<_Cond::value, _Tp>::type;
+ public:
+ template<typename _Functor,
+ typename = _Requires<_Callable<_Functor>, void>>
+ function(_Functor);
+ typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...);
+ _Invoker_type _M_invoker;
+ };
+ template<typename _Res, typename... _ArgTypes>
+ template<typename _Functor, typename>
+ function<_Res(_ArgTypes...)>::
+ function(_Functor __f)
+ {
+ typedef _Function_handler<_Signature_type, _Functor> _My_handler;
+{
+ _M_invoker = &_My_handler::_M_invoke;
+ }
+ }
+ template<typename _Ptr>
+ class __ptrtr_pointer_to
+ ;
+ template<typename _Ptr>
+ struct pointer_traits : __ptrtr_pointer_to<_Ptr>
+ {};
+ template<typename _Tp>
+ struct pointer_traits<_Tp*>
+ {
+ typedef ptrdiff_t difference_type;
+ };
+ template<typename _Alloc, typename _Tp>
+ class __alloctr_rebind_helper
+ {
+ template<typename, typename>
+ static constexpr bool
+ _S_chk(...)
+ { return false; }
+ public:
+ static const bool __value = _S_chk<_Alloc, _Tp>(nullptr);
+ };
+ template<typename _Alloc, typename _Tp,
+ bool = __alloctr_rebind_helper<_Alloc, _Tp>::__value>
+ struct __alloctr_rebind;
+ template<template<typename, typename...> class _Alloc, typename _Tp,
+ typename _Up, typename... _Args>
+ struct __alloctr_rebind<_Alloc<_Up, _Args...>, _Tp, false>
+ {
+ typedef _Alloc<_Tp, _Args...> __type;
+ };
+ template<typename _Alloc>
+ struct allocator_traits
+ {
+ typedef _Alloc allocator_type;
+ typedef typename _Alloc::value_type value_type; static value_type* _S_pointer_helper(...); typedef decltype(_S_pointer_helper((_Alloc*)0)) __pointer; public:
+ typedef __pointer pointer; static typename pointer_traits<pointer>::difference_type _S_difference_type_helper(...); typedef decltype(_S_difference_type_helper((_Alloc*)0)) __difference_type; public:
+ typedef __difference_type difference_type; static typename make_unsigned<difference_type>::type _S_size_type_helper(...); typedef decltype(_S_size_type_helper((_Alloc*)0)) __size_type; public:
+ typedef __size_type size_type; public:
+ template<typename _Tp>
+ using rebind_alloc = typename __alloctr_rebind<_Alloc, _Tp>::__type;
+ template<typename _Tp>
+ using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
+ template<typename _Tp, typename... _Args>
+ struct __construct_helper
+ {
+ template<typename>
+ static false_type __test(...);
+ typedef decltype(__test<_Alloc>(0)) type;
+ static const bool value = type::value;
+ };
+ template<typename _Tp, typename... _Args>
+ static typename
+ enable_if<__and_<__not_<__construct_helper<_Tp, _Args...>>,
+ is_constructible<_Tp, _Args...>>::value, void>::type
+ _S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
+ { ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); }
+ static pointer
+ allocate(_Alloc& __a, size_type __n)
+ ;
+ template<typename _Tp, typename... _Args>
+ static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
+ -> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
+ { _S_construct(__a, __p, std::forward<_Args>(__args)...); }
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ enum _Lock_policy { _S_single, _S_mutex, _S_atomic };
+ static const _Lock_policy __default_lock_policy =
+ _S_atomic;
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template<typename _Tp>
+ struct default_delete
+ ;
+ template <typename _Tp, typename _Dp = default_delete<_Tp> >
+ class unique_ptr
+ {
+ class _Pointer
+ {
+ template<typename _Up>
+ static _Tp* __test(...);
+ typedef typename remove_reference<_Dp>::type _Del;
+ public:
+ typedef decltype(__test<_Del>(0)) type;
+ };
+ public:
+ typedef typename _Pointer::type pointer;
+ typedef _Tp element_type;
+ template<typename _Up, typename _Ep, typename = _Require<
+ is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
+ typename conditional<is_reference<_Dp>::value,
+ is_same<_Ep, _Dp>,
+ is_convertible<_Ep, _Dp>>::type>>
+ unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
+ ;
+ };
+}
+namespace __gnu_cxx
+{
+ template<typename _Tp>
+ struct __aligned_buffer
+ {};
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ using __gnu_cxx::_Lock_policy;
+ using __gnu_cxx::__default_lock_policy;
+ template<_Lock_policy _Lp = __default_lock_policy>
+ class _Sp_counted_base
+ {};
+ template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
+ class __shared_ptr;
+ struct _Sp_make_shared_tag {};
+ template<typename _Tp, typename _Alloc, _Lock_policy _Lp>
+ class _Sp_counted_ptr_inplace final : public _Sp_counted_base<_Lp>
+ {
+ struct _Impl
+ : public _Alloc
+ {
+ _Impl(_Alloc __a) : _Alloc(__a), _M_ptr() {}
+ _Tp* _M_ptr;
+ };
+ public:
+ template<typename... _Args>
+ _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
+ : _M_impl(__a), _M_storage()
+ {
+ allocator_traits<_Alloc>::construct(__a, _M_impl._M_ptr,
+ std::forward<_Args>(__args)...);
+ }
+ _Impl _M_impl;
+ __gnu_cxx::__aligned_buffer<_Tp> _M_storage;
+ };
+ template<_Lock_policy _Lp>
+ class __shared_count
+ {
+ public:
+ template<typename _Tp, typename _Alloc, typename... _Args>
+ __shared_count(_Sp_make_shared_tag, _Tp*, const _Alloc& __a,
+ _Args&&... __args)
+ {
+ typedef _Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp> _Sp_cp_type;
+ typedef typename allocator_traits<_Alloc>::template
+ rebind_traits<_Sp_cp_type> _Alloc_traits;
+ typename _Alloc_traits::allocator_type __a2(__a);
+ _Sp_cp_type* __mem = _Alloc_traits::allocate(__a2, 1);
+ try
+ {
+ _Alloc_traits::construct(__a2, __mem, std::move(__a),
+ std::forward<_Args>(__args)...);
+ }
+ catch(...)
+ {}
+ }
+ };
+ template<typename _Tp, _Lock_policy _Lp>
+ class __shared_ptr
+ {
+ public:
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
+ __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
+ : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
+ {}
+ template<typename _Alloc, typename... _Args>
+ __shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
+ _Args&&... __args)
+ : _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
+ std::forward<_Args>(__args)...)
+ {}
+ _Tp* _M_ptr;
+ __shared_count<_Lp> _M_refcount;
+ };
+ template<typename _Tp>
+ class shared_ptr : public __shared_ptr<_Tp>
+ {
+ public:
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
+ shared_ptr(const shared_ptr<_Tp1>& __r) noexcept
+ : __shared_ptr<_Tp>(__r) {}
+ template<typename _Alloc, typename... _Args>
+ shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
+ _Args&&... __args)
+ : __shared_ptr<_Tp>(__tag, __a, std::forward<_Args>(__args)...)
+ {}
+ };
+ template<typename _Tp, typename _Alloc, typename... _Args>
+ inline shared_ptr<_Tp>
+ allocate_shared(const _Alloc& __a, _Args&&... __args)
+ {
+ return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a,
+ std::forward<_Args>(__args)...);
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template<typename _Signature>
+ class packaged_task;
+ struct __future_base
+ {
+ struct _Result_base
+ {
+ struct _Deleter
+ ;
+ };
+ template<typename _Res>
+ struct _Result : _Result_base
+ {
+ typedef _Res result_type;
+ };
+ template<typename _Res>
+ using _Ptr = unique_ptr<_Res, _Result_base::_Deleter>;
+ template<typename _Res, typename _Alloc>
+ struct _Result_alloc final : _Result<_Res>, _Alloc
+ {};
+ template<typename _Res, typename _Allocator>
+ static _Ptr<_Result_alloc<_Res, _Allocator>>
+ _S_allocate_result(const _Allocator& __a)
+ ;
+ template<typename _Signature>
+ class _Task_state_base;
+ template<typename _Fn, typename _Alloc, typename _Signature>
+ class _Task_state;
+ template<typename _Res_ptr,
+ typename _Res = typename _Res_ptr::element_type::result_type>
+ struct _Task_setter;
+ template<typename _Res_ptr, typename _BoundFn>
+ static _Task_setter<_Res_ptr>
+ _S_task_setter(_Res_ptr& __ptr, _BoundFn&& __call)
+ {
+ return _Task_setter<_Res_ptr>{ __ptr, std::ref(__call) };
+ }
+ };
+ template<typename _Ptr_type, typename _Res>
+ struct __future_base::_Task_setter
+ {
+ _Ptr_type& _M_result;
+ std::function<_Res()> _M_fn;
+ };
+ template<typename _Res, typename... _Args>
+ struct __future_base::_Task_state_base<_Res(_Args...)>
+ {
+ template<typename _Alloc>
+ _Task_state_base(const _Alloc& __a)
+ : _M_result(_S_allocate_result<_Res>(__a))
+ {}
+ typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
+ _Ptr_type _M_result;
+ };
+ template<typename _Fn, typename _Alloc, typename _Res, typename... _Args>
+ struct __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)> final
+ : __future_base::_Task_state_base<_Res(_Args...)>
+ {
+ _Task_state(_Fn&& __fn, const _Alloc& __a)
+ : _Task_state_base<_Res(_Args...)>(__a), _M_impl(std::move(__fn), __a)
+ {}
+ virtual void
+ _M_run(_Args... __args)
+ {
+ auto __boundfn = std::__bind_simple(std::ref(_M_impl._M_fn),
+ _S_maybe_wrap_ref(std::forward<_Args>(__args))...);
+ auto __setter = _S_task_setter(this->_M_result, std::move(__boundfn));
+ }
+ struct _Impl : _Alloc
+ {
+ _Impl(_Fn&& __fn, const _Alloc& __a)
+ : _Alloc(__a), _M_fn(std::move(__fn)) {}
+ _Fn _M_fn;
+ } _M_impl;
+ };
+ template<typename _Signature, typename _Fn, typename _Alloc>
+ static shared_ptr<__future_base::_Task_state_base<_Signature>>
+ __create_task_state(_Fn&& __fn, const _Alloc& __a)
+ {
+ typedef __future_base::_Task_state<_Fn, _Alloc, _Signature> _State;
+ return std::allocate_shared<_State>(__a, std::move(__fn), __a);
+ }
+ template<typename _Task, typename _Fn, bool
+ = is_same<_Task, typename decay<_Fn>::type>::value>
+ struct __constrain_pkgdtask
+ { typedef void __type; };
+ template<typename _Res, typename... _ArgTypes>
+ class packaged_task<_Res(_ArgTypes...)>
+ {
+ typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type;
+ shared_ptr<_State_type> _M_state;
+ public:
+ template<typename _Fn, typename _Alloc, typename = typename
+ __constrain_pkgdtask<packaged_task, _Fn>::__type>
+ packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn)
+ : _M_state(__create_task_state<_Res(_ArgTypes...)>(
+ std::forward<_Fn>(__fn), __a))
+ {}
+ };
+}
+namespace __gnu_test
+{
+ template <class Tp>
+ struct SimpleAllocator
+ {
+ typedef Tp value_type;
+ SimpleAllocator() ;
+ template <class T>
+ SimpleAllocator(const SimpleAllocator<T>& other) ;
+ };
+}
+using std::packaged_task;
+using std::allocator_arg;
+__gnu_test::SimpleAllocator<int> a;
+packaged_task<int()> p(allocator_arg, a, []() { return 1; });
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/eh1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh1.C
new file mode 100644
index 000000000..63a4d2ef3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh1.C
@@ -0,0 +1,21 @@
+// PR middle-end/14477
+// { dg-do compile }
+// { dg-options "-O2 -fno-default-inline" }
+
+struct A
+{
+ A();
+};
+
+struct B
+{
+ B(const A*);
+};
+
+struct C
+{
+ B b;
+ C(int) : b(new A) {}
+};
+
+C c(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/eh2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh2.C
new file mode 100644
index 000000000..7cb49f00c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh2.C
@@ -0,0 +1,34 @@
+// PR 6764
+// { dg-do run }
+// { dg-options "-O -fomit-frame-pointer" }
+
+extern "C" void abort ();
+
+class test
+{
+ public:
+ test * const me;
+ test () : me(this) { }
+ ~test () { if (me != this) abort (); }
+};
+
+void x1 ()
+{
+ test w1;
+ throw 1;
+}
+
+void x2 ()
+{
+ test w2;
+ x1 ();
+}
+
+int main (void)
+{
+ try {
+ x2 ();
+ } catch (...) {
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/eh3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh3.C
new file mode 100644
index 000000000..0cd9cac5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh3.C
@@ -0,0 +1,33 @@
+// PR target/18841
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+int r, i1 = 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5;
+
+struct S
+{
+ ~S() { r = i1 + i2 + i3 + i4 + i5; }
+};
+
+void foo()
+{
+ S s;
+ throw 1;
+}
+
+void bar()
+{
+ try {
+ foo();
+ } catch (...) {
+ }
+}
+
+int main()
+{
+ bar();
+ if (r != 1 + 2 + 3 + 4 + 5)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/eh4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh4.C
new file mode 100644
index 000000000..0a62ee2db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh4.C
@@ -0,0 +1,59 @@
+// { dg-do run }
+// { dg-options "-O3" }
+
+// Make sure that the call to terminate within F2 is not eliminated
+// by incorrect MUST_NOT_THROW optimization. Note that we expect F1
+// to be inlined into F2 in order to expose this case.
+
+#include <cstdlib>
+#include <exception>
+
+static volatile int zero = 0;
+
+// Note that we need F0 to not be marked nothrow, though we don't actually
+// want a throw to happen at runtime here. The noinline tag is merely to
+// make sure the assembly in F0 is not unnecessarily complex.
+static void __attribute__((noinline)) f0()
+{
+ if (zero != 0)
+ throw 0;
+}
+
+struct S1
+{
+ S1() { }
+ ~S1() { f0(); }
+};
+
+static void f1()
+{
+ S1 s1;
+ throw 1;
+}
+
+struct S2
+{
+ S2() { }
+ ~S2() { f1(); }
+};
+
+static void __attribute__((noinline)) f2()
+{
+ S2 s2;
+ throw 2;
+}
+
+static void pass()
+{
+ exit (0);
+}
+
+int main()
+{
+ std::set_terminate (pass);
+ try {
+ f2();
+ } catch (...) {
+ }
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/eh5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh5.C
new file mode 100644
index 000000000..3557ab2aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/eh5.C
@@ -0,0 +1,43 @@
+// PR 41377
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct A
+{
+ bool foo(int*) const;
+} a;
+
+struct B {};
+
+struct B1 : B
+{
+ bool (A::*pmf)(int*) const;
+ const A* pa;
+
+ B1() : pmf(&A::foo), pa(&a) {}
+ bool operator()() const { return (pa->*pmf)(new int); }
+};
+
+struct B2 : B
+{
+ B1 b1;
+
+ B2(const B1& _b1) : b1(_b1) {}
+ bool operator()() const { return b1(); }
+};
+
+template<int> struct C
+{
+ void bar(B2 b2) { while (b2()) ; }
+ C() { bar(B2(B1())); }
+};
+
+void baz(int i)
+{
+ switch(i)
+ {
+ case 0: new C<0>;
+ case 1: new C<1>;
+ case 2: new C<2>;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/empty1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/empty1.C
new file mode 100644
index 000000000..66784fb28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/empty1.C
@@ -0,0 +1,11 @@
+// PR c++/43787
+// Test that we don't try to copy *x.
+// { dg-do run }
+
+class empty_t {};
+
+int main()
+{
+ empty_t* x = 0;
+ empty_t y = *x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/empty2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/empty2.C
new file mode 100644
index 000000000..86caa5ccb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/empty2.C
@@ -0,0 +1,18 @@
+// PR c++/46160
+// { dg-do compile }
+
+struct S
+{
+ enum E { A };
+} s;
+volatile S t;
+
+void f (S::E);
+
+void
+g ()
+{
+ volatile S *p = &s;
+ f (p->A);
+ f (t.A);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/emptyunion.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/emptyunion.C
new file mode 100644
index 000000000..105faed58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/emptyunion.C
@@ -0,0 +1,13 @@
+// PR optimization/11059
+// This testcase ICEd because clear_by_pieces was called with zero length.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+union uni {};
+
+int main() {
+ uni *h;
+
+ h = (uni *)new uni();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/enum1.C
new file mode 100644
index 000000000..6416b3f1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/enum1.C
@@ -0,0 +1,30 @@
+// Verify that we don't confuse precision and mode for enums.
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort();
+
+enum E {
+ zero = 0,
+ test = 0xbb
+};
+
+static bool foo(unsigned char *x)
+{
+ E e = static_cast<E>(*x);
+ switch (e)
+ {
+ case test:
+ return true;
+ default:
+ return false;
+ }
+}
+
+int main()
+{
+ unsigned char dummy = test;
+ if (! foo(&dummy))
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/enum2.C
new file mode 100644
index 000000000..40a496e53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/enum2.C
@@ -0,0 +1,21 @@
+// PR c++/43680
+// Test that we don't make excessively aggressive assumptions about what
+// values an enum variable can have.
+// { dg-do run { target fpic } }
+// { dg-options "-O2 -fPIC" }
+
+extern "C" void abort ();
+
+enum E { A, B, C, D };
+
+void
+CheckE(const E value)
+{
+ long v = value;
+ if (v <= D)
+ abort ();
+}
+
+int main() {
+ CheckE(static_cast<E>(5));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/expect1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/expect1.C
new file mode 100644
index 000000000..90a871f37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/expect1.C
@@ -0,0 +1,17 @@
+// PR c++/13239
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+struct Y {
+ int i;
+};
+
+bool foo () { return true; }
+Y bar () { Y y = {0}; return y; }
+
+int main ()
+{
+ __builtin_expect (foo () && (bar ().i) == 0, 0) ? 0 : (abort (), 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/expect2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/expect2.C
new file mode 100644
index 000000000..1bb5d8331
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/expect2.C
@@ -0,0 +1,11 @@
+// PR c++/13392
+// { dg-do compile }
+// { dg-options "-O0" }
+
+extern "C" void abort (void);
+struct X { ~X () throw() {} };
+bool foo (X s = X ()) { return false; }
+void bar ()
+{
+ __builtin_expect (foo () && true, 1) ? 0 : (abort (), 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/float1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/float1.C
new file mode 100644
index 000000000..8f26ed5c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/float1.C
@@ -0,0 +1,21 @@
+// PR optimization/11637
+// Origin: <nick@ilm.com>
+
+// This used to fail to assemble on x86 because a decimal
+// floating point litteral was emitted, which originated
+// from a bogus REG_EQUAL note not removed by the combiner.
+
+// { dg-do assemble }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+void f(long int seed);
+
+void g(float &o)
+{
+ float a = 0.05f;
+ float b = 1.0 - a;
+ float c = 1.0 + a;
+
+ f(0);
+ o = a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/fold1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold1.C
new file mode 100644
index 000000000..98f1b5191
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold1.C
@@ -0,0 +1,17 @@
+// PR middle-end/13696
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern void x(unsigned long*);
+
+enum e { red, blue, green };
+
+struct s {
+ unsigned long l;
+};
+struct s map[1][256];
+
+void
+f(int i,e j) {
+ x(&(map[i][j].l));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/fold2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold2.C
new file mode 100644
index 000000000..95063d7ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold2.C
@@ -0,0 +1,19 @@
+// PR optimization/14669
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+enum ActionType { EE=-1, E0=0, E1, E2 };
+
+int main(void)
+{
+ ActionType t = E0;
+
+ if (E1 <= t && t <= E2)
+ abort ();
+
+ exit (0);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/fold3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold3.C
new file mode 100644
index 000000000..87a36b9ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/fold3.C
@@ -0,0 +1,21 @@
+// PR middle-end/15069
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+typedef enum {
+ FOUR = 4,
+ FIVE = 5
+} direction_t;
+
+int main ()
+{
+ direction_t four = FOUR;
+ int flags = (four & 4L) ? (32L | 128L) : 0;
+ flags &= 32L;
+
+ if (flags == 0)
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ice1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ice1.C
new file mode 100644
index 000000000..701897166
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ice1.C
@@ -0,0 +1,41 @@
+// PR c++/43024
+// { dg-options "-O2" }
+
+void foo();
+
+template<int> struct X
+{
+ enum { e };
+ typedef int Y;
+};
+
+template<int N = 0> struct A
+{
+ ~A() { foo(); }
+ A() { a<0>(0); }
+ template<int> void a(typename X<!X<N>::e>::Y);
+ struct B b();
+};
+
+struct B
+{
+ A<> b0, b1, b2, b3;
+ B operator+ (const B&);
+};
+
+struct C
+{
+ A<> c0, c1, c2, c3, c4, c5, c6, c7, c8;
+};
+
+inline void bar(int i)
+{
+ A<> a0, a1;
+ if (i) a0.b() + a0.b() + a0.b() + a0.b();
+}
+
+void baz()
+{
+ C c;
+ bar(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ifcvt1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ifcvt1.C
new file mode 100644
index 000000000..8fcbf4619
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ifcvt1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+struct S { ~S () throw () {} };
+double bar ();
+
+int
+foo ()
+{
+ S a;
+ int i = 0;
+ double c = bar ();
+ c = c < 0 ? -c : c;
+ if (c <= 1.e-8)
+ i += 24;
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/init1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/init1.C
new file mode 100644
index 000000000..d9a139e72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/init1.C
@@ -0,0 +1,4 @@
+// PR c++/23171
+// { dg-options "-O" }
+
+int *p = (int*)(int[1]){0};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/init2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/init2.C
new file mode 100644
index 000000000..3c3bc939d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/init2.C
@@ -0,0 +1,6 @@
+// PR middle-end/37414
+// { dg-do compile }
+// { dg-options "-O2 -ffast-math" }
+
+double x = 6.0;
+double y = x * x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline1.C
new file mode 100644
index 000000000..55b931138
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline1.C
@@ -0,0 +1,43 @@
+// PR c++/6316
+// This testcase ICEd because when deferred bar()::F::F() was being
+// expanded, containing bar() was still deferred and had DECL_EXTERNAL set
+// (and DECL_NOT_REALLY_EXTERN too).
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct A { ~A() throw() {} };
+template<typename T, typename U> struct B { U a; B(const T *); };
+typedef B<char, A> C;
+struct D { D(); };
+struct E { virtual ~E(); };
+
+E *bar ();
+
+void
+foo ()
+{
+ E *a = bar ();
+}
+
+extern char *z [];
+
+E *
+bar ()
+{
+ struct F : public E
+ {
+ F ()
+ {
+ for (int i = 0; i < 2; i++)
+ C e = z[i];
+ }
+ D x, y;
+ };
+ return new F ();
+}
+
+int
+main ()
+{
+ foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline10.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline10.C
new file mode 100644
index 000000000..086a48128
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline10.C
@@ -0,0 +1,20 @@
+// PR c++/25010
+// { dg-options "-O2" }
+
+#pragma interface
+
+struct T
+{
+ T *p;
+
+ void baz ()
+ {
+ p->baz ();
+ }
+};
+
+void foo (T *p)
+{
+ p->baz ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline11.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline11.C
new file mode 100644
index 000000000..d9758176c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline11.C
@@ -0,0 +1,28 @@
+/* Verify that gnu_inline inlines disregard inlining limits. */
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+
+extern int foo (int);
+extern int baz (int);
+
+extern inline __attribute__((gnu_inline))
+int foo (int x)
+{
+ int i;
+ if (!__builtin_constant_p (x))
+ {
+#define B(n) baz (1##n) + baz (2##n) + baz (3##n) \
+ + baz (4##n) + baz (5##n) + baz (6##n)
+#define C(n) B(1##n) + B(2##n) + B(3##n) + B(4##n) + B(5##n) + B(6##n)
+#define D(n) C(1##n) + C(2##n) + C(3##n) + C(4##n) + C(5##n) + C(6##n)
+ return D(0) + D(1) + D(2) + D(3) + D(4)
+ + D(5) + D(6) + D(7) + D(8) + D(9);
+ }
+ return 0;
+}
+
+int
+main (void)
+{
+ return foo (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline12.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline12.C
new file mode 100644
index 000000000..d9eae306d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline12.C
@@ -0,0 +1,32 @@
+// PR tree-optimization/33458
+// { dg-do compile }
+// { dg-options "-O" }
+
+inline void
+foo (int *p, int n)
+{
+ for (; n > 0; --n, ++p)
+ *p = 0;
+}
+
+struct A
+{
+ int x[2];
+ A () { foo (x, 2); }
+};
+
+inline A
+getA ()
+{
+ return A ();
+}
+
+struct B
+{
+ A a;
+ B ();
+};
+
+B::B () : a (getA ())
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline14.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline14.C
new file mode 100644
index 000000000..8d2a5d4bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline14.C
@@ -0,0 +1,51 @@
+// PR middle-end/34018
+// { dg-do compile }
+// { dg-options "-O1" }
+
+template <typename E, unsigned long N>
+struct A
+{
+ typedef E F;
+ E elems[N];
+ A () {}
+ E *begin () { return elems; }
+ const E *begin () const { return elems; }
+
+ explicit A (F const &v0, F const &v1, F const &v2)
+ {
+ elems[0] = v0;
+ elems[1] = v1;
+ elems[2] = v2;
+ }
+};
+
+template <typename E1, typename E2, typename E3>
+inline void
+bar (const E1 *a1, E2 const &a2, E3 *a3, unsigned long const &sz)
+{
+ E3 *r = a3 + sz;
+ for (;a3 != r; a1++, a3++)
+ *a3 = *a1 - a2;
+}
+
+template<typename E, unsigned long N>
+inline A<E, N>
+operator- (A<E, N> const& a1, E const& a2)
+{
+ typedef A<E, N> G;
+ G a3;
+ bar (a1.begin (), a2, a3.begin (), N);
+ return a3;
+}
+
+struct B
+{
+ B (A<unsigned long, 3> const &m) : n (m - static_cast<unsigned long>(1)) {}
+ A<unsigned long, 3> n;
+};
+
+void
+foo ()
+{
+ B t (A<unsigned long, 3> (0,0,0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline15.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline15.C
new file mode 100644
index 000000000..5da3a6105
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline15.C
@@ -0,0 +1,42 @@
+// PR tree-optimization/40813
+// { dg-do compile }
+// { dg-options "-O -fcheck-new" }
+
+typedef __SIZE_TYPE__ size_t;
+typedef void *P;
+struct A;
+struct B
+{
+ void *b[5];
+ A *foo () { return (A *) & b[0]; }
+};
+struct A
+{
+ void *operator new (size_t x, B &y) { return y.foo (); }
+};
+struct C : public A
+{
+ virtual int bar () { }
+};
+struct D : public C
+{
+ static B baz (unsigned *x) { B b; new (b) D (x); return b; }
+ D (unsigned *x) { }
+};
+struct E
+{
+ B e;
+ B fn (unsigned *a) { return D::baz (a); }
+ E (P b, unsigned *a) : e (fn (a)) { }
+};
+
+static unsigned *
+fn2 ()
+{
+}
+
+void
+test (P x)
+{
+ E (x, fn2 ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline16.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline16.C
new file mode 100644
index 000000000..6ee6d76d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline16.C
@@ -0,0 +1,19 @@
+// PR c++/36959
+// We shouldn't have to emit fromSlotB just because we need shuf_BZZZ.
+// { dg-options -O }
+// { dg-final { scan-assembler-not "_ZL9fromSlotBv" } }
+
+static inline int *fromSlotB(void)
+{
+ static int shuf_BZZZ = 1;
+ return &shuf_BZZZ;
+}
+
+int *p;
+
+int main(void)
+{
+ p = fromSlotB();
+ return (*p != 1);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline17.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline17.C
new file mode 100644
index 000000000..a42233d57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline17.C
@@ -0,0 +1,80 @@
+// PR tree-optimization/47420
+// Testcase by Yu Simin <silver24k@gmail.com>
+
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class fooControlBase
+{
+public:
+ fooControlBase() { }
+
+ virtual ~fooControlBase();
+};
+
+class fooControl : public fooControlBase
+{
+public:
+ fooControl() { }
+};
+
+class sfTextEntryBase
+{
+public:
+ sfTextEntryBase() { }
+ virtual ~sfTextEntryBase();
+};
+
+class sfTextEntry : public sfTextEntryBase
+{
+public:
+ sfTextEntry()
+ {
+ }
+};
+
+class sfTextAreaBase
+{
+public:
+ sfTextAreaBase() { }
+ virtual ~sfTextAreaBase() { }
+
+protected:
+};
+
+
+class sfTextCtrlBase : public fooControl,
+ public sfTextAreaBase,
+ public sfTextEntry
+{
+public:
+
+
+
+ sfTextCtrlBase() { }
+ virtual ~sfTextCtrlBase() { }
+};
+
+class sfTextCtrl : public sfTextCtrlBase
+{
+public:
+ sfTextCtrl(void* parent)
+ {
+ Create(parent);
+ }
+ virtual ~sfTextCtrl();
+
+ bool Create(void *parent);
+
+
+};
+
+sfTextCtrl* CreateTextCtrl()
+{
+ return new sfTextCtrl(0);
+}
+
+void foo ()
+{
+ new sfTextCtrl(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline2.C
new file mode 100644
index 000000000..6e6889fc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline2.C
@@ -0,0 +1,18 @@
+// { dg-do link }
+// { dg-options "-O1 -finline-functions" }
+
+static void g ();
+
+void f()
+{
+ void g();
+ g();
+}
+
+void g()
+{
+}
+
+int main () {
+ f ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline3.C
new file mode 100644
index 000000000..7199de09c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline3.C
@@ -0,0 +1,40 @@
+// PR opt/6793
+// We failed to supress inlining of a varargs function when it's a template.
+// { dg-do compile }
+// { dg-options "-O3" }
+
+#include <stdarg.h>
+
+typedef __SIZE_TYPE__ size_t;
+
+template < class Type > class VectorNd
+{
+ size_t size;
+ Type *data;
+ public:
+
+ VectorNd (size_t _size, size_t count, ...)
+ : size (_size)
+ {
+ data = new Type[size];
+
+ va_list ap;
+
+ va_start (ap, count);
+
+ for (size_t i = 0; i < count; i++)
+ data[i] = va_arg (ap, Type);
+
+ va_end (ap);
+ }
+
+ ~VectorNd ()
+ {
+ delete [] data;
+ }
+};
+
+int main ()
+{
+ VectorNd <double> vector (3, 3, 1.0, 2.0, 3.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline4.C
new file mode 100644
index 000000000..2eaad115f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline4.C
@@ -0,0 +1,13 @@
+// { dg-options "-O2 -ftemplate-depth-20000" }
+
+template <int I>
+inline void g() { g<I-1>(); return; }
+
+template <>
+inline void g<0>() { int i; return; }
+
+void h() {
+ g<250>();
+}
+
+// { dg-final { scan-assembler-not "\n_?_Z1gILi\[0-9\]+EEvv\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline5.C
new file mode 100644
index 000000000..dd61ee6bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline5.C
@@ -0,0 +1,20 @@
+// PR c++/12519
+
+// { dg-do compile }
+// { dg-options "-O" }
+
+struct A
+{
+ ~A();
+};
+
+inline const A foo()
+{
+ A a;
+ return a;
+}
+
+A bar()
+{
+ return foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline6.C
new file mode 100644
index 000000000..b1616c7e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline6.C
@@ -0,0 +1,14 @@
+// PR c++/13081
+// { dg-options "-O2" }
+// { dg-final { scan-assembler-not "\n_?_Z3fooIlET_S0_\[: \t\n\]" } }
+
+template<typename T> T foo(T);
+
+template<typename T> inline T foo(T t)
+{
+ return t;
+}
+
+void bar (long& l) {
+ l = foo(l);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline7.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline7.C
new file mode 100644
index 000000000..7a873b01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline7.C
@@ -0,0 +1,7 @@
+// PR c++/13543
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct basic_string { basic_string(const basic_string&); };
+basic_string operator+(const basic_string& lhs, char);
+void dumpNode(basic_string start) { dumpNode(start + 'a'); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline8.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline8.C
new file mode 100644
index 000000000..b2ca021b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline8.C
@@ -0,0 +1,5 @@
+// PR c++/15871
+// { dg-options "-O2 -fkeep-inline-functions" }
+// { dg-final { scan-assembler "foo" } }
+
+inline void foo(void) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/inline9.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline9.C
new file mode 100644
index 000000000..4fc556f28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/inline9.C
@@ -0,0 +1,29 @@
+// PR c++/17972
+// Origin: Michal Ostrowski <mostrows@watson.ibm.com>
+// Testcase by Alan Modra <amodra@bigpond.net.au>
+// { dg-do run }
+// { dg-options "-O" }
+// { dg-options "-O -mtune=i686" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+struct thread_info
+{
+ short preempt_count;
+} x;
+
+static inline struct thread_info *cti (void) __attribute__ ((const));
+static inline struct thread_info *cti (void)
+{
+ return &x;
+}
+
+void fn (void) __attribute__ ((noinline));
+void fn (void)
+{
+ ++cti()->preempt_count;
+}
+
+int main (void)
+{
+ fn ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1-a.cc b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1-a.cc
new file mode 100644
index 000000000..595585257
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1-a.cc
@@ -0,0 +1,9 @@
+struct Test {
+ void f();
+};
+
+Test t;
+
+void g() {
+ t.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.C
new file mode 100644
index 000000000..850fe3840
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.C
@@ -0,0 +1,13 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "interface1-a.cc" }
+
+#pragma implementation "interface1.h"
+
+#include "interface1.h"
+
+extern void g();
+
+int main () {
+ g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.h b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.h
new file mode 100644
index 000000000..125f4b59e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface1.h
@@ -0,0 +1,8 @@
+#pragma interface "interface1.h"
+
+struct Test {
+ void f();
+};
+
+inline void Test::f() {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.C
new file mode 100644
index 000000000..e75e42589
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Jun 2005 <nathan@codesourcery.com>
+
+// PR 21280
+// Origin: Jens Maurer <jens.maurer@gmx.net>
+
+#include "interface2.h"
+
+struct A
+{
+ A() { }
+ virtual ~A() { }
+};
+
+int main()
+{
+ A a;
+ C<A> c(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.h b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.h
new file mode 100644
index 000000000..dc0590472
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/interface2.h
@@ -0,0 +1,11 @@
+#pragma interface
+
+template<class T>
+struct C
+{
+ explicit C(const T& t) : a(t) { }
+ virtual ~C() { }
+ T a;
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/life1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/life1.C
new file mode 100644
index 000000000..9b8a61aa9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/life1.C
@@ -0,0 +1,17 @@
+// This testcase did not set up the pic register on IA-32 due
+// to bug in calculate_global_regs_live EH edge handling.
+// { dg-do compile { target { { i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } && ia32 } } }
+// { dg-require-effective-target fpic }
+// { dg-options "-O2 -fPIC" }
+
+struct A { };
+
+void foo (A (*fn)())
+{
+ try {
+ A a = fn ();
+ } catch (...) {
+ }
+}
+
+// { dg-final { scan-assembler "GLOBAL_OFFSET_TABLE" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/local1.C
new file mode 100644
index 000000000..9cecaee6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/local1.C
@@ -0,0 +1,20 @@
+// { dg-options "-O" }
+
+struct Outer {
+ struct Inner { virtual bool f() = 0; };
+ void g(Inner &) const;
+};
+
+inline void h(const Outer &o)
+{
+ struct Local : public Outer::Inner {
+ virtual bool f() {};
+ };
+ Local l;
+ o.g(l);
+}
+
+void f(Outer &req) {
+ h (req);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch1.C
new file mode 100644
index 000000000..a64a57aea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch1.C
@@ -0,0 +1,36 @@
+// PR c++/5964
+// This testcase failed to link on sparc -m64 -O0, because instruction
+// lengths were incorrectly computed
+// { dg-do link }
+// { dg-options "-O0" }
+
+#define makecode for (int i = 1; i < 1000; ++i) i *= 3
+#define muchcode \
+ makecode; makecode; makecode; makecode; makecode; makecode; \
+ makecode; makecode; makecode; makecode; makecode; makecode; \
+ makecode; makecode; makecode; makecode; makecode; makecode; \
+ makecode; makecode; makecode; makecode; makecode; makecode
+
+#define verymuchcode \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \
+ muchcode; muchcode; muchcode; muchcode; muchcode; muchcode
+
+int
+main (int argc, char **argv)
+{
+loop:
+ verymuchcode;
+ delete[] argv;
+ goto loop;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch2.C
new file mode 100644
index 000000000..4a8d5eef7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/longbranch2.C
@@ -0,0 +1,63 @@
+// PR target/11689
+// Originator: thor@math.tu-berlin.de
+
+// { dg-do compile }
+// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+
+// This used to fail to assemble because of an out-of-range 'loop' instructions.
+
+
+class JKeeper {
+public:
+ unsigned long a0;
+};
+
+class EBCOTLut : public JKeeper {
+ unsigned char a1[1<<8];
+ unsigned char a2[1<<9];
+ unsigned char a3[1<<9];
+ long a4[1<<9];
+public:
+ EBCOTLut(void);
+};
+
+EBCOTLut::EBCOTLut(void)
+{
+ unsigned char inter[36]; // intermediate lookup table;
+ unsigned long i;
+ for(i=0;i<36;i++) {
+ inter[i] = 0;
+ }
+ for(i=1;i<16;i++) {
+ a1[i | (1<<7)] = 8<<1;
+ a1[i | (1<<6)] = 8<<1;
+ }
+ for(i=0;i < ((1<<9)-1);i++) {
+ int ds = (i>>0) & 0x01; // significance of DOWN
+ int us = (i>>1) & 0x01; // significance of UP
+ int rs = (i>>2) & 0x01; // significance of RIGHT
+ int ls = (i>>3) & 0x01; // significance of LEFT
+ int dn = (i>>5) & 0x01; // sign of DOWN
+ int un = (i>>6) & 0x01; // sign of UP
+ int rn = (i>>7) & 0x01; // sign of RIGHT
+ int ln = (i>>8) & 0x01; // sign of LEFT
+ int h,v; // h and v as in the VM description
+
+ h = ls*(1-ln*2) + rs*(1-2*rn);
+ v = us*(1-un*2) + ds*(1-2*dn);
+ h = (h >= -1)?(h):(-1);
+ v = (v >= -1)?(v):(-1);
+ h = (h <= 1)?(h):(1);
+ v = (v <= 1)?(v):(1);
+ a2[i] = inter[((h+1)<<3) | (v+1)];
+ a3[i] = inter[((h+1)<<3) | (v+1)] & (unsigned char)(~1);
+ }
+ for(i=0;i< 1<<9; i++) {
+ a4[i] = 2*(i-(1<<(9-1)))*(i-(1<<(9-1))) -
+ ((i< (1<<(9-1)))?
+ (2*(i-(1<<(9-2)))*(i-(1<<(9-2)))):
+ (2*(i-(3<<(9-2)))*(i-(3<<(9-2)))));
+
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/loop1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/loop1.C
new file mode 100644
index 000000000..ad0308e7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/loop1.C
@@ -0,0 +1,24 @@
+// PR rtl-optimization/16590
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+struct iterator {
+ char * p;
+ int *dummy;
+};
+
+static iterator pend(char * start) {
+ iterator p = {start, 0};
+ if (p.p == start) p.p = start+5;
+ --p.p;
+ return p;
+}
+
+int main() {
+ char mem[4+1];
+
+ if(pend(mem).p != mem+4)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/loop2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/loop2.C
new file mode 100644
index 000000000..aee612ab5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/loop2.C
@@ -0,0 +1,24 @@
+// PR middle-end/22484
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct A { ~A(); };
+typedef bool B;
+
+bool foo();
+
+bool bar(A&)
+{
+ B b = true;
+
+ for (int i = 0; i < 2 && b; ++i)
+ b = foo();
+
+ return b;
+}
+
+void baz()
+{
+ A a;
+ if (bar(a)) foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/memcpy1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/memcpy1.C
new file mode 100644
index 000000000..f29134599
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/memcpy1.C
@@ -0,0 +1,79 @@
+// PR target/34403
+// Origin: Martin Michlmayr <tbm@cyrius.com>
+
+// { dg-do compile }
+// { dg-options "-O" }
+
+typedef unsigned char uint8_t;
+typedef uint8_t uint8;
+__extension__ typedef __SIZE_TYPE__ size_t;
+class csVector2
+{
+public:float x;
+};
+class csBox2
+{
+};
+struct iBase
+{
+};
+struct iClipper2D:public virtual iBase
+{
+};
+template < class Class > class scfImplementation:public virtual iBase
+{
+};
+template < class Class, class I1 > class scfImplementation1:public
+scfImplementation < Class >,
+ public I1
+{
+};
+class csClipper:public scfImplementation1 < csClipper, iClipper2D >
+{
+};
+class csBoxClipper:public csClipper
+{
+ csBox2 region;
+ virtual uint8 Clip (csVector2 * InPolygon, size_t InCount,
+ csVector2 * OutPolygon, size_t & OutCount);
+};
+struct StatusOutputNone
+{
+};
+namespace CS
+{
+ template < typename BoxTest, typename StatusOutput > class BoxClipper
+ {
+ BoxTest boxTest;
+ StatusOutput statOut;
+ const csBox2 & region;
+ csVector2 *InP;
+ size_t InV;
+ csVector2 *OutP;
+ size_t OutV;
+ public: BoxClipper (const BoxTest & boxTest, const StatusOutput & statOut,
+ const csBox2 & region, csVector2 * InP, size_t InV,
+ csVector2 * OutP):boxTest (boxTest), statOut (statOut),
+ region (region), InP (InP), InV (InV), OutP (OutP), OutV (-1)
+ {
+ }
+ uint8 Clip ()
+ {
+ __builtin_memcpy (this->OutP, InP, OutV * sizeof (csVector2));
+ }
+ };
+}
+struct BoxTestAll
+{
+};
+uint8
+csBoxClipper::Clip (csVector2 * InPolygon, size_t InCount,
+ csVector2 * OutPolygon, size_t & OutCount)
+{
+ BoxTestAll b;
+ StatusOutputNone n;
+ CS::BoxClipper < BoxTestAll, StatusOutputNone > boxClip (b, n, region,
+ InPolygon, InCount,
+ OutPolygon);
+ uint8 Clipped = boxClip.Clip ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx1.C
new file mode 100644
index 000000000..7af0d0145
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx1.C
@@ -0,0 +1,65 @@
+// PR optimization/4994
+// This testcase ICEd because movsi was not supporting direct
+// mmx -> mmx register moves.
+// { dg-do compile }
+// { dg-options "-O2" }
+// { dg-options "-fno-exceptions -O2 -mmmx -fPIC" { target { { i?86-*-* x86_64-*-* } && { ilp32 && fpic } } } }
+
+struct A {
+ unsigned a0;
+ bool a1 () { return !--a0; }
+ void a2 ();
+};
+
+struct B
+{
+ B ();
+ B (const B &);
+ ~B();
+ B &operator= (const B &);
+ B b0 (unsigned long x, int y = 0, int z = 10) const;
+
+private:
+ A *b1;
+ static A *b2;
+};
+
+inline B::~B()
+{
+ if (b1->a1 () && b1 == b2)
+ b1->a2();
+}
+
+struct C
+{
+ C *c0;
+};
+
+struct D
+{
+ C *d0;
+ D ();
+ D (const D &c0) {}
+ D &operator++ () {
+ C *x = d0; C *y = x->c0;
+ while (x == y->c0)
+ x = y;
+ d0 = x;
+ return *this;
+ }
+};
+
+B foo (const char *x, const B &y);
+
+void bar (void)
+{
+ B *y = 0;
+ B z;
+ for (unsigned long l = 0; l < 2147483647L * 2UL + 1; l++)
+ {
+ z = y->b0 (l);
+ *y = foo ("data", z);
+ }
+ D d;
+ ++d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx2.C
new file mode 100644
index 000000000..8ee6cd469
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/mmx2.C
@@ -0,0 +1,24 @@
+// { dg-do link { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O2 -mmmx" }
+// { dg-prune-output "mangled name" }
+
+#include <mmintrin.h>
+
+static union u { __m64 m; long long l; } u;
+extern "C" void abort (void);
+
+__attribute__((noinline))
+void bar (__m64 x)
+{
+ u.m = x;
+}
+
+int
+main ()
+{
+ bar (_mm_set_pi32 (0x000000FF,0xFFFF00FF));
+ _mm_empty ();
+ if (u.l != 0xffffff00ffLL)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/new1.C
new file mode 100644
index 000000000..dbcc0f851
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/new1.C
@@ -0,0 +1,71 @@
+// PR c++/39367
+// { dg-options "-O" }
+
+class QScriptEnginePrivate;
+class QScriptClassInfo;
+namespace QScript {
+ enum Type { InvalidType };
+};
+class QScriptValueImpl {
+public:
+ inline QScriptValueImpl();
+ QScript::Type m_type;
+};
+namespace QScript {
+ namespace Ecma {
+ class Core {
+ public:
+ inline QScriptEnginePrivate *engine() const { }
+ inline QScriptClassInfo *classInfo() const { }
+ QScriptValueImpl publicPrototype;
+ };
+ class Boolean: public Core {
+ void newBoolean(QScriptValueImpl *result, bool value = false);
+ };
+ }
+ template <typename T> class Buffer {
+ public:
+ inline void reserve(int num);
+ inline void resize(int s);
+ T *m_data;
+ int m_capacity;
+ int m_size;
+ };
+}
+template <typename T> void QScript::Buffer<T>::resize(int s) {
+ if (m_capacity < s)
+ reserve (s << 1);
+}
+template <typename T> void QScript::Buffer<T>::reserve(int x) {
+ T *new_data = new T[m_capacity];
+ for (int i=0; i<m_size; ++i)
+ new_data[i] = m_data[i];
+}
+class QScriptObject {
+public:
+ inline void reset();
+ QScript::Buffer<QScriptValueImpl> m_values;
+};
+class QScriptEnginePrivate {
+public:
+ inline QScriptObject *allocObject() { return 0; }
+ inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
+ QScriptClassInfo *oc = 0);
+};
+inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o,
+ const QScriptValueImpl &proto,
+ QScriptClassInfo *oc)
+{
+ QScriptObject *od = allocObject();
+ od->reset();
+}
+inline QScriptValueImpl::QScriptValueImpl() : m_type(QScript::InvalidType) { }
+inline void QScriptObject::reset() { m_values.resize(0); }
+namespace QScript {
+ namespace Ecma {
+ void Boolean::newBoolean(QScriptValueImpl *result, bool value)
+ {
+ engine()->newObject(result, publicPrototype, classInfo());
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/noreturn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/noreturn-1.C
new file mode 100644
index 000000000..9b2fc0cf1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/noreturn-1.C
@@ -0,0 +1,87 @@
+// PR optimization/12965
+// Origin: <qboosh@pld-linux.org>
+// Reduced testcase: Falk Hueffner <falk@debian.org>
+
+// This ICEd on Alpha because the reload pass emitted save/restore
+// insns around a no-return call.
+
+// { dg-do compile }
+// { dg-options "-O2" }
+
+template <typename _Alloc> class allocator;
+template <class _CharT> struct char_traits;
+template <typename _CharT,
+ typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+class basic_string;
+typedef basic_string<char> string;
+
+static inline int __exchange_and_add(volatile int * __mem, int __val) {
+ int __result;
+ asm("" : "=&r"(__result));
+ return __result;
+}
+
+template<typename _Tp> struct allocator {
+ allocator() throw() { }
+ allocator(const allocator &) throw() {}
+};
+
+template<typename _CharT, typename _Traits, typename _Alloc>
+struct basic_string {
+ typedef _Alloc allocator_type;
+ struct _Rep {
+ int _M_references;
+ void _M_dispose(const _Alloc & __a) {
+ if (__exchange_and_add(&_M_references, -1) <= 0)
+ _M_destroy(__a);
+ } void _M_destroy(const _Alloc &) throw();
+ };
+ struct _Alloc_hider : _Alloc {
+ _CharT *_M_p;
+ };
+ mutable _Alloc_hider _M_dataplus;
+ _CharT *_M_data() const { return _M_dataplus._M_p; }
+ _Rep *_M_rep() const {
+ return &((reinterpret_cast<_Rep *>(_M_data()))[-1]);
+ }
+ basic_string();
+ basic_string(const _CharT * __s, const _Alloc & __a = _Alloc());
+ ~basic_string() {
+ _M_rep()->_M_dispose(this->get_allocator());
+ }
+ allocator_type get_allocator() const { return _M_dataplus; }
+};
+
+struct Egeneric {
+ void stack(const string & passage, const string & message = "") { }
+};
+
+struct infinint {
+ void detruit() throw(Egeneric);
+ template<class T> void infinint_from(T a) throw(Egeneric);
+ infinint(long a = 0) throw(Egeneric) {
+ try {
+ infinint_from(a);
+ } catch(Egeneric& e) {
+ e.stack("infinint::infinint", "long");
+ }
+ }
+ ~infinint() throw(Egeneric) {
+ try {
+ detruit();
+ } catch(Egeneric& e) { }
+ }
+};
+
+struct inode {
+ string x;
+ infinint a, c;
+ infinint ea_offset;
+ inode();
+};
+
+inode::inode()
+{
+ ea_offset = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nothrow1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nothrow1.C
new file mode 100644
index 000000000..c1a80822b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nothrow1.C
@@ -0,0 +1,25 @@
+// Test that the nothrow optimization works properly.
+// { dg-do compile }
+// { dg-options "-O -fdump-tree-optimized" }
+
+extern void blah() throw();
+
+int i, j, k;
+
+int main()
+{
+ try
+ {
+ ++i;
+ blah();
+ ++j;
+ }
+ catch (...)
+ {
+ return -42;
+ }
+}
+
+// The catch block should be optimized away.
+// { dg-final { scan-tree-dump-times "-42" 0 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv1.C
new file mode 100644
index 000000000..cba162522
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv1.C
@@ -0,0 +1,28 @@
+// Test for the named return value optimization.
+// { dg-do run }
+// { dg-options -fno-inline }
+
+int c;
+int d;
+
+struct A
+{
+ A() { ++c; }
+ A(const A&) { ++c; };
+ ~A() { ++d; }
+};
+
+inline A f ()
+{
+ A a;
+ return a;
+}
+
+int main ()
+{
+ {
+ A a = f ();
+ }
+
+ return !(c == 1 && c == d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv10.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv10.C
new file mode 100644
index 000000000..d4cb92c33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv10.C
@@ -0,0 +1,48 @@
+// PR c++/25979
+// Bug: we were eliding too many temporaries, so that a1 was used
+// as both 'a' and 'x' in the second operator+.
+// { dg-do run }
+
+struct A
+{
+ A() : data1_(0), data2_(0) {}
+ A(int i, int j) : data1_(i), data2_(j) {}
+ A operator+(int);
+ friend A operator+(int, const A&);
+ ~A() {}
+//private:
+ int data1_;
+ int data2_;
+};
+
+extern bool x;
+
+extern "C" void abort ();
+
+int main()
+{
+ A a1(1,2);
+ a1 = (x ? a1 + 3 : 3 + a1);
+ if (a1.data1_ != 3 || a1.data2_ != 2)
+ abort ();
+}
+
+bool x = false;
+
+A
+A::operator+(int i)
+{
+ A a;
+ a = *this;
+ a.data2_ = i;
+ return a;
+}
+
+A
+operator+(int i, const A& x)
+{
+ A a;
+ a = x;
+ a.data1_ = i;
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv11.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv11.C
new file mode 100644
index 000000000..2b72f790b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv11.C
@@ -0,0 +1,58 @@
+// PR middle-end/25977
+// Bug: We were assuming that the return slot of the current function is
+// always safe to use as the return slot for another call, because its
+// address cannot escape. But its address can escape if we perform the
+// named return value optimization.
+
+// { dg-do run }
+
+struct A
+{
+ A( int left, int top, int width, int height )
+ : x1(left), y1(top), x2(left+width-1), y2(top+height-1) {}
+
+ //A(const A& o) : x1(o.x1), y1(o.y1), x2(o.x2), y2(o.y2) {}
+ //A& operator=(const A& o ) { x1=o.x1; y1=o.y1; x2=o.x2; y2=o.y2; return *this; }
+
+ A operator&(const A &r) const
+ {
+ A tmp(0, 0, -1, -1);
+ tmp.x1 = ((r.x1) < (x1) ? (x1) : (r.x1));
+ tmp.x2 = ((x2) < (r.x2) ? (x2) : (r.x2));
+ tmp.y1 = ((r.y1) < (y1) ? (y1) : (r.y1));
+ tmp.y2 = ((y2) < (r.y2) ? (y2) : (r.y2));
+ return tmp;
+ }
+
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+};
+
+bool operator==( const A &r1, const A &r2 )
+{
+ return r1.x1==r2.x1 && r1.x2==r2.x2 && r1.y1==r2.y1 && r1.y2==r2.y2;
+}
+
+static A test()
+{
+ A all = A( 0, 0, 1024, 768);
+ A a = all;
+ A r = all;
+ a = a & r;
+ return a;
+}
+
+extern "C" void abort(void);
+
+int main( int argc, char ** argv )
+{
+ A all = A( 0, 0, 1024, 768);
+ A a = test();
+
+ if ( ! ( a == all))
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv12.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv12.C
new file mode 100644
index 000000000..55933753c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv12.C
@@ -0,0 +1,24 @@
+/* Verify that gimple-level NRV is occurring even for RESULT_DECLs. */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+struct P
+{
+ long long l;
+ int a;
+ unsigned int b;
+ P(long long x) : l(x) {}
+};
+
+P foo (P);
+P bar (P);
+
+P foo (P x)
+{
+ P y = P (-1LL);
+ y = bar (x);
+ return y;
+}
+
+/* { dg-final { scan-tree-dump-times "return slot optimization" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv13.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv13.C
new file mode 100644
index 000000000..bb49a3a6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv13.C
@@ -0,0 +1,42 @@
+// PR tree-optimization/32353
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+struct A
+{
+ int f;
+ A (int x) : f (x) {}
+};
+
+A
+foo (const A &x, const A &y)
+{
+ A r (0);
+ r = x.f == -111 ? y : (y.f == -111 || x.f > y.f) ? x : y;
+ A s (0);
+ r = r.f == -111 ? s : (r.f > s.f) ? r : s;
+ return r;
+}
+
+int
+main ()
+{
+ if (foo (A (0), A (1)).f != 1)
+ abort ();
+ if (foo (A (1), A (9)).f != 9)
+ abort ();
+ if (foo (A (9), A (1)).f != 9)
+ abort ();
+ if (foo (A (-4), A (-5)).f != 0)
+ abort ();
+ if (foo (A (-111), A (-111)).f != 0)
+ abort ();
+ if (foo (A (2), A (-111)).f != 2)
+ abort ();
+ if (foo (A (-111), A (6)).f != 6)
+ abort ();
+ if (foo (A (-111), A (-4)).f != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv14.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv14.C
new file mode 100644
index 000000000..22526d6b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv14.C
@@ -0,0 +1,39 @@
+// PR c++/32992
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+struct A
+{
+ long int a1;
+ long int a2;
+ long int a3;
+};
+
+struct B
+{
+ long int f[3];
+ operator A ()
+ {
+ union
+ {
+ long int t[3];
+ A a;
+ };
+ for (int i = 0; i < 3; i++)
+ t[i] = f[i];
+ return a;
+ }
+};
+
+int
+main ()
+{
+ B b = { {1, 3, 5} };
+ A a = b;
+
+ if (a.a1 != b.f[0] || a.a2 != b.f[1] || a.a3 != b.f[2])
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv15.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv15.C
new file mode 100644
index 000000000..23511b284
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv15.C
@@ -0,0 +1,97 @@
+// PR debug/39086
+// { dg-options "-g -O -fno-tree-sra" }
+
+struct A { int v; };
+
+A ax;
+
+struct B
+{
+ static A f1 () { return ax; }
+ static bool f2 ();
+ static A f3 ();
+};
+
+struct C
+{
+ A f4 ()
+ {
+ A x;
+ if (__builtin_expect (this->f6 () < this->f12 (), true))
+ x = B::f1 ();
+ else
+ x = this->f7 ();
+ return x;
+ }
+ A f5 ()
+ {
+ A y;
+ if (this->f6 () < this->f12 ())
+ y = B::f1 ();
+ else
+ y = this->f7 ();
+ return y;
+ }
+ void *f6 () const;
+ void *f12 () const;
+ virtual A f7 ();
+};
+
+C *dx;
+
+struct D
+{
+ C *f8 () const;
+};
+
+class E : virtual public D
+{
+ void f11 ();
+ void f9 ();
+ void f10 ();
+};
+
+struct G
+{
+ explicit G ();
+ operator bool () const;
+};
+
+void
+E::f11 (void)
+{
+ A d = B::f3 ();
+ d = this->f8 ()->f4 ();
+}
+
+void
+E::f9 ()
+{
+ G c;
+ if (c)
+ {
+ const A e = B::f3 ();
+ C * f = this->f8 ();
+ A d = f->f5 ();
+ if (B::f2 ())
+ ;
+ else if (B::f2 ())
+ f->f4 ();
+ }
+}
+
+void
+E::f10 ()
+{
+ G c;
+ if (c)
+ {
+ const A e = B::f3 ();
+ C * f = this->f8 ();
+ A d = f->f5 ();
+ if (B::f2 ())
+ ;
+ else if (B::f2 ())
+ f->f4 ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv16.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv16.C
new file mode 100644
index 000000000..7b24d4a4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv16.C
@@ -0,0 +1,16 @@
+// PR c++/44808
+// { dg-do compile }
+
+struct S
+{
+ void *a, *b;
+ int c;
+};
+
+S
+foo ()
+{
+ S x;
+ S y = x;
+ return x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv17.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv17.C
new file mode 100644
index 000000000..6248bca03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv17.C
@@ -0,0 +1,32 @@
+// { dg-do run }
+
+#include <cstdlib>
+#include <complex>
+
+void __attribute__((noinline))
+h(std::complex<double> x)
+{
+ if (x.real() != 2.0)
+ std::abort ();
+}
+
+void __attribute__((noinline))
+g(std::complex<double> x)
+{
+ if (x.real() != 0.5)
+ std::abort ();
+}
+
+void __attribute__((noinline))
+f(std::complex<double> x)
+{
+ h (x);
+ x = 1.0 / x;
+ g (x);
+}
+
+int main()
+{
+ f(2.0);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv2.C
new file mode 100644
index 000000000..4ffc07587
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv2.C
@@ -0,0 +1,28 @@
+// Test for the named return value optimization, this time with inlining.
+// { dg-do run }
+// { dg-options -O2 }
+
+int c;
+int d;
+
+struct A
+{
+ A() { ++c; }
+ A(const A&) { ++c; };
+ ~A() { ++d; }
+};
+
+inline A f ()
+{
+ A a;
+ return a;
+}
+
+int main ()
+{
+ {
+ A a = f ();
+ }
+
+ return !(c == 1 && c == d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv3.C
new file mode 100644
index 000000000..2ec597744
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv3.C
@@ -0,0 +1,24 @@
+// PR optimization/6189
+// Bug: we forgot about foo's nrv after writing it out.
+// { dg-options -O3 }
+// { dg-do run }
+
+struct A
+{
+ int i;
+};
+
+
+A foo ()
+{
+ A a;
+ a.i = 42;
+ return a;
+}
+
+
+int main()
+{
+ A b = foo();
+ return b.i != 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv4.C
new file mode 100644
index 000000000..531647d67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv4.C
@@ -0,0 +1,23 @@
+// PR optimization/7145
+// Bug: The NRV optimization caused us to lose the initializer for 'ret'.
+// { dg-options -O }
+// { dg-do run }
+
+struct GdkColor {
+ long pixel;
+ short red;
+ short green;
+ short blue;
+};
+
+inline GdkColor mkcolor() {
+ GdkColor ret={0,1,2,3};
+ return ret;
+}
+
+int
+main()
+{
+ GdkColor col=mkcolor();
+ return (col.pixel != 0 || col.red != 1 || col.green != 2 || col.blue != 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv5.C
new file mode 100644
index 000000000..7c3c0591f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv5.C
@@ -0,0 +1,57 @@
+// PR c++/7279
+// Test for the named return value optimization with inlining.
+// Contributed by Jakub Jelinek <jakub@redhat.com>.
+// { dg-do run }
+// { dg-options -O2 }
+
+enum E { E0, E1, E2, E3 };
+
+struct S
+{
+ E s0 : 2;
+ bool s1 : 1, s2 : 1, s3 : 1, s4 : 1, s5 : 1, s6 : 1;
+ S ();
+ void foo (E x);
+};
+
+S::S() : s1 (true), s2 (false), s0 (E1), s3 (true), s4 (false),
+ s5 (true), s6 (false) {}
+void S::foo (E x) { this->s0 = x; }
+
+inline S foo ()
+{
+ S s;
+ s.foo (E0);
+ return s;
+}
+
+inline S bar ()
+{
+ S s;
+ s.foo (E2);
+ return s;
+}
+
+void check (S &s, bool isfoo);
+
+void test (bool isfoo)
+{
+ S a = isfoo ? foo () : bar ();
+ check (a, isfoo);
+}
+
+extern "C" void abort ();
+
+void check (S &s, bool isfoo)
+{
+ if (! s.s1 || s.s2 || ! s.s3 || s.s4 || ! s.s5 || s.s6)
+ abort ();
+ if (s.s0 != (isfoo ? E0 : E2))
+ abort ();
+}
+
+int main ()
+{
+ test (true);
+ test (false);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv6.C
new file mode 100644
index 000000000..57ff12e41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv6.C
@@ -0,0 +1,26 @@
+// PR c++/9993
+// Bug: We were failing to destroy b.
+
+// { dg-do run }
+
+int c, d;
+
+struct Object {
+ Object() { ++c; }
+ Object(const Object&) { ++c; }
+ ~Object() { ++d; }
+};
+
+Object function() {
+ int i = 0;
+ do {
+ Object b;
+ if (i++ == 2)
+ return b;
+ } while (1);
+}
+
+int main() {
+ function();
+ return c != d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv7.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv7.C
new file mode 100644
index 000000000..c5034ecc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv7.C
@@ -0,0 +1,13 @@
+// PR c++/15461
+
+struct A {
+ int i;
+};
+
+inline A foo () {
+ int j = 1;
+ A a = { j };
+ return a;
+}
+
+A tv = foo();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv8.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv8.C
new file mode 100644
index 000000000..19999a188
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv8.C
@@ -0,0 +1,31 @@
+// PR optimization/19531
+// forbids NRV on volatile return value.
+// { dg-options -O2 }
+// { dg-do run }
+
+extern "C" { void abort(); }
+
+struct A
+{
+ int d;
+
+ A () { d = 123; }
+ A (const A & o) { d = o.d; }
+ A (volatile const A & o) { d = o.d + 2; }
+};
+
+A bar()
+{
+ volatile A l;
+ return l;
+}
+
+main()
+{
+ A a = bar ();
+
+ if (a.d != 125)
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv9.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv9.C
new file mode 100644
index 000000000..462506867
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/nrv9.C
@@ -0,0 +1,28 @@
+// PR c++/19317
+// If we do both NRV and caller-side return slot opt for ga = f()
+// constructing la sets ga.i to 0 too soon.
+
+extern "C" void abort();
+
+struct A
+{
+ int i;
+ int pad[32]; // force return in memory
+ A(): i(0) {}
+ A(int ia): i(ia) {}
+};
+
+A ga(42);
+
+A f()
+{
+ A la;
+ if (ga.i != 42)
+ abort();
+ return la;
+}
+
+int main()
+{
+ ga = f ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/operator1.C
new file mode 100644
index 000000000..9f286b9f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/operator1.C
@@ -0,0 +1,10 @@
+// Tests whether g++ can handle large number of operators
+// { dg-do compile }
+
+#define OP0(n) struct I##n { int i; }; operator I##n ();
+#define OP1(n) OP0(n)
+#define OP2(n) OP1(n##0) OP1(n##1) OP1(n##2) OP1(n##3) OP1(n##4)
+#define OP3(n) OP2(n##0) OP2(n##1) OP2(n##2) OP2(n##3) OP2(n##4)
+struct S {
+ OP3(0) OP3(1) OP3(2) OP3(3) OP3(4) OP3(5)
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/placeholder1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/placeholder1.C
new file mode 100644
index 000000000..a1c984263
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/placeholder1.C
@@ -0,0 +1,10 @@
+// PR rtl-optimization/15159
+// { dg-options "-O2" }
+struct S { S (); };
+struct P { P (S *); };
+void foo (const P &);
+void bar ()
+{
+ P p = new S;
+ foo (p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pmf1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pmf1.C
new file mode 100644
index 000000000..428e7530b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pmf1.C
@@ -0,0 +1,76 @@
+// PR c++/37016
+// { dg-do run }
+// { dg-options "-O2 -Wall" }
+
+/*
+ Basic design concept is that WorldObject implements remote method call
+ functionality using the "curiously recurring template pattern" to enable
+ forwarding calls from the generic base class that implements the transport
+ layer to the derived class.
+
+ The specific failure was in forwarding calls to items in a container.
+ This is emulated here by wrapping a single item.
+
+ In the main program there are two forms of the call. In the last
+ (uncommented) form the member function pointer is for clarity
+ assigned to a variable (itemfunptr) before making the call.
+ With 4.3.0 and 4.3.1 this code compiles incorrectly with -O1 or greater
+ to produce this warning
+
+ reproduce.cc: In function ‘int main()’:
+ reproduce.cc:26: warning: ‘itemfunptr.void (Container::*)(void
+(Item::*)(int), int)::__pfn’ is used uninitialized in this function
+ reproduce.cc:47: note: ‘itemfunptr.void (Container::*)(void (Item::*)(int),
+int)::__pfn’ was declared here
+
+ and the resulting executable segvs. It works correctly with -O0.
+
+ With 4.2.3 and earlier it works correctly with optimization.
+
+ In the first (commented out) form of the call in the main program
+ we directly refer to desired member function. This compiles
+ and executes correctly with all tested versions.
+*/
+
+extern "C" int printf (const char *, ...);
+
+template <class Derived>
+struct WorldObject {
+ template <typename memfunT, typename arg1T, typename arg2T>
+ void forward(memfunT memfun, arg1T arg1, arg2T arg2) {
+ Derived* obj = static_cast<Derived*>(this);
+ (obj->*memfun)(arg1, arg2);
+ }
+};
+
+struct Item {
+ void fred(int a) {
+ printf ("a=%d\n", a);
+ }
+};
+
+struct Container : public WorldObject<Container> {
+ Item item;
+ template <typename itemfunT, typename arg1T>
+ void itemfun(itemfunT itemfun, int a) {
+ (item.*itemfun)(a);
+ }
+};
+
+int main() {
+ typedef void (Item::*itemfun)(int);
+
+ Container t;
+
+ // This call compiles and executes correctly with all versions tested
+ //t.forward(&Container::itemfun<itemfun,int>, &Item::fred, 1);
+
+ // This call compiles with a warning and segvs on execution if using
+ // -O1 or greater with 4.3.*. 4.2.* is correct.
+ void (Container::*itemfunptr)(itemfun, int) =
+&Container::itemfun<itemfun,int>;
+ t.forward(itemfunptr, &Item::fred, 1);
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr13066-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr13066-1.C
new file mode 100644
index 000000000..67f853456
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr13066-1.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+class nsIURI;
+
+struct nsCOMPtr
+{
+ operator nsIURI*() const
+ {
+ return mRawPtr;
+ }
+
+ nsIURI *mRawPtr;
+};
+
+void func()
+{
+ nsCOMPtr u1;
+ if (!u1 == !u1)
+ return;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14029.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14029.C
new file mode 100644
index 000000000..1673edfd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14029.C
@@ -0,0 +1,41 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// We used to mis-compile this testcase as we did not know that
+// &a+offsetof(b,a) was the same as &a.b
+
+struct Iterator {
+ int * ptr;
+
+ Iterator(int * i) : ptr(i) { }
+ void operator++() { ++ptr; }
+ int *const & base() const { return ptr; }
+};
+
+
+Iterator find_7(Iterator first, Iterator last)
+{
+ int trip_count = (last.base() - first.base()) >> 1;
+
+ for ( ; trip_count > 0 ; --trip_count) {
+ if (*first.ptr == 7) return first;
+ ++first;
+
+ if (*first.ptr == 7) return first;
+ ++first;
+ }
+
+ switch(last.base() - first.base()) {
+ case 1:
+ if (*first.ptr == 7) return first;
+ ++first;
+ case 0:
+ default:
+ return last;
+ }
+}
+
+int main() {
+ int as[5] = {4,4,4,4,7};
+ return (find_7(Iterator(&as[0]), Iterator(&as[5])).ptr == &as[5]);
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14888.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14888.C
new file mode 100644
index 000000000..e5c56aaab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr14888.C
@@ -0,0 +1,22 @@
+// PR target/14888
+// This used to ICE because the truncdfsf2 isn't completely eliminated
+
+// { dg-do compile }
+// { dg-options "-O2 -ffast-math" }
+
+class xcomplex
+{
+public:
+ float re, im;
+
+ xcomplex &operator*= (const float &fact)
+ { re*=fact; im*=fact; return *this; }
+};
+
+void foo (xcomplex &almT, xcomplex &almG)
+{
+ double gb;
+ almT*=gb;
+ almG*=gb*42;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054-2.C
new file mode 100644
index 000000000..156e945d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054-2.C
@@ -0,0 +1,39 @@
+// PR middle-end/15054
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+void
+__attribute__((noinline))
+check (long x, long y)
+{
+ if (x != y)
+ abort ();
+}
+
+struct A
+{
+ A() : a(2) { check (a, 2); }
+ ~A() { check (a, 2); }
+private:
+ long a;
+};
+
+class B {
+ long b;
+ B& operator =(const B& );
+public:
+ B (long p) : b(p) { check (b, 6); }
+ B (const B& p) : b(p.b) { check (b, 6); }
+ ~B () { check (b, 6); A obj; check (b, 6); }
+ B foo() { return B(*this); }
+};
+
+int main ()
+{
+ B o(6);
+ o.foo().foo();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054.C
new file mode 100644
index 000000000..cfc48cf24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15054.C
@@ -0,0 +1,36 @@
+// PR middle-end/15054
+// This used to abort due to overlapping stack temporaries.
+
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct pointer
+{
+ void* ptr;
+
+ pointer(void* x = 0) : ptr(x) {}
+ pointer(const pointer& x) : ptr(x.ptr) {}
+};
+
+struct element
+{
+ int canary;
+
+ element() : canary(123) { }
+ ~element() { pointer(); if (canary != 123) abort (); }
+};
+
+inline pointer
+insert(const element& x)
+{
+ return pointer(new element(x));
+}
+
+int
+main (void)
+{
+ insert(element());
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15551.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15551.C
new file mode 100644
index 000000000..dc3ddc446
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr15551.C
@@ -0,0 +1,26 @@
+// PR target/15551
+// This used to crash on pentium4-pc-cygwin due to an alloca problem.
+// Testcase submitted by Hans Horn to mingw bug tracker
+//
+// { dg-do run }
+// { dg-options "-O3" }
+
+#include <cstring>
+#include <fstream>
+#include <cstdio>
+using namespace std;
+
+ostream* logfile;
+
+int main () {
+
+ logfile = new ofstream("bar", ios::out);
+
+ char expList[20000];
+ strcpy(expList, "foo");
+
+ delete logfile;
+ remove ("bar");
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16372-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16372-1.C
new file mode 100644
index 000000000..b797e4ad2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16372-1.C
@@ -0,0 +1,17 @@
+// PR tree-optimization/16372
+// { dg-do run }
+// { dg-options "-O1" }
+
+extern "C" void abort();
+
+enum number {ZERO, ONE, TWO, THREE, FOUR, FIVE};
+
+int main() {
+ number n = FIVE;
+
+ if((n == ONE) || (n == TWO) || (n == THREE)) {
+ abort ();
+ }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-1.C
new file mode 100644
index 000000000..6b716116d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-1.C
@@ -0,0 +1,25 @@
+// PR middle-end/16693
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+unsigned short ret6666(int) {
+ return 0x66;
+}
+
+typedef enum {
+ a = 0x0, b = 0x1, c = 0x2, d = 0x3, e = 0x4, f = 0x5,
+ g = 0x6, h = 0x7, i = 0x8, j = 0x9, k = 0xa, l = 0xb,
+ m = 0xc, n = 0xd, o = 0xe, p = 0xf
+} Test_Enum;
+
+int main(void) {
+ unsigned char r1;
+ r1 = static_cast<Test_Enum>(0xf & ret6666(44));
+
+ if(r1 != 0x6)
+ abort();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-2.C
new file mode 100644
index 000000000..cb60df642
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr16693-2.C
@@ -0,0 +1,21 @@
+// PR middle-end/16693
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+char foo()
+{
+ return 0x10;
+}
+
+enum E { e = 0x0f };
+
+int main()
+{
+ char c = (char)(E)(e & foo());
+ if (c != 0)
+ abort();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17411-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17411-1.C
new file mode 100644
index 000000000..62b57a5a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17411-1.C
@@ -0,0 +1,21 @@
+// PR middle-end/17411
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct CalibData {
+ float mean_pedestal;
+};
+
+struct pair
+{
+ CalibData second;
+ pair(const CalibData& __b) : second(__b) { }
+};
+
+void insert(const pair& __x);
+
+void foo()
+{
+ insert(pair(CalibData()));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17624.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17624.C
new file mode 100644
index 000000000..07fbf14da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17624.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern void foo (void);
+int c;
+void foo (int n)
+{
+ int j = 0;
+ try
+ {
+ for(;;)
+ {
+ foo ();
+ if (j ++ == n)
+ break;
+ foo ();
+ }
+ }
+ catch (...)
+ {
+ c = j;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-1.C
new file mode 100644
index 000000000..50a75b845
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-1.C
@@ -0,0 +1,32 @@
+// PR tree-optimization/17697
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C"
+{
+ extern int strcmp (const char *s, const char *t) throw ()
+ __attribute__ ((pure));
+}
+
+namespace A
+{
+ extern int strcmp (const char *s, const char *t);
+}
+
+inline int
+A::strcmp (const char *s, const char *t)
+{
+ return ::strcmp (s, t);
+}
+
+int
+foo (const char *x) throw ()
+{
+ return A::strcmp ("", x);
+}
+
+int
+main ()
+{
+ return foo ("") != 0 || foo ("a") == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-2.C
new file mode 100644
index 000000000..4a746be3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-2.C
@@ -0,0 +1,32 @@
+// PR tree-optimization/17697
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C"
+{
+ extern int strcmp (const char *s, const char *t) throw ()
+ __attribute__ ((pure));
+}
+
+namespace A
+{
+ extern int strcmp (const char *s, const char *t) throw ();
+}
+
+inline int
+A::strcmp (const char *s, const char *t) throw ()
+{
+ return ::strcmp (s, t);
+}
+
+int
+foo (const char *x) throw ()
+{
+ return A::strcmp ("", x);
+}
+
+int
+main ()
+{
+ return foo ("") != 0 || foo ("a") == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-3.C
new file mode 100644
index 000000000..630441c25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17697-3.C
@@ -0,0 +1,28 @@
+// PR tree-optimization/17697
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" int strcmp (const char *s, const char *t);
+
+namespace A
+{
+ extern int strcmp (const char *s, const char *t);
+}
+
+inline int
+A::strcmp (const char *s, const char *t)
+{
+ return ::strcmp (s, t);
+}
+
+int
+foo (const char *x)
+{
+ return A::strcmp ("", x);
+}
+
+int
+main ()
+{
+ return foo ("") != 0 || foo ("a") == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-1.C
new file mode 100644
index 000000000..79de663b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-1.C
@@ -0,0 +1,23 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+namespace N { char *strcpy (char *, const char *); }
+extern "C" char *strcpy (char *, const char *) throw ();
+inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); }
+
+struct S { ~S (); };
+int foo ();
+
+int
+main ()
+{
+ S s;
+ int a;
+ char b[64];
+ N::strcpy (b, "ABCDEFGHIJKLM");
+ while ((a = foo ()) != -1)
+ if (a)
+ return -1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-2.C
new file mode 100644
index 000000000..c9c7f2a40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-2.C
@@ -0,0 +1,23 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+namespace N { char *strcpy (char *, const char *); }
+extern "C" char *strcpy (char *, const char *);
+inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); }
+
+struct S { ~S (); };
+int foo ();
+
+int
+main ()
+{
+ S s;
+ int a;
+ char b[64];
+ N::strcpy (b, "ABCDEFGHIJKLM");
+ while ((a = foo ()) != -1)
+ if (a)
+ return -1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-3.C
new file mode 100644
index 000000000..212ab4770
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-3.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" char *strcpy (char* d, const char* s) throw ();
+
+class A { public: A (); ~A (); };
+
+inline char * B (char *s, const char *t)
+{ return ::strcpy (s, t); }
+
+class C { int D (void); int E; };
+
+int C::D (void)
+{
+ A a;
+ try
+ {
+ char z[22];
+ if (this->E) B (z, "");
+ return 0;
+ }
+ catch (int &f) { return -1; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-4.C
new file mode 100644
index 000000000..7828a25e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-4.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" char *strcpy (char* d, const char* s);
+
+class A { public: A (); ~A (); };
+
+inline char * B (char *s, const char *t)
+{ return ::strcpy (s, t); }
+
+class C { int D (void); int E; };
+
+int C::D (void)
+{
+ A a;
+ try
+ {
+ char z[22];
+ if (this->E) B (z, "");
+ return 0;
+ }
+ catch (int &f) { return -1; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-5.C
new file mode 100644
index 000000000..5ce303856
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-5.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern char *strcpy (char* d, const char* s) throw ();
+
+class A { public: A (); ~A (); };
+
+inline char * B (char *s, const char *t)
+{ return ::strcpy (s, t); }
+
+class C { int D (void); int E; };
+
+int C::D (void)
+{
+ A a;
+ try
+ {
+ char z[22];
+ if (this->E) B (z, "");
+ return 0;
+ }
+ catch (int &f) { return -1; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-6.C
new file mode 100644
index 000000000..f95c4d0ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17724-6.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/17724
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern char *strcpy (char* d, const char* s);
+
+class A { public: A (); ~A (); };
+
+inline char * B (char *s, const char *t)
+{ return ::strcpy (s, t); }
+
+class C { int D (void); int E; };
+
+int C::D (void)
+{
+ A a;
+ try
+ {
+ char z[22];
+ if (this->E) B (z, "");
+ return 0;
+ }
+ catch (int &f) { return -1; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17902.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17902.C
new file mode 100644
index 000000000..fc5b6541f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr17902.C
@@ -0,0 +1,26 @@
+/* { dg-options "-O3" } */
+/* { dg-do compile } */
+
+void foo();
+struct A { ~A(){ foo(); } };
+struct B { A a; };
+void bar()
+{
+ A a;
+ bool b = false;
+ int i, j;
+
+
+ for (j=0; j<i; j++)
+ {
+ if (i) b=true;
+ if (j && i) foo();
+ if (j && i) i++;
+ }
+
+
+ for (j=0; j<i; j++)
+ if ( !j || (j==1 && b && i) )
+ B x;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18084-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18084-1.C
new file mode 100644
index 000000000..bf62a7b70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18084-1.C
@@ -0,0 +1,32 @@
+// { dg-do run }
+// { dg-options "-O3" }
+
+extern "C" void abort (void);
+
+struct X {
+ bool init;
+ void foo() { if (!init) init = true; }
+ void bar() { foo(); }
+
+};
+
+typedef unsigned long long int uint64_t;
+uint64_t mask1, mask2;
+
+uint64_t calc() {
+ return mask1 & mask2;
+}
+
+int main()
+{
+ mask1 = 0x00000000FFFFFFFFull;
+ mask2 = 0x000000000000FFFFull;
+ uint64_t value = calc();
+
+ X().bar();
+
+ if(value != calc())
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18683-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18683-1.C
new file mode 100644
index 000000000..847a4d3c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18683-1.C
@@ -0,0 +1,29 @@
+// PR middle-end/18683
+// { dg-do compile }
+// { dg-options "-O0" }
+
+template<typename _CharT>
+struct basic_ostream
+{
+ basic_ostream& operator<<(int __n);
+};
+
+extern basic_ostream<char> cout;
+
+template<int> struct linear_congruential
+{
+ template<class CharT>
+ friend basic_ostream<CharT>&
+ operator<<(basic_ostream<CharT>& os,
+ const linear_congruential& lcg)
+ {
+ return os << 1;
+ }
+};
+
+void instantiate_all()
+{
+ linear_congruential<0> lcf;
+ cout << lcf;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18968.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18968.C
new file mode 100644
index 000000000..cce73b579
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr18968.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-O1" }
+struct X
+{
+ int i;
+};
+struct Y : virtual X {};
+struct Z : Y {};
+struct A
+{
+ Z* p;
+ A();
+};
+A::A() : p(0)
+{
+ ((X*)(Y*)p)->i++;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19108.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19108.C
new file mode 100644
index 000000000..206a2bc38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19108.C
@@ -0,0 +1,19 @@
+// PR tree-optimization/19108
+// This used to abort due to not handing RANGE_EXPR in SRA.
+
+// { dg-do compile }
+// { dg-options "-O" }
+
+struct A
+{
+ int i[6];
+ A () : i() {}
+};
+
+struct B
+{
+ A a;
+ B(const A& x) : a(x) {}
+};
+
+B b=A();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-1.C
new file mode 100644
index 000000000..ffb646a90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-1.C
@@ -0,0 +1,39 @@
+// PR c++/19317
+// { dg-options "-O2" }
+// { dg-do run }
+// Origin: Dirk Mueller <mueller@kde.org>
+
+extern "C" void abort (void);
+
+struct A
+{
+ A () { d = e = 0; f = -1; }
+ A (int x) : d (0), e (0), f (x) { }
+ A b (const A &r) const;
+ int d;
+ int e;
+ int f;
+};
+
+A
+A::b (const A & r) const
+{
+ A t;
+ t.f = f < r.f ? f : r.f;
+ return t;
+}
+
+int
+main ()
+{
+ A a (100);
+ a = a.b (A (10));
+ if (a.f != 10)
+ abort ();
+
+ A c (10);
+ A d (100);
+ c = d.b (c);
+ if (c.f != 10)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-2.C
new file mode 100644
index 000000000..70c642b21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-2.C
@@ -0,0 +1,32 @@
+// PR c++/19317
+// { dg-options "-O2" }
+// { dg-do run }
+
+extern "C" void abort (void);
+
+struct A
+{
+ A () { d = e = 0; f = -1; }
+ A (int x) : d (0), e (0), f (x) { }
+ A b () const;
+ int d;
+ int e;
+ int f;
+};
+
+A
+A::b () const
+{
+ A t;
+ t.f = 10 + this->f;
+ return t;
+}
+
+int
+main ()
+{
+ A a (100);
+ a = a.b ();
+ if (a.f != 110)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-3.C
new file mode 100644
index 000000000..b2b2bb0e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19317-3.C
@@ -0,0 +1,37 @@
+// PR c++/19317
+// { dg-options "-O2" }
+// { dg-do run }
+
+extern "C" void abort (void);
+
+struct A { int c; int d; int e; int f; };
+
+A
+foo (const A *x, const A *r)
+{
+ A t;
+ t.c = -1;
+ t.c += x->c < r->c ? x->c : r->c;
+ t.d = 0;
+ t.e = 0;
+ t.f = 0;
+ return t;
+}
+
+int
+main ()
+{
+ A a;
+ a.c = 10;
+ a.d = 0;
+ a.e = 0;
+ a.f = 0;
+ A b;
+ b.c = 100;
+ b.d = 0;
+ b.e = 0;
+ b.f = 0;
+ a = foo (&b, &a);
+ if (a.c != 9)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19650.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19650.C
new file mode 100644
index 000000000..1f495cb7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19650.C
@@ -0,0 +1,71 @@
+// { dg-options "-O1 -w -fpermissive" }
+// { dg-do run }
+// Tests the fold bug described in PR 19650.
+#include <stdio.h>
+#include <stdlib.h>
+#define test(a) ((a) ? 1 : 0)
+
+typedef int (*arg_cmp_func)();
+
+class Item_func
+{
+public:
+ enum Functype { UNKNOWN_FUNC, EQ_FUNC, EQUAL_FUNC };
+ virtual enum Functype functype() const { return UNKNOWN_FUNC; }
+};
+
+class Item_bool_func2 : public Item_func
+{
+public:
+ virtual enum Functype functype() const { return EQUAL_FUNC; }
+};
+
+class Arg_comparator
+{
+public:
+ Item_bool_func2 *owner;
+ arg_cmp_func func;
+ static arg_cmp_func comparator_matrix[4][2];
+
+ int Arg_comparator::set_compare_func(Item_bool_func2 *item, int type)
+ {
+ owner = item;
+
+ /****************** problematic line is here ************************/
+
+ func = comparator_matrix[type][test(owner->functype() == Item_func::EQUAL_FUNC)];
+ return 0;
+ }
+};
+
+int compare_string() { return 0; }
+int compare_e_string() { return 0; }
+int compare_real() { return 0; }
+int compare_e_real() { return 0; }
+int compare_int_signed() { return 0; }
+int compare_e_int() { return 0; }
+int compare_row() { return 0; }
+int compare_e_row() { return 0; }
+
+arg_cmp_func Arg_comparator::comparator_matrix[4][2] =
+ {{&compare_string, &compare_e_string},
+ {&compare_real, &compare_e_real},
+ {&compare_int_signed, &compare_e_int},
+ {&compare_row, &compare_e_row}};
+
+void myfunc (const char*p, arg_cmp_func f1, arg_cmp_func f2) __attribute__((noinline));
+void myfunc (const char*p, arg_cmp_func f1, arg_cmp_func f2)
+{
+ if (f1!=f2)
+ abort ();
+}
+
+int main()
+{
+ Arg_comparator cmp;
+ Item_bool_func2 equal_func;
+
+ cmp.set_compare_func(&equal_func, 0);
+ myfunc("cmp.func is %p (expected %p)\n", cmp.func, &compare_e_string);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19768.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19768.C
new file mode 100644
index 000000000..376ca9938
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr19768.C
@@ -0,0 +1,29 @@
+// PR tree-opt/19768
+// tree DSE was removing one store to LL.currentLevel
+// but forgot that since the vop was in an abnormal PHI
+// that we have to update the SSA_NAME which we propagate
+// into the abnormal PHI
+
+// { dg-do compile }
+// { dg-options "-O" }
+
+struct LeveLogger
+{
+ int currentLevel;
+};
+extern LeveLogger LL;
+struct gg
+{
+ ~gg ( void )
+ { LL.currentLevel = 1; }
+};
+void f(void);
+void g ( void )
+{
+ gg sll;
+ {
+ gg sll;
+ f();
+ }
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20931.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20931.C
new file mode 100644
index 000000000..01518c06d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20931.C
@@ -0,0 +1,13 @@
+// PR middle-end
+// This testcase ICEd because fold checking saw a type change which
+// is allowed as TYPE_CONTAINS_PLACEHOLDER_INTERNAL could change.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int
+__finite (double __x) throw ()
+{
+ return (__extension__
+ (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1]
+ | 0x800fffffu) + 1) >> 31));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20991.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20991.C
new file mode 100644
index 000000000..32b3d05c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20991.C
@@ -0,0 +1,34 @@
+// PR middle-end/20991
+// { dg-options "-O2" }
+// { dg-do compile }
+
+struct S
+{
+ virtual inline int foo () const;
+ virtual inline bool bar () const;
+ virtual int baz (int) const;
+};
+
+inline int S::foo () const
+{
+ return 1;
+}
+
+inline bool S::bar () const
+{
+ return foo () == 0;
+}
+
+void A ()
+{
+ S s;
+ if (s.bar ())
+ s.foo ();
+}
+
+void B ()
+{
+ S s;
+ if (s.bar ())
+ s.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20995-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20995-1.C
new file mode 100644
index 000000000..aa9689639
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr20995-1.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+template<int N> void foo()
+{
+ double d = (N ? 0.0 : 0) + 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr22167.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr22167.C
new file mode 100644
index 000000000..07af74462
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr22167.C
@@ -0,0 +1,32 @@
+// Derived from PR22167, which failed on some RISC targets. The call to
+// foo() has two successors, one normal and one exceptional, and both
+// successors use &a[0] and x. Expressions involving &a[0] can be hoisted
+// before the call but those involving x cannot.
+// { dg-options "-Os" }
+// { dg-do run }
+
+int a[4];
+
+struct S {
+ S() : x (0) {}
+ ~S() { a[0] = x; }
+ int x;
+};
+
+void
+foo (int *x)
+{
+ if (*x == 1)
+ throw 1;
+ *x = 1;
+}
+
+int
+main()
+{
+ S s;
+ foo (&s.x);
+ if (a[0] == s.x)
+ a[0]++;
+ return a[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23056.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23056.C
new file mode 100644
index 000000000..b9689ec50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23056.C
@@ -0,0 +1,9 @@
+// PR c++/23056
+// { dg-do compile }
+
+template <bool T> struct S { virtual ~S(); };
+void foo ()
+{
+ static_cast<bool>("Foo");
+}
+S<true> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23299.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23299.C
new file mode 100644
index 000000000..94a414aa5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23299.C
@@ -0,0 +1,63 @@
+// PR rtl-optimization/23299
+// { dg-do run }
+// { dg-options "-Os" }
+
+extern "C" void abort ();
+
+struct A
+{
+ virtual int a () {}
+};
+struct B : public A
+{
+ virtual int b () {}
+};
+struct C : public A
+{
+ virtual int c () {}
+};
+struct D
+{
+ D () { d = 64; }
+ ~D ();
+ int d;
+};
+
+int x;
+D::~D ()
+{
+ x |= 1;
+ if (d != 64)
+ abort ();
+}
+
+struct E : public B, public C
+{
+ E () {}
+ virtual int c ();
+ ~E ();
+ D dv;
+};
+
+E::~E ()
+{
+ int r = c ();
+}
+
+int
+E::c ()
+{
+ if (x > 10)
+ throw 1;
+ x |= 2;
+}
+
+int
+main (void)
+{
+ {
+ E e;
+ }
+ if (x != 3)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23372.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23372.C
new file mode 100644
index 000000000..9be4c9c56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23372.C
@@ -0,0 +1,15 @@
+// PR c++/23372
+// { dg-options -fdump-tree-gimple }
+
+// There shouldn't be an assignment to a temporary in the GIMPLE,
+// as that represents a redundant copy.
+// { dg-final { scan-tree-dump-not "=" gimple } }
+
+struct A {
+ int a[1000];
+ //A(A const &);
+};
+void f(A);
+void g(A *a) { f(*a); }
+
+// { dg-final { cleanup-tree-dump gimple } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454-2.C
new file mode 100644
index 000000000..bd5e9e99b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454-2.C
@@ -0,0 +1,106 @@
+/* PR rtl-optimization/23454 */
+/* Submitted by Matthias Klose <doko@debian.org> */
+
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef unsigned long long int ulonglong;
+typedef long long int longlong;
+typedef unsigned int uint32;
+typedef unsigned int uint;
+typedef unsigned long int ulong;
+
+class Item {
+public:
+ bool null_value;
+ virtual longlong val_int()=0;
+};
+
+typedef struct st_tree_element {
+ struct st_tree_element *left,*right;
+ uint32 count;
+} TREE_ELEMENT;
+
+typedef struct st_tree {
+ uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated;
+ void *custom_arg;
+ bool with_delete;
+ uint flag;
+} TREE;
+
+class field_info
+{
+public:
+ ulong treemem, tree_elements, empty, nulls, min_length, max_length;
+ uint room_in_tree;
+ bool found;
+ TREE tree;
+ Item *item;
+};
+
+class field_ulonglong: public field_info
+{
+ ulonglong min_arg, max_arg;
+ ulonglong sum, sum_sqr;
+ void add();
+};
+
+extern char *longlong10_to_str(longlong val,char *dst,int radix);
+extern void delete_tree(TREE*);
+extern TREE_ELEMENT *tree_insert(TREE *tree,void *custom_arg);
+
+static int compare_ulonglong(const ulonglong *s, const ulonglong *t)
+{
+ return ((*s < *t) ? -1 : *s > *t ? 1 : 0);
+}
+
+void field_ulonglong::add()
+{
+ char buff[(255*3 +1)];
+ longlong num = item->val_int();
+ uint length = (uint) (longlong10_to_str(num, buff, 10) - buff);
+ TREE_ELEMENT *element;
+
+ if (item->null_value)
+ {
+ nulls++;
+ return;
+ }
+ if (num == 0)
+ empty++;
+
+ if (room_in_tree)
+ {
+ if (!(element = tree_insert(&tree, tree.custom_arg)))
+ {
+ room_in_tree = 0;
+ delete_tree(&tree);
+ }
+ else if (element->count == 1)
+ {
+ room_in_tree = 0;
+ delete_tree(&tree);
+ }
+ }
+
+ if (!found)
+ {
+ found = 1;
+ min_arg = max_arg = sum = num;
+ sum_sqr = num * num;
+ min_length = max_length = length;
+ }
+ else if (num != 0)
+ {
+ sum += num;
+ sum_sqr += num * num;
+ if (length < min_length)
+ min_length = length;
+ if (length > max_length)
+ max_length = length;
+ if (compare_ulonglong((ulonglong*) &num, &min_arg) < 0)
+ min_arg = num;
+ if (compare_ulonglong((ulonglong*) &num, &max_arg) > 0)
+ max_arg = num;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454.C
new file mode 100644
index 000000000..ab82b1f9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23454.C
@@ -0,0 +1,41 @@
+/* PR rtl-optimization/23454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void foo ();
+int a, b;
+char c;
+long long d, e;
+
+static inline int
+bar (const long long s, const long long t)
+{
+ return ((s < t) ? -1 : s > t ? 1 : 0);
+}
+
+int fn ();
+int f;
+
+void
+baz (int x)
+{
+ long long g = fn ();
+ if (f)
+ {
+ b++;
+ return;
+ }
+ if (g == 0)
+ a++;
+ if (x)
+ foo ();
+ if (!c)
+ c = 1;
+ else if (g != 0)
+ {
+ if (bar (g, d) < 0)
+ d = g;
+ if (bar (g, e) > 0)
+ e = g;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23478.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23478.C
new file mode 100644
index 000000000..da1371d25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23478.C
@@ -0,0 +1,211 @@
+// PR rtl-optimization/23478
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+bool tthrow;
+struct C3 { int i; };
+class C14 {};
+struct C7
+{
+ virtual ~C7 ();
+};
+
+C7::~C7 ()
+{
+ asm volatile ("" : : : "memory");
+}
+class C2 : public C7 {};
+
+template <class X> class C13
+{
+ bool ma;
+ X *mb;
+public:
+ explicit C13 (X *p = 0) throw () : ma (p != 0), mb (p) {}
+ ~C13 ();
+};
+
+template <class X>
+C13<X>::~C13 ()
+{
+ asm volatile ("" : : "r" (ma), "r" (mb) : "memory");
+}
+
+struct C1
+{
+ C1 (const C3 &, const C3 &, const C3 &, const C3 *&);
+};
+
+C1::C1 (const C3 &, const C3 &, const C3 &, const C3 *&)
+{
+ if (!tthrow)
+ throw 24;
+}
+
+struct C8
+{
+ struct C15 {};
+ typedef C15 *C9;
+ virtual void f1 (C2 &, long *, void *, C3 &, void *, bool) = 0;
+ virtual C13<C14> f3 () const = 0;
+ virtual ~C8 () {}
+};
+
+bool
+xx14 ()
+{
+ bool b = false;
+ if (tthrow)
+ throw 6;
+ asm volatile ("" : : "r" (&b) : "memory");
+ return b;
+}
+
+bool
+xx2 ()
+{
+ bool b = false;
+ if (tthrow)
+ throw 6;
+ asm volatile ("" : : "r" (&b) : "memory");
+ return b;
+}
+
+C13<C7>
+xx9 ()
+{
+ return C13<C7>();
+}
+
+C2 &
+xx10 ()
+{
+ static C2 c2;
+ return c2;
+}
+
+C3 &
+xx12 ()
+{
+ static C3 c3 = { 1 };
+ return c3;
+}
+
+const C3 &
+xx5 ()
+{
+ static const C3 c3 = { 2 };
+ return c3;
+}
+
+const C3 *&
+xx4 ()
+{
+ static const C3 *p;
+ if (tthrow)
+ throw 6;
+ return p;
+}
+
+long ll13;
+
+long
+xx13 ()
+{
+ long ret;
+ asm volatile ("" : "=r" (ret) : "r" (ll13));
+ return ret;
+}
+
+void
+xx15 (C3 &x, C13<C1> &y)
+{
+ asm volatile ("" : : "r" (&x), "r" (&y) : "memory");
+}
+
+long
+xx16 (const void *x)
+{
+ long ret;
+ asm volatile ("" : "=r" (ret) : "0" (1), "r" (x) : "memory");
+ return ret;
+}
+
+void
+xx1 (C13<C14> x)
+{
+ asm volatile ("" : : "r" (&x) : "memory");
+ if (tthrow)
+ throw 6;
+}
+
+void
+xx3 (const C7 *x)
+{
+ if (x)
+ abort ();
+}
+
+void
+xx7 ()
+{
+ asm volatile ("" : : : "memory");
+}
+
+struct C5
+{
+ C13<C7> f2 (C3 &v1, const void *v2, C8 *v6);
+ C7 *m2[2];
+ long m1[2];
+};
+
+C13<C7>
+C5::f2 (C3 &v1, const void *v2, C8 *v6)
+{
+ C13<C7> v13 = xx9 ();
+ C2 &v9 = xx10 ();
+ for (long i = 1; i < 2; i++)
+ xx3 (m2[i]);
+ const C3 &ld = xx5 ();
+ xx7 ();
+ if (xx2 ())
+ throw "";
+ xx4 ();
+ C3 &si = xx12 ();
+ for (long i = 0; i < xx16 (v2); ++i)
+ {
+ C13<C1> sk (new C1 (xx5 (), ld, xx5 (), xx4 ()));
+ xx15 (si, sk);
+ }
+ long v4 = xx13 ();
+ for (long i = v4 - 1; i >= 0; --i)
+ m1[i] = i;
+ bool v8 = xx2 ();
+ for (long i = 0; i < 2 && !xx14 (); i++)
+ {
+ v6[i].f1 (v9, 0, __null, v1, __null, v8);
+ if (v8)
+ xx1 (v6[i].f3 ());
+ }
+ return v13;
+}
+
+int
+main (void)
+{
+ C5 c5 = { { __null, __null }, { 0, 0 } };
+ bool seen = false;
+ try
+ {
+ c5.f2 (xx12 (), __null, __null);
+ }
+ catch (int n)
+ {
+ if (n != 24)
+ abort ();
+ seen = true;
+ }
+ if (!seen)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23714.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23714.C
new file mode 100644
index 000000000..bf1b4ac5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr23714.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+void run (void) {
+ float stack[1];
+ float *sp = stack;
+ try
+ {
+ float value2 = ((float) *(--sp));
+ float value1 = ((float) *(--sp));
+ *(sp++) = (value1 - value2);
+ }
+ catch (int *ex)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24665.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24665.C
new file mode 100644
index 000000000..646642c49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24665.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef unsigned long T;
+typedef volatile T* const hwreg_t;
+struct RegisterLayout
+{
+ T intmask;
+};
+struct Controller_t
+{
+ Controller_t();
+ inline void
+ disableInterrupt()
+ {
+ *mpMaskRegister = 0;
+ };
+ static hwreg_t mpMaskRegister;
+};
+
+extern char SimulatedRegisters[];
+
+hwreg_t Controller_t::mpMaskRegister
+ = &(reinterpret_cast<volatile RegisterLayout*>(SimulatedRegisters))->intmask;
+
+Controller_t::Controller_t()
+{
+ disableInterrupt();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24780.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24780.C
new file mode 100644
index 000000000..7baad386b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr24780.C
@@ -0,0 +1,14 @@
+// PR c++/24780
+// { dg-do compile }
+
+template<typename S=int>
+struct Move {
+ Move();
+ static Move<S> const MOVES[2][2];
+};
+template<typename S>
+ Move<S> const Move<S>::MOVES[2][2]={};
+typedef Move<int> const MoveClass;
+void moves(int x, int y) {
+ &MoveClass::MOVES[x][y];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25005.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25005.C
new file mode 100644
index 000000000..f62f8a2bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25005.C
@@ -0,0 +1,34 @@
+// PR target/25005
+// { dg-options "-O2 -funroll-loops" }
+// { dg-do compile }
+
+inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; }
+
+struct M { ~M() { } };
+
+struct P
+{
+ P () { v[0] = 0; v[1] = 0; v[2] = 0; }
+ P (const P &x) { for (int i = 0; i < 3; ++i) v[i] = x.v[i]; }
+ double v[3];
+};
+
+struct V : public M
+{
+ V (const P *x, const P *y)
+ {
+ P *b = this->a = ::new P[2];
+ for (; x != y; ++x, ++b)
+ ::new (b) P(*x);
+ }
+ P *a;
+};
+
+void bar (const V &);
+
+void
+foo ()
+{
+ const P d[2] = { P(), P() };
+ bar (V (&d[0], &d[2]));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25857.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25857.C
new file mode 100644
index 000000000..4e6858fe1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr25857.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int foo();
+int i;
+
+struct A
+{
+ ~A() { if (this != (A*)(&i)) foo(); }
+};
+
+struct B
+{
+ A a1, a2, a3, a4;
+ ~B() { foo(); }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr26179.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr26179.C
new file mode 100644
index 000000000..32cd7a00e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr26179.C
@@ -0,0 +1,22 @@
+/* The problem here is that Load PRE on the tree level
+ forgot to handle RETURN_DECL which causes us to ICE. */
+
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct a
+{
+ int i;
+};
+void h(struct a&);
+void l(void);
+
+struct a g(void)
+{
+ struct a fl;
+ h(fl);
+ if (fl.i)
+ l();
+ fl.i+=2;
+ return fl;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr27826.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr27826.C
new file mode 100644
index 000000000..5e40f1746
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr27826.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct Geometry
+{
+ int type:16;
+};
+struct Geometry get() {};
+int f()
+{
+ struct Geometry test;
+ return get().type == test.type;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr28116.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr28116.C
new file mode 100644
index 000000000..a85917c8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr28116.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct QDateTime
+{
+ QDateTime addSecs( int secs ) const;
+ int t;
+};
+QDateTime gridToDate(long x)
+{
+ QDateTime date;
+ date = date.addSecs(1);
+ return date;
+}
+void whatsOnAt(long x, long y)
+{
+ gridToDate(x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30590.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30590.C
new file mode 100644
index 000000000..42ae046db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30590.C
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-options "-O" } */
+struct test
+{
+ int type;
+ char buffer[4242]; /* should trigger pass-by-reference */
+};
+
+int flag = 0;
+
+struct test
+reset (void)
+{
+ struct test retval;
+ retval.type = 1;
+ return retval;
+}
+
+struct test
+test (void)
+{
+ struct test result;
+ result.type = 0;
+
+ for (int i = 0; i < 2; ++i)
+ {
+ struct test candidate = reset ();
+ if (flag)
+ result = candidate;
+ }
+
+ return result;
+}
+
+int
+main (void)
+{
+ struct test result = test ();
+ return result.type;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30965.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30965.C
new file mode 100644
index 000000000..91bb55c05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr30965.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
+
+#include <tr1/functional>
+#include <algorithm>
+
+extern void assign( long* variable, long v )
+{
+ std::transform( variable, variable + 1, variable,
+ std::tr1::bind( std::plus< long >(), 0L, v ) );
+}
+extern void assign( long& variable, long v )
+{
+ std::transform( &variable, &variable + 1, &variable,
+ std::tr1::bind( std::plus< long >(), 0L, v ) );
+}
+
+/* { dg-final { scan-tree-dump-times ";; Function" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "variable_..D. = v_..D." 2 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr32383.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr32383.C
new file mode 100644
index 000000000..af4161888
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr32383.C
@@ -0,0 +1,20 @@
+// Testcase by Volker Reichelt <reichelt@gcc.gnu.org>
+
+// { dg-do compile }
+// { dg-options "-O -ffast-math" }
+
+struct A
+{
+ ~A();
+};
+
+double& foo();
+
+inline void bar (double d) { foo() /= d; }
+
+void baz()
+{
+ A a;
+ bar(2);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr34036.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr34036.C
new file mode 100644
index 000000000..ecf6cf745
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr34036.C
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -ffast-math -fsignaling-nans" } */
+/* { dg-warning "-fassociative-math disabled" "" { target *-*-* } 1 } */
+
+template <class T>
+class ggStaticArray {
+public:
+ ~ggStaticArray();
+};
+
+template <class T>
+class ggGrid {
+public:
+ ggGrid() : grid() { }
+ ggStaticArray<T> grid;
+};
+
+class mrGrid {
+public:
+ mrGrid(void);
+protected:
+ ggGrid<int*> grid;
+ double multiplier;
+};
+
+mrGrid::mrGrid(void)
+{
+ double xMeasure, yMeasure, zMeasure;
+ double cellDimension;
+
+ cellDimension = multiplier * (xMeasure * yMeasure * zMeasure);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36185.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36185.C
new file mode 100644
index 000000000..2ffa52f8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36185.C
@@ -0,0 +1,24 @@
+// PR rtl-optimization/36185
+// { dg-do run }
+// { dg-options "-O2 -fgcse-sm" }
+
+struct Base {
+ virtual ~Base() {}
+ virtual void f() = 0;
+};
+struct Derived : Base {
+ Derived();
+ virtual void f() {}
+};
+struct Foo {
+ Foo(Base&);
+};
+Derived::Derived() {
+ Foo foo(*this);
+}
+Foo::Foo(Base& base) {
+ base.f();
+}
+int main() {
+ Derived d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36187.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36187.C
new file mode 100644
index 000000000..91166940d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36187.C
@@ -0,0 +1,45 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern "C" void abort (void);
+enum SbxDataType { SbxINTEGER, SbxDECIMAL, SbxBYREF = 0x4000 };
+struct SbxValues {
+ union {
+ float nSingle;
+ float* pSingle;
+ };
+ SbxDataType eType;
+};
+static bool ImpPutDoubleFoo( SbxValues* p)
+{
+ bool bRet = false;
+ SbxValues aTmp;
+ int count = 0;
+start:
+ switch( p->eType ) {
+ case SbxINTEGER:
+ if (count++ > 0)
+ abort ();
+ aTmp.pSingle = &p->nSingle; goto direct;
+ case SbxBYREF | SbxDECIMAL:
+ bRet = false;
+ break;
+ direct:
+ aTmp.eType = SbxDataType( p->eType | SbxBYREF );
+ p = &aTmp; goto start;
+ case SbxBYREF | SbxINTEGER:
+ break;
+ default:
+ bRet =true;
+ }
+ return bRet;
+}
+
+int main( int argc, char** argv )
+{
+ SbxValues aTmp;
+ aTmp.eType = SbxINTEGER;
+ if ( ImpPutDoubleFoo( &aTmp ) )
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36449.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36449.C
new file mode 100644
index 000000000..f66598040
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr36449.C
@@ -0,0 +1,70 @@
+// PR middle-end/36449
+// { dg-do run }
+// { dg-options "-O3" }
+
+extern "C" void exit (int);
+extern "C" void abort ();
+
+struct R
+{
+ short a;
+ short b;
+};
+
+struct S
+{
+ R e;
+ long f;
+ long g;
+};
+
+struct T
+{
+ short c;
+ short d;
+};
+
+struct U
+{
+ long h[0x1ffffff + 1];
+ T i;
+};
+
+U *j;
+
+void __attribute__((noinline))
+bar ()
+{
+ exit (0);
+}
+
+void __attribute__((noinline))
+foo ()
+{
+ S s;
+
+ s.e.a = 36;
+ s.e.b = 38;
+ if (s.e.a == j->i.c && s.e.b == j->i.d)
+ bar ();
+}
+
+int
+main ()
+{
+ try
+ {
+ j = new U;
+ }
+ catch (...)
+ {
+ return 0;
+ }
+ j->i.c = 36;
+ j->i.d = 38;
+ j->h[0] = 1;
+ j->h[1] = 2;
+ j->h[2] = 3;
+ foo ();
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr39607.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr39607.C
new file mode 100644
index 000000000..c39260dc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr39607.C
@@ -0,0 +1,65 @@
+// PR rtl-optimization/39607
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void abcErrorMessage(int error);
+enum AbcSurfType {
+ SURF_U,
+ SURF_V
+};
+class AbcVec2d
+{
+public:
+ double x;
+ double y;
+};
+class AbcIval1d
+{
+protected:
+ double m_dMin;
+ double m_dMax;
+public:
+ AbcIval1d();
+ AbcIval1d(double dMin, double dMax);
+ double GetMax() const { return m_dMax; }
+ double GetMin() const { return m_dMin; }
+};
+inline AbcIval1d::AbcIval1d(double dMin, double dMax)
+{
+ if (dMin > dMax) {
+ abcErrorMessage(1);
+ }
+ else {
+ m_dMin = dMin;
+ m_dMax = dMax;
+ }
+}
+class AbcIval2d
+{
+protected:
+ AbcVec2d m_vMin;
+ AbcVec2d m_vMax;
+public:
+ AbcVec2d GetMax() const { return m_vMax; }
+ AbcVec2d GetMin() const { return m_vMin; }
+};
+class AbcCone
+{
+protected:
+ int m_uv;
+public:
+ AbcIval2d GetNaturalUVDomain() const;
+ AbcIval1d GetLinearParamIval(AbcSurfType * pSurfParam) const;
+};
+AbcIval1d AbcCone::GetLinearParamIval(AbcSurfType * pSurfParam) const
+{
+ AbcIval1d sIval;
+ AbcIval2d sUVDomain = GetNaturalUVDomain();
+ if (m_uv) {
+ sIval = AbcIval1d(sUVDomain.GetMin().x,sUVDomain.GetMax().x);
+ }
+ else {
+ sIval = AbcIval1d(sUVDomain.GetMin().y,sUVDomain.GetMax().y);
+ }
+ return sIval;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr40496.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr40496.C
new file mode 100644
index 000000000..961f067af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr40496.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O2 -fprefetch-loop-arrays -msse2" { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target sse2 { target i?86-*-* x86_64-*-* } }
+
+struct DOMStringHandle
+{
+ unsigned int fLength;
+ int fRefCount;
+};
+static void *freeListPtr;
+void foo(DOMStringHandle *dsg)
+{
+ int i;
+ for (i = 1; i < 1023; i++)
+ {
+ *(void **) &dsg[i] = freeListPtr;
+ freeListPtr = &dsg[i];
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42295.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42295.C
new file mode 100644
index 000000000..602420626
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42295.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O1 -fschedule-insns -fselective-scheduling" }
+
+extern int f (...);
+
+int
+testsum (void *a, int k, int n)
+{
+ int i, j;
+
+ f (n / 2);
+ for (i = 0; i < n; i += 8)
+ for (j = 0; j < n; j += 8)
+ while (k < n)
+ k += 8;
+
+ return k;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42508.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42508.C
new file mode 100644
index 000000000..68dd4c693
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr42508.C
@@ -0,0 +1,33 @@
+// PR tree-optimization/42508
+// { dg-do run }
+// { dg-options "-O1 -fipa-sra" }
+
+extern "C" void abort ();
+
+int v[10], vidx;
+
+struct A
+{
+ A *prev;
+ int i;
+ ~A()
+ {
+ v[vidx++] = i;
+ delete prev;
+ }
+};
+
+int
+main ()
+{
+ A *a1 = new A ();
+ A *a2 = new A ();
+ a1->prev = 0;
+ a1->i = 1;
+ a2->prev = a1;
+ a2->i = 2;
+ delete a2;
+ if (vidx != 2 || v[0] != 2 || v[1] != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr43655.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr43655.C
new file mode 100644
index 000000000..f7e370b9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr43655.C
@@ -0,0 +1,34 @@
+// PR tree-optimization/43655
+// { dg-do run }
+// { dg-options "-O0 -ftree-ter" }
+
+extern "C" void abort ();
+
+struct C
+{
+ C (int i) : val(i) { }
+ C (const C& c) : val(c.val) { }
+ ~C (void) { val = 999; }
+ C& operator = (const C& c) { val = c.val; return *this; }
+ C& inc (int i) { val += i; return *this; }
+ int val;
+};
+
+C
+f ()
+{
+ return C (3);
+}
+
+C
+f (int i)
+{
+ return f ().inc (i);
+}
+
+int
+main ()
+{
+ if (f (2).val != 5)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr44919.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr44919.C
new file mode 100644
index 000000000..e90851be3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr44919.C
@@ -0,0 +1,253 @@
+// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+// { dg-options "-O3 -fselective-scheduling2" }
+
+namespace std {
+
+typedef long unsigned int size_t;
+
+template<typename _Tp> class new_allocator { public: typedef size_t size_type; typedef _Tp* pointer; };
+template<typename _Tp> class allocator: public new_allocator<_Tp> { public: typedef size_t size_type; template<typename _Tp1> struct rebind { typedef allocator<_Tp1> other; }; };
+
+class back_insert_iterator { };
+template<typename _Container> back_insert_iterator back_inserter(_Container& __x) { };
+
+class vector { };
+
+struct _List_node_base { };
+struct _List_node : public _List_node_base { };
+template<typename _Tp> struct _List_iterator { typedef _List_iterator<_Tp> _Self; typedef _Tp& reference; explicit _List_iterator(_List_node_base* __x) : _M_node(__x) { } reference operator*() const { } _Self& operator++() { } bool operator!=(const _Self& __x) const { return _M_node != __x._M_node; } _List_node_base* _M_node; };
+template<typename _Tp, typename _Alloc> class _List_base { protected: typedef typename _Alloc::template rebind<_List_node >::other _Node_alloc_type; struct _List_impl : public _Node_alloc_type { _List_node_base _M_node; }; _List_impl _M_impl; };
+template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class list : protected _List_base<_Tp, _Alloc> { public: typedef _Tp value_type; typedef _List_iterator<_Tp> iterator; iterator begin() { } iterator end() { return iterator(&this->_M_impl._M_node); } };
+
+namespace tr1 { template<typename _Tp, size_t _Nm> struct array { typedef _Tp value_type; typedef const value_type& const_reference; typedef const value_type* const_iterator; typedef size_t size_type; value_type _M_instance[_Nm ? _Nm : 1]; const_iterator begin() const { return const_iterator(&_M_instance[0]); } const_reference operator[](size_type __n) const { return _M_instance[__n]; } }; }
+}
+
+namespace X {
+
+class Object { };
+struct Has_qrt { };
+template <typename F> struct qrt_or_not { typedef const typename F::result_type & type; };
+template <typename Functor, typename P1 = void> struct Qualified_result_of : qrt_or_not<Functor> { };
+
+using std::tr1::array;
+
+template <class R_> class Point_2 : public R_::Kernel_base::Point_2 {
+public:
+ typedef typename R_::Kernel_base::Point_2 RPoint_2;
+ typedef RPoint_2 Rep;
+ const Rep& rep() const { }
+};
+
+template <class R_> class Vector_2 : public R_::Kernel_base::Vector_2 {
+public:
+ typedef typename R_::Kernel_base::Vector_2 RVector_2;
+ typedef RVector_2 Rep;
+ const Rep& rep() const { return *this; }
+ typedef R_ R;
+ typename Qualified_result_of<typename R::Compute_x_2,Vector_2>::type x() const { return R().compute_x_2_object()(*this); }
+ typename Qualified_result_of<typename R::Compute_y_2,Vector_2>::type y() const { return R().compute_y_2_object()(*this); }
+ typename Qualified_result_of<typename R::Compute_y_2,Vector_2>::type cartesian(int i) const { return (i==0) ? x() : y(); }
+ typename Qualified_result_of<typename R::Compute_hx_2,Vector_2>::type hx() const { return R().compute_hx_2_object()(*this); }
+ typename Qualified_result_of<typename R::Compute_hy_2,Vector_2>::type hy() const { return R().compute_hy_2_object()(*this); }
+ typename Qualified_result_of<typename R::Compute_hw_2,Vector_2>::type hw() const { return R().compute_hw_2_object()(*this); }
+ typename Qualified_result_of<typename R::Compute_hx_2,Vector_2>::type homogeneous(int i) const { return (i==0) ? hx() : (i==1)? hy() : hw(); }
+};
+
+template <class R_> class Segment_2 : public R_::Kernel_base::Segment_2 { };
+template <class R_> class Iso_rectangle_2 : public R_::Kernel_base::Iso_rectangle_2 { };
+
+template <typename T, int i > const T& constant() { static const T t(i); return t; }
+template <class T, class Alloc = std::allocator<T > > class Handle_for { struct RefCounted { T t; }; typedef typename Alloc::template rebind<RefCounted>::other Allocator; typedef typename Allocator::pointer pointer; pointer ptr_; public: typedef T element_type; const T * Ptr() const { return &(ptr_->t); } };
+template <class T, class Allocator> const T& get(const Handle_for<T, Allocator> &h) { return *(h.Ptr()); }
+
+template <class R_> class PointC2 {
+public:
+ typedef typename R_::Vector_2 Vector_2; Vector_2 base;
+ typedef typename Vector_2::Cartesian_const_iterator Cartesian_const_iterator; Cartesian_const_iterator cartesian_begin() const { return base.cartesian_begin(); }
+};
+
+template <class R_> class VectorC2 {
+public:
+ typedef typename R_::FT FT;
+ typedef array<FT, 2> Rep;
+ typedef typename R_::template Handle<Rep>::type Base;
+ Base base;
+ typedef typename Rep::const_iterator Cartesian_const_iterator;
+ const FT & x() const { return X::get(base)[0]; }
+ const FT & y() const { return X::get(base)[1]; }
+ const FT & hx() const { return x(); }
+ const FT & hy() const { return y(); }
+ const FT & hw() const { return constant<FT, 1>(); }
+ Cartesian_const_iterator cartesian_begin() const { return X::get(base).begin(); }
+};
+
+template <class R_> class SegmentC2 { };
+template <class R_> class Iso_rectangleC2 { };
+
+namespace internal {
+ template <class K> class Segment_2_Iso_rectangle_2_pair {
+ public:
+ enum Intersection_results { NO_INTERSECTION };
+ Segment_2_Iso_rectangle_2_pair(typename K::Segment_2 const *seg, typename K::Iso_rectangle_2 const *rect) ;
+ Intersection_results intersection_type() const;
+ mutable Intersection_results _result;
+ typename K::Point_2 _ref_point;
+ typename K::Vector_2 _dir;
+ typename K::Point_2 _isomin;
+ typename K::Point_2 _isomax;
+ mutable typename K::FT _min, _max;
+ };
+ template <class K> Object intersection( const typename K::Segment_2 &seg, const typename K::Iso_rectangle_2 &iso, const K&) {
+ typedef Segment_2_Iso_rectangle_2_pair<K> is_t; is_t ispair(&seg, &iso); switch (ispair.intersection_type()) { }
+ }
+ template <class K> typename Segment_2_Iso_rectangle_2_pair<K>::Intersection_results Segment_2_Iso_rectangle_2_pair<K>::intersection_type() const {
+ typedef typename K::RT RT;
+ typedef typename K::FT FT;
+ typename K::Construct_cartesian_const_iterator_2 construct_cccit;
+ typename K::Cartesian_const_iterator_2 ref_point_it = construct_cccit(_ref_point);
+ typename K::Cartesian_const_iterator_2 end = construct_cccit(_ref_point, 0);
+ typename K::Cartesian_const_iterator_2 isomin_it = construct_cccit(_isomin);
+ typename K::Cartesian_const_iterator_2 isomax_it = construct_cccit(_isomax);
+ for (unsigned int i=0; ref_point_it != end; ++i, ++ref_point_it, ++isomin_it, ++isomax_it) {
+ if (_dir.homogeneous(i) == RT(0)) {
+ if ( *(ref_point_it) <*(isomin_it) ) {
+ _result = NO_INTERSECTION;
+ }
+ if ( *(ref_point_it) > *(isomax_it)) {
+ _result = NO_INTERSECTION;
+ }
+ } else {
+ FT newmin, newmax;
+ if (_dir.homogeneous(i) > RT(0)) {
+ newmin = ( *(isomin_it) - (*ref_point_it)) / _dir.cartesian(i);
+ newmax = ( *(isomax_it) - (*ref_point_it)) / _dir.cartesian(i);
+ } else {
+ newmin = ( (*isomax_it) - (*ref_point_it)) / _dir.cartesian(i);
+ newmax = ( (*isomin_it) - (*ref_point_it)) / _dir.cartesian(i);
+ }
+ if (newmin > _min) _min = newmin;
+ if (newmax <_max) _max = newmax;
+ if (_max <_min) { return _result; }
+ }
+ }
+ }
+}
+
+template <class K> Object intersection(const Segment_2<K> &seg, const Iso_rectangle_2<K> &iso) { typedef typename K::Intersect_2 Intersect; return Intersect()(seg, iso); }
+
+namespace CommonKernelFunctors {
+ template <typename K> class Construct_cartesian_const_iterator_2 {
+ typedef typename K::Point_2 Point_2;
+ typedef typename K::Cartesian_const_iterator_2 Cartesian_const_iterator_2;
+public:
+ typedef Cartesian_const_iterator_2 result_type;
+ Cartesian_const_iterator_2 operator()( const Point_2& p) const { return p.rep().cartesian_begin(); }
+ Cartesian_const_iterator_2 operator()( const Point_2& p, int) const { }
+ };
+ template <typename K> class Intersect_2 {
+ typedef typename K::Object_2 Object_2;
+ public:
+ typedef Object_2 result_type;
+ template <class T1, class T2> Object_2 operator()(const T1& t1, const T2& t2) const { return internal::intersection(t1, t2, K()); }
+ };
+}
+
+namespace CartesianKernelFunctors {
+ using namespace CommonKernelFunctors;
+ template <typename K> class Compute_x_2 : Has_qrt {
+ typedef typename K::FT FT;
+ typedef typename K::Vector_2 Vector_2;
+ public:
+ typedef FT result_type;
+ const result_type & operator()(const Vector_2& v) const { return v.rep().x(); }
+ };
+ template <typename K> class Compute_y_2 : Has_qrt {
+ typedef typename K::FT FT;
+ typedef typename K::Vector_2 Vector_2;
+ public:
+ typedef FT result_type;
+ const result_type & operator()(const Vector_2& v) const { return v.rep().y(); }
+ };
+ template <typename K> class Compute_hx_2 : public Has_qrt {
+ typedef typename K::FT FT;
+ typedef typename K::Vector_2 Vector_2;
+ public:
+ typedef FT result_type;
+ const result_type & operator()(const Vector_2& v) const { return v.rep().hx(); }
+ };
+ template <typename K> class Compute_hy_2 : public Has_qrt {
+ typedef typename K::FT FT;
+ typedef typename K::Vector_2 Vector_2;
+ public:
+ typedef FT result_type;
+ const result_type & operator()(const Vector_2& v) const { return v.rep().hy(); }
+ };
+ template <typename K> class Compute_hw_2 : public Has_qrt {
+ typedef typename K::FT FT;
+ typedef typename K::Vector_2 Vector_2;
+ public:
+ typedef FT result_type;
+ const result_type & operator()(const Vector_2& v) const { return v.rep().hw(); }
+ };
+}
+
+template <typename K_, typename FT_> struct Cartesian_base {
+ typedef K_ Kernel;
+ typedef X::Object Object_2;
+ typedef PointC2<Kernel> Point_2;
+ typedef VectorC2<Kernel> Vector_2;
+ typedef SegmentC2<Kernel> Segment_2;
+ typedef Iso_rectangleC2<Kernel> Iso_rectangle_2;
+ typedef typename array<FT_, 2>::const_iterator Cartesian_const_iterator_2;
+};
+
+template <typename K_base, typename Kernel_ > struct Type_equality_wrapper : public K_base {
+ typedef K_base Kernel_base;
+ typedef X::Point_2<Kernel_> Point_2;
+ typedef X::Vector_2<Kernel_> Vector_2;
+ typedef X::Segment_2<Kernel_> Segment_2;
+ typedef X::Iso_rectangle_2<Kernel_> Iso_rectangle_2;
+};
+
+template <typename FT_, typename Kernel_ > struct Cartesian_base_ref_count : public Cartesian_base<Kernel_, FT_ > {
+ typedef FT_ RT;
+ typedef FT_ FT;
+ template <typename T > struct Handle { typedef Handle_for<T> type; };
+ typedef Kernel_ K;
+ typedef CartesianKernelFunctors::Compute_x_2<K> Compute_x_2;
+ Compute_x_2 compute_x_2_object() const { }
+ typedef CartesianKernelFunctors::Compute_y_2<K> Compute_y_2;
+ Compute_y_2 compute_y_2_object() const { }
+ typedef CartesianKernelFunctors::Compute_hx_2<K> Compute_hx_2;
+ Compute_hx_2 compute_hx_2_object() const { }
+ typedef CartesianKernelFunctors::Compute_hy_2<K> Compute_hy_2;
+ Compute_hy_2 compute_hy_2_object() const { }
+ typedef CartesianKernelFunctors::Compute_hw_2<K> Compute_hw_2;
+ Compute_hw_2 compute_hw_2_object() const { }
+ typedef CartesianKernelFunctors::Construct_cartesian_const_iterator_2<K> Construct_cartesian_const_iterator_2;
+ typedef CartesianKernelFunctors::Intersect_2<K> Intersect_2;
+};
+
+template <typename FT_ > struct Cartesian : public Type_equality_wrapper<Cartesian_base_ref_count<FT_, Cartesian<FT_> >, Cartesian<FT_> > { };
+
+template <class Kernel> class Ipelet_base {
+public:
+ typedef typename X::Point_2<Kernel> Point_2;
+ typedef typename Kernel::Segment_2 Segment_2;
+ typedef typename Kernel::Iso_rectangle_2 Iso_rectangle_2;
+
+ Iso_rectangle_2 read_active_objects () const { }
+ struct Voronoi_from_tri{ std::list<Segment_2> seg_list; };
+
+ template <class T,class output_iterator> bool cast_into_seg(const T& obj,const Iso_rectangle_2& bbox,output_iterator out_it) const{ X::intersection(obj,bbox); }
+ template<class iterator,class output_iterator> void cast_into_seg(const iterator first,const iterator end, const Iso_rectangle_2& bbox, output_iterator out_it) const { for (iterator it=first; it!=end; ++it) cast_into_seg(*it,bbox,out_it); }
+ void draw_dual_(Voronoi_from_tri& v_recup,const Iso_rectangle_2& bbox) const { std::vector seg_cont; cast_into_seg(v_recup.seg_list.begin(),v_recup.seg_list.end(),bbox,std::back_inserter(seg_cont)); }
+ void draw_dual_in_ipe(const Iso_rectangle_2& bbox) const { Voronoi_from_tri v_recup; draw_dual_(v_recup,bbox); }
+};
+
+typedef X::Cartesian<double> Kernel;
+
+class diagrammeIpelet : public X::Ipelet_base<Kernel> { void protected_run(); };
+void diagrammeIpelet::protected_run() { Iso_rectangle_2 bbox = read_active_objects( ); draw_dual_in_ipe(bbox); }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45316.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45316.C
new file mode 100644
index 000000000..74ad30ead
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45316.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-options "-O1 -ftree-pre -fnon-call-exceptions" }
+
+struct A
+{
+ int i;
+};
+
+struct B : A
+{
+ int i[6];
+ B (int = 0) : A ()
+ {
+ m ();
+ }
+ int m ();
+};
+
+struct C : B
+{
+};
+
+void
+foo ()
+{
+ new C ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45412.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45412.C
new file mode 100644
index 000000000..e374f52b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr45412.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-O2 -fipa-cp-clone -ftracer" }
+
+int foo (int *);
+void bar ();
+
+struct S
+{
+ virtual int vm ();
+ ~S ();
+};
+
+int
+S::vm ()
+{
+ int state;
+ switch (foo (&state))
+ {
+ case 0:
+ bar ();
+ case 1:
+ delete this;
+ }
+ return state;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46640.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46640.C
new file mode 100644
index 000000000..0892c9ac8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46640.C
@@ -0,0 +1,44 @@
+// { dg-do compile { target x86_64-*-* } }
+// { dg-options "-fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2 -fno-exceptions -O" }
+
+struct QBasicAtomicInt
+{
+ int i, j;
+ bool deref ()
+ {
+ asm volatile ("":"=m" (i), "=qm" (j));
+ }
+};
+
+struct Data
+{
+ QBasicAtomicInt ref;
+ void *data;
+};
+
+struct QByteArray
+{
+ Data * d;
+ ~QByteArray ()
+ {
+ d->ref.deref ();
+ }
+};
+
+int indexOf (unsigned);
+int stat (void *, int *);
+QByteArray encodeName ();
+
+bool makeDir (unsigned len)
+{
+ unsigned i = 0;
+ while (len)
+ {
+ int st;
+ int pos = indexOf (i);
+ QByteArray baseEncoded = encodeName ();
+ if (stat (baseEncoded.d->data, &st) && stat (baseEncoded.d, &st))
+ return false;
+ i = pos;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46649.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46649.C
new file mode 100644
index 000000000..1428e8bdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46649.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+// { dg-options "-fschedule-insns -fselective-scheduling" }
+
+void foo ()
+{
+ for (;;)
+ for (;;({break;}))
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46864.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46864.C
new file mode 100644
index 000000000..0f7b7d2f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr46864.C
@@ -0,0 +1,26 @@
+// PR tree-optimization/46864
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions" }
+
+int baz ();
+
+struct S
+{
+ int k;
+ bool bar () throw ()
+ {
+ int m = baz ();
+ for (int i = 0; i < m; i++)
+ k = i;
+ return m;
+ }
+};
+
+extern S *s;
+
+void
+foo ()
+{
+ while (baz () && s->bar ())
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47036.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47036.C
new file mode 100644
index 000000000..d6d5adc6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47036.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+// { dg-options "-fschedule-insns -fselective-scheduling -fno-dce" }
+
+
+void foo ()
+{
+ for (;;)
+ for (;;({break;}));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47280.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47280.C
new file mode 100644
index 000000000..01ca48439
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47280.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions -ftrapv" }
+
+void bar (int n, char *p)
+{
+ try
+ {
+ n++;
+ for (int i = 0; i < n - 1; i++)
+ p[i];
+ }
+ catch (...)
+ {}
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47355.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47355.C
new file mode 100644
index 000000000..4fdbd9f59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47355.C
@@ -0,0 +1,39 @@
+// PR tree-optimization/47355
+// { dg-do compile }
+// { dg-options "-O -fipa-cp -fipa-cp-clone" }
+
+struct T
+{
+ T ();
+ void *p;
+ ~T ();
+};
+
+void foo (T *i);
+
+T *bar ();
+void baz (T *);
+
+struct V
+{
+ long q;
+ T *r;
+ ~V ()
+ {
+ while (q)
+ {
+ foo (r);
+ ++r;
+ --q;
+ }
+ baz (r);
+ }
+};
+
+void
+foo ()
+{
+ V v;
+ T t;
+ v.r = bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47366.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47366.C
new file mode 100644
index 000000000..e133edfbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47366.C
@@ -0,0 +1,22 @@
+// PR rtl-optimization/47366
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions -fno-tree-ccp -fno-tree-forwprop" }
+
+struct A
+{
+ int i;
+ virtual ~A ();
+};
+
+struct B : virtual A
+{};
+
+struct C : B
+{
+ void bar () {}
+};
+
+void foo ()
+{
+ C ().bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47615.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47615.C
new file mode 100644
index 000000000..f8dbcf7e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47615.C
@@ -0,0 +1,711 @@
+// { dg-do compile }
+// { dg-options "-O -fstrict-aliasing -ftree-pre -fno-tree-fre -fno-tree-sra" }
+
+typedef __SIZE_TYPE__ size_t;
+namespace std
+{
+ template < class _T1, class > struct pair
+ {
+ _T1 first;
+ };
+}
+namespace __gnu_cxx
+{
+ template < typename _Tp > class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef _Tp * pointer;
+ typedef _Tp const_pointer;
+ typedef _Tp & reference;
+ typedef const _Tp & const_reference;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef new_allocator < _Tp1 > other;
+ };
+ };
+}
+namespace std
+{
+template < typename _Tp > class allocator:
+ public __gnu_cxx::new_allocator < _Tp >
+ {};
+ template < typename, typename, typename > struct binary_function;
+ template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool >
+ {};
+}
+namespace __gnu_cxx
+{
+ namespace typelist
+ {
+ struct null_type;
+ template < typename Root > struct node
+ {
+ typedef Root root;
+ };
+ template < typename, typename > struct chain;
+ namespace detail
+ {
+ template < typename, int >struct chain_at_index_;
+ template
+ <
+ typename
+ Hd, typename Tl > struct chain_at_index_ <chain < Hd, Tl >, 0 >
+ {
+ typedef Hd type;
+ };
+ template
+ <
+ typename
+ Hd, typename Tl, int i > struct chain_at_index_ <chain < Hd, Tl >, i >
+ {
+ typedef typename chain_at_index_ < Tl, i - 1 >::type type;
+ };
+ }
+ template < typename Typelist, int i > struct at_index
+ {
+ typedef typename Typelist::root root_type;
+ typedef detail::chain_at_index_ < root_type, i > index_type;
+ typedef typename index_type::type type;
+ };
+ template < typename T1, typename T2 > struct create2
+ {
+ typedef node < chain < T1, chain < T2, null_type > > >type;
+ };
+ }
+}
+namespace std
+{
+ namespace tr1
+ {
+ template < typename _Tp, _Tp __v > struct integral_constant
+ {
+ static const _Tp value = __v;
+ };
+ typedef integral_constant < bool, false > false_type;
+ template < typename, typename > struct is_same:false_type
+ {};
+ }
+}
+using std::tr1::is_same;
+namespace __gnu_pbds
+{
+ struct null_mapped_type;
+ struct rb_tree_tag;
+ namespace detail
+ {
+ template < typename, typename, typename > struct basic_tree_policy_base;
+ template
+ <
+ typename
+ Const_Node_Iterator,
+ typename
+ Allocator
+ >
+ struct
+ basic_tree_policy_base
+ <Const_Node_Iterator, Const_Node_Iterator, Allocator >
+ {};
+ }
+ template
+ < typename, typename, typename, typename > struct null_tree_node_update;
+template < typename Const_Node_Iterator, typename Node_Iterator, typename, typename Allocator > class tree_order_statistics_node_update:
+ detail::basic_tree_policy_base
+ < Const_Node_Iterator, Node_Iterator, Allocator >
+ {
+ public:
+ typedef Allocator allocator_type;
+ typedef typename allocator_type::size_type size_type;
+ typedef size_type metadata_type;
+ typedef Const_Node_Iterator const_node_iterator;
+ typedef Node_Iterator node_iterator;
+ typedef
+ typename
+ allocator_type::template
+ rebind < metadata_type >::other::reference metadata_reference;
+ void operator () (node_iterator, const_node_iterator) const;
+ };
+ template
+ <
+ typename
+ Const_Node_Iterator,
+ class
+ Node_Iterator,
+ class
+ Cmp_Fn,
+ class
+ Allocator
+ >
+ inline
+ void
+ tree_order_statistics_node_update
+ <
+ Const_Node_Iterator,
+ Node_Iterator,
+ Cmp_Fn,
+ Allocator
+ >::operator
+ () (node_iterator node_it, const_node_iterator end_nd_it) const
+ {
+ node_iterator l_child_it;
+ size_type
+ l_rank = (l_child_it == end_nd_it) ? : l_child_it.get_metadata ();
+ node_iterator r_child_it = node_it.get_r_child ();
+ size_type
+ r_rank = (r_child_it == end_nd_it) ? : r_child_it.get_metadata ();
+ const_cast
+ < metadata_reference > (node_it.get_metadata ()) = l_rank + r_rank;
+ }
+ namespace
+ {
+ template < typename, typename, typename, bool > struct value_type_base;
+ template
+ <
+ typename
+ Key,
+ typename
+ Allocator
+ > struct value_type_base <Key, null_mapped_type, Allocator, false >
+ {
+ typedef Key value_type;
+ typedef
+ typename
+ Allocator::template rebind < value_type >::other value_type_allocator;
+ typedef typename value_type_allocator::pointer pointer;
+ typedef typename value_type_allocator::const_pointer const_pointer;
+ typedef typename value_type_allocator::reference reference;
+ typedef typename value_type_allocator::const_reference const_reference;
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped, typename Alloc, bool Store_Extra > struct vt_base_selector
+ {
+ typedef value_type_base < Key, Mapped, Alloc, Store_Extra > type;
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ typename
+ Alloc,
+ bool
+ Store_Extra
+ >
+ struct
+ types_traits:vt_base_selector < Key, Mapped, Alloc, Store_Extra >::type
+ {};
+ template < typename, class, class > struct dumconst_node_iterator;
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ class,
+ class
+ Node_And_It_Traits, class Allocator > class bin_search_tree_no_data_
+ {
+ protected:
+ typedef
+ typename
+ Allocator::template
+ rebind
+ < typename Node_And_It_Traits::node >::other::pointer node_pointer;
+ typedef
+ typename
+ types_traits
+ < Key, Mapped, Allocator, false >::const_reference const_reference;
+ typedef typename Node_And_It_Traits::point_iterator point_iterator;
+ typedef typename Node_And_It_Traits::node_update node_update;
+ void rotate_right (node_pointer);
+ template
+ <
+ typename
+ Node_Update_ > void apply_update (node_pointer, Node_Update_ *);
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ class
+ Cmp_Fn,
+ class
+ Node_And_It_Traits,
+ class
+ Allocator
+ >
+ void
+ bin_search_tree_no_data_
+ <
+ Key,
+ Mapped,
+ Cmp_Fn, Node_And_It_Traits, Allocator >::rotate_right (node_pointer p_x)
+ {
+ node_pointer p_y = p_x->m_p_parent;
+ p_y->m_p_right = p_x;
+ apply_update (p_x, this);
+ apply_update (p_x->m_p_parent, (node_update *) this);
+ }
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ class
+ Cmp_Fn,
+ class
+ Node_And_It_Traits,
+ class
+ Allocator
+ >
+ template
+ <
+ typename
+ Node_Update_
+ >
+ void
+ bin_search_tree_no_data_
+ <
+ Key,
+ Mapped,
+ Cmp_Fn,
+ Node_And_It_Traits,
+ Allocator >::apply_update (node_pointer p_nd, Node_Update_ *)
+ {
+ node_update ()((p_nd), ((0)));
+ }
+ }
+ namespace detail
+ {
+ template < typename Key, typename Mapped, typename Cmp_Fn, typename Node_And_It_Traits, typename Allocator > class rb_tree_no_data_:
+ bin_search_tree_no_data_
+ < Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator >
+ {
+ typedef
+ bin_search_tree_no_data_
+ < Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator > base_type;
+ typedef typename base_type::node_pointer node_pointer;
+ public:
+ typedef typename base_type::const_reference const_reference;
+ typedef typename base_type::point_iterator point_iterator;
+ std::pair < point_iterator, bool > insert (const_reference);
+ void insert_fixup (node_pointer);
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ typename
+ Cmp_Fn,
+ typename
+ Node_And_It_Traits,
+ typename
+ Allocator
+ >
+ std::pair
+ <
+ typename
+ rb_tree_no_data_
+ <
+ Key,
+ Mapped,
+ Cmp_Fn,
+ Node_And_It_Traits,
+ Allocator
+ >::point_iterator,
+ bool
+ >
+ rb_tree_no_data_
+ <
+ Key,
+ Mapped,
+ Cmp_Fn, Node_And_It_Traits, Allocator >::insert (const_reference)
+ {
+ std::pair < point_iterator, bool > ins_pair;
+{
+ insert_fixup (ins_pair.first.m_p_nd);
+ }
+ }
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ typename
+ Cmp_Fn,
+ typename
+ Node_And_It_Traits,
+ typename
+ Allocator
+ >
+ void
+ rb_tree_no_data_
+ <
+ Key,
+ Mapped,
+ Cmp_Fn,
+ Node_And_It_Traits, Allocator >::insert_fixup (node_pointer p_nd)
+ {
+{
+{
+{
+ this->rotate_right (p_nd);
+ }
+ }
+ }
+ }
+ template
+ <
+ typename,
+ typename, typename, typename, typename > struct container_base_dispatch;
+ template
+ <
+ typename
+ Key,
+ typename
+ Policy_Tl,
+ typename
+ Alloc
+ >
+ struct
+ container_base_dispatch
+ <Key, null_mapped_type, rb_tree_tag, Policy_Tl, Alloc >
+ {
+ typedef __gnu_cxx::typelist::at_index < Policy_Tl, 0 > at0;
+ typedef typename at0::type at0t;
+ typedef __gnu_cxx::typelist::at_index < Policy_Tl, 1 > at1;
+ typedef typename at1::type at1t;
+ typedef
+ rb_tree_no_data_ < Key, null_mapped_type, at0t, at1t, Alloc > type;
+ };
+ template
+ <
+ typename
+ Node_Pointer,
+ typename,
+ typename,
+ typename,
+ typename, typename, bool, class > class bin_search_tree_const_it_
+ {
+ public:
+ Node_Pointer m_p_nd;
+ };
+ template
+ <
+ typename
+ Node,
+ class
+ Const_Iterator,
+ class Iterator, class Allocator > class bin_search_tree_const_node_it_
+ {
+ typedef
+ typename
+ Allocator::template rebind < Node >::other::pointer node_pointer;
+ public:
+ typedef typename Node::metadata_type metadata_type;
+ typedef
+ typename
+ Allocator::template
+ rebind
+ < metadata_type >::other::const_reference const_metadata_reference;
+ bin_search_tree_const_node_it_ (node_pointer p_nd):
+ m_p_nd ((p_nd))
+ {}
+ const_metadata_reference get_metadata ()
+ {
+ return (m_p_nd->get_metadata ());
+ }
+ bin_search_tree_const_node_it_ ()
+ {}
+ bin_search_tree_const_node_it_
+ < Node, Const_Iterator, Iterator, Allocator > get_r_child ()
+ {
+ return ((m_p_nd->m_p_right));
+ }
+ bool operator == (bin_search_tree_const_node_it_)
+ {}
+ node_pointer m_p_nd;
+ };
+ template
+ <
+ typename,
+ typename,
+ class,
+ template
+ <
+ typename,
+ class,
+ class, class > class, class, class > struct bin_search_tree_traits;
+ template
+ <
+ typename
+ Key,
+ class
+ Cmp_Fn,
+ template
+ <
+ typename,
+ class,
+ class,
+ class
+ >
+ class
+ Node_Update,
+ class
+ Node,
+ class
+ Allocator
+ >
+ struct
+ bin_search_tree_traits
+ <Key, null_mapped_type, Cmp_Fn, Node_Update, Node, Allocator >
+ {
+ typedef
+ types_traits < Key, null_mapped_type, Allocator, false > type_traits;
+ typedef Node node;
+ typedef
+ bin_search_tree_const_it_
+ <
+ typename
+ Allocator::template
+ rebind
+ <
+ node
+ >::other::pointer,
+ typename
+ type_traits::value_type,
+ typename
+ type_traits::pointer,
+ typename
+ type_traits::const_pointer,
+ typename
+ type_traits::reference,
+ typename
+ type_traits::const_reference, true, Allocator > const_point_iterator;
+ typedef const_point_iterator point_iterator;
+ typedef
+ bin_search_tree_const_node_it_
+ <
+ Node,
+ const_point_iterator, point_iterator, Allocator > const_node_iterator;
+ typedef const_node_iterator node_iterator;
+ typedef
+ Node_Update
+ < const_node_iterator, node_iterator, Cmp_Fn, Allocator > node_update;
+ };
+ template < typename Node_Update, bool > struct tree_metadata_helper
+ {
+ typedef typename Node_Update::metadata_type type;
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Data,
+ class
+ Cmp_Fn,
+ template
+ <
+ typename,
+ class,
+ class,
+ class
+ >
+ class Node_Update, class Allocator > struct tree_node_metadata_selector
+ {
+ typedef
+ dumconst_node_iterator < Key, Data, Allocator > dumconst_node_it;
+ enum
+ {
+ null_update = is_same < Node_Update < dumconst_node_it,
+ dumconst_node_it,
+ Cmp_Fn,
+ Allocator >,
+ null_tree_node_update < dumconst_node_it,
+ dumconst_node_it,
+ Cmp_Fn,
+ Allocator > >::value
+ };
+ typedef
+ typename
+ tree_metadata_helper
+ <
+ Node_Update
+ <
+ dumconst_node_it,
+ dumconst_node_it, Cmp_Fn, Allocator >, null_update >::type type;
+ };
+ template
+ <
+ typename,
+ typename,
+ class,
+ template
+ <
+ typename,
+ class, class, class > class, class, class > struct tree_traits;
+ template < typename Value_Type, class Metadata, class Allocator > struct rb_tree_node_
+ {
+ typedef Metadata metadata_type;
+ typedef
+ typename
+ Allocator::template
+ rebind
+ <
+ rb_tree_node_
+ < Value_Type, Metadata, Allocator > >::other::pointer node_pointer;
+ typedef
+ typename
+ Allocator::template
+ rebind < metadata_type >::other::reference metadata_reference;
+ metadata_reference get_metadata ()
+ {
+ return m_metadata;
+ }
+ node_pointer m_p_right;
+ node_pointer m_p_parent;
+ metadata_type m_metadata;
+ };
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ typename
+ Cmp_Fn,
+ template
+ <
+ typename,
+ class,
+ class,
+ class
+ >
+ class
+ Node_Update,
+ typename
+ Allocator
+ >
+ struct
+ tree_traits
+ <Key,
+ Mapped,
+ Cmp_Fn,
+ Node_Update,
+ rb_tree_tag,
+ Allocator
+ >:bin_search_tree_traits
+ <
+ Key,
+ Mapped,
+ Cmp_Fn,
+ Node_Update,
+ rb_tree_node_
+ <
+ typename
+ types_traits
+ <
+ Key,
+ Mapped,
+ Allocator,
+ false
+ >::value_type,
+ typename
+ tree_node_metadata_selector
+ <
+ Key,
+ Mapped, Cmp_Fn, Node_Update, Allocator >::type, Allocator >, Allocator >
+ {};
+ }
+template < typename Key, typename Mapped, typename Tag, typename Policy_Tl, typename Allocator > class container_base:
+ public
+ detail::container_base_dispatch
+ < Key, Mapped, Tag, Policy_Tl, Allocator >::type
+ {};
+template < typename Key, typename Mapped, typename Tag, typename, typename Policy_Tl, typename Allocator > class basic_tree:
+ public
+ container_base < Key, Mapped, Tag, Policy_Tl, Allocator >
+ {};
+ template
+ <
+ typename
+ Key,
+ typename
+ Mapped,
+ typename
+ Cmp_Fn
+ =
+ std::less
+ <
+ Key
+ >,
+ typename
+ Tag
+ =
+ rb_tree_tag,
+ template
+ <
+ typename,
+ typename,
+ typename,
+ typename
+ >
+ class
+ Node_Update
+ =
+ null_tree_node_update,
+ typename
+ Allocator
+ =
+ std::allocator
+ <
+ char
+ > >class
+ tree:public
+ basic_tree
+ <
+ Key,
+ Mapped,
+ Tag,
+ detail::tree_traits
+ <
+ Key,
+ Mapped,
+ Cmp_Fn,
+ Node_Update,
+ Tag,
+ Allocator
+ >,
+ typename
+ __gnu_cxx::typelist::create2
+ <
+ Cmp_Fn,
+ detail::tree_traits
+ < Key, Mapped, Cmp_Fn, Node_Update, Tag, Allocator > >::type, Allocator >
+ {};
+}
+using namespace std;
+using namespace __gnu_pbds;
+typedef
+ tree
+ <
+ int,
+ null_mapped_type,
+ less < int >, rb_tree_tag, tree_order_statistics_node_update > set_t;
+main ()
+{
+ set_t s;
+ s.insert (12);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47632.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47632.C
new file mode 100644
index 000000000..4b0572a61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47632.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions -ftrapv" }
+
+template < typename > struct S
+{
+ int n;
+ void bar ()
+ {
+ int *i = new int[n];
+ }
+};
+
+void
+foo (S < char >*s)
+{
+ s->bar ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47639.c b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47639.c
new file mode 100644
index 000000000..6ee8bb7de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr47639.c
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions" }
+
+typedef int __attribute__ ((vector_size (8))) vec;
+
+vec foo (vec v1, vec v2)
+{
+ try
+ {
+ return v1 / v2;
+ }
+ catch (...)
+ {
+ throw;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48272.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48272.C
new file mode 100644
index 000000000..cb28a1bb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48272.C
@@ -0,0 +1,130 @@
+// { dg-do compile }
+// { dg-options "-O3 -ftracer -fsched-pressure -Wno-unused-parameter -Wno-return-type" }
+
+extern "C"
+{
+ namespace std
+ {
+ class exception
+ {
+ virtual const char *what () const throw ();
+ };
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Alloc > class allocator;
+ template < class _CharT > struct char_traits;
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT >, typename _Alloc =
+ allocator < _CharT > >class basic_string;
+ typedef basic_string < char >string;
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT > >class basic_ios;
+ typedef basic_ios < char >ios;
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp > class new_allocator
+ {
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
+ _Tp >
+ {
+ };
+}
+
+typedef int _Atomic_word;
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ static inline _Atomic_word
+ __attribute__ ((__unused__)) __exchange_and_add_dispatch (_Atomic_word *
+ __mem,
+ int __val)
+ {
+ }
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _CharT, typename _Traits,
+ typename _Alloc > class basic_string
+ {
+ typedef _Alloc allocator_type;
+ private:struct _Rep_base
+ {
+ _Atomic_word _M_refcount;
+ };
+ struct _Rep:_Rep_base
+ {
+ void _M_dispose (const _Alloc & __a)
+ {
+ if (__builtin_expect (this != &_S_empty_rep (), false))
+ {
+ if (__gnu_cxx::
+ __exchange_and_add_dispatch (&this->_M_refcount, -1) <= 0)
+ {
+ _M_destroy (__a);
+ }
+ }
+ }
+ void _M_destroy (const _Alloc &) throw ();
+ };
+ struct _Alloc_hider:_Alloc
+ {
+ _CharT *_M_p;
+ };
+ private:mutable _Alloc_hider _M_dataplus;
+ _CharT *_M_data () const
+ {
+ return _M_dataplus._M_p;
+ }
+ _Rep *_M_rep () const
+ {
+ return &((reinterpret_cast < _Rep * >(_M_data ()))[-1]);
+ }
+ static _Rep & _S_empty_rep ()
+ {
+ }
+ public: basic_string ():_M_dataplus (_S_empty_rep ()._M_refdata (),
+ _Alloc ())
+ {
+ }
+ basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ());
+ ~basic_string ()
+ {
+ _M_rep ()->_M_dispose (this->get_allocator ());
+ }
+ allocator_type get_allocator () const
+ {
+ }
+ };
+ class ios_base
+ {
+ public:class failure:public exception
+ {
+ public:explicit failure (const string & __str) throw ();
+ };
+ };
+template < typename _CharT, typename _Traits > class basic_ios:public
+ ios_base
+ {
+ };
+ namespace iostreams
+ {
+ class zlib_error:public std::ios::failure
+ {
+ public:explicit zlib_error (int error);
+ private:int error_;
+ };
+ zlib_error::zlib_error (int error):std::ios::failure ("zlib error"),
+ error_ (error)
+ {
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48273.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48273.C
new file mode 100644
index 000000000..4c5108bdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48273.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target x86_64-*-* } }
+// { dg-options "-fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2 -funroll-all-loops -march=core2" }
+
+void bar ();
+
+void foo ()
+{
+ for (;;)
+ bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48302.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48302.C
new file mode 100644
index 000000000..fd51ba412
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48302.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+// { dg-options "-O -fcrossjumping -fgcse -fschedule-insns2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fselective-scheduling2 --param lim-expensive=320 --param min-crossjump-insns=1" }
+
+struct S
+{
+ int i, j;
+ S *s;
+ ~S();
+};
+
+S *gs;
+
+void foo ()
+{
+restart:
+ for (S *s = gs; s; s = s->s)
+ if (s->j && s->j != (s->i & 1)) {
+ delete s;
+ goto restart;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48549.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48549.C
new file mode 100644
index 000000000..01f600e79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48549.C
@@ -0,0 +1,67 @@
+// PR rtl-optimization/48549
+// { dg-do compile }
+// { dg-options "-fcompare-debug -O2" }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+__extension__ typedef __PTRDIFF_TYPE__ pdiff_t;
+
+void
+foo (void *from, void *to)
+{
+ pdiff_t offset = reinterpret_cast <pdiff_t>(to)
+ - reinterpret_cast <pdiff_t>(from);
+ if (offset != static_cast <int>(offset))
+ *(int *) 0xC0DE = 0;
+ reinterpret_cast <int *>(from)[1] = offset;
+}
+struct A
+{
+ A () : a () {}
+ A (void *x) : a (x) {}
+ void *bar () { return a; }
+ void *a;
+};
+struct C;
+struct D;
+struct E : public A
+{
+ C m1 (int);
+ D m2 ();
+ E () {}
+ E (A x) : A (x) {}
+};
+struct C : public E
+{
+ C () {}
+ C (void *x) : E (x) {}
+};
+struct D : public E
+{
+ D (void *x) : E (x) {}
+};
+C
+E::m1 (int x)
+{
+ return (reinterpret_cast <char *>(bar ()) + x);
+}
+D
+E::m2 ()
+{
+ return reinterpret_cast <char *>(bar ());
+}
+struct B
+{
+ E a;
+ unsigned b : 16;
+ unsigned c : 1;
+};
+void
+baz (B *x)
+{
+ for (unsigned i = 0; i < 64; i++)
+ {
+ D d = x[i].a.m2 ();
+ C c = x[i].a.m1 (x[i].c);
+ foo (d.bar (), c.bar ());
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48967.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48967.C
new file mode 100644
index 000000000..db2ea5474
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr48967.C
@@ -0,0 +1,98 @@
+// PR debug/48967
+// { dg-do compile }
+// { dg-options "-g -O2" }
+
+template <typename> struct A;
+template <typename T> struct A <T *>
+{
+ typedef T ref;
+};
+template <typename T, typename> struct B
+{
+ typedef A <T> t;
+ typedef typename t::ref ref;
+ ref operator * () { return ref (); }
+};
+template <typename T> struct I
+{
+ typedef T *cp;
+ template <typename T1> struct J
+ {
+ typedef I <T1> other;
+ };
+};
+template <typename T> struct S : public I <T>
+{
+};
+template <typename T, typename _A> struct E
+{
+ typedef typename _A::template J <T>::other at;
+};
+template <typename T, typename _A = S <T> > struct D
+{
+ typedef E <T, _A> _Base;
+ typedef typename _Base::at at;
+ typedef typename at::cp cp;
+ typedef B <cp, D> H;
+};
+template <class T> struct F
+{
+ T *operator -> () { return __null; }
+};
+template <typename T> long
+lfloor (T x)
+{
+ return static_cast <long>(x) - (x && x != static_cast <long>(x));
+}
+template <typename T> long
+lround (T x)
+{
+ return lfloor (x - 0.5) + 1;
+}
+class M;
+template <typename> class P;
+typedef P <M> Q;
+template <typename> struct P
+{
+ float x ();
+};
+struct CV
+{
+ Q c;
+};
+struct C
+{
+ void foo (const CV &) const;
+ class O;
+ typedef D <F <O> > R;
+ R n;
+};
+struct S3
+{
+ S3 (int, int);
+};
+struct S2
+{
+ S3 sx, sy;
+ S2 (int x = 0, int y = 0, int s = 0, int t = 0) : sx (x, y), sy (s, t) {}
+};
+template <typename> struct N
+{
+ int bar ();
+};
+struct C::O
+{
+ N <float> o;
+ void foo (CV r, int)
+ {
+ Q c = r.c;
+ float t = 0.5 * (o.bar ());
+ S2 (lround (c.x ()), t);
+ }
+};
+void
+C::foo (const CV &w) const
+{
+ R::H m;
+ (*m)->foo (w, 8);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr49264.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr49264.C
new file mode 100644
index 000000000..dc23740f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr49264.C
@@ -0,0 +1,19 @@
+// PR c++/49264
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct B { };
+struct A { char a[sizeof (B) + 1]; } a;
+
+static inline void
+foo (const B &b)
+{
+ __builtin_memcpy (&a, &b, sizeof (b));
+}
+
+void
+bar ()
+{
+ B c;
+ foo (c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50682.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50682.C
new file mode 100644
index 000000000..b7e91f45d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50682.C
@@ -0,0 +1,39 @@
+// PR tree-optimization/50682
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions -ftracer -fno-tree-ccp -fno-tree-copy-prop -fno-tree-dce" }
+
+void foo () __attribute__ ((__noreturn__));
+int baz ();
+
+const int &
+bar (const int &x, const int &y)
+{
+ if (x >= y)
+ return y;
+ return x;
+}
+
+int a, b;
+
+struct S
+{
+ ~S ();
+ bool m ()
+ {
+ int l = bar (a, b);
+ int r = baz ();
+ if (r)
+ r = l;
+ return r;
+ }
+};
+
+void
+test ()
+{
+ S s;
+ if (!s.m ())
+ foo ();
+ if (!s.m ())
+ foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-1_0.C
new file mode 100644
index 000000000..4a5546c63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-1_0.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-require-effective-target lto }
+// { dg-options "-flto" }
+
+void foo();
+
+static void bar() __attribute__((weakref("foo")));
+
+struct A
+{
+ A();
+};
+
+int i;
+
+template <typename T, int&> struct B : T {};
+
+B<A, i> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-2_0.C
new file mode 100644
index 000000000..26f423af6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr50747-2_0.C
@@ -0,0 +1,112 @@
+// { dg-do compile }
+// { dg-require-effective-target lto }
+// { dg-options "-w -fpermissive -fno-implicit-templates -flto" }
+
+namespace std {
+ typedef long unsigned int size_t;
+ template<typename _Alloc> class allocator;
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> > class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_ostringstream;
+}
+extern "C++" {
+ namespace std {
+ class exception {
+ };
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public: typedef size_t size_type;
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> class basic_string {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ private: struct _Rep_base {
+ };
+ struct _Rep : _Rep_base {
+ _CharT* _M_refdata() throw() {
+ }
+ };
+ struct _Alloc_hider : _Alloc {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a) : _Alloc(__a), _M_p(__dat) {
+ }
+ _CharT* _M_p;
+ };
+ private: mutable _Alloc_hider _M_dataplus;
+ static _Rep& _S_empty_rep() {
+ }
+ public: basic_string() : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) {
+ }
+ template<class _InputIterator> basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc());
+ static _CharT* _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Alloc>& __str) {
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc> template<typename _InputIterator> basic_string<_CharT, _Traits, _Alloc>:: basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a) : _M_dataplus(_S_construct(__beg, __end, __a), __a) {
+ };
+ enum _Ios_Openmode {
+ _S_app = 1L << 0, _S_ate = 1L << 1, _S_bin = 1L << 2, _S_in = 1L << 3, _S_out = 1L << 4, _S_trunc = 1L << 5, _S_ios_openmode_end = 1L << 16 };
+ class ios_base {
+ public: class failure : public exception {
+ };
+ typedef _Ios_Openmode openmode;
+ static const openmode in = _S_in;
+ static const openmode out = _S_out;
+ };
+ template<typename _CharT, typename _Traits> class basic_streambuf {
+ public: typedef _CharT char_type;
+ char_type* egptr() const {
+ }
+ char_type* pbase() const {
+ }
+ char_type* pptr() const {
+ }
+ };
+ template<typename _CharT, typename _Traits> class basic_ios : public ios_base {
+ };
+ template<typename _CharT, typename _Traits> class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> class basic_stringbuf : public basic_streambuf<_CharT, _Traits> {
+ public: typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ typedef basic_string<char_type, _Traits, _Alloc> __string_type;
+ protected: ios_base::openmode _M_mode;
+ __string_type _M_string;
+ public: explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out) : __streambuf_type(), _M_mode(__mode), _M_string() {
+ }
+ __string_type str() const {
+ __string_type __ret;
+ if (this->pptr()) {
+ if (this->pptr() > this->egptr()) __ret = __string_type(this->pbase(), this->pptr());
+ }
+ }
+ };
+ template <typename _CharT, typename _Traits, typename _Alloc> class basic_ostringstream : public basic_ostream<_CharT, _Traits> {
+ public: typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
+ typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
+ typedef basic_ostream<char_type, traits_type> __ostream_type;
+ private: __stringbuf_type _M_stringbuf;
+ public: explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out) : __ostream_type(), _M_stringbuf(__mode | ios_base::out) {
+ }
+ __string_type str() const {
+ return _M_stringbuf.str();
+ }
+ };
+ template<typename _Tp> class complex;
+ template<typename _Tp, typename _CharT, class _Traits> basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) {
+ basic_ostringstream<_CharT, _Traits> __s;
+ return __os << __s.str();
+ };
+ template basic_ostream<wchar_t, char_traits<wchar_t> >& operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51014.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51014.C
new file mode 100644
index 000000000..1e5bb9f0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51014.C
@@ -0,0 +1,16 @@
+// PR rtl-optimization/51014
+// { dg-do compile }
+// { dg-options "-O2 -funroll-loops -fcompare-debug" }
+
+struct S
+{
+ ~S() { delete s; }
+ int *s;
+};
+
+void
+f (S *x, S *y)
+{
+ for (; x != y; ++x)
+ x->~S();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51117.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51117.C
new file mode 100644
index 000000000..b5fec03c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51117.C
@@ -0,0 +1,37 @@
+// PR tree-optimization/51117
+// { dg-do compile }
+// { dg-options "-O2 -fexceptions" }
+
+struct A { char buf[64]; };
+void bar (A *);
+
+int
+foo ()
+{
+ A c;
+ bar (&c);
+ try
+ {
+ {
+ A a;
+ bar (&a);
+ if (a.buf[13])
+ throw 1;
+ else if (a.buf[52])
+ throw 3;
+ }
+ {
+ A b;
+ bar (&b);
+ if (b.buf[13])
+ throw 2;
+ }
+ }
+ catch ( ...)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+// { dg-final { scan-assembler-not "__cxa_rethrow" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51262.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51262.C
new file mode 100644
index 000000000..d0e8d7812
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51262.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-require-effective-target lto }
+// { dg-options "-flto -g" }
+
+template < typename > void *
+bar (int *p)
+{
+ union
+ {
+ int *p;
+ }
+ u;
+ u.p = p;
+ return u.p;
+}
+
+void
+foo (int *p)
+{
+ bar < void >(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51396.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51396.C
new file mode 100644
index 000000000..39ebe0887
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51396.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/51396
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+// { dg-additional-options "-mfma" { target i?86-*-* x86_64-*-* } }
+
+double baz (double) throw ();
+
+struct C
+{
+ C (double d = 0.0) : c (d) {}
+ double c;
+};
+
+static inline void
+foo (double x, const C &y)
+{
+ x ? (y.c * baz (x)) : (C (), y);
+}
+
+void
+bar (double x, C y)
+{
+ foo (x, y);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51575.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51575.C
new file mode 100644
index 000000000..e13379b37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51575.C
@@ -0,0 +1,21 @@
+// PR tree-optimization/51575
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions" }
+
+#include <new>
+
+struct S
+{
+ S ()
+ {
+ for (int i = 0; i < 3; ++i)
+ new (&a[i]) double ();
+ }
+ double a[4];
+};
+
+void
+foo ()
+{
+ S s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51596.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51596.C
new file mode 100644
index 000000000..2ed94812d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51596.C
@@ -0,0 +1,39 @@
+// PR tree-optimization/51596
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions" }
+
+struct A { float v[2]; };
+struct B { int v[2]; };
+
+struct C
+{
+ B c;
+ C f ()
+ {
+ B b;
+ for (int i = 0; i < 2; i++)
+ b.v[i] = c.v[i];
+ return *this;
+ }
+};
+
+struct D
+{
+ A d;
+ D (B x)
+ {
+ for (int i = 0; i < 2; i++)
+ d.v[i] = x.v[i];
+ }
+};
+
+int bar ();
+
+C i;
+
+void
+foo ()
+{
+ while (bar ())
+ D (i.f ().c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51895.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51895.C
new file mode 100644
index 000000000..84ac5e996
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr51895.C
@@ -0,0 +1,25 @@
+// PR middle-end/51895
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct S
+{
+ long a;
+ char b;
+ S () : a (0), b (0) {}
+ bool baz ();
+};
+
+__attribute__((noinline)) static bool
+bar (S x, S y)
+{
+ y = x;
+ return y.baz ();
+}
+
+bool
+foo (S x)
+{
+ S y;
+ return bar (x, y);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52429.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52429.C
new file mode 100644
index 000000000..0ab8b4015
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52429.C
@@ -0,0 +1,23 @@
+// PR tree-optimization/52429
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-O -g -ftree-parallelize-loops=4" }
+
+struct B
+{
+ B () : b (__null) {}
+ int *b;
+};
+
+void *
+operator new (__SIZE_TYPE__, void *p)
+{
+ return p;
+}
+
+void
+foo (B *x, unsigned y)
+{
+ while (y--)
+ new (x) B;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52582.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52582.C
new file mode 100644
index 000000000..4ba8a26f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52582.C
@@ -0,0 +1,28 @@
+// PR c++/52582
+// { dg-do compile }
+// { dg-options "-O2" }
+
+inline void *operator new (__SIZE_TYPE__, void *p) throw ()
+{
+ return p;
+}
+
+struct B
+{
+ virtual ~B ();
+ B ();
+};
+
+struct A : B
+{
+ A () : B () {}
+ virtual void bar ();
+};
+
+void
+foo ()
+{
+ char a[64];
+ B *b = new (&a) A ();
+ b->~B ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52643.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52643.C
new file mode 100644
index 000000000..271dd76c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52643.C
@@ -0,0 +1,64 @@
+// PR c++/52643
+// { dg-options "-O" }
+
+template<class T> class already_AddRefd {};
+
+template<class T>
+class ObjRef
+{
+public:
+ ObjRef() {}
+
+ ObjRef(const already_AddRefd<T> aar) {}
+
+ ~ObjRef()
+ {
+ T* mPtr;
+ mPtr->release_ref();
+ }
+
+ operator T* () const
+ {
+ return __null;
+ }
+
+ template<class U>
+ void operator= (const already_AddRefd<U>& newAssign) {}
+};
+
+class MyRetClass {
+public:
+ void release_ref();
+};
+
+class MyClass
+{
+ void appendChild();
+ void getTripleOutOfByPredicate();
+ already_AddRefd<MyRetClass> getNextTriple();
+};
+
+void
+MyClass::getTripleOutOfByPredicate()
+{
+ ObjRef<MyRetClass> t (getNextTriple());
+
+ if (t == __null)
+ throw MyRetClass();
+}
+
+void
+MyClass::appendChild()
+{
+ while (1)
+ {
+ try
+ {
+ ObjRef<MyRetClass> t (getNextTriple());
+ continue;
+ }
+ catch (MyRetClass)
+ {
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52727.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52727.C
new file mode 100644
index 000000000..ed8b973ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr52727.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+// { dg-options "-g -Os" }
+// { dg-additional-options "-march=i686" { target ia32 } }
+
+int grow (int);
+void fn (int);
+struct A { int a1, a2; };
+template <typename T>
+struct B
+{
+ A *b;
+ ~B () { b3 (b); }
+ void b1 (int);
+ void b2 (int);
+ void b3 (A *);
+};
+struct C { int c1, c2, c3; bool c4; };
+int
+bar (int x)
+{
+ int y = x / 6;
+ if (y > x / 2)
+ return y;
+ return 0;
+}
+void baz (double, double);
+void
+foo (const C *x, int y, int z)
+{
+ B<int> p;
+ double r = y / 2;
+ int w = bar (int (r));
+ double s = y / 2 + 0.5;
+ double t = z / 2 + 0.5;
+ int u = x->c3;
+ int v = (x->c2 + u - 1 - x->c1) / u;
+ p.b2 ((2 * v > p.b->a1 || (2 * v < p.b->a2 && 2 * v < (p.b->a1 >> 1)))
+ ? grow (0) : p.b->a1);
+ for (int i = 0; i <= v; ++i)
+ {
+ double l = x->c4 ? 4.5 - i * 6.2 / v : (3.1 - i * 31 / v) / 6;
+ baz (s + (r - w) * l, t - (r - w) * l);
+ }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55081.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55081.C
new file mode 100644
index 000000000..b4f533e5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55081.C
@@ -0,0 +1,17 @@
+// PR c++/55081
+// { dg-do compile }
+
+struct R { int field; } r;
+
+__UINTPTR_TYPE__ *
+foo ()
+{
+ static __UINTPTR_TYPE__ array[] = {
+ sizeof (char),
+ (reinterpret_cast <__UINTPTR_TYPE__>(&r.field)
+ - reinterpret_cast <__UINTPTR_TYPE__>(&r)) + 1
+ };
+ return array;
+}
+
+// { dg-final { scan-assembler-not "_ZGVZ3foovE5array" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55137.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55137.C
new file mode 100644
index 000000000..73f8092af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55137.C
@@ -0,0 +1,4 @@
+// PR c++/55137
+// { dg-do compile }
+
+enum E { F = -1 + (int) (sizeof (int) - 1) };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55281.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55281.C
new file mode 100644
index 000000000..7076a19c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55281.C
@@ -0,0 +1,17 @@
+// PR tree-optimization/55281
+// { dg-do compile }
+// { dg-options "-Ofast" }
+
+typedef float VF __attribute__((vector_size (16)));
+
+VF x;
+
+void
+foo (void)
+{
+ VF a, b, c;
+ a = (VF) { 1.0, 2.0, 3.0, 4.0 };
+ b = (VF) { 5.0, 6.0, 7.0, 8.0 };
+ c = (VF) { 0.0, 0.0, 0.0, 0.0 };
+ x = c == ((VF) { 0.0, 0.0, 0.0, 0.0 }) ? a : b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55329.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55329.C
new file mode 100644
index 000000000..3646785d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55329.C
@@ -0,0 +1,73 @@
+// PR tree-optimization/55329
+// { dg-do compile }
+// { dg-options "-O -fno-guess-branch-probability -fnon-call-exceptions --param=early-inlining-insns=111" }
+
+void *f1 ();
+void f2 (void *);
+void f3 ();
+static inline void *
+f4 ()
+{
+ void *p = f1 ();
+ if (!p)
+ f3 ();
+ return p;
+}
+
+struct A
+{
+ int *a;
+ A ();
+ ~A () { a3 (); }
+ int a1 (int * p) { if (!p) f3 (); f2 (p); }
+ int *a2 ();
+ void a3 () { if (*a) a1 (a); }
+ int a4 (int x) { if (*a) f4 (); *a2 () += x; }
+};
+
+struct B : A
+{
+ ~B () { a3 (); }
+};
+
+template <class T>
+struct C
+{
+ T *c;
+ C ();
+ int c1 () { return *(int *) f4 (); }
+ ~C () { if (c1 ()) for (T *t = c + c2 (); t != c; t--) T (); }
+ int c2 ();
+};
+
+class D
+{
+ C <C <int> > c;
+};
+
+struct E
+{
+ int *e;
+ ~E () { delete e; }
+};
+
+struct F
+{
+ int *f1 ();
+ D f2;
+ E f3;
+ F () { f4 (); }
+};
+
+struct G : F
+{
+ B g;
+ G () { g.a4 (*g1 ()->f1 ()); g1 ()->f1 (); }
+ F *g1 ();
+};
+
+void
+foo ()
+{
+ G g;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55331.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55331.C
new file mode 100644
index 000000000..4717db809
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55331.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/55331
+// { dg-do compile }
+// { dg-options "-O2 -fno-tree-fre" }
+
+struct A {};
+
+void
+foo (A *p, bool x)
+{
+ A a;
+ char *e = (char *) (&a + 1);
+ if (x)
+ __builtin_memmove (p, &a, e - (char *) &a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55717.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55717.C
new file mode 100644
index 000000000..7b3af589e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr55717.C
@@ -0,0 +1,107 @@
+// PR debug/55717
+// { dg-do compile }
+// { dg-options "-O -g" }
+
+struct DebugOnly {};
+template <class T>
+struct StripConst { typedef T result; };
+class TempAllocPolicy {};
+template <class T>
+class HashTableEntry
+{
+ unsigned keyHash;
+ template <class, class, class>
+ friend class HashTable;
+ T t;
+ void setLive (unsigned hn) { keyHash = hn; }
+};
+template <class T, class HashPolicy, class>
+struct HashTable
+{
+ typedef typename HashPolicy::KeyType Key;
+ typedef typename HashPolicy::Lookup Lookup;
+ typedef HashTableEntry <T> Entry;
+ struct Range
+ {
+ Range () {}
+ Entry *cur, end;
+ bool empty () { return false; }
+ T front () { return T (); }
+ };
+ struct Enum : public Range
+ {
+ HashTable table;
+ bool removed;
+ template <class Map>
+ Enum (Map map) : Range (map.all ()), table (map.impl), removed () {}
+ void rekeyFront (Lookup l, Key)
+ {
+ T t = this->cur->t;
+ table.putNewInfallible (l, t);
+ }
+ void rekeyFront (Key k)
+ {
+ rekeyFront (k, k);
+ }
+ };
+ unsigned entryCount;
+ unsigned sCollisionBit;
+ unsigned prepareHash (Lookup l)
+ {
+ unsigned keyHash (HashPolicy::hash (l));
+ return keyHash & sCollisionBit;
+ }
+ static Entry *entryp;
+ Entry *findFreeEntry (unsigned) { return entryp; }
+ void putNewInfallible (Lookup l, T)
+ {
+ unsigned keyHash = prepareHash (l);
+ Entry *entry = findFreeEntry (keyHash);
+ entry->setLive (keyHash);
+ entryCount++;
+ }
+};
+template <class Key>
+struct HashMapEntry { Key key; };
+template <class Key, class Value, class HashPolicy = DebugOnly, class AllocPolicy = TempAllocPolicy>
+struct HashMap
+{
+ typedef HashMapEntry <Key> Entry;
+ struct MapHashPolicy : HashPolicy
+ {
+ typedef Key KeyType;
+ };
+ typedef HashTable <Entry, MapHashPolicy, AllocPolicy> Impl;
+ Impl impl;
+ typedef typename Impl::Range Range;
+ Range all () { return Range (); }
+ typedef typename Impl::Enum Enum;
+};
+class FreeOp;
+struct AllocationSiteKey;
+typedef HashMap <AllocationSiteKey, DebugOnly, AllocationSiteKey, TempAllocPolicy> AllocationSiteTable;
+struct TypeCompartment
+{
+ AllocationSiteTable *allocationSiteTable;
+ void sweep (FreeOp *);
+};
+struct JSScript { unsigned *code; };
+bool IsScriptMarked (JSScript **);
+struct AllocationSiteKey
+{
+ JSScript *script;
+ unsigned offset : 24;
+ int kind;
+ typedef AllocationSiteKey Lookup;
+ static unsigned hash (AllocationSiteKey key) { return (long (key.script->code + key.offset)) ^ key.kind; }
+};
+void
+TypeCompartment::sweep (FreeOp *)
+{
+ for (AllocationSiteTable::Enum e (*allocationSiteTable); !e.empty ();)
+ {
+ AllocationSiteKey key = e.front ().key;
+ IsScriptMarked (&key.script);
+ e.rekeyFront (key);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56381.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56381.C
new file mode 100644
index 000000000..00e5495a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56381.C
@@ -0,0 +1,156 @@
+// PR tree-optimization/56381
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -w" }
+
+template <class>
+class intrusive_ptr {};
+class BasicReferenceCounted
+{
+};
+template <class T>
+class ReferenceCountingPointer : intrusive_ptr <T>
+{
+};
+typedef BasicReferenceCounted ReferenceCountedInConditions;
+class PointTag;
+template <typename T, typename>
+struct PreciseFloatType
+{
+ typedef T Type;
+};
+template <typename T, int N>
+struct ExtVecTraits
+{
+ typedef T __attribute__ ((vector_size (N * sizeof (T)))) type;
+};
+template <typename T, int N>
+using ExtVec = typename ExtVecTraits <T, N>::type;
+template <typename T> using Vec4 = ExtVec <T, 4>;
+template <typename Vec>
+Vec cross3 (Vec x, Vec y)
+{
+ Vec x1200 = (Vec) { x[2], x[0] };
+ Vec y2010 { y[2], y[0], y[1], y[0] };
+ Vec x2010 = (Vec) { x[2], x[0], x[1], x[0] };
+ Vec y1200 = (Vec) { y[1], y[0] };
+ return x1200 * y2010 - x2010 * y1200;
+}
+template <typename T>
+struct Rot3
+{
+ typedef Vec4 <T> Vec;
+ Vec axis[3];
+};
+class Basic2DVector
+{
+};
+template <typename T>
+struct Basic3DVector
+{
+ typedef Vec4 <T> MathVector;
+ Basic3DVector (MathVector iv) : v { (iv[0]), (iv[1]), (iv[2]), (iv[3]) } {}
+ T mag2 () {}
+ Basic3DVector unit ()
+ {
+ T my_mag = mag2 ();
+ return (my_mag) ? (*this) * (T () / (my_mag)) : *this;
+ }
+ Basic3DVector
+ cross (Basic3DVector lh) { return cross3 (v, lh.v); }
+ Vec4 <T> v;
+};
+template <class T>
+Basic3DVector <T> operator * (Basic3DVector <T>, T);
+template <class T, class, class>
+struct PV3DBase
+{
+ typedef Basic3DVector <T> BasicVectorType;
+ template <class U>
+ PV3DBase (Basic3DVector <U> v) : theVector (v) {}
+ BasicVectorType basicVector () { return theVector; }
+ T x ();
+ T y ();
+ BasicVectorType theVector;
+};
+class VectorTag;
+template <class T, class FrameTag>
+struct Vector3DBase:public PV3DBase <T, VectorTag, FrameTag>
+{
+ typedef PV3DBase <T, VectorTag, FrameTag> BaseClass;
+ template <class U>
+ Vector3DBase (Basic3DVector <U> v) : BaseClass (v) {}
+ Vector3DBase unit () { return (this->basicVector ().unit ()); }
+ template <class U>
+ Vector3DBase <typename PreciseFloatType <T, U>::Type, FrameTag> cross (Vector3DBase <U, FrameTag> v)
+ {
+ return (this->theVector.cross (v.basicVector ()));
+ }
+};
+template <class T, class FrameTag>
+class Point3DBase : public PV3DBase <T, PointTag, FrameTag>
+{
+};
+template <typename T, typename U, class Frame>
+Vector3DBase <typename PreciseFloatType <T, U>::Type, Frame> operator - (Point3DBase <T, Frame>, Point3DBase <U, Frame>);
+class GlobalTag;
+template <class T>
+struct TkRotation
+{
+ typedef Vector3DBase <T, GlobalTag> GlobalVector;
+ TkRotation (GlobalVector aX, GlobalVector aY)
+ {
+ GlobalVector uX = aX.unit ();
+ GlobalVector uY = aY.unit ();
+ GlobalVector uZ (uX.cross (uY));
+ rot.axis[2] = uZ.basicVector ().v;
+ }
+ Basic3DVector <T> z ();
+ Rot3 <T> rot;
+};
+template <class T>
+struct GloballyPositioned
+{
+ typedef Point3DBase <T, GlobalTag> PositionType;
+ typedef TkRotation <T> RotationType;
+ typedef Point3DBase <T, GlobalTag> GlobalPoint;
+ typedef Vector3DBase <T, GlobalTag> GlobalVector;
+ T iniPhi () { return 999.9978; }
+ GloballyPositioned (PositionType pos, RotationType rot) : thePos (pos), theRot (rot) { resetCache (); }
+ PositionType position () const;
+ RotationType rotation () const;
+ PositionType thePos;
+ RotationType theRot;
+ void resetCache ()
+ {
+ if ((thePos.x () == 0.) && (thePos.y () == 0.))
+ thePhi = 0.;
+ else
+ thePhi = iniPhi ();
+ }
+ T thePhi;
+};
+class Plane;
+using TangentPlane = Plane;
+struct Surface : public GloballyPositioned <float>, ReferenceCountedInConditions
+{
+ typedef GloballyPositioned <float> Base;
+ Surface (PositionType pos, RotationType rot):
+ Base (pos, rot) {}
+};
+struct Plane : Surface
+{
+ template <typename ... Args>
+ Plane (Args ... args):
+ Surface ((args) ...) {}
+};
+class Cylinder : Surface
+{
+ void tangentPlane (const GlobalPoint &) const;
+};
+void
+Cylinder::tangentPlane (const GlobalPoint & aPoint) const
+{
+ GlobalVector yPlane (rotation ().z ());
+ GlobalVector xPlane (yPlane.cross (aPoint - position ()));
+ new TangentPlane (aPoint, RotationType (xPlane, yPlane));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C
new file mode 100644
index 000000000..6db2f270e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C
@@ -0,0 +1,188 @@
+// PR rtl-optimization/56999
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-fpic" { target fpic } }
+// { dg-additional-options "-march=i686 -mtune=atom" { target ia32 } }
+// { dg-require-visibility "" }
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+volatile bool do_exit = true;
+struct JSScript;
+struct JITScript { int i; };
+#pragma GCC visibility push(hidden)
+typedef struct JSCompartment JSCompartment;
+typedef struct JSContext JSContext;
+namespace js
+{
+ struct ContextFriendFields
+ {
+ JSCompartment *compartment;
+ };
+ struct TempAllocPolicy
+ {
+ };
+ template <class T>
+ struct Vector
+ {
+ T *mBegin;
+ T *begin () { return mBegin; }
+ T & operator[] (unsigned i) { return begin ()[i]; }
+ template <class U>
+ __attribute__((noinline, noclone))
+ bool append (U) { asm volatile ("" : : : "memory"); if (do_exit) abort (); return false; }
+ };
+ namespace types
+ {
+ struct TypeCompartment;
+ }
+ namespace mjit
+ {
+ }
+ namespace ion
+ {
+ struct IonScript;
+ }
+ namespace types
+ {
+ struct CompilerOutput
+ {
+ enum Kind { MethodJIT, ParallelIon };
+ JSScript *script;
+ unsigned kindInt : 2;
+ bool constructing : 1;
+ bool barriers : 1;
+ bool pendingRecompilation : 1;
+ Kind kind () const { return static_cast <Kind> (kindInt); }
+ bool isValid () const;
+ };
+ struct RecompileInfo
+ {
+ unsigned outputIndex;
+ CompilerOutput *compilerOutput (TypeCompartment & types) const;
+ CompilerOutput *compilerOutput (JSContext *cx) const;
+ };
+ struct TypeCompartment
+ {
+ Vector <CompilerOutput> *constrainedOutputs;
+ Vector <RecompileInfo> *pendingRecompiles;
+ void addPendingRecompile (JSContext *cx, const RecompileInfo & info);
+ };
+ }
+}
+struct JSScript
+{
+ struct JITScriptHandle
+ {
+ static volatile JITScript *UNJITTABLE __attribute__((visibility ("default")));
+ JITScript *value;
+ bool isValid () { return value != UNJITTABLE; }
+ JITScript *getValid () { return value; }
+ };
+ struct JITScriptSet
+ {
+ JITScriptHandle jitHandleNormal, jitHandleNormalBarriered;
+ JITScriptHandle jitHandleCtor, jitHandleCtorBarriered;
+ JITScriptHandle jitNull1, jitNull2;
+ };
+ JITScriptSet *mJITInfo;
+ void *ion;
+ JITScriptHandle *jitHandle (bool constructing, bool barriers)
+ {
+ return constructing ? (barriers ? &mJITInfo->jitHandleCtorBarriered
+ : &mJITInfo->jitHandleCtor)
+ : (barriers ? &mJITInfo->jitHandleNormalBarriered
+ : &mJITInfo->jitHandleNormal);
+ }
+ JITScript *getJIT (bool constructing, bool barriers)
+ {
+ JITScriptHandle *jith = jitHandle (constructing, barriers);
+ return jith->isValid () ? jith->getValid () : __null;
+ }
+};
+struct JSContext : js::ContextFriendFields
+{
+};
+namespace js
+{
+ __attribute__((noinline, noclone))
+ void CancelOffThreadIonCompile (JSCompartment *, JSScript *)
+ {
+ if (do_exit)
+ exit (0);
+ }
+}
+struct JSCompartment
+{
+ js::types::TypeCompartment types;
+};
+namespace js
+{
+ namespace types
+ {
+ inline bool CompilerOutput::isValid () const
+ {
+ if (!script)
+ return false;
+ switch (kind ())
+ {
+ case MethodJIT:
+ {
+ JITScript *jit = script->getJIT (constructing, barriers);
+ if (!jit)
+ return false;
+ }
+ case ParallelIon:
+ return true;
+ }
+ return false;
+ }
+ inline CompilerOutput *RecompileInfo::compilerOutput (TypeCompartment & types) const
+ {
+ return &(*types.constrainedOutputs)[outputIndex];
+ }
+ inline CompilerOutput *RecompileInfo::compilerOutput (JSContext *cx) const
+ {
+ return compilerOutput (cx->compartment->types);
+ }
+ }
+}
+using namespace js::types;
+__attribute__((noinline, noclone)) void
+TypeCompartment::addPendingRecompile (JSContext *cx, const RecompileInfo & info)
+{
+ CompilerOutput *co = info.compilerOutput (cx);
+ if (co->pendingRecompilation)
+ if (co->isValid ())
+ CancelOffThreadIonCompile (cx->compartment, co->script);
+ if (co->isValid ())
+ pendingRecompiles->append (info);
+}
+volatile JITScript *JSScript::JITScriptHandle::UNJITTABLE;
+int
+main ()
+{
+ JSContext cx;
+ JSCompartment com;
+ RecompileInfo info;
+ cx.compartment = &com;
+ info.outputIndex = 0;
+ js::Vector<CompilerOutput> v;
+ JITScript js;
+ JSScript::JITScriptSet set;
+ __builtin_memset (&set, 0, sizeof set);
+ set.jitHandleCtor.value = &js;
+ JSScript s;
+ s.mJITInfo = &set;
+ CompilerOutput co;
+ co.kindInt = 0;
+ co.constructing = true;
+ co.barriers = false;
+ co.pendingRecompilation = true;
+ co.script = &s;
+ v.mBegin = &co;
+ com.types.constrainedOutputs = &v;
+ com.types.pendingRecompiles = __null;
+ com.types.addPendingRecompile (&cx, info);
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57411.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57411.C
new file mode 100644
index 000000000..9c99ee061
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57411.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O -fno-tree-dce -ftree-vectorize" }
+
+static inline void
+iota (int *__first, int *__last, int __value)
+{
+ for (; __first != __last; ++__first)
+ {
+ *__first = __value;
+ }
+}
+
+void assert_fail ();
+
+int A[] = { 0, 0, 0 };
+
+void
+test01 (int equal)
+{
+ iota (A, A + 3, 1);
+ if (equal)
+ assert_fail ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57661.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57661.C
new file mode 100644
index 000000000..9573663af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr57661.C
@@ -0,0 +1,76 @@
+// PR tree-optimization/57661
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -fno-tree-forwprop" }
+
+template <typename>
+struct A
+{
+ ~A () {}
+};
+template <typename _Tp>
+using B = A <_Tp>;
+template <typename _Tp>
+class C : B <_Tp> {};
+namespace N { enum D { d }; }
+template <class>
+struct E
+{
+ ~E ();
+};
+template <class, class V>
+struct F : V {};
+template <class U, class V>
+struct G : F <U, V>
+{
+ N::D g1;
+ void g2 ();
+ void g3 ();
+ void g4 () { g3 (); }
+ static void g5 (G *__t) { __t->g4 (); }
+};
+template <class U, class V>
+struct H : G <U, V>
+{
+ E <U> *h1;
+ bool h2;
+ ~H () throw ()
+ {
+ this->g2 ();
+ if (h2)
+ delete h1;
+ }
+};
+template <class U, class V>
+struct I : H <U, V>, E <U>
+{
+ G <U, V> *i;
+ ~I () throw ()
+ {
+ i->g4 ();
+ }
+};
+struct J
+{
+ typedef C <char> j1;
+ typedef G <char, C <char>> j2;
+ J ();
+ j2 *j3;
+};
+struct K : J
+{
+ typedef G <char, C <char>> j2;
+ K () { j2::g5 (this->j3); }
+};
+template <class U, class V>
+void G <U, V>::g3 ()
+{
+ switch (g1)
+ {
+ case N::d:
+ {
+ I <U, V> *q = (I <U, V> *) this;
+ q->I <U, V>::~I ();
+ }
+ }
+}
+K r;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58006.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58006.C
new file mode 100644
index 000000000..fd3b7bebd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58006.C
@@ -0,0 +1,22 @@
+// PR tree-optimization/58006
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-Ofast -ftree-parallelize-loops=2" }
+
+extern "C" float sqrtf (float);
+
+struct S
+{
+ float i, j;
+ float foo () const { return sqrtf (i * i + j * j); }
+ S () : i (1), j (1) {}
+};
+
+void
+bar (int a, int b)
+{
+ int i;
+ float f;
+ for (i = a; i < b; i++)
+ f = S ().foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58165.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58165.C
new file mode 100644
index 000000000..d758e3700
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58165.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/58165
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" float sqrtf (float);
+
+struct A { A (); ~A (); };
+
+void
+foo (double d)
+{
+ A a;
+ sqrtf (d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58864.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58864.C
new file mode 100644
index 000000000..b8587f298
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr58864.C
@@ -0,0 +1,21 @@
+// PR target/58864
+// { dg-do compile }
+// { dg-options "-Os" }
+// { dg-additional-options "-march=i686" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+struct A { A (); ~A (); };
+struct B { B (); };
+
+float d, e;
+
+void
+foo ()
+{
+ A a;
+ float c = d;
+ while (1)
+ {
+ B b;
+ e = c ? -c : 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59470.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59470.C
new file mode 100644
index 000000000..4698ab717
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59470.C
@@ -0,0 +1,188 @@
+// PR middle-end/59470
+// { dg-do run }
+// { dg-options "-O2 -fstack-protector" }
+// { dg-additional-options "-fPIC" { target fpic } }
+// { dg-require-effective-target fstack_protector }
+
+struct A
+{
+ int a1;
+ A () throw () : a1 (0) {}
+};
+
+struct B
+{
+ unsigned int b1 () throw ();
+};
+
+__attribute__((noinline, noclone)) unsigned int
+B::b1 () throw ()
+{
+ asm volatile ("" : : : "memory");
+ return 0;
+}
+
+struct C
+{
+ const A **c1;
+ void c2 (const A *, unsigned int);
+};
+
+__attribute__((noinline, noclone)) void
+C::c2 (const A *, unsigned int)
+{
+ asm volatile ("" : : : "memory");
+}
+
+struct D
+{
+ C *d1;
+};
+
+struct E
+{
+ int e1;
+ int e2;
+ D e3;
+};
+
+struct F
+{
+ virtual int f1 (const char * s, int n);
+};
+
+struct G
+{
+ F *g1;
+ bool g2;
+ G & g3 (const char * ws, int len)
+ {
+ if (__builtin_expect (!g2, true)
+ && __builtin_expect (this->g1->f1 (ws, len) != len, false))
+ g2 = true;
+ return *this;
+ }
+};
+
+struct H : public A
+{
+ const char *h1;
+ unsigned int h2;
+ bool h3;
+ const char *h4;
+ char h5;
+ char h6;
+ char h7[31];
+ bool h8;
+ H () : h1 (0), h2 (0), h4 (0), h5 (0), h6 (0), h8 (false) {}
+ void h9 (const D &) __attribute__((noinline, noclone));
+};
+
+void
+H::h9 (const D &)
+{
+ h3 = true;
+ __builtin_memset (h7, 0, sizeof (h7));
+ asm volatile ("" : : : "memory");
+};
+
+B b;
+
+inline const H *
+foo (const D &x)
+{
+ const unsigned int i = b.b1 ();
+ const A **j = x.d1->c1;
+ if (!j[i])
+ {
+ H *k = 0;
+ try
+ {
+ k = new H;
+ k->h9 (x);
+ }
+ catch (...)
+ {
+ }
+ x.d1->c2 (k, i);
+ }
+ return static_cast <const H *>(j[i]);
+}
+
+__attribute__((noinline, noclone)) int
+bar (char *x, unsigned long v, const char *y, int z, bool w)
+{
+ asm volatile ("" : : "r" (x), "r" (v), "r" (y) : "memory");
+ asm volatile ("" : : "r" (z), "r" (w) : "memory");
+ return 8;
+}
+
+__attribute__((noinline, noclone)) void
+baz (void *z, const char *g, unsigned int h, char s, E &e, char *n, char *c, int &l)
+{
+ asm volatile ("" : : "r" (z), "r" (g), "r" (h) : "memory");
+ asm volatile ("" : : "r" (s), "r" (&e), "r" (n) : "memory");
+ asm volatile ("" : : "r" (c), "r" (&l) : "memory");
+ if (n == c)
+ __builtin_abort ();
+ int i = 0;
+ asm ("" : "+r" (i));
+ if (i == 0)
+ __builtin_exit (0);
+}
+
+__attribute__((noinline, noclone)) G
+test (void *z, G s, E &x, char, long v)
+{
+ const D &d = x.e3;
+ const H *h = foo (d);
+ const char *q = h->h7;
+ const int f = x.e2;
+ const int i = 5 * sizeof (long);
+ char *c = static_cast <char *>(__builtin_alloca (i));
+ const int b = f & 74;
+ const bool e = (b != 64 && b != 8);
+ const unsigned long u = ((v > 0 || !e) ? (unsigned long) v : -(unsigned long) v);
+ int l = bar (c + i, u, q, f, e);
+ c += i - l;
+ if (h->h3)
+ {
+ char *c2 = static_cast <char *>(__builtin_alloca ((l + 1) * 2));
+ baz (z, h->h1, h->h2, h->h6, x, c2 + 2, c, l);
+ c = c2 + 2;
+ }
+ if (__builtin_expect (e, true))
+ {
+ }
+ else if ((f & 4096) && v)
+ {
+ {
+ const bool m = f & 176;
+ *--c = q[m];
+ *--c = q[1];
+ }
+ }
+ const int w = x.e1;
+ if (w > l)
+ {
+ char * c3 = static_cast <char *>(__builtin_alloca (w));
+ c = c3;
+ }
+ return s.g3 (c, l);
+}
+
+int
+main ()
+{
+ H h;
+ const A *j[1];
+ C c;
+ G g;
+ E e;
+ h.h9 (e.e3);
+ j[0] = &h;
+ c.c1 = j;
+ e.e3.d1 = &c;
+ test (0, g, e, 0, 0);
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-2.C
new file mode 100644
index 000000000..8096eebca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-2.C
@@ -0,0 +1,21 @@
+// PR tree-optimization/59622
+// { dg-do compile }
+// { dg-options "-O2" }
+
+namespace
+{
+ struct A
+ {
+ A () {}
+ virtual A *bar (int) = 0;
+ A *baz (int x) { return bar (x); }
+ };
+}
+
+A *a;
+
+void
+foo ()
+{
+ a->baz (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-3.C
new file mode 100644
index 000000000..0af86050c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-3.C
@@ -0,0 +1,21 @@
+// PR tree-optimization/59622
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C { int a; int b; };
+
+namespace
+{
+ struct A
+ {
+ virtual C foo ();
+ C bar () { return foo (); }
+ };
+}
+
+C
+baz ()
+{
+ A a;
+ return a.bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-4.C
new file mode 100644
index 000000000..f72af1641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-4.C
@@ -0,0 +1,23 @@
+// PR tree-optimization/59622
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C { int a; int b; };
+
+namespace
+{
+ struct A
+ {
+ A () {}
+ virtual C bar (int) = 0;
+ C baz (int x) { return bar (x); }
+ };
+}
+
+A *a;
+
+C
+foo ()
+{
+ return a->baz (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-5.C
new file mode 100644
index 000000000..bcb2591a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622-5.C
@@ -0,0 +1,26 @@
+// PR tree-optimization/59622
+// { dg-do compile }
+// { dg-options "-O2" }
+
+namespace
+{
+ struct A
+ {
+ A () {}
+ virtual A *bar (int);
+ A *baz (int x) { return bar (x); }
+ };
+
+ __attribute__((noreturn)) A *A::bar (int)
+ {
+ __builtin_exit (0);
+ }
+}
+
+A *a;
+
+void
+foo ()
+{
+ a->baz (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622.C
new file mode 100644
index 000000000..1d8e9986c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59622.C
@@ -0,0 +1,19 @@
+// PR tree-optimization/59622
+// { dg-do compile }
+// { dg-options "-O2" }
+
+namespace
+{
+ struct A
+ {
+ virtual int foo ();
+ int bar () { return foo (); }
+ };
+}
+
+int
+baz ()
+{
+ A a;
+ return a.bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59647.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59647.C
new file mode 100644
index 000000000..1fc5067d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59647.C
@@ -0,0 +1,32 @@
+// PR rtl-optimization/59647
+// { dg-do compile }
+// { dg-options "-O2 -fno-tree-vrp" }
+// { dg-additional-options "-msse2 -mfpmath=sse" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+void f1 (int);
+void f2 ();
+double f3 (int);
+
+struct A
+{
+ int f4 () const
+ {
+ if (a == 0)
+ return 1;
+ return 0;
+ }
+ unsigned f5 ()
+ {
+ if (!f4 ())
+ f2 ();
+ return a;
+ }
+ int a;
+};
+
+void
+f6 (A *x)
+{
+ unsigned b = x->f5 ();
+ f1 (b - 1 - f3 (x->f5 () - 1U));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59947.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59947.C
new file mode 100644
index 000000000..71c51b226
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr59947.C
@@ -0,0 +1,34 @@
+// PR ipa/59947
+// { dg-do compile { target c++11 } }
+// { dg-options "-O0" }
+
+#pragma GCC optimize ("O2")
+template <typename T>
+inline void
+foo (T & a) noexcept { T tmp = static_cast <T &&> (a); };
+struct A
+{
+ A () noexcept : a (1), b (1) {}
+ virtual void c () noexcept = 0;
+ void d () noexcept { c (); }
+ int a;
+ int b;
+};
+struct B
+{
+ ~B () noexcept { e->d (); }
+ A *e;
+};
+template <typename T>
+struct C
+{
+ B f;
+};
+struct D {};
+template <typename T>
+struct E
+{
+ void bar () { foo (g); }
+ C <D> g;
+};
+template class E <char>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60002.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60002.C
new file mode 100644
index 000000000..753f579dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60002.C
@@ -0,0 +1,12 @@
+// PR tree-optimization/60002
+// { dg-do compile }
+// { dg-options "-O2 -fcompare-debug -fdeclone-ctor-dtor -fipa-cp-clone" }
+
+struct A {};
+
+struct B : virtual A { B (); ~B (); };
+
+B::~B ()
+{
+ B ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60597.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60597.C
new file mode 100644
index 000000000..c61f76797
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr60597.C
@@ -0,0 +1,46 @@
+// PR middle-end/60597
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+
+struct A
+{
+ int foo () const;
+ int bar () const;
+ int a;
+};
+
+struct B
+{
+ int foo ();
+ int bar ();
+};
+
+int *c, d;
+
+int
+A::foo () const
+{
+ int b = a >> 16;
+ return b;
+}
+
+int
+A::bar () const
+{
+ int b = a;
+ return b;
+}
+
+void
+baz (A &x, B h, int i, int j)
+{
+ for (; i < h.bar (); ++i)
+ for (; h.foo (); ++j)
+ {
+ int g = x.foo ();
+ int f = x.bar ();
+ int e = c[0] & 1;
+ d = (e << 1) | (g << 16) | (f & 1);
+ c[j] = 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr6713.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr6713.C
new file mode 100644
index 000000000..d89fef81b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr6713.C
@@ -0,0 +1,117 @@
+// PR optimization/6713
+// This testcase segfaulted on x86 because a dangling REG_EQUAL note
+// resulted in incorrect substitutions later.
+// { dg-do run }
+// { dg-options "-O2" }
+
+template<typename _CharT> class basic_iterator
+{
+ public:
+ basic_iterator(_CharT* _p) : _M_current(_p) {}
+ basic_iterator& operator++() { ++_M_current; return *this; }
+ _CharT& operator*() const { return *_M_current; }
+ bool operator!=(basic_iterator &_rhs) { return _M_current != _rhs._M_current; }
+
+ private:
+ _CharT* _M_current;
+};
+
+template<typename _CharT> class basic_string
+{
+ public:
+ typedef unsigned int size_type;
+ typedef basic_iterator<_CharT> iterator;
+
+ private:
+ struct _Rep
+ {
+ size_type _M_length;
+ size_type _M_capacity;
+ int _M_references;
+
+ bool _M_is_leaked() const { return _M_references < 0; }
+ bool _M_is_shared() const { return _M_references > 0; }
+ void _M_set_leaked() { _M_references = -1; }
+ void _M_set_sharable() { _M_references = 0; }
+ };
+
+ struct _Rep _M_rep;
+
+ struct _Alloc_hider
+ {
+ _CharT _raw[16];
+ _CharT* _M_p;
+ };
+
+ mutable _Alloc_hider _M_dataplus;
+
+ _CharT* _M_data() const { return _M_dataplus._M_p; }
+
+ void _M_leak() { if (!_M_rep._M_is_leaked()) _M_leak_hard(); }
+
+ static int count;
+
+ static void _M_leak_hard();
+
+ public:
+ explicit basic_string(const _CharT* __s);
+
+ iterator begin() { _M_leak(); return iterator(_M_data()); }
+
+ iterator end() { _M_leak(); return iterator(_M_data() + this->size()); }
+
+ size_type size() const { return _M_rep._M_length; }
+};
+
+template<typename _CharT> basic_string<_CharT>::
+basic_string(const _CharT* __s)
+{
+ int i;
+
+ for (i=0; i<15; i++) {
+ if (!__s[i])
+ break;
+
+ _M_dataplus._raw[i] = __s[i];
+ }
+
+ _M_dataplus._raw[i] = 0;
+ _M_dataplus._M_p = _M_dataplus._raw;
+
+ _M_rep._M_length = i;
+ _M_rep._M_capacity = i;
+ _M_rep._M_references = 1;
+}
+
+template<typename _CharT> int basic_string<_CharT>::count = 0;
+
+template<typename _CharT> void basic_string<_CharT>::
+_M_leak_hard()
+{
+ count++;
+}
+
+typedef basic_string<char> string;
+
+template int basic_string<char>::count;
+
+int isspa(int ch)
+{
+ return 0;
+}
+
+void foo(string& str)
+{
+ string::iterator it = str.begin();
+ string::iterator stop = str.end();
+
+ for (; it != stop; ++it)
+ if (isspa(*it))
+ break;
+}
+
+int main()
+{
+ string str("test");
+ foo(str);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr7503-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr7503-1.C
new file mode 100644
index 000000000..d366a6180
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr7503-1.C
@@ -0,0 +1,148 @@
+// PR c++/7503
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+void test1a()
+{
+ int A = 4;
+ int B = 4;
+
+ (A > B ? A : B) = 1;
+ if (A != 4 || B != 1)
+ abort ();
+}
+
+void test1b()
+{
+ int A = 3;
+ int B = 5;
+
+ (A > B ? A : B) = 1;
+ if (A != 3 || B != 1)
+ abort ();
+}
+
+void test1c()
+{
+ int A = 5;
+ int B = 3;
+
+ (A > B ? A : B) = 1;
+ if (A != 1 || B != 3)
+ abort ();
+}
+
+void test2a()
+{
+ int A = 4;
+ int B = 4;
+
+ (A >= B ? A : B) = 1;
+ if (A != 1 || B != 4)
+ abort ();
+}
+
+void test2b()
+{
+ int A = 3;
+ int B = 5;
+
+ (A >= B ? A : B) = 1;
+ if (A != 3 || B != 1)
+ abort ();
+}
+
+void test2c()
+{
+ int A = 5;
+ int B = 3;
+
+ (A >= B ? A : B) = 1;
+ if (A != 1 || B != 3)
+ abort ();
+}
+
+void test3a()
+{
+ int A = 4;
+ int B = 4;
+
+ (A < B ? A : B) = 1;
+ if (A != 4 || B != 1)
+ abort ();
+}
+
+void test3b()
+{
+ int A = 3;
+ int B = 5;
+
+ (A < B ? A : B) = 1;
+ if (A != 1 || B != 5)
+ abort ();
+}
+
+void test3c()
+{
+ int A = 5;
+ int B = 3;
+
+ (A < B ? A : B) = 1;
+ if (A != 5 || B != 1)
+ abort ();
+}
+
+void test4a()
+{
+ int A = 4;
+ int B = 4;
+
+ (A <= B ? A : B) = 1;
+ if (A != 1 || B != 4)
+ abort ();
+}
+
+void test4b()
+{
+ int A = 3;
+ int B = 5;
+
+ (A <= B ? A : B) = 1;
+ if (A != 1 || B != 5)
+ abort ();
+}
+
+void test4c()
+{
+ int A = 5;
+ int B = 3;
+
+ (A <= B ? A : B) = 1;
+ if (A != 5 || B != 1)
+ abort ();
+}
+
+
+int main()
+{
+ test1a();
+ test1b();
+ test1c();
+
+ test2a();
+ test2b();
+ test2c();
+
+ test3a();
+ test3b();
+ test3c();
+
+ test4a();
+ test4b();
+ test4c();
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/preinc1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/preinc1.C
new file mode 100644
index 000000000..89a0116b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/preinc1.C
@@ -0,0 +1,59 @@
+// PR optimization/6086
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct A
+{
+ A (int x, int y);
+ int a, b;
+ int foo () { return a; }
+ int bar () { return b; }
+};
+
+struct B
+{
+ virtual ~B ();
+ virtual A baz () const;
+};
+
+struct C
+{
+ A foo () const;
+ B *c;
+};
+
+A C::foo () const
+{
+ int x, y;
+ x = c->baz ().foo ();
+ y = c->baz ().bar ();
+ return A (x, y);
+}
+
+A B::baz () const
+{
+ return A (4, 8);
+}
+
+A::A (int x, int y)
+{
+ a = x;
+ b = y;
+}
+
+B::~B ()
+{
+}
+
+int
+main ()
+{
+ C the_c;
+ B the_b;
+ the_c.c = &the_b;
+ if (the_c.foo().a != 4)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrintsum1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrintsum1.C
new file mode 100644
index 000000000..a6a3c9727
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrintsum1.C
@@ -0,0 +1,29 @@
+// PR c++/4401
+// This testcase was miscompiled on 64-bit platforms, resulting to
+// operating on a[0x100000000] instead of a[0].
+// { dg-do run }
+// { dg-options "-O2" }
+
+char *a;
+char b[] = "AAAA";
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+void foo (void)
+{
+ unsigned int i, j;
+
+ i = 2;
+ j = 3;
+ a[i + 1 - j] += i;
+}
+
+int main (void)
+{
+ a = b;
+ foo ();
+ if (b[0] != 'A' + 2)
+ abort ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem1.C
new file mode 100644
index 000000000..0a02a53a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem1.C
@@ -0,0 +1,12 @@
+// { dg-options "-O2" }
+
+class QWidget
+{
+ public: void repaint( bool erase = 1 );
+};
+void f (void)
+{
+ typedef void (QWidget::*A)(bool);
+ A b = &QWidget::repaint;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem2.C
new file mode 100644
index 000000000..19c43f7cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem2.C
@@ -0,0 +1,12 @@
+typedef unsigned int Mword;
+struct Thread
+{
+ Mword sys_ipc_log();
+ void hook_ipc_vector();
+ unsigned (Thread::*syscall_table)();
+};
+
+void Thread::hook_ipc_vector()
+{
+ syscall_table = &Thread::sys_ipc_log;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem3.C
new file mode 100644
index 000000000..552a92c9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem3.C
@@ -0,0 +1,23 @@
+// { dg-options "-O1" }
+
+#include <stdio.h>
+struct A {
+ A(int arg) : ia(arg) {}
+ int x,y,z,ia;
+ int mf(int arg) { return arg + ia; }
+};
+int func(int A::*pdm, int (A::*pmf)(int)) // 2. regular function
+{
+ A oa(2);
+ return ((&oa)->*pdm) + (oa.*pmf)(2);
+}
+int main()
+{
+ int val;
+
+ int A::*pda = &A::ia;
+ int (A::*pmfa)(int) = &A::mf;
+ val = func( pda, pmfa );
+ if(val != 6)
+ printf("val=%d, expect 6 \n", val);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem4.C
new file mode 100644
index 000000000..ad39a371b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem4.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct X { void foo (); };
+
+template <typename>
+inline void spawn (void (X::*fun_ptr)()) {}
+
+void bar () {
+ void (X::*const comp)() = &X::foo;
+ spawn<int> (comp);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem5.C
new file mode 100644
index 000000000..639ad2831
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem5.C
@@ -0,0 +1,19 @@
+// PR tree-opt/18904
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct Data;
+struct Wrapper {
+ Data* D;
+};
+struct Data {
+ int X;
+ void init(Wrapper&);
+};
+void Data::init( Wrapper &w ) {
+ int Data::* res = &Data::X;
+ w.D = this;
+ for( int i = 0; i < 4; i++ )
+ (w.D->*res) = 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem6.C
new file mode 100644
index 000000000..891c4ff17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/ptrmem6.C
@@ -0,0 +1,28 @@
+// PR tree-opt/18040
+// { dg-do compile }
+// { dg-options "-O3" }
+
+int PyObject_IsTrue();
+struct object_base
+{
+ void ptr() const;
+ void ptr1() const;
+};
+struct object : public object_base
+{
+ typedef void (object::*bool_type)() const;
+ inline operator bool_type() const
+ { return PyObject_IsTrue()
+ ? &object_base::ptr : &object::ptr1; }
+};
+void f();
+void g (void)
+{
+ for (unsigned n = 0; n < 100; ++n)
+ {
+ object kv;
+ if (kv)
+ f();
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-1.C
new file mode 100644
index 000000000..9015147b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-1.C
@@ -0,0 +1,216 @@
+// Test fold-const.c (fold_range_test) optimizations.
+// { dg-do run } */
+// { dg-options "-O2" } */
+
+#ifndef __RANGE_TEST_HDR_INCL
+#define __RANGE_TEST_HDR_INCL
+/* Protect against fix-header weakness */
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#endif
+
+#if (INT_MAX == 2147483647) && (INT_MIN == -2147483648) \
+ && (SCHAR_MIN == -128) && (SCHAR_MAX == 127) \
+ && (UCHAR_MIN == 0) && (UCHAR_MAX == 255)
+
+#ifndef T
+
+enum integers
+{
+ int_smallest = INT_MIN,
+ int_2ndsmallest = INT_MIN + 1,
+ int_3rdsmallest = INT_MIN + 2,
+ int_minus2 = -2,
+ int_minus1 = -1,
+ int_zero = 0,
+ int_one = 1,
+ int_two = 2,
+ int_3rdlargest = INT_MAX - 2,
+ int_2ndlargest = INT_MAX - 1,
+ int_largest = INT_MAX
+};
+
+enum smallenum
+{
+ smalle_minus4 = -4,
+ smalle_minus3 = -3,
+ smalle_minus2 = -2,
+ smalle_minus1 = -1,
+ smalle_zero = 0,
+ smalle_one = 1,
+ smalle_two = 2,
+ smalle_three = 3
+};
+
+enum enum2
+{
+ enum2_two = 2,
+ enum2_three = 3,
+ enum2_four = 4,
+ enum2_five = 5
+};
+
+enum enum3
+{
+ enum3_zero,
+ enum3_one,
+ enum3_two,
+ enum3_three,
+ enum3_four,
+ enum3_five,
+ enum3_six,
+ enum3_seven
+};
+
+int var;
+void
+check ()
+{
+ ++var;
+}
+
+#define T(IDX, TYPE, TEST, YESARR, NOARR) \
+void __attribute__((noinline)) \
+test##IDX (TYPE x) \
+{ \
+ if (TEST) \
+ check (); \
+}
+#include "range-test-1.C"
+#undef T
+
+int
+main ()
+{
+ int i, fails = 0;
+
+#define C ,
+#define T(IDX, TYPE, TEST, YESARR, NOARR) \
+ { \
+ static TYPE yesarr##IDX [] = YESARR; \
+ static TYPE noarr##IDX [] = NOARR; \
+ for (i = 0; i < (int) (sizeof (yesarr##IDX) / sizeof (TYPE)); ++i) \
+ { \
+ var = 0; \
+ test##IDX (yesarr##IDX [i]); \
+ if (var != 1) \
+ printf ("test" #IDX " failed for yesarr [%u]\n", i), ++fails; \
+ } \
+ var = 0; \
+ for (i = 0; i < (int) (sizeof (noarr##IDX) / sizeof (TYPE)); ++i) \
+ { \
+ test##IDX (noarr##IDX [i]); \
+ if (var != 0) \
+ printf ("test" #IDX " failed for noarr [%u]\n", i), ++fails; \
+ } \
+ }
+#include "range-test-1.C"
+#undef T
+
+ if (fails)
+ abort ();
+
+ exit (0);
+}
+
+#else
+
+/* Use `C' instead of `,' below to separate array entries. */
+
+/* These ought to be all optimized into single comparison. */
+T(1, unsigned int, x == 0 || x == 1,
+ { 0 C 1 }, { -1U C 2 C 12 C 35 C 0x7fffffff C 0x80000000 })
+T(2, unsigned int, x == 0 || x == -1U || x == -2U,
+ { 0 C -1U C -2U }, { -3U C -6U C 1 C 2 C 12 C 35 C 0x7fffffff C 0x80000000 })
+T(3, unsigned int, x == 0 || x == 1 || x == 2,
+ { 0 C 1 C 2 }, { -3U C -6U C -1U C -2U C 12 C 35 C 0x7fffffff C 0x80000000 })
+T(4, unsigned int, x == 3 || x == 4 || x == 5 || x == 6,
+ { 3 C 4 C 5 C 6 }, { -3U C 0 C 1 C 2 C 7 C 8 C 12 C 0x7fffffff C 0x80000000 })
+T(5, unsigned int, x == -3U || x == -4U || x == -5U || x == -6U,
+ { -3U C -4U C -5U C -6U }, { -7U C -8U C -2U C -1U C 1 C 2 C 0x7fffffff C 0x80000000 })
+T(6, unsigned int, x == -3U || x == -4U || x == -5U,
+ { -3U C -4U C -5U }, { -6U C -7U C -8U C -2U C -1U C 1 C 2 C 0x7fffffff C 0x80000000 })
+T(7, char *, x == (char *) -3UL || x == (char *) -4UL || x == (char *) -5UL,
+ { (char *) -3UL C (char *) -4UL C (char *) -5UL },
+ { (char *) -6UL C (char *) -20UL C (char *) -2UL C (char *) -1UL C (char *) 0
+ C (char *) 1UL C (char *) 35UL C (char *) 0x7fffffffUL C (char *) 0x80000000UL })
+T(8, unsigned long, x == -2UL || x == -1UL || x == 0,
+ { 0 C -1UL C -2UL }, { -3UL C -6UL C 1 C 2 C 12 C 35 C 0x7fffffff C 0x80000000 })
+T(9, unsigned long, x >= -4UL || x <= 8,
+ { -4UL C -3UL C -2UL C -1UL C 0 C 1 C 2 C 3 C 4 C 5 C 6 C 7 C 8 },
+ { -7UL C -5UL C 9 C 10 C 61 C 127 C 0x7fffffff C 0x80000000 })
+T(10, signed char, x == 0 || x == -1 || x == -2 || x == -3,
+ { 0 C -1 C -2 C -3 }, { -4 C -5 C 1 C 2 C 3 C 35 C -24 })
+T(11, int, x == 0 || x == 1,
+ { 0 C 1 }, { -1 C 2 C 12 C 35 C INT_MAX C INT_MIN })
+T(12, int, x == 0 || x == -1 || x == -2,
+ { 0 C -1 C -2 }, { -3 C -6 C 1 C 2 C 12 C 35 C INT_MAX C INT_MIN })
+T(13, int, x == 0 || x == 1 || x == 2,
+ { 0 C 1 C 2 }, { -3 C -6 C -1 C -2 C 12 C 35 C INT_MAX C INT_MIN })
+T(14, int, x == 3 || x == 4 || x == 5 || x == 6,
+ { 3 C 4 C 5 C 6 }, { -3 C 0 C 1 C 2 C 7 C 8 C 12 C INT_MAX C INT_MIN })
+T(15, int, x == -3 || x == -4 || x == -5 || x == -6,
+ { -3 C -4 C -5 C -6 }, { -7 C -8 C -2 C -1 C 1 C 2 C INT_MAX C INT_MIN })
+T(16, int, x == -3 || x == -4 || x == -5,
+ { -3 C -4 C -5 }, { -6 C -7 C -8 C -2 C -1 C 1 C 2 C INT_MAX C INT_MIN })
+T(17, unsigned int, (x >= -8U && x <= -3U) || x == -2U || x == -1U || x == 0 || x == 1 || x == 2,
+ { -8U C -7U C -6U C -5U C -4U C -3U C -2U C -1U C 0 C 1 C 2 },
+ { -9U C -10U C 3 C 4 C 12 C -54U C INT_MAX C (unsigned int)INT_MIN })
+T(18, int, (x >= -8 && x <= -3) || x == -2 || x == -1 || x == 0 || x == 1 || x == 2,
+ { -8 C -7 C -6 C -5 C -4 C -3 C -2 C -1 C 0 C 1 C 2 },
+ { -9 C -10 C 3 C 4 C 12 C -54 C INT_MAX C INT_MIN })
+T(19, unsigned long, x <= 16 || (x >= 18 && x <= -1UL),
+ { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 18 C 19 C 35 C 0x7fffffff
+ C 0x80000000 }, { 17 })
+T(20, char *, x == (char *) -1UL || x == 0,
+ { (char *) -1UL C 0 }, { (char *) -6UL C (char *) -20UL C (char *) -2UL
+ C (char *) 1UL C (char *) 35UL C (char *) 0x7fffffffUL C (char *) 0x80000000UL })
+T(21, integers, x == int_zero || x == int_one,
+ { int_zero C int_one }, { int_minus1 C int_two C int_largest C int_smallest })
+T(22, int, x == INT_MIN || x == INT_MAX,
+ { INT_MIN C INT_MAX },
+ { -1 C 0 C 1 C INT_MAX - 1 C INT_MAX - 2 C INT_MIN + 1 C INT_MIN + 2 })
+T(23, int, x == INT_MIN + 1 || x == INT_MIN + 2 || x == INT_MIN || x == INT_MAX,
+ { INT_MIN + 1 C INT_MIN + 2 C INT_MIN C INT_MAX },
+ { -1 C 0 C 1 C INT_MAX - 1 C INT_MAX - 2 C INT_MIN + 3 C INT_MIN + 4 })
+T(24, signed char, x == SCHAR_MIN || x == SCHAR_MAX,
+ { SCHAR_MIN C SCHAR_MAX },
+ { -1 C 0 C 1 C SCHAR_MAX - 1 C SCHAR_MAX - 2 C SCHAR_MIN + 1 C SCHAR_MIN + 2 })
+T(25, integers, x == int_smallest || x == int_largest,
+ { int_smallest C int_largest }, { int_minus1 C int_zero C int_one
+ C int_2ndsmallest C int_2ndlargest C int_3rdsmallest C int_3rdlargest })
+
+/* These should be optimized into unconditional jumps. */
+T(o1, unsigned long, x <= 16 || (x >= 17 && x <= -1UL),
+ { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 17 C 18 C 19 C 35 C 0x7fffffff
+ C 0x80000000 }, { })
+T(o2, unsigned long, x <= -3UL || (x == -2UL || x == -1UL),
+ { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 17 C 18 C 19 C 35 C 0x7fffffff
+ C 0x80000000 }, { })
+
+/* These should be eventually optimized into a single comparison. */
+T(td1, unsigned char, x == 0 || x == 4 || x == 1 || x == 5 || x == 2 || x == 6 || x == 3,
+ { 0 C 1 C 2 C 3 C 4 C 5 C 6 }, { 7 C 8 C 127 C 128 C 254 C 255 })
+
+/* These should not be optimized into a single comparison. */
+T(n1, smallenum, x == smalle_minus4 || x == smalle_three,
+ { smalle_minus4 C smalle_three }, { smalle_minus3 C smalle_minus2 C smalle_minus1
+ C smalle_zero C smalle_one C smalle_two })
+T(n2, enum2, x == enum2_two || x == enum2_five,
+ { enum2_two C enum2_five }, { enum2_three C enum2_four })
+T(n3, enum3, x == enum3_zero || x == enum3_seven,
+ { enum3_zero C enum3_seven }, { enum3_one C enum3_two C enum3_three C enum3_four
+ C enum3_five C enum3_six })
+
+#endif
+
+#else
+
+int
+main (void)
+{
+ return 0;
+}
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-2.C
new file mode 100644
index 000000000..05690bfd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/range-test-2.C
@@ -0,0 +1,96 @@
+// Test fold-const.c (fold_range_test) optimizations.
+// { dg-do run } */
+// { dg-options "-O2" } */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+
+#if (INT_MAX == 2147483647) && (INT_MIN == -2147483648) \
+ && (SCHAR_MIN == -128) && (SCHAR_MAX == 127) \
+ && (UCHAR_MIN == 0) && (UCHAR_MAX == 255)
+
+#ifndef T
+
+enum enum3
+{
+ enum3_zero,
+ enum3_one,
+ enum3_two,
+ enum3_three,
+ enum3_four,
+ enum3_five,
+ enum3_six,
+ enum3_seven
+};
+
+int var;
+void
+check ()
+{
+ ++var;
+}
+
+#define T(IDX, TYPE, TEST, YESARR, NOARR) \
+void __attribute__((noinline)) \
+test##IDX (TYPE x) \
+{ \
+ if (TEST) \
+ check (); \
+}
+#include "range-test-2.C"
+#undef T
+
+int
+main ()
+{
+ int i, fails = 0;
+
+#define C ,
+#define T(IDX, TYPE, TEST, YESARR, NOARR) \
+ { \
+ static TYPE yesarr##IDX [] = YESARR; \
+ static TYPE noarr##IDX [] = NOARR; \
+ for (i = 0; i < (int) (sizeof (yesarr##IDX) / sizeof (TYPE)); ++i) \
+ { \
+ var = 0; \
+ test##IDX (yesarr##IDX [i]); \
+ if (var != 1) \
+ printf ("test" #IDX " failed for yesarr [%u]\n", i), ++fails; \
+ } \
+ var = 0; \
+ for (i = 0; i < (int) (sizeof (noarr##IDX) / sizeof (TYPE)); ++i) \
+ { \
+ test##IDX (noarr##IDX [i]); \
+ if (var != 0) \
+ printf ("test" #IDX " failed for noarr [%u]\n", i), ++fails; \
+ } \
+ }
+#include "range-test-2.C"
+#undef T
+
+ if (fails)
+ abort ();
+
+ exit (0);
+}
+
+#else
+
+/* Use `C' instead of `,' below to separate array entries. */
+
+T(26, enum3, x == enum3_one || x == enum3_two || x == enum3_three,
+ { enum3_one C enum3_two C enum3_three }, { enum3_zero C enum3_four
+ C enum3_five C enum3_six C enum3_seven })
+
+#endif
+
+#else
+
+int
+main (void)
+{
+ return 0;
+}
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack.C
new file mode 100644
index 000000000..76d3cee1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack.C
@@ -0,0 +1,47 @@
+// PR target/6087
+// The code that moves around insns emitted by reg-stack to cope with
+// exception edges lost the REG_DEAD note indicating a pop. Which
+// eventually fills up the register stack resulting in Z == NaN.
+
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort ();
+
+struct Base
+{
+ virtual ~Base() {}
+};
+
+struct Foo : public Base
+{
+ Foo ();
+};
+
+double x = 3;
+double y = 4;
+
+double bar ()
+{
+ double z = x*x+y*y;
+ if (z != 25.0)
+ throw 1;
+ return z;
+}
+
+Foo::Foo ()
+{
+ bar ();
+}
+
+int main ()
+{
+ try {
+ int i;
+ for (i = 0; i < 10; ++i)
+ new Foo;
+ } catch (...) {
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack2.C
new file mode 100644
index 000000000..08cd590b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack2.C
@@ -0,0 +1,34 @@
+// PR target/9786
+// Origin: <nick@ilm.com>
+
+// This used to fail on x86 because the reg-stack pass deleted
+// an insn that could seemingly trap (but actually doesn't)
+// without updating the CFG.
+
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+struct D1 {
+ float l;
+ D1 GS() const {D1 d;float f=.299*l;d.l=f;return d;}
+ static D1 G() {return D1();}
+};
+
+struct D2 {
+ D1 g;
+ D2(const D1& gi) : g(gi) {}
+ D2 GS() const {return D2(g.GS());}
+};
+
+class A {
+ public:
+ virtual ~A() {}
+};
+
+class B : public A {
+ public:
+ B(const D2& mi);
+ D2 fm;
+};
+
+B::B(const D2 &mi) : fm(mi.GS()) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack3.C
new file mode 100644
index 000000000..48dcb335b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack3.C
@@ -0,0 +1,21 @@
+// PR target/12712
+// Origin: Markus Schoder <gccbug@gammarayburst.de>
+
+// This used to segfault on x86 because the reg-stack pass
+// created an unreachable basic block by purging an outgoing
+// edge, and was not prepared to handle it.
+
+// { dg-do compile }
+
+struct A
+{
+ ~A();
+ float f(float x);
+ float g() const {return 0;}
+};
+
+void h()
+{
+ A a, b;
+ a.f(b.g() + 1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack4.C
new file mode 100644
index 000000000..5707a38ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reg-stack4.C
@@ -0,0 +1,29 @@
+// PR target/12900
+// Origin: <snyder@fnal.gov>
+
+// This used to fail on x86 because the reg-stack pass
+// deleted a valid edge.
+
+// { dg-do compile }
+// { dg-options "-mtune=i586 -O2" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+struct array {
+ double data;
+ virtual ~array();
+};
+
+double glob;
+double ext1(double);
+int nmuons;
+
+void track_match()
+{
+ array vecdca;
+ if (glob < 10) return;
+ double p = glob*5;
+ double phi = vecdca.data;
+ ext1 (vecdca.data-glob);
+ ext1 (phi*2);
+ if (1 < p)
+ ++nmuons;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reload1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload1.C
new file mode 100644
index 000000000..0d8fb894e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload1.C
@@ -0,0 +1,43 @@
+// PR 7944
+// { dg-do compile }
+// { dg-options -O2 }
+
+struct B
+{
+ B & operator << (short s)
+ {
+ int j;
+ if (j)
+ return operator << (s);
+ else
+ return operator << (s);
+ }
+};
+
+struct A
+{
+ int i;
+ static void bar ();
+ static int quux ()
+ {
+ bar ();
+ return 0;
+ }
+
+ A ():i (quux ())
+ {
+ }
+ ~A ()
+ {
+ }
+};
+
+void
+foo ()
+{
+ short s[4] = { 0, 0, 0, 1 };
+ A a[2] = { A (), A () };
+
+ B b;
+ b << s[0] << s[2];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reload2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload2.C
new file mode 100644
index 000000000..1af8aea65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload2.C
@@ -0,0 +1,42 @@
+// PR 10352
+// { dg-do compile }
+// { dg-options -O2 }
+
+extern double fabs(double x);
+
+typedef struct { float x, y; } S;
+typedef struct _T T;
+
+extern void fT( T *p );
+extern T *h();
+extern S g( );
+
+static
+int f(void)
+{
+ T *t=0;
+ int c=0;
+ S s;
+
+ const S exp_s = {0.,0.};
+
+ if(!(t = h()))
+ {
+ c++;
+ }
+
+ if(!c)
+ {
+ s = g();
+ if( (fabs( (s.x) - (exp_s.x) ) > 1 )
+ || (fabs( (s.y) - (exp_s.y) ) > 1 ) )
+ {
+ c++;
+ }
+ }
+
+ if(t)
+ fT(t);
+
+ return c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/reload3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload3.C
new file mode 100644
index 000000000..12f3e66f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/reload3.C
@@ -0,0 +1,39 @@
+// PR target/38287
+// { dg-do run }
+// { dg-options "-O2 -mcpu=v8 -fPIC" { target { { sparc*-*-* } && { ilp32 && fpic } } } }
+
+#include <cstdlib>
+
+class QTime
+{
+public:
+ explicit QTime(int ms = 0) : ds(ms) {}
+ static QTime currentTime() { return QTime(); }
+ QTime addMSecs(int ms) const;
+ int msecs() const { return ds; }
+private:
+ unsigned ds;
+};
+
+static const unsigned MSECS_PER_DAY = 86400000;
+
+QTime QTime::addMSecs(int ms) const
+{
+ QTime t;
+ if ( ms < 0 ) {
+ // % not well-defined for -ve, but / is.
+ int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY;
+ t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY)
+ % MSECS_PER_DAY;
+ } else {
+ t.ds = ((int)ds + ms) % MSECS_PER_DAY;
+ }
+ return t;
+}
+
+int main()
+{
+ if (QTime(1).addMSecs(1).msecs() != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/return-slot1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/return-slot1.C
new file mode 100644
index 000000000..fcc6cea5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/return-slot1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ A();
+ virtual A foo() const;
+};
+
+void bar()
+{
+ const A& a=A();
+ a.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti1.C
new file mode 100644
index 000000000..32daaefa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti1.C
@@ -0,0 +1,20 @@
+// Test that typeid sees through references even when optimizing.
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <typeinfo>
+
+struct A
+{
+ virtual ~A() { }
+};
+
+class B : public A { };
+
+int main ()
+{
+ B b;
+ A &aref = b;
+
+ return typeid (aref) != typeid (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti2.C
new file mode 100644
index 000000000..ebbe3cdfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/rtti2.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+// We used to ICE in compare_values as the types for a comparison
+// were not the same kind of types.
+
+struct class1
+{
+ virtual ~class1 ();
+};
+struct class2 : class1 { };
+
+void f(class1 * oo)
+{
+ class2 * oj = dynamic_cast <class2 *>(oo) ;
+ if (oj)
+ delete oo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/stack1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/stack1.C
new file mode 100644
index 000000000..7fac18dac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/stack1.C
@@ -0,0 +1,135 @@
+// PR optimization/11198
+// Origin: Joerg Walter <jhr.walter@t-online.de>
+// Reduced testcase by: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// The compiler used to allocate the same stack slot for two aggregates,
+// overlooking that assignments to members given the same address on the
+// stack may not alias and thus may be reordered by the scheduling passes.
+
+// { dg-do run }
+// { dg-options "-O2 -frename-registers" }
+
+
+double zero_;
+
+inline const int&
+min(const int& a, const int& b) {
+ if (b < a) return b; return a;
+}
+
+struct barrier { barrier () {} };
+
+template <typename=void> struct unbounded_array {
+ inline unbounded_array (): data_ (new double [9]) {}
+ inline double& operator [] (int i) { return data_ [i]; }
+ double* data_;
+};
+
+inline int element (int i, int j) {
+ return i + j;
+}
+
+template <typename=void>
+struct matrix {
+ inline matrix () : size2_ (3) {}
+
+ inline unbounded_array<> &data () { return data_; }
+
+ inline double& el (int i, int j) {
+ int dead1 = j;
+ int dead2 = 1 + i - j;
+ if (j < size2_ && i-j < 2)
+ return data () [element (j,i-j+1)];
+ barrier ();
+ return zero_;
+ }
+
+ struct iterator2;
+
+ inline iterator2 find () {
+ return iterator2 (*this);
+ }
+
+ struct iterator1 {
+ inline iterator1 (matrix *m):
+ dead1 (m), i (0) {}
+ void *dead1;
+ int i;
+ int dead2;
+ };
+
+ const int size2_;
+ unbounded_array<> data_;
+};
+
+
+template<typename=void>
+struct adaptor {
+ adaptor (matrix<> &m) : m(&m), upper_ (1) {}
+
+ int size1 () const;
+ int size2 () const { return 3; }
+ int lower () const { return 1; }
+ int upper () const { return upper_; }
+ matrix<> &data () { return *m; }
+
+ double& el (int i, int j) {
+ int dead1, dead2;
+ if (j < size2 () && i-j < 1)
+ return data ().el (i, j);
+
+ barrier ();
+ return zero_;
+ }
+
+ struct a_iterator2;
+
+ struct a_iterator1 {
+ a_iterator1 (adaptor &a, const matrix<>::iterator1 &it1):
+ a (&a), dead1 (it1) {}
+
+ a_iterator2 begin () const {
+ return a_iterator2(*a);
+ }
+ adaptor *a;
+ matrix<>::iterator1 dead1;
+ };
+
+ struct a_iterator2 {
+ a_iterator2 (adaptor &a) : a (&a) {}
+
+ double& f () const {
+ int i = 0;
+ int l = a->upper () + i;
+ int q = a->size2 ();
+ if (0 < q &&
+ l < a->lower () + 1 + a->upper ())
+ return a->m->el(0,0);
+
+ return a->el (i, 0);
+ }
+
+ adaptor *a;
+ };
+
+ matrix<> *m;
+ int upper_;
+};
+
+void matrix_swap (adaptor<> &bam1, adaptor<> &bam2)
+{
+ adaptor<>::a_iterator1 it1 (bam1,matrix<>::iterator1(bam1.m)),
+ it2 (bam2,matrix<>::iterator1(bam2.m));
+ int dead;
+ double x = it1.begin().f();
+ it2.begin().f() = x;
+}
+
+int main ()
+{
+ matrix<> m1,m2;
+ adaptor<> bam1 (m1), bam2 (m2);
+ matrix_swap (bam1, bam2);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/stack2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/stack2.C
new file mode 100644
index 000000000..8468e1a68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/stack2.C
@@ -0,0 +1,33 @@
+// PR c++/51060
+// { dg-options "-Os -Wframe-larger-than=2000 -Werror" }
+
+// Shows a problem of not re-using stack space:
+// Compile as: g++ -c test_stack_reuse.cpp -o /dev/null -Wframe-larger-than=2048 -Werror -Os
+// Result: warning: the frame size of 10240 bytes is larger than 2048 bytes [-Wframe-larger-than=]
+//
+
+struct StackObject
+{
+ StackObject();
+ char buffer[1024];
+};
+
+void Test()
+{
+#define TEST_SUB() \
+ StackObject();
+
+#define TEST() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB() \
+ TEST_SUB()
+
+ TEST()
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static1.C
new file mode 100644
index 000000000..05429e18b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static1.C
@@ -0,0 +1,20 @@
+// PR c++/6073
+// This testcase ICEd because finish_struct_bits changed
+// A's and const A's TYPE_MODE from QI to BLK, but did
+// not change a's DECL_MODE because its mode was not
+// TYPE_MAIN_VARIANT.
+
+struct A
+{
+ static const A a;
+ ~A ();
+};
+
+void bar (A x);
+void foo ();
+
+void
+foo ()
+{
+ bar (A::a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static2.C
new file mode 100644
index 000000000..e2ecd13c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static2.C
@@ -0,0 +1,13 @@
+// Origin: reichelt@igpm.rwth-aachen.de
+// PR 5571
+// { dg-options "-O2" }
+
+template <class T> struct A {};
+
+struct B
+{
+ static A<int> a;
+ void f() { a; }
+};
+
+A<int> B::a = A<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static3.C
new file mode 100644
index 000000000..4f8f7a9ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static3.C
@@ -0,0 +1,36 @@
+// { dg-do link }
+// { dg-options "-O2" }
+
+class Foo {
+public:
+ // No out-of-class definition is provided for these class members.
+ // That's technically a violation of the standard, but no diagnostic
+ // is required, and, as a QOI issue, we should optimize away all
+ // references.
+ static const int erf = 0;
+ static const int foo = 1;
+};
+
+int one()
+{
+ return Foo::foo;
+}
+
+int two()
+{
+ return Foo::foo + Foo::erf;
+}
+
+int three(int x)
+{
+ return x ? Foo::erf : Foo::foo;
+}
+
+int i;
+
+int main ()
+{
+ one ();
+ two ();
+ three (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static4.C
new file mode 100644
index 000000000..87e11b027
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static4.C
@@ -0,0 +1,15 @@
+// PR 13898
+// Make sure the two X variables get assigned unique assembler names
+// if they are promoted to static storage.
+
+// { dg-do compile }
+
+int g(int i) {
+ if (i<1) {
+ const int x[3] = { 1,2,3 };
+ return x[i];
+ } else {
+ const int x[3] = { 4,5,6 };
+ return x[i];
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static5.C
new file mode 100644
index 000000000..1daca6d71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static5.C
@@ -0,0 +1,29 @@
+// PR c++/31809
+// { dg-do run }
+// { dg-options "-O2" }
+
+struct S
+{
+ unsigned v;
+ static inline S f (unsigned a);
+};
+
+inline S
+S::f (unsigned a)
+{
+ static S t = { a };
+ return t;
+}
+
+const static S s = S::f (26);
+
+extern "C" void abort (void);
+
+int
+main ()
+{
+ S t = s;
+ if (t.v != 26)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/static6.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/static6.C
new file mode 100644
index 000000000..00e76fb73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/static6.C
@@ -0,0 +1,35 @@
+// PR c++/31806
+// { dg-do run }
+// { dg-options "-O2 -fno-inline -fno-threadsafe-statics" }
+
+extern "C" void abort(void);
+
+struct A
+{
+ void *d;
+};
+
+static const A& staticA()
+{
+ static A s_static;
+ return s_static;
+}
+
+void assert_failed()
+{
+ abort();
+}
+
+A testMethod()
+{
+ static const A& s = staticA( );
+ if (&s == 0)
+ assert_failed();
+ return s;
+}
+
+int main()
+{
+ testMethod();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/strength-reduce.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/strength-reduce.C
new file mode 100644
index 000000000..3fee937f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/strength-reduce.C
@@ -0,0 +1,51 @@
+// This testcase was miscompiled on s390x, because strength-reduction
+// did not see biv in C::foo as used after loop, but it was used
+// in a REG_EQUAL note.
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort (void);
+
+struct C
+{
+ int foo (char ch, int offset = __INT_MAX__) const;
+ int bar (int offset, char c) const;
+ const char *a;
+};
+
+int C::bar (int offset, char c) const
+{
+ char ch = a[offset];
+ if (ch < c)
+ return -1;
+ if (ch > c)
+ return 1;
+ return 0;
+}
+
+int C::foo (char ch, int offset) const
+{
+ int len = __builtin_strlen (a);
+ if (len == 0)
+ return __INT_MAX__;
+ if (offset >= len)
+ offset = len - 1;
+
+ while (bar (offset, ch) != 0)
+ {
+ if (offset == 0)
+ return __INT_MAX__;
+ offset--;
+ }
+
+ return offset;
+}
+
+int main (void)
+{
+ C c;
+ c.a = "/some/dir/file.ext";
+ if (c.foo ('/') != 9)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/switch1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch1.C
new file mode 100644
index 000000000..c21630d75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch1.C
@@ -0,0 +1,23 @@
+// { dg-options "-O1" }
+
+template <typename T>
+int f(T t) {
+ switch (t) {
+ case 1:
+ return 5;
+ case 2:
+ return 6;
+ case 3:
+ return -4;
+ case 4:
+ return 8;
+ case 5:
+ return 12;
+ case 6:
+ return 13;
+ default:
+ return -27;
+ }
+}
+
+template int f(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/switch2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch2.C
new file mode 100644
index 000000000..f7374cb74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch2.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-O2 -w" }
+
+extern int foo (int);
+
+void
+bar (void)
+{
+ char tmp = foo (0);
+ switch (tmp)
+ {
+ case 1: foo (1); break;
+ case 2: foo (2); break;
+ case 3: foo (3); break;
+ case 4: foo (4); break;
+ case 5: foo (5); break;
+ case 6: foo (6); break;
+ case 7: foo (7); break;
+ case 255: foo (8); break;
+ default: break;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/switch3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch3.C
new file mode 100644
index 000000000..643cac323
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch3.C
@@ -0,0 +1,16 @@
+// PR c++/20023
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void f (void);
+typedef __SIZE_TYPE__ size_t;
+void g (void *a)
+{
+ size_t b = (size_t) a;
+ switch (b)
+ {
+ case 1:
+ f ();
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/switch4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch4.C
new file mode 100644
index 000000000..1542f310c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/switch4.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-fshort-enums -w" }
+
+// PR c++/20008
+
+// We failed to compile this because CFG cleanup left the switch
+// statement intact, whereas expand_case expected at least one
+// in-range case to remain.
+
+typedef enum _SECStatus {
+ SECWouldBlock = -2,
+ SECFailure = -1,
+ SECSuccess = 0
+} SECStatus;
+
+typedef enum {
+ SEC_ERROR_BAD_SIGNATURE = (-0x2000) + 10
+} SECErrorCodes;
+
+void g(void);
+void f(SECStatus status)
+{
+ switch( status )
+ {
+ case SEC_ERROR_BAD_SIGNATURE :
+ // This case can be optimized away in C++ (but apparently not in
+ // C), because the enum type is defined with a narrow range.
+ g();
+ break ;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/temp1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/temp1.C
new file mode 100644
index 000000000..dc13f5162
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/temp1.C
@@ -0,0 +1,50 @@
+// PR c++/16405
+// { dg-options "-O2" }
+// { dg-do run }
+
+// There should be exactly one temporary generated for the code in "f"
+// below when optimizing -- for the result of "b + c". We have no
+// easy way of checking that directly, so we count the number of calls
+// to "memcpy", which is used on (some?) targets to copy temporaries.
+// If there is more than two calls (one for coping "*this" to "t", and
+// one for copying the temporary to "a"), then there are too many
+// temporaries.
+
+int i;
+
+extern "C"
+void *memcpy (void *dest, const void *src, __SIZE_TYPE__ n)
+{
+ char *d = (char *) dest;
+ const char *s = (const char *) src;
+ while (n--)
+ d[n] = s[n];
+ ++i;
+ return dest;
+}
+
+struct T {
+#ifdef __SPU__
+ /* SPU returns aggregates up to 1172 bytes in registers. */
+ int a[300];
+#else
+ int a[128];
+#endif
+ T &operator+=(T const &v) __attribute__((noinline));
+ T operator+(T const &v) const { T t = *this; t += v; return t; }
+};
+
+T &T::operator+=(T const &v) {
+ return *this;
+}
+
+T a, b, c;
+
+void f() { a = b + c; }
+
+int main () {
+ i = 0;
+ f();
+ if (i > 2)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/temp2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/temp2.C
new file mode 100644
index 000000000..35520a242
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/temp2.C
@@ -0,0 +1,62 @@
+// { dg-do run }
+
+// Copyright (C) 2006 Free Software Foundation, Inc.
+
+// Originally from PR 16681, found also in init/array15.C
+// This variant of the testcase verifies that we do not create
+// a temporary on the stack, which is PR 27620.
+
+int i;
+
+extern "C"
+void *memcpy (void *dest, const void *src, __SIZE_TYPE__ n)
+{
+ char *d = (char *) dest;
+ const char *s = (const char *) src;
+ while (n--)
+ d[n] = s[n];
+ ++i;
+ return dest;
+}
+
+struct foo {
+ unsigned char buffer[41112];
+ foo() ;
+ bool check () const;
+};
+
+foo::foo ()
+ : buffer()
+{}
+
+bool foo::check () const
+{
+ for (unsigned ix = sizeof (buffer); ix--;)
+ if (buffer[ix])
+ return false;
+ return true;
+}
+
+void *operator new (__SIZE_TYPE__ size, void *p)
+{
+ return p;
+}
+
+char heap[50000];
+
+int main ()
+{
+ for (unsigned ix = sizeof (heap); ix--;)
+ heap[ix] = ix;
+
+ i = 0;
+ foo *f = new (heap) foo ();
+
+ if (i != 0)
+ return 1;
+ if (!f->check ())
+ return 1;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/template1.C
new file mode 100644
index 000000000..f25434693
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/template1.C
@@ -0,0 +1,19 @@
+// { dg-options "-O2" }
+// { dg-final { scan-assembler-not "\n_?_ZN1AILi0EE4foo1Ev\[: \t\n\]" } }
+
+template <int>
+struct A {
+ void foo1 () throw ();
+ void foo2 ();
+
+ void UNRELATED ();
+};
+
+template <> void A<0>::UNRELATED ();
+
+template <int dim> inline void A<dim>::foo1 () throw () {}
+template <int dim> inline void A<dim>::foo2 () {}
+
+void bar (A<0> &a) {
+ a.foo1 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk1.C
new file mode 100644
index 000000000..566c0f2fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk1.C
@@ -0,0 +1,42 @@
+// PR 6788
+// Test that the thunk adjusts the this pointer properly.
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct A
+{
+ virtual void foo() = 0;
+ char large[33*1024];
+};
+
+struct B
+{
+ virtual void foo() = 0;
+};
+
+struct C : public A, public B
+{
+ virtual void foo();
+};
+
+static C *match;
+
+void C::foo()
+{
+ if (this != match)
+ abort ();
+}
+
+void bar(B *x)
+{
+ x->foo();
+}
+
+int main()
+{
+ C obj;
+ match = &obj;
+ bar(&obj);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk2.C
new file mode 100644
index 000000000..52fcd74bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk2.C
@@ -0,0 +1,44 @@
+// PR c++/20206
+// { dg-do run }
+// { dg-options "-O0" }
+
+void
+bar (int x)
+{
+ asm ("" : : "g" (x));
+}
+
+struct S { S () {}; virtual ~S () {}; };
+struct T { virtual void foo (int) = 0; };
+struct U : public S, public T
+{
+ bool a;
+ U () {}
+ virtual ~U () {}
+ virtual void foo (int x)
+ {
+ switch (x)
+ {
+ case 12:
+ break;
+ case 9:
+ bar (7);
+ break;
+ case 10:
+ bar (12);
+ break;
+ case 4:
+ bar (18);
+ break;
+ case 2:
+ bar (26);
+ break;
+ }
+ }
+};
+U u;
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3-1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3-1.C
new file mode 100644
index 000000000..c540b0fa2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3-1.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "-O1" }
+struct Foo { };
+struct Bar { virtual ~Bar(); };
+struct Baz: public virtual Bar { virtual void Func (Foo); };
+void unused() { Baz().Func(Foo()); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3.C
new file mode 100644
index 000000000..bfd68744a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk3.C
@@ -0,0 +1,48 @@
+// PR c++/39106
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+struct A
+{
+ A (bool x = true);
+};
+class B
+{
+ virtual bool bar (A &, int) const =0;
+};
+class C : virtual public B
+{
+};
+struct D : virtual public B
+{
+ bool bar (A &, int) const;
+};
+template <int N>
+struct E : public D
+{
+ bool bar (A &x, int y) const
+ {
+ return baz().bar (x, y);
+ }
+ const D & baz () const;
+};
+extern template class E<0>;
+
+void
+foo ()
+{
+ try
+ {
+ A a;
+ abort ();
+ } catch (...)
+ {
+ }
+ A b;
+ E<0> c;
+ c.bar (b, 3);
+ E<0> d;
+ d.bar (b, 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk4.C
new file mode 100644
index 000000000..7dd5ea433
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/thunk4.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+// { dg-options "-O1" }
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < class _CharT > struct char_traits;
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT > >class basic_iostream;
+}
+
+extern "C++"
+{
+ namespace std
+ {
+ class exception
+ {
+ public:exception () throw ()
+ {
+ }
+ };
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ class ios_base
+ {
+ public:class failure:public exception
+ {
+ };
+ virtual ~ ios_base ();
+ };
+template < typename _CharT, typename _Traits > class basic_ios:public
+ ios_base
+ {
+ };
+template < typename _CharT, typename _Traits > class basic_ostream:virtual public basic_ios < _CharT,
+ _Traits
+ >
+ {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+template < typename _CharT, typename _Traits > class basic_istream:virtual public basic_ios < _CharT,
+ _Traits
+ >
+ {
+ };
+template < typename _CharT, typename _Traits > class basic_iostream:public basic_istream < _CharT, _Traits >, public basic_ostream < _CharT,
+ _Traits
+ >
+ {
+ };
+ class strstream:public basic_iostream < char >
+ {
+ virtual ~ strstream ();
+ };
+ strstream::~strstream ()
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/tmp1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/tmp1.C
new file mode 100644
index 000000000..21665335e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/tmp1.C
@@ -0,0 +1,48 @@
+// { dg-do run }
+
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com>
+
+// compound exprs were causing additional temporaries.
+
+extern "C" int printf (char const *, ...);
+extern "C" void abort ();
+
+
+static unsigned order[] =
+{
+ 1, 2, 502, 102, 101,
+ 0
+};
+
+static unsigned point;
+
+static void Check (unsigned t, unsigned i, void const *ptr, char const *name)
+{
+ printf ("%d %d %p %s\n", t, i, ptr, name);
+
+ if (order[point++] != i + t)
+ abort ();
+
+}
+
+template <int I> struct A
+{
+ A () { Check (0, I, this, __PRETTY_FUNCTION__); }
+ ~A () { Check (100, I, this, __PRETTY_FUNCTION__); }
+ A (A const &) { Check (200, I, this, __PRETTY_FUNCTION__); }
+ A &operator= (A const &) { Check (300, I, this, __PRETTY_FUNCTION__); }
+ void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); }
+};
+
+template <int I> void Foo (A<I> a)
+{
+ Check (500, I, &a, __PRETTY_FUNCTION__);
+}
+
+int main ()
+{
+ Foo ((A<1> (), A<2> ()));
+ Check (0, 0, 0, "end");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll1.C
new file mode 100644
index 000000000..fd07f889a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll1.C
@@ -0,0 +1,420 @@
+// PR optimization/12340
+// Origin: Richard Guenther <richard.guenther@uni-tuebingen.de>
+// Testcase by Eric Botcazou <ebotcazou@libertysurf.fr>
+
+// This used to segfault on x86 because the loop optimizer wrongly
+// interpreted a double assignment to a biv as a double increment,
+// which subsequently fooled the unroller.
+
+// { dg-do run }
+// { dg-options "-O2 -fno-exceptions -funroll-loops" }
+
+typedef __SIZE_TYPE__ size_t;
+
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { };
+
+class Loc;
+class Interval;
+
+template<class DT>
+class DomainBase
+{
+public:
+ typedef typename DT::Domain_t Domain_t;
+ typedef typename DT::Storage_t Storage_t;
+
+ Domain_t &unwrap() { return *static_cast<Domain_t *>(this); }
+
+ const Domain_t &unwrap() const {
+ return *static_cast<Domain_t *>(const_cast<DomainBase<DT> *>(this));
+ }
+
+protected:
+ Storage_t domain_m;
+};
+
+template<class DT>
+class Domain : public DomainBase<DT>
+{
+ typedef DomainBase<DT> Base_t;
+
+public:
+ typedef typename DT::Size_t Size_t;
+ typedef typename DT::Element_t Element_t;
+ typedef typename Base_t::Domain_t Domain_t;
+ typedef typename Base_t::Storage_t Storage_t;
+
+ Domain_t &operator[](int) { return this->unwrap(); }
+
+ const Domain_t &operator[](int) const { return this->unwrap(); }
+
+ template<class T>
+ void setDomain(const T &newdom) {
+ DT::setDomain(this->domain_m, newdom);
+ }
+
+ Element_t first() const { return DT::first(this->domain_m); }
+
+ Size_t length() const { return DT::length(this->domain_m); }
+
+ Size_t size() const { return length(); }
+};
+
+template<class T>
+struct DomainTraits;
+
+template<>
+struct DomainTraits<Interval>
+{
+ typedef int Size_t;
+ typedef int Element_t;
+ typedef Interval Domain_t;
+ typedef Interval OneDomain_t;
+ typedef Loc AskDomain_t;
+ typedef int Storage_t[2];
+ enum { dimensions = 1 };
+ enum { wildcard = false };
+
+ static int first(const Storage_t &d) { return d[0]; }
+
+ static int length(const Storage_t &d) { return d[1]; }
+
+ static OneDomain_t &getDomain(Domain_t &d, int) { return d; }
+
+ static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; }
+
+ template<class T>
+ static void setDomain(Storage_t &dom, const T &newdom) {
+ dom[0] = newdom.first();
+ dom[1] = newdom.length();
+ }
+
+ template<class T1, class T2>
+ static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval) {
+ dom[0] = begval;
+ dom[1] = (endval - begval + 1);
+ }
+
+};
+
+class Interval : public Domain<DomainTraits<Interval> >
+{
+public:
+ Interval(const Interval &a) : Domain<DomainTraits<Interval> >() {
+ for (int i=0; i < DomainTraits<Interval>::dimensions; ++i)
+ DomainTraits<Interval>::getDomain(*this, i).setDomain(
+ DomainTraits<Interval>::getDomain(a, i));
+ }
+
+ Interval(int a) : Domain<DomainTraits<Interval> >()
+ {
+ DomainTraits<Interval>::setDomain(domain_m, 0, a - 1);
+ }
+};
+
+template<>
+struct DomainTraits<Loc>
+{
+ typedef int Size_t;
+ typedef int Element_t;
+ typedef Loc Domain_t;
+ typedef Loc AskDomain_t;
+ typedef Loc MultResult_t;
+ typedef int Storage_t;
+
+ static int first(int d) { return d; }
+
+ template<class T>
+ static void setDomain(int &dom, const T &newdom) {
+ dom = DomainTraits<T>::getFirst(newdom);
+ }
+};
+
+template<>
+struct DomainTraits<int>
+ {
+ enum { dimensions = 1 };
+ enum { wildcard = false };
+
+ static int getPointDomain(int d, int) { return d; }
+
+ static int getFirst(const int &d) { return d; }
+};
+
+class Loc : public Domain<DomainTraits<Loc> >
+{
+public:
+ explicit Loc(const int &a) : Domain<DomainTraits<Loc> >() {
+ for (int i=0; i < 1; ++i)
+ (*this)[i].setDomain(DomainTraits<int>::getPointDomain(a, 0));
+ }
+};
+
+struct ElementProperties
+{
+ enum { hasTrivialDefaultConstructor = false };
+ enum { hasTrivialDestructor = false };
+
+ static void construct(double* addr)
+ {
+ new (addr) double();
+ }
+
+ static void construct(double* addr, const double& model)
+ {
+ new (addr) double(model);
+ }
+
+ static void destruct(double *addr) {}
+};
+
+class RefCounted
+{
+public:
+ RefCounted() : count_m(0) {}
+
+ void addReference() { ++count_m; }
+ bool removeRefAndCheckGarbage()
+ {
+ return (--count_m == 0);
+ }
+
+private:
+ int count_m;
+};
+
+class RefBlockController : public RefCounted
+{
+public:
+ explicit RefBlockController(unsigned int size)
+ : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false)
+ {
+ reallocateStorage(size, false);
+
+ if (!ElementProperties::hasTrivialDefaultConstructor)
+ {
+ for (double * pt = begin(); pt != end(); ++pt)
+ ElementProperties::construct(pt);
+ }
+ }
+
+ ~RefBlockController()
+ {
+ deleteStorage();
+ }
+
+ double *begin() const
+ {
+ return pBegin_m;
+ }
+
+ double *end() const
+ {
+ return pEnd_m;
+ }
+
+ bool isMine() const
+ {
+ return dealloc_m;
+ }
+
+private:
+ void deleteStorage()
+ {
+ if (isMine() && pBegin_m != 0)
+ {
+ if (!ElementProperties::hasTrivialDestructor)
+ for (double *pt = begin(); pt != end(); ++pt)
+ ElementProperties::destruct(pt);
+
+ char *tmp = reinterpret_cast<char *>(pBegin_m);
+ delete [] tmp;
+ }
+ }
+
+ void reallocateStorage(unsigned int newsize, bool copyold = false)
+ {
+ double *pBeginNew = 0;
+ double *pEndNew = 0;
+ double *pEndOfStorageNew = 0;
+
+ if (newsize > 0)
+ {
+ int nsize = newsize * sizeof(double);
+ char *tmp = new char[nsize];
+ pBeginNew = reinterpret_cast<double *>(tmp);
+ pEndNew = pBeginNew + newsize;
+ pEndOfStorageNew = pBeginNew + (nsize / sizeof(double));
+
+ if (copyold)
+ {
+ double * pOld = begin();
+ double * pNew = pBeginNew;
+ while (pOld != end() && pNew != pEndNew)
+ ElementProperties::construct(pNew++,*pOld++);
+ }
+ }
+
+ deleteStorage();
+
+ pBegin_m = pBeginNew;
+ pEnd_m = pEndNew;
+ pEndOfStorage_m = pEndOfStorageNew;
+ dealloc_m = true;
+ }
+
+ double *pBegin_m;
+ double *pEnd_m;
+ double *pEndOfStorage_m;
+ bool dealloc_m;
+};
+
+class DataBlockController : public RefBlockController
+{
+public:
+ explicit
+ DataBlockController(unsigned int size)
+ : RefBlockController(size), dataObjectPtr_m(new char), owned_m(true) {}
+
+ ~DataBlockController()
+ {
+ if (owned_m) delete dataObjectPtr_m;
+ }
+
+private:
+ mutable char *dataObjectPtr_m;
+ bool owned_m;
+};
+
+class RefCountedPtr
+{
+public:
+ RefCountedPtr(DataBlockController * const pT) : ptr_m(pT)
+ { if (isValid()) ptr_m->addReference(); }
+
+ ~RefCountedPtr() { invalidate(); }
+
+ DataBlockController* operator->() const { return ptr_m; }
+ void invalidate();
+ bool isValid() const { return ptr_m != 0; }
+
+private:
+ friend class RefCountedBlockPtr;
+ DataBlockController * ptr_m;
+};
+
+inline void RefCountedPtr::invalidate()
+{
+ if ( isValid() && ptr_m->removeRefAndCheckGarbage() )
+ delete ptr_m;
+ ptr_m = 0;
+}
+
+class RefCountedBlockPtr
+{
+public:
+ explicit RefCountedBlockPtr(unsigned int size)
+ : offset_m(0),
+ blockControllerPtr_m(new DataBlockController(size)) {}
+
+ int offset() const
+ {
+ return offset_m;
+ }
+
+ double *beginPointer() const
+ {
+ return blockControllerPtr_m->begin();
+ }
+
+ double *currentPointer() const
+ {
+ return beginPointer() + offset();
+ }
+
+protected:
+ int offset_m;
+ RefCountedPtr blockControllerPtr_m;
+};
+
+class DataBlockPtr : public RefCountedBlockPtr
+{
+public:
+ explicit DataBlockPtr(unsigned int size) : RefCountedBlockPtr(size) {}
+};
+
+class Node
+{
+public:
+ Node(const Interval &owned, const Interval &allocated)
+ : domain_m(owned), allocated_m(allocated) {}
+
+ const Interval &allocated() const { return allocated_m; }
+
+private:
+ Interval domain_m;
+ Interval allocated_m;
+};
+
+class DomainLayout
+{
+public:
+ explicit DomainLayout(const Interval &dom) : node_m(0, dom) {}
+
+ const Interval &domain() const
+ {
+ return node_m.allocated();
+ }
+
+private:
+ Node node_m;
+};
+
+class BrickBase
+{
+public:
+ explicit BrickBase(const Interval &domain);
+
+ int offset(const Loc &dom) const { return off_m + dom[0].first(); }
+
+protected:
+ DomainLayout layout_m;
+ int firsts_m;
+ int off_m;
+};
+
+BrickBase::BrickBase(const Interval &dom)
+ : layout_m(dom)
+{
+ firsts_m = layout_m.domain()[0].first();
+ off_m = -firsts_m;
+}
+
+class Engine : public BrickBase
+{
+public:
+ explicit Engine(const Interval &dom)
+ : BrickBase(dom), dataBlock_m(dom.size()), data_m(dataBlock_m.currentPointer()) {}
+
+ double& operator()(const Loc &loc) const
+ {
+ return data_m[this->offset(loc)];
+ }
+
+private:
+ DataBlockPtr dataBlock_m;
+ double *data_m;
+};
+
+
+int main()
+{
+ Interval I(10);
+ Engine A(I);
+
+ for (int i = 0; i < 10; i++)
+ A(Loc(i)) = 2.0 + i - i*i;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll2.C
new file mode 100644
index 000000000..82a1e7f56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/unroll2.C
@@ -0,0 +1,27 @@
+// PR tree-opt/28937
+// Complete unroll forgot to update the statement usage
+// which meant we ICEd in add_virtual_operand.
+
+// { dg-do compile }
+// { dg-options "-O2" }
+
+
+class SHA256
+{
+ unsigned m_digest;
+ unsigned long long m_count;
+ unsigned char _buffer[64];
+ static void Transform (unsigned * data);
+ void WriteByteBlock (unsigned t);
+};
+void SHA256::WriteByteBlock (unsigned t)
+{
+ unsigned data32[16];
+ Transform (data32);
+ unsigned long long lenInBits = m_count;
+ if (t != (64 - 8))
+ return;
+ for (int i = 0; i < 2; i++)
+ _buffer[t++] = (unsigned char)lenInBits;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/value-init1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/value-init1.C
new file mode 100644
index 000000000..1569a822f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/value-init1.C
@@ -0,0 +1,14 @@
+// PR c++/59659
+// { dg-do compile { target c++11 } }
+// { dg-options "-fdump-tree-gimple" }
+// { dg-final { scan-tree-dump-times "i = 0" 0 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
+
+struct S { S () = default; S (int i); int i; };
+struct A { S s[100]; };
+
+void
+foo ()
+{
+ A a = {{}};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp2.C
new file mode 100644
index 000000000..b2066ae2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp2.C
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+/* VRP was miscompiling the following as it thought &a->b was a dereference
+ and therfore a was non-null.
+ Reduced from Mozilla by Serge Belyshev <belyshev@depni.sinp.msu.ru>. */
+
+extern "C" void abort (void);
+struct T { int i; } t;
+struct A : T { int j; } *p = __null;
+
+int main (void)
+{
+ if (p == &t)
+ return 0;
+ if (p)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3-aux.cc
new file mode 100644
index 000000000..fb68f6b52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3-aux.cc
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#include "vrp3.h"
+
+R::R ()
+{
+ r1 = r2 = 1;
+}
+
+R::R (int n, int d)
+{
+ r1 = n;
+ r2 = d;
+}
+
+int
+R::compare (R const &r, R const &s)
+{
+ return (int) (r.r1 * s.r2 - s.r1 * r.r2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.C
new file mode 100644
index 000000000..90162bfe1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.C
@@ -0,0 +1,47 @@
+// PR tree-optimization/53239
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "vrp3-aux.cc" }
+
+#include "vrp3.h"
+
+struct M
+{
+ M (R m);
+ R val;
+ static int compare (M const &, M const &);
+};
+
+inline M const &
+min (M const & t1, M const & t2)
+{
+ return R::compare (t1.val, t2.val) < 0 ? t1 : t2;
+}
+
+M::M (R m)
+{
+ val = m;
+}
+
+M
+test (M *x)
+{
+ M n (R (0, 0));
+
+ for (int i = 0; i < 2; i++)
+ {
+ M p = x[i];
+ n = min (n, p);
+ }
+
+ if (n.val.r2 != 2 || n.val.r1 != 1)
+ __builtin_abort ();
+ return n;
+}
+
+int
+main ()
+{
+ M x[2] = { M (R (1, 2)), M (R (1, 1)) };
+ test (x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.h b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.h
new file mode 100644
index 000000000..0e97d0c49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vrp3.h
@@ -0,0 +1,9 @@
+struct R
+{
+ long long r1, r2;
+ void copy (R const &r) { r1 = r.r1; r2 = r.r2; }
+ R ();
+ explicit R (int, int);
+ R (R const &r) { copy (r); }
+ static int compare (R const &, R const &);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vt1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt1.C
new file mode 100644
index 000000000..ba871fba2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt1.C
@@ -0,0 +1,13 @@
+// Test whether vtable for S is not put into read-only section.
+// { dg-do compile { target fpic } }
+// { dg-options "-O2 -fpic -fno-rtti" }
+// { dg-skip-if "requires unsupported run-time relocation" { spu-*-* } { "*" } { "" } }
+// { dg-skip-if "No Windows PIC" { *-*-mingw* *-*-cygwin } { "*" } { "" } }
+// Origin: Jakub Jelinek <jakub@redhat.com>
+
+struct S
+{
+ virtual void vm (void) {};
+} x;
+
+// { dg-final { scan-assembler-not "section\[^\n\r\]*_ZTV1S\[^\n\r\]*\"\[^w\"\n\r\]*\"" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vt2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt2.C
new file mode 100644
index 000000000..a77db3875
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt2.C
@@ -0,0 +1,24 @@
+// PR c++/34949
+// { dg-options "-O3" }
+// { dg-final { scan-assembler-not "mov\[^\n\]*_ZTV" { target i?86-*-* x86_64-*-* } } }
+
+class Foo
+{
+public:
+ virtual ~Foo();
+};
+
+Foo::~Foo()
+{
+}
+
+
+class Bar : public Foo
+{
+public:
+ virtual ~Bar();
+};
+
+Bar::~Bar()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vt3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt3.C
new file mode 100644
index 000000000..0cef67206
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt3.C
@@ -0,0 +1,43 @@
+// PR c++/34949
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct E {};
+struct A
+{
+ virtual void a (void *) = 0;
+};
+struct B
+{
+ virtual ~B () {};
+ unsigned int b1;
+ E **b2;
+ A *b3;
+};
+struct C : public B
+{
+ ~C ();
+};
+C::~C ()
+{
+ for (unsigned int i = 0; i < b1; i++)
+ b3->a (b2);
+}
+struct D
+{
+ ~D () {}
+ C d;
+};
+struct F { virtual ~F () {}; };
+struct G { void g (); };
+struct H : public F
+{
+ virtual ~H ();
+ D *h1;
+ G *h2;
+};
+H::~H ()
+{
+ h2->g ();
+ delete h1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/vt4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt4.C
new file mode 100644
index 000000000..c8d04cffc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/vt4.C
@@ -0,0 +1,31 @@
+// PR c++/50243
+// { dg-do compile }
+// { dg-options "-O" }
+// { dg-final { scan-assembler-not "_ZTV.A" } }
+
+void foo ();
+
+struct A
+{
+ ~A () { }
+ virtual void a () = 0;
+ virtual void b () = 0;
+ virtual void c () = 0;
+};
+
+struct B : public A
+{
+ ~B () { foo (); }
+ void a () { foo (); }
+ void b () { foo (); }
+ void c () { delete this; }
+};
+
+void
+test ()
+{
+ A *y = new B ();
+ y->a ();
+ y->b ();
+ y->c ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/PR23205.C b/gcc-4.9/gcc/testsuite/g++.dg/other/PR23205.C
new file mode 100644
index 000000000..b05087b54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/PR23205.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-skip-if "No stabs" { aarch64*-*-* mmix-*-* *-*-aix* alpha*-*-* hppa*64*-*-* ia64-*-* nios2-*-* tile*-*-* *-*-vxworks } { "*" } { "" } } */
+/* { dg-options "-gstabs+ -fno-eliminate-unused-debug-types" } */
+
+const int foobar = 4;
+int foo ()
+{
+ return foobar + 1;
+}
+
+int main()
+{
+ int i;
+ i = foo();
+ return i;
+}
+
+/* { dg-final { scan-assembler ".stabs.*foobar:(c=i|S)" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract1.C
new file mode 100644
index 000000000..53d767acd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract1.C
@@ -0,0 +1,59 @@
+// { dg-do compile }
+// Contributed by <giovannibajo at gcc dot gnu dot org>,
+// <pavel_vozenilek at hotmail dot com>,
+// <bangerth at dealii dot org>
+// c++/9256: Make sure that a pointer to an array of abstract elements
+// cannot be created, not even during template substitution (DR337).
+
+struct Abstract { virtual void f() = 0; }; // { dg-message "note" }
+struct Complete { void f(); };
+
+
+/*
+ * TEST 1
+ * Arrays of abstract elements cannot be declared.
+ */
+
+Abstract a0[2]; // { dg-error "" }
+Abstract (*a1)[2]; // { dg-error "" }
+Abstract (**a2)[2]; // { dg-error "" }
+Abstract (***a3)[2]; // { dg-error "" }
+Abstract *a4;
+Abstract *a5[2];
+Abstract (*a6[2])[2]; // { dg-error "" }
+Abstract **a7[2];
+Abstract *(*a8[2])[2];
+Abstract (**a9[2])[2]; // { dg-error "" }
+
+/*
+ * TEST 2
+ * If a pointer to an array of abstract elements is created during template
+ * instantiation, an error should occur.
+ */
+
+template <class T> struct K {
+ T (*a)[2]; // { dg-error "abstract class type" }
+};
+
+template struct K<Abstract>; // { dg-message "required" }
+
+
+
+/*
+ * TEST 3
+ * Deducing an array of abstract elements during type deduction is a silent
+ * failure (rejects overload).
+ */
+
+template <bool> struct StaticAssert;
+template <> struct StaticAssert<true> {};
+
+typedef char Yes;
+typedef struct { char x[2]; } No;
+
+template<typename U> No is_abstract(U (*k)[1]);
+template<typename U> Yes is_abstract(...);
+
+StaticAssert<sizeof(is_abstract<Abstract>(0)) == sizeof(Yes)> b1;
+StaticAssert<sizeof(is_abstract<Complete>(0)) == sizeof(No)> b2;
+StaticAssert<sizeof(is_abstract<int>(0)) == sizeof(No)> b3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract2.C
new file mode 100644
index 000000000..b79493285
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract2.C
@@ -0,0 +1,58 @@
+// { dg-do compile }
+// Contributed by Gabriel Dos Reis <gdr at integrable-solutions dot net>
+// PR c++/2204: Check for parameters of abstract type in function declarations.
+
+namespace N1 {
+ struct X;
+
+ struct Y1 {
+ void g(X parm1); // { dg-error "abstract" }
+ void g(X parm2[2]); // { dg-error "abstract" }
+ void g(X (*parm3)[2]); // { dg-error "abstract" }
+ };
+
+
+ template <int N>
+ struct Y2 {
+ void g(X parm4); // { dg-error "abstract" }
+ void g(X parm5[2]); // { dg-error "abstract" }
+ void g(X (*parm6)[2]); // { dg-error "abstract" }
+ };
+
+ struct X { // { dg-message "note" }
+ virtual void xfunc(void) = 0; // { dg-message "note" }
+ };
+}
+
+namespace N2 {
+ struct X1 { // { dg-message "note" }
+ virtual void xfunc(void) = 0; // { dg-message "note" }
+ void g(X1 parm7); // { dg-error "abstract" }
+ void g(X1 parm8[2]); // { dg-error "abstract" }
+ void g(X1 (*parm9)[2]); // { dg-error "abstract" }
+ };
+
+ template <int N>
+ struct X2 { // { dg-message "note" }
+ virtual void xfunc(void) = 0; // { dg-message "note" }
+ void g(X2 parm10); // { dg-error "abstract" }
+ void g(X2 parm11[2]); // { dg-error "abstract" }
+ void g(X2 (*parm12)[2]); // { dg-error "abstract" }
+ };
+}
+
+namespace N3 {
+ struct X { // { dg-message "note" "" }
+ virtual void xfunc(void) = 0; // { dg-message "note" }
+ };
+ void g(X parm13); // { dg-error "abstract" }
+ void g(X parm14[2]); // { dg-error "abstract" }
+ void g(X (*parm15)[2]); // { dg-error "abstract" }
+
+ template <int N>
+ void g(X parm16); // { dg-error "abstract" }
+ template <int N>
+ void g(X parm17[2]); // { dg-error "abstract" }
+ template <int N>
+ void g(X (*parm18)[2]); // { dg-error "abstract" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract3.C
new file mode 100644
index 000000000..95e293e50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract3.C
@@ -0,0 +1,12 @@
+// PR c++/51431
+
+struct A // { dg-message "note" }
+{
+ virtual void foo() = 0; // { dg-message "note" }
+};
+
+struct B
+{
+ A a; // { dg-error "abstract" }
+ B() : a() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract4.C
new file mode 100644
index 000000000..68b2eb27b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract4.C
@@ -0,0 +1,18 @@
+// PR c++/51184
+
+template<typename T>
+struct S { };
+
+template<typename T>
+void foo();
+
+struct Abs
+{
+ virtual void bar() = 0;
+};
+
+int main()
+{
+ S<Abs(int)> s; // { dg-error "abstract" }
+ foo<Abs(int)>(); // { dg-error "abstract" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract5.C
new file mode 100644
index 000000000..d13dd9e51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract5.C
@@ -0,0 +1,6 @@
+struct A
+{
+ virtual void f() = 0;
+};
+
+typedef A (*fp)(); // { dg-error "abstract" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/abstract6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract6.C
new file mode 100644
index 000000000..ceba1a60b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/abstract6.C
@@ -0,0 +1,10 @@
+// PR c++/60532
+
+class A
+{
+ ~A ();
+};
+class B : A
+{
+ virtual void m () = 0;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/access1.C
new file mode 100644
index 000000000..ee3239b93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/access1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Mar 2002 <nathan@codesourcery.com>
+
+// PR c++/5659. Failed to notice default accessed changed
+
+class Foo;
+struct Foo
+{
+ static int m;
+};
+
+class Outer {
+ private:
+ class Inner;
+ Inner *i;
+ public:
+ void pub();
+};
+
+struct Outer::Inner {
+ Inner(int i);
+};
+
+void Outer::pub() { i = new Inner(Foo::m); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/access2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/access2.C
new file mode 100644
index 000000000..c7dd77a04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/access2.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// Origin: Dirk Mueller <dmuell@gmx.net>
+
+// PR c++/2739
+// Access to base class private static member.
+
+class Base {
+private:
+ static int fooprivate;
+protected:
+ static int fooprotected;
+public:
+ static int foopublic;
+};
+
+class Derived : public Base {
+public:
+ void test();
+};
+
+int Base::fooprivate=42; // { dg-error "private" }
+int Base::fooprotected=42;
+int Base::foopublic=42;
+
+void Derived::test() {
+ if ( fooprivate ); // { dg-error "context" }
+ if ( fooprotected );
+ if ( foopublic );
+}
+
+int main()
+{
+ Derived d;
+ d.test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/access3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/access3.C
new file mode 100644
index 000000000..2c21c1e5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/access3.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fno-access-control" }
+
+// PR c++/20022
+
+// Make sure -fno-access-control doesn't crash, and actually grants at
+// least some access.
+
+class B {
+ enum A {};
+};
+
+B::A r;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon-struct.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-struct.C
new file mode 100644
index 000000000..a23e8094e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-struct.C
@@ -0,0 +1,9 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// { dg-do compile }
+
+namespace N { }
+
+namespace M
+{
+ typedef struct { } N;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union.C
new file mode 100644
index 000000000..51598bf3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options -O2 }
+
+int foo ();
+double bar (void)
+{
+ union
+ {
+ char a[8];
+ double b;
+ };
+
+ a[0] = foo ();
+ a[1] = foo ();
+ a[2] = foo ();
+ a[3] = foo ();
+ a[4] = foo ();
+ a[5] = foo ();
+ a[6] = foo ();
+ a[7] = foo ();
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union2.C
new file mode 100644
index 000000000..31bb74fa9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union2.C
@@ -0,0 +1,10 @@
+// PR c++/52915
+
+struct S {
+ int val;
+ S(int v) : val(v) {}
+};
+
+void f() {
+ union { S a; }; // { dg-error "constructor|no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union3.C
new file mode 100644
index 000000000..94d0aecaf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon-union3.C
@@ -0,0 +1,25 @@
+// PR c++/32054
+
+class C
+{
+ auto union // { dg-error "storage class" "" { target { ! c++11 } } }
+ {
+ int a;
+ }; // { dg-error "multiple|specified" "" { target c++11 } }
+ register union // { dg-error "storage class" }
+ {
+ int b;
+ };
+ static union // { dg-error "storage class" }
+ {
+ int c;
+ };
+ extern union // { dg-error "storage class" }
+ {
+ int d;
+ };
+ mutable union // { dg-error "storage class" }
+ {
+ int e;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon2.C
new file mode 100644
index 000000000..98d8c2065
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon2.C
@@ -0,0 +1,22 @@
+// Test that we can have an unnamed struct inside an anonymous union.
+
+struct A
+{
+ union
+ {
+ struct { int i; } foo;
+ };
+};
+
+static union
+{
+ struct { int i; } foo;
+};
+
+int main ()
+{
+ union
+ {
+ struct { int i; } bar;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon3.C
new file mode 100644
index 000000000..586a40e5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon3.C
@@ -0,0 +1,7 @@
+// pr c++/15049
+// Origin: Matt Austern <austern@apple.com>
+// Test that we can declare a global variable whose type is anonymous.
+
+// { dg-do compile }
+
+enum { a = 3 } x; // { dg-warning "anonymous type" "" { target { ! c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon4.C
new file mode 100644
index 000000000..37df228da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon4.C
@@ -0,0 +1,8 @@
+// PR c++/27951
+// { dg-do compile }
+
+void foo()
+{
+ int i; // { dg-message "previously" }
+ union { int i; }; // { dg-error "redeclaration" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon5.C
new file mode 100644
index 000000000..81e9def53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon5.C
@@ -0,0 +1,25 @@
+// PR c++/34094
+// { dg-do link { target { ! { *-*-darwin* *-*-hpux* *-*-solaris2.* } } } }
+// { dg-options "-g" }
+// Ignore additional message on powerpc-ibm-aix
+// { dg-prune-output "obtain more information" } */
+
+namespace {
+ struct c
+ {
+ static const bool t = 0;
+ };
+}
+
+const bool &f()
+{
+ return c::t; // { dg-message "\[Uu\]ndefined" "undefined" { target *-*-* } 0 }
+ // Some targets report the error for the previous line, others
+ // don't give line number inforamtion for it, so use line 0.
+}
+
+int main(void)
+{
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/anon6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/anon6.C
new file mode 100644
index 000000000..2fd094254
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/anon6.C
@@ -0,0 +1,8 @@
+// PR c++/60353
+
+struct A {
+ A(int);
+};
+typedef struct {
+ A format;
+} B;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/arm-neon-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/arm-neon-1.C
new file mode 100644
index 000000000..33cc04b69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/arm-neon-1.C
@@ -0,0 +1,18 @@
+/* Basic smoke test for arm_neon.h */
+
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
+
+float a[4];
+
+void test(void)
+{
+ float32x2x2_t v;
+ float32x2_t res;
+ v = vld2_f32(a);
+ res = vadd_f32(v.val[0], v.val[1]);
+ vst1_f32(a, res);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/armv7m-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/armv7m-1.C
new file mode 100644
index 000000000..6aa686b10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/armv7m-1.C
@@ -0,0 +1,69 @@
+/* { dg-do run { target arm*-*-* } } */
+/* Test Armv7m interrupt routines. */
+#include <stdlib.h>
+
+#ifdef __ARM_ARCH_7M__
+void __attribute__((interrupt))
+foo(void)
+{
+ long long n;
+ long p;
+ asm volatile ("" : "=r" (p) : "0" (&n));
+ if (p & 4)
+ abort ();
+ return;
+}
+
+void __attribute__((interrupt))
+bar(void)
+{
+ throw 42;
+}
+
+int main()
+{
+ int a;
+ int before;
+ int after;
+ volatile register int sp asm("sp");
+
+ asm volatile ("mov %0, sp\n"
+ "blx %2\n"
+ "mov %1, sp\n"
+ : "=&r" (before), "=r" (after) : "r" (foo)
+ : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
+ if (before != after)
+ abort();
+ asm volatile ("mov %0, sp\n"
+ "sub sp, sp, #4\n"
+ "blx %2\n"
+ "add sp, sp, #4\n"
+ "mov %1, sp\n"
+ : "=&r" (before), "=r" (after) : "r" (foo)
+ : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
+ if (before != after)
+ abort();
+ before = sp;
+ try
+ {
+ bar();
+ }
+ catch (int i)
+ {
+ if (i != 42)
+ abort();
+ }
+ catch (...)
+ {
+ abort();
+ }
+ if (before != sp)
+ abort();
+ exit(0);
+}
+#else
+int main()
+{
+ exit (0);
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array1.C
new file mode 100644
index 000000000..aff960e57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array1.C
@@ -0,0 +1,10 @@
+// Test typeid of multidimensional array with no bounds.
+// { dg-do compile }
+
+#include <typeinfo>
+
+int main()
+{
+ const char *s = typeid(double[][]).name(); // { dg-error "bounds|confused" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array2.C
new file mode 100644
index 000000000..b091d96be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array2.C
@@ -0,0 +1,6 @@
+// PR c++/25263
+// { dg-do compile }
+
+int x[1/0]; // { dg-warning "division by zero" }
+ // { dg-error "constant" "constant" { target *-*-* } 4 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array3.C
new file mode 100644
index 000000000..ce3641e8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array3.C
@@ -0,0 +1,14 @@
+// PR C++/28906: new on an array causes incomplete arrays to
+// become complete with the wrong size.
+
+// the bounds of xvalue_store was being set to include want
+// which was incorrect.
+
+// { dg-do compile }
+
+extern unsigned char xvalue_store[];
+bool reserve (int want)
+{
+ new unsigned char[want];
+}
+unsigned char xvalue_store[257];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array4.C
new file mode 100644
index 000000000..97ccc986d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array4.C
@@ -0,0 +1,19 @@
+// PR C++/28906: new on an array causes incomplete arrays to
+// become complete with the wrong size.
+// The sizeof machineMain should be 5 and not 100.
+// { dg-do run }
+
+
+extern char machineMain[];
+void sort (long len)
+{
+ new char[100];
+}
+char machineMain[] = "main";
+int main(void)
+{
+ if (sizeof(machineMain)!=sizeof("main"))
+ __builtin_abort();
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array5.C
new file mode 100644
index 000000000..df551e380
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array5.C
@@ -0,0 +1,9 @@
+// Check to make sure changing from an incomplete
+// array type to a complete one does not change other
+// incomplete array type's bounds.
+// { dg-do compile }
+
+extern unsigned char xvalue_store[];
+extern unsigned char xvalue_store1[];
+unsigned char xvalue_store[7];
+unsigned char xvalue_store1[9];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array6.C
new file mode 100644
index 000000000..cd02401f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array6.C
@@ -0,0 +1,11 @@
+// PR c++/43036
+
+typedef char T6[2][8];
+const T6* p1;
+typedef char T[8];
+typedef T T2[2];
+typedef T T3[2];
+typedef char T5[2][8];
+const T2* p2;
+const T5* p3;
+const T3* p4;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/array7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/array7.C
new file mode 100644
index 000000000..72322f063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/array7.C
@@ -0,0 +1,9 @@
+// PR c++/54038
+
+extern const char *const v[];
+typedef char T;
+void foo (const T *const[]);
+struct A
+{
+ static const char *const a[];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/assign1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/assign1.C
new file mode 100644
index 000000000..1983680dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/assign1.C
@@ -0,0 +1,7 @@
+// PR c++/27716
+// { dg-do compile }
+
+int foo()
+{
+ return i ""= i; // { dg-error "not declared|string constant" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/big-struct.C b/gcc-4.9/gcc/testsuite/g++.dg/other/big-struct.C
new file mode 100644
index 000000000..dcf230dd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/big-struct.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+
+struct A
+{
+};
+
+struct B : public A
+{
+ char b[0x20000000];
+} e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield1.C
new file mode 100644
index 000000000..896490fba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield1.C
@@ -0,0 +1,9 @@
+// { dg-options "-w" }
+
+union u1 {
+ char m1 : 16;
+} x;
+
+int main () {
+ x.m1 = 256;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield2.C
new file mode 100644
index 000000000..cd9a837dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield2.C
@@ -0,0 +1,9 @@
+// PR c++/28052
+// { dg-do compile }
+
+struct A
+{
+ double d : 2; // { dg-error "non-integral" }
+ A() {}
+ ~A() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield3.C
new file mode 100644
index 000000000..befd7f817
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield3.C
@@ -0,0 +1,19 @@
+// PR c++/33841
+// { dg-do compile }
+
+template<int> struct A
+{
+ // multiple errors below: missing semicolon, no anonymous structs, etc.
+ struct {} : 2; // { dg-error "" }
+};
+
+template<int> struct B
+{
+ int a;
+ // multiple errors below: missing semicolon, no anonymous structs, etc.
+ struct {} : 2; // { dg-error "" }
+ int b;
+};
+
+struct C : A<0> {};
+struct D : B<0> {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield4.C
new file mode 100644
index 000000000..d140f82cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/bitfield4.C
@@ -0,0 +1,10 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42217
+// { dg-do compile }
+
+struct A
+{
+ int : 0;
+};
+A a = A();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C
new file mode 100644
index 000000000..f6a557703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C
@@ -0,0 +1,11 @@
+// PR c++/40445
+// Check that a function containing only __builtin_unreachable()
+// doesn't ICE.
+
+// { dg-do compile }
+// { dg-options "-O0" }
+const char *
+f (void)
+{
+ __builtin_unreachable ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/builtin1.C
new file mode 100644
index 000000000..886658199
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/builtin1.C
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ __builtin_isless (foo, 0); /* { dg-error "non-floating-point arguments" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/canon-31724.C b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-31724.C
new file mode 100644
index 000000000..1a39f78a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-31724.C
@@ -0,0 +1,8 @@
+struct ac {ac();};
+ac spline_rep1(void)
+{
+ typedef ac at[2];
+ ac * b = new ac[2];
+ at *a = (at*)b;
+ return (*a)[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/canon-33194.C b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-33194.C
new file mode 100644
index 000000000..496aafe2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-33194.C
@@ -0,0 +1,21 @@
+// PR c++/33194
+void c_translate_location (
+ void (*fail) (
+ const char *fmt, ...)
+ __attribute__ ((noreturn,
+ format (printf, 1, 2)))
+ );
+
+
+struct dwflpp
+{
+ static void loc2c_error (const char *fmt, ...)
+ {
+ }
+
+ void
+ translate_location()
+ {
+ return c_translate_location (&loc2c_error);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/canon-37342.C b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-37342.C
new file mode 100644
index 000000000..dd96e40eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/canon-37342.C
@@ -0,0 +1,8 @@
+class Asm;
+template<typename _CharT> class basic_ostream;
+typedef basic_ostream<char> ostream;
+class Options {
+ typedef void (Asm::* emitfunc_t) (ostream &);
+ emitfunc_t getemit () const { return emitfunc; }
+ emitfunc_t emitfunc;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/classkey1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/classkey1.C
new file mode 100644
index 000000000..80ab6756c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/classkey1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Feb 2002 <nathan@codesourcery.com>
+
+// PR 775. Some mismatches which were broken.
+
+template <class T> struct A {};
+union A<int> a; // { dg-error "'union' tag" "" }
+
+template <> union A<float> {}; // { dg-error "'union' tag" "" }
+
+struct B {};
+union B b; // { dg-error "'union' tag" "" }
+
+union C {};
+class C c; // { dg-error "'class' tag" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/complex1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/complex1.C
new file mode 100644
index 000000000..5c0351428
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/complex1.C
@@ -0,0 +1,28 @@
+// PR middle-end/18882
+// Origin: Petr Mikulik <mikulik@physics.muni.cz>
+// Testcase by Wolfgang Bangerth <bangerth@dealii.com>
+
+// { dg-do run }
+// { dg-options "" }
+
+extern "C" void abort ();
+
+struct C {
+ __complex__ long double c;
+};
+
+void foo()
+{
+ C x = {2+2i};
+
+ int n = 1;
+ C y = (n==1) ? x : (C){3+3i};
+ if (__imag__ y.c != 2)
+ abort ();
+}
+
+int main(void)
+{
+ foo ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/component1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/component1.C
new file mode 100644
index 000000000..601e019ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/component1.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5123. ICE
+
+struct C {
+ template<class T> void f(T);
+ void g ();
+ void g (int);
+};
+
+void Foo () {
+ C c;
+
+ (c.g) ();
+ (c.f) (1);
+
+ (c.f<int>) (2);
+
+ c.g; // { dg-error "statement cannot resolve" "" }
+ c.f; // { dg-error "statement cannot resolve" "" }
+ c.f<int>; // { dg-error "statement cannot resolve" "" }
+
+ c.g == 1; // { dg-error "invalid" "" }
+ c.f == 1; // { dg-error "invalid" "" }
+ c.f<int> == 1; // { dg-error "invalid" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/const1.C
new file mode 100644
index 000000000..f01013837
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/const1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 335. Missed diagnostic
+
+struct Foo
+{
+ unsigned i;
+ void Modify(unsigned j) const;
+};
+
+void Foo::Modify(unsigned j) const
+{
+ Foo::i = j; // { dg-error "assignment of member" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/const2.C
new file mode 100644
index 000000000..86dde1e45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/const2.C
@@ -0,0 +1,22 @@
+// PR c++/3331: just because 'this' is readonly and bars[0].b is readonly
+// doesn't mean that the result of the member reference is readonly.
+
+struct foo
+{
+ int a;
+
+ struct bar
+ { int foo::* b ;};
+
+ static const bar bars[];
+
+ void bad ()
+ {
+ this->*(bars[0].b) = 42; // { dg-bogus "read-only" "" }
+ }
+};
+
+const foo::bar foo::bars[] = { { &foo::a } };
+
+int main ()
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/const3.C
new file mode 100644
index 000000000..d47133b45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/const3.C
@@ -0,0 +1,23 @@
+// PR middle-end/44101
+// { dg-do compile }
+
+extern bool equal (int[], int[], const int[]);
+extern bool equal (wchar_t[], wchar_t[], const wchar_t[]);
+
+void foo(void)
+{
+ const int A1[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
+ const int N1 = sizeof(A1) / sizeof(int);
+ int i1[N1];
+
+ if (equal(i1, i1 + N1, A1))
+ return;
+
+ const wchar_t A3[] = {L'\3', L'\3', L'\3', L'\3', L'\3',
+ L'\3', L'\3', L'\3', L'\3', L'\3'};
+ const int N3 = sizeof(A3) / sizeof(wchar_t);
+ wchar_t i3[N3];
+
+ if (equal(i3, i3 + N3, A3))
+ return;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/constref1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/constref1.C
new file mode 100644
index 000000000..900a07de3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/constref1.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// Make sure that we can pass a cast-expression as an argument that's
+// passed by const reference.
+
+void bar (const long&)
+{ }
+
+void foo (int x)
+{
+ bar ((long) x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/constref2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/constref2.C
new file mode 100644
index 000000000..5c82e2dbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/constref2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// Make sure that we can pass a cast-expression as an argument that's
+// passed to a function template by const reference.
+
+template <class T>
+void bar (const T&)
+{ }
+
+void foo (int x)
+{
+ bar ((long) x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/conversion1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/conversion1.C
new file mode 100644
index 000000000..6573ef15b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/conversion1.C
@@ -0,0 +1,17 @@
+// PR C++/2213
+// Origin: philippeb@corel.com
+// Copyright (C), 2002 Free Software Foundation
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+// { dg-do compile }
+
+class QObject
+{
+};
+
+int main()
+{
+ long long m;
+
+ (void (QObject::*)()) m; // { dg-error "invalid cast" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/copy1.C
new file mode 100644
index 000000000..d02b08fce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/copy1.C
@@ -0,0 +1,83 @@
+// { dg-do run }
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2001 <nathan@nathan@codesourcery.com>
+
+// PR 87
+
+int assign = 0;
+int ctor = 0;
+int assignC = 0;
+
+struct A {
+ int i;
+
+ template<class T>
+ void operator=(const T&) const
+ {
+ assign = 1;
+ }
+
+ A () : i (0) {}
+
+ template <typename T> A (const T &)
+ {
+ ctor = 1;
+ }
+};
+
+struct B : A
+{
+};
+
+struct C
+{
+ int i;
+
+ C (int i_) :i (i_) {}
+
+ template <int I>
+ void operator= (const C &)
+ {
+ assignC = 1;
+ }
+};
+
+
+int main()
+{
+ const A a;
+ A b;
+ B c;
+
+ b = a;
+ if (assign)
+ return 5;
+
+ b.i = 100;
+ c.i = 200;
+
+ a = b;
+
+ if (!assign)
+ return 1;
+ if (a.i)
+ return 2;
+
+ A e (b);
+ if (ctor)
+ return 3;
+
+ A d (c);
+ if (!ctor)
+ return 4;
+
+ C c0 (0);
+ C c1 (1);
+
+ c0 = c1;
+ if (assignC)
+ return 5;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/copy2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/copy2.C
new file mode 100644
index 000000000..335cab8d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/copy2.C
@@ -0,0 +1,32 @@
+// { dg-do run }
+
+// Test that A's copy assignment method is called when B's instance
+// member array of A is assigned.
+
+// Contributed by Brian Gaeke, public domain.
+int status = 1;
+
+class A
+{
+public:
+ int i;
+ A &operator =(const A &i)
+ {
+ status = 0;
+ }
+};
+
+class B
+{
+public:
+ A arr[10];
+};
+
+int main (int argc, char **argv)
+{
+ B b;
+ b.arr[0].i = 15;
+ B a;
+ a = b; // trigger copy assignment
+ return status;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-1.C
new file mode 100644
index 000000000..e9a2d79f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-1.C
@@ -0,0 +1,3 @@
+
+void f() { return 0; } // { dg-error "return-statement" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-10.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-10.C
new file mode 100644
index 000000000..6dcd79149
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-10.C
@@ -0,0 +1,24 @@
+// Origin: PR c++/43327
+// { dg-do compile }
+
+template <typename _T>
+struct A
+{
+ template <int _N, int _M> struct B;
+
+ template <int _N>
+ struct B<_N, _T::m>
+ {
+ static void f();
+ };
+};
+
+struct C
+{
+ static const int m = 4;
+};
+
+void m()
+{
+ A<C>::B<1, 4>::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-11.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-11.C
new file mode 100644
index 000000000..29ee231be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-11.C
@@ -0,0 +1,27 @@
+// Origin: PR c++/43327
+// { dg-do compile }
+
+template <typename _T>
+struct A
+{
+ template <int _N, int _M> struct B;
+
+ template <int _N>
+ struct B<_N, _T::m>
+ {
+ static void f();
+ };
+};
+
+struct C
+{
+ static int m;
+};
+
+void m()
+{
+ A<C>::B<1, 4>::f(); // { dg-error "incomplete type|not a valid" }
+}
+
+int C::m = 4;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-12.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-12.C
new file mode 100644
index 000000000..6612ff216
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-12.C
@@ -0,0 +1,25 @@
+// Origin: PR c++/43953
+
+template<typename T,
+ typename U,
+ typename T::type V> class bad;
+
+// partial specialization
+// for T = U
+template<typename T, typename T::type V>
+class bad<T, T, V>
+{
+public:
+ static void foo() {}
+};
+
+struct dummy
+{
+ typedef int type;
+};
+
+int main()
+{
+ bad<dummy, dummy, 0>::foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-2.C
new file mode 100644
index 000000000..961a18a23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-finline -finline-functions" }
+// Contributed by Hans Buchmann <hans dot buchmann at fhso dot ch>
+// PR c++/14033: ICE while inlining a function with incomplete parameter
+
+struct A; // { dg-error "forward declaration" }
+void foo(A a) {} // { dg-error "incomplete" }
+struct A {};
+
+void bar(void)
+{
+ foo(A());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-3.C
new file mode 100644
index 000000000..d13821dee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-3.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-g" }
+// Contributed by: <schmid at snake dot iap dot physik dot tu-darmstadt dot de>
+// and Niall Douglas <s_gccbugzilla at nedprod dot com>
+// PR c++/14246: ice in write_template_arg_literal while mangling boolean
+// expressions.
+
+namespace N1 {
+
+ template <typename T>
+ struct A {
+ enum { Yes = (sizeof(T) == 1) };
+ };
+
+ template<bool T>
+ struct B {
+ void foo(void);
+ };
+
+ template struct B< !A<int>::Yes >;
+
+}
+
+
+namespace N2 {
+
+ template<bool> struct A {};
+ A<!false> a;
+
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-4.C
new file mode 100644
index 000000000..a77fe05d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-4.C
@@ -0,0 +1,26 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Jun 2005 <nathan@codesourcery.com>
+
+// PR 20678: ICE on error message
+// Origin: Andrew Pinski pinskia@gcc.gnu.org
+
+// NOTE: This test assumes packed structure layout differs from unpacked
+// structure layout. This isn't true, e.g., with the default
+// arm-none-elf options.
+// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } }
+
+struct a
+{
+ int m;
+ a(const a&);
+};
+struct b // { dg-error "cannot bind packed field" "" { target { ! default_packed } } }
+{
+ char c;
+ a aa __attribute__((packed)); // { dg-warning "attribute ignored" "" { target default_packed } }
+};
+struct c
+{
+ b bb;
+ c(const b& __a): bb(__a) {} // { dg-message "synthesized" "" { target { ! default_packed } } }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-5.C
new file mode 100644
index 000000000..25a70b7df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-5.C
@@ -0,0 +1,16 @@
+// Origin: PR c++/42758
+// { dg-do compile }
+
+template<class T> struct less {};
+
+template<class T, typename U = less<T> > struct set {};
+
+struct int_less_than {};
+
+void assert_fail (const char*);
+
+int f(const set<int, int_less_than>&)
+{
+ assert_fail (__PRETTY_FUNCTION__);
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-6.C
new file mode 100644
index 000000000..06aea4f58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-6.C
@@ -0,0 +1,34 @@
+// Origin: PR c++/42634
+// { dg-options "-g" }
+// { dg-do compile { target c++11 } }
+
+template<typename T> T declval();
+
+template<typename T, typename... Args> struct is_constructible {
+ template<typename T1, typename... Args1> static decltype(T1(declval<Args1>()...), char()) test();
+ static const bool value = sizeof(test<T, Args...>()) == 1;
+};
+template<bool> struct enable_if {
+ typedef void type;
+};
+template<class T1, class T2> struct pair {
+ template<class U2,
+ class = typename enable_if<is_constructible<T2,U2&&>::value>::type
+ >
+ pair(const T1&, U2&&) { }
+};
+struct string {
+ string() : p(0) {}
+ char* p;
+};
+
+struct Foo {
+ string s;
+ int i;
+};
+
+void f()
+{
+ pair<int, Foo>(1, Foo());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-7.C
new file mode 100644
index 000000000..d96aeead0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-7.C
@@ -0,0 +1,19 @@
+// Origin: PR c++/42336
+// { dg-options "-O2 -g" }
+// { dg-do compile { target c++11 } }
+
+struct X {
+ void func() {}
+};
+
+template<typename T, void (X::*P)() = &T::func>
+void b(T) {}
+
+int main() {
+ b(X()); /* line 9 */
+ X().func();
+
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-8.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-8.C
new file mode 100644
index 000000000..dcae7da76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-8.C
@@ -0,0 +1,110 @@
+// Origin: PR c++/42797
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -O2" }
+
+template<typename _Tp, _Tp __v> struct integral_constant {
+ static const _Tp value = __v;
+};
+
+template<typename _Tp> _Tp declval();
+
+template<typename _Tp, typename... _Args>
+class __is_constructible_helper {
+};
+
+template<typename _Tp, typename _Arg>
+class __is_constructible_helper<_Tp, _Arg> {
+
+ template<typename _Tp1, typename _Arg1>
+ static decltype(static_cast<_Tp1>(declval<_Arg1>()), char()) __test(int);
+public:
+ static const bool __value = sizeof(__test<_Tp, _Arg>(0)) == 1;
+};
+
+template<typename _Tp, typename... _Args>
+struct is_constructible : public integral_constant<bool,__is_constructible_helper<_Tp, _Args...>::__value> { };
+
+template<bool, typename _Tp = void>
+struct enable_if { };
+
+template<typename _Tp>
+struct enable_if<true, _Tp> {
+ typedef _Tp type;
+};
+
+template<class _T1, class _T2> struct pair {
+ _T1 first;
+ _T2 second;
+
+ template<class _U2, class = typename enable_if<is_constructible<_T2, _U2&&>::value>::type>
+ pair(const _T1& __x, _U2&& __y) : first(__x),
+ second(__y) { }
+};
+
+namespace __gnu_cxx {
+template<typename _Tp>
+class new_allocator {
+public:
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+};
+}
+
+template<typename _Tp>
+class allocator: public __gnu_cxx::new_allocator<_Tp> {
+public:
+
+ template<typename _Tp1>
+ struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+};
+
+
+template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+
+ struct _Vector_impl : public _Tp_alloc_type {
+ _Vector_impl()
+ { }
+ };
+public:
+
+ _Vector_impl _M_impl;
+};
+
+template<typename _Tp, typename _Alloc = allocator<_Tp> >
+class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Alloc allocator_type;
+public:
+ vector() { }
+ explicit vector(int, const allocator_type& __a = allocator_type())
+ {
+ }
+};
+
+
+template <typename _Key, typename _Tp>
+class map {
+ typedef _Key key_type;
+ typedef _Tp mapped_type;
+ typedef pair<const _Key, _Tp> value_type;
+public:
+
+ void insert(const value_type& __x)
+ {
+ }
+
+ mapped_type& operator[](const key_type& __k) {
+ insert(value_type(__k, mapped_type()));
+ }
+
+};
+
+struct Foo {
+ Foo() {} template<typename Tp> Foo(Tp *p) {} };
+void foo() {
+ map <int, vector<Foo>> the_map;
+ the_map[1] = vector<Foo>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/crash-9.C b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-9.C
new file mode 100644
index 000000000..0953fcbc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/crash-9.C
@@ -0,0 +1,15 @@
+// Origin: PR c++/42915
+// { dg-do compile }
+
+template <typename T>
+class A
+{
+ template <typename U>
+ class B
+ {
+ B foo();
+ };
+};
+template <typename T> template <typename U>
+A<T>::B<U> A<T>::B<U>::foo() {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ctor1.C
new file mode 100644
index 000000000..65449f4c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ctor1.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+// PR C++/30303
+// This used to ICE because we did not return NULL
+// in grokfndecl when an error happened.
+
+class A
+{
+ int i;
+};
+
+A::A() { A(); } /* { dg-error "definition of implicitly-declared" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ctor2.C
new file mode 100644
index 000000000..65bd85902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ctor2.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+// PR C++/30303
+// This used to ICE because we did not return NULL
+// in grokfndecl when an error happened.
+
+
+class A
+{
+ int i;
+};
+
+void foo()
+{
+ A();
+}
+
+A::A() {} /* { dg-error "definition of implicitly-declared" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func.C b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func.C
new file mode 100644
index 000000000..2eb9f039a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+
+typedef int FIC(int) const;
+typedef int FI(int);
+
+FIC f; // { dg-error "cv-qualifier" }
+struct S {
+ FIC f; // OK
+
+ const FI g;
+
+ int h(int) const;
+
+};
+FIC S::*pm = &S::f;
+const FI S::*pm2 = &S::f; // { dg-error "cannot convert" }
+const FIC S::*pm3 = &S::f;
+
+int S::f(int) const
+{
+ return 17;
+}
+
+
+int foo(float) const // { dg-error "qualifier" }
+{
+ return 0;
+}
+
+int bar(float) volatile; // { dg-error "qualifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func2.C
new file mode 100644
index 000000000..ffd249fc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func2.C
@@ -0,0 +1,18 @@
+typedef int ptr1() const; // no error
+
+void foo ()
+{
+ typedef int ptr2() const; // no error
+}
+
+class C
+{
+ typedef int ptr3() const; // error
+
+ void bar ()
+ {
+ typedef int ptr4() const; // no error
+ }
+};
+
+void wibble () const { } // { dg-error "non-member function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func3.C
new file mode 100644
index 000000000..0fd47882f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/cv_func3.C
@@ -0,0 +1,10 @@
+// PR c++/58810
+
+typedef int F() const;
+
+F f; // { dg-error "cv-qualifier" }
+
+struct A
+{
+ friend F f; // { dg-error "cv-qualifier" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/cxa-atexit1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/cxa-atexit1.C
new file mode 100644
index 000000000..a51f33401
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/cxa-atexit1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-O2 -fuse-cxa-atexit" }
+
+# 1 "cxa-atexit1.C"
+struct A
+{
+ struct B
+ {
+ B ();
+ ~B ();
+ };
+};
+static A::B b;
+# 1 "cxa-atexit1.h" 1
+#pragma interface
+template <class T> struct C
+{
+ ~C (void);
+};
+struct D : public C<bool>
+{
+ D (void) : C<bool> () { }
+};
+# 55 "cxa-atexit1.C" 2
+
+// { dg-final { scan-assembler-not ".gnu.linkonce.t.__tcf_" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-cfstring1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-cfstring1.C
new file mode 100644
index 000000000..b2def1e85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-cfstring1.C
@@ -0,0 +1,25 @@
+/* Test whether the __builtin__CFStringMakeConstantString
+ "function" fails gracefully when handed a non-constant
+ argument. This will only work on MacOS X 10.1.2 and later. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-ftrack-macro-expansion=0 -mconstant-cfstrings" } */
+
+#include <CoreFoundation/CFString.h>
+
+#ifdef __CONSTANT_CFSTRINGS__
+#undef CFSTR
+#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR))
+#endif
+
+extern int cond;
+extern const char *func(void);
+
+int main(void) {
+ CFStringRef s1 = CFSTR("Str1");
+ CFStringRef s2 = CFSTR(cond? "Str2": "Str3"); /* { dg-error "CFString literal expression is not a string constant" } */
+ CFStringRef s3 = CFSTR(func()); /* { dg-error "CFString literal expression is not a string constant" } */
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-minversion-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-minversion-1.C
new file mode 100644
index 000000000..cbf5ff1d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/darwin-minversion-1.C
@@ -0,0 +1,10 @@
+/* Test for -mmacosx-version-min default on powerpc-darwin. */
+/* { dg-do compile { target powerpc-*-darwin* } } */
+
+int main(void)
+{
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1030
+ fail me;
+#endif
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/datasec1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/datasec1.C
new file mode 100644
index 000000000..c6b2ae981
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/datasec1.C
@@ -0,0 +1,11 @@
+// PR target/33168
+// { dg-do compile }
+// { dg-require-effective-target named_sections }
+// { dg-options "-O2 -fdata-sections" }
+
+extern const int& foo;
+namespace
+{
+ const int bar = 16;
+}
+const int &foo = bar;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default1.C
new file mode 100644
index 000000000..a6d968185
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default1.C
@@ -0,0 +1,22 @@
+// PR c++/24103
+// ICE in simple_cst_equal
+// Origin: Alexander Stepanov <astepanov@softminecorp.com>
+// { dg-do compile }
+// { dg-options "" }
+
+struct S
+{
+ int i;
+};
+
+struct A
+{
+ A(S = (S){0});
+};
+
+struct B
+{
+ B(S = (S){0});
+};
+
+B::B(S) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default2.C
new file mode 100644
index 000000000..51534b887
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default2.C
@@ -0,0 +1,9 @@
+// PR c++/16829
+// { dg-do compile }
+
+template<typename T> void foo(T, int = 0, int) {} // { dg-error "default" }
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default3.C
new file mode 100644
index 000000000..42c1fe489
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default3.C
@@ -0,0 +1,109 @@
+// PR c++/16829
+// { dg-do compile }
+
+void f1(int = 0, int); // { dg-error "default" }
+
+void f2(int = 0, int) {} // { dg-error "default" }
+
+void f3(int, int);
+void f3(int = 0, int); // { dg-error "default" }
+
+void f4(int, int);
+void f4(int = 0, int) {} // { dg-error "default" }
+
+void f5();
+void f5(int = 0, int); // { dg-error "default" }
+
+void f6();
+void f6(int = 0, int) {} // { dg-error "default" }
+
+template<typename> void g1(int = 0, int); // { dg-error "default" }
+
+template<typename> void g2(int = 0, int) {} // { dg-error "default" }
+
+template<typename> void g3(int, int);
+template<typename> void g3(int = 0, int); // { dg-error "default" }
+
+template<typename> void g4(int, int);
+template<typename> void g4(int = 0, int) {} // { dg-error "default" "" { xfail *-*-* } }
+
+template<typename> void g5();
+template<typename> void g5(int = 0, int); // { dg-error "default" }
+
+template<typename> void g6();
+template<typename> void g6(int = 0, int) {} // { dg-error "default" }
+
+template<typename T> void g7(T, T) {}
+template<typename T> void g7(T* = 0, T*) {} // { dg-error "default" }
+
+
+struct A
+{
+ void F1(int = 0, int); // { dg-error "default" }
+
+ void F2(int = 0, int) {} // { dg-error "default" }
+
+ void F3(int, int);
+
+ void F4();
+ void F4(int = 0, int); // { dg-error "default" }
+
+ void F5();
+ void F5(int = 0, int) {} // { dg-error "default" }
+
+ template<typename> void G1(int = 0, int); // { dg-error "default" }
+
+ template<typename> void G2(int = 0, int) {} // { dg-error "default" }
+
+ template<typename> void G3(int, int);
+
+ template<typename> void G4();
+ template<typename> void G4(int = 0, int); // { dg-error "default" }
+
+ template<typename> void G5();
+ template<typename> void G5(int = 0, int) {} // { dg-error "default" }
+
+ template<typename T> void G6(T, T) {}
+ template<typename T> void G6(T* = 0, T*) {} // { dg-error "default" }
+};
+
+void A::F3(int = 0, int) {} // { dg-error "default" }
+
+template<typename> void A::G3(int = 0, int) {} // { dg-error "default" }
+
+
+template<typename> struct B
+{
+ void F1(int = 0, int); // { dg-error "default" }
+
+ void F2(int = 0, int) {} // { dg-error "default" }
+
+ void F3(int, int);
+
+ void F4();
+ void F4(int = 0, int); // { dg-error "default" }
+
+ void F5();
+ void F5(int = 0, int) {} // { dg-error "default" }
+
+ template<typename> void G1(int = 0, int); // { dg-error "default" }
+
+ template<typename> void G2(int = 0, int) {} // { dg-error "default" }
+
+ template<typename> void G3(int, int);
+
+ template<typename> void G4();
+ template<typename> void G4(int = 0, int); // { dg-error "default" }
+
+ template<typename> void G5();
+ template<typename> void G5(int = 0, int) {} // { dg-error "default" }
+
+ template<typename T> void G6(T, T) {}
+ template<typename T> void G6(T* = 0, T*) {} // { dg-error "default" }
+};
+
+template<typename T>
+void B<T>::F3(int = 0, int) {} // { dg-error "default" }
+
+template<typename T> template<typename>
+void B<T>::G3(int = 0, int) {} // { dg-error "default" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default4.C
new file mode 100644
index 000000000..599480984
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default4.C
@@ -0,0 +1,29 @@
+// PR c++/15759
+// Origin: Lars Rune Nøstdal <larsnostdal@gmail.com>
+// Testcase: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// { dg-do run }
+
+extern "C" void abort();
+
+int n = 0;
+
+int f() { return ++n; }
+
+int(&foo1)() = f;
+int(*foo2)() = &f;
+int(*foo3)() = f;
+
+int bar1(int i = foo1()) { return i; }
+int bar2(int i = foo2()) { return i; }
+int bar3(int i = foo3()) { return i; }
+int bar4(int i = f()) { return i; }
+
+int main()
+{
+ if (bar1() != 1) abort();
+ if (bar2() != 2) abort();
+ if (bar3() != 3) abort();
+ if (bar4() != 4) abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default5.C
new file mode 100644
index 000000000..87acb765e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default5.C
@@ -0,0 +1,47 @@
+// PR c++/28274
+// { dg-do compile }
+
+void f1(int, int, int, int, int = 0);
+void f1(int, int, int, int = 0, int);
+void f1(int, int, int = 0, int, int);
+void f1(int = 0, int, int, int, int); // { dg-error "default" }
+
+void f2(int, int, int, int, int = 0) {}
+void f2(int, int, int, int = 0, int);
+void f2(int, int, int = 0, int, int);
+void f2(int = 0, int, int, int, int); // { dg-error "default" }
+
+void f3(int, int, int, int, int = 0);
+void f3(int, int, int, int = 0, int) {}
+void f3(int, int, int = 0, int, int);
+void f3(int = 0, int, int, int, int); // { dg-error "default" }
+
+void f4(int, int, int, int, int = 0);
+void f4(int, int, int, int = 0, int);
+void f4(int, int, int = 0, int, int) {}
+void f4(int = 0, int, int, int, int); // { dg-error "default" }
+
+void f5(int, int, int, int, int = 0);
+void f5(int, int, int, int = 0, int);
+void f5(int, int, int = 0, int, int);
+void f5(int = 0, int, int, int, int) {} // { dg-error "default" }
+
+
+struct A
+{
+ void F1(int, int, int = 0);
+ void F2(int, int, int = 0);
+};
+
+void A::F1(int, int = 0, int) {}
+void A::F2(int = 0, int, int) {} // { dg-error "default" }
+
+
+template<int> struct B
+{
+ void F1(int, int, int = 0);
+ void F2(int, int, int = 0);
+};
+
+template<int N> void B<N>::F1(int, int = 0, int) {} // { dg-error "default arguments" }
+template<int N> void B<N>::F2(int = 0, int, int) {} // { dg-error "default arguments|parameter 2" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default6.C
new file mode 100644
index 000000000..2641801b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default6.C
@@ -0,0 +1,18 @@
+// PR c++/30108
+
+class BaseRobot {
+ typedef void (BaseRobot::*PseudoState)(void);
+ typedef PseudoState STATE;
+ STATE initial ();
+ int ready ();
+ STATE stpOtherTask ();
+ STATE commonEventProcessing (STATE pIdleTarget=(STATE)&BaseRobot::ready);
+};
+BaseRobot::STATE BaseRobot::initial ()
+{
+ return commonEventProcessing ();
+}
+BaseRobot::STATE BaseRobot::stpOtherTask ()
+{
+ return commonEventProcessing ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default7.C
new file mode 100644
index 000000000..ec523bf89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default7.C
@@ -0,0 +1,20 @@
+/* { dg-do assemble } */
+/* { dg-options "-O1" }*/
+// This was PR C++/31165
+// We used to copy the whole decl when we just wantted to
+// unshare some expressions for the default argument.
+class string {
+ char *ptr;
+ int len;
+ int sz;
+};
+class cset { } _cset_init;
+string an_empty_string;
+void f(string& = an_empty_string);
+void
+h (void )
+{
+f();
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/default8.C b/gcc-4.9/gcc/testsuite/g++.dg/other/default8.C
new file mode 100644
index 000000000..255a66135
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/default8.C
@@ -0,0 +1,43 @@
+// PR c++54485
+
+template<typename T>
+class K1
+{
+ int fn(int, int);
+ int gn(int, int);
+};
+
+template<typename T>
+int K1<T>::fn (int a, int b = 3) // { dg-error "default arguments" }
+{
+ return a - b;
+}
+
+template<typename T>
+int K1<T>::gn (int a = 1, int b = 3) // { dg-error "default arguments" }
+{
+ return a - b;
+}
+
+template<typename T>
+class K2
+{
+ template<typename U>
+ int fn(int, int);
+ template<typename U>
+ int gn(int, int);
+};
+
+template<typename T>
+template<typename U>
+int K2<T>::fn (int a, int b = 3) // { dg-error "default arguments" }
+{
+ return a - b;
+}
+
+template<typename T>
+template<typename U>
+int K2<T>::gn (int a = 1, int b = 3) // { dg-error "default arguments" }
+{
+ return a - b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/do1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/do1.C
new file mode 100644
index 000000000..720358568
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/do1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7640. ICE.
+
+void init ()
+{
+ do { } while (0)
+ obj = 0; // { dg-error "expected|not declared" "" }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/dtor1.C
new file mode 100644
index 000000000..90ca38007
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/dtor1.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+// PR C++/30303
+// This used to ICE because we did not return NULL
+// in grokfndecl when an error happened.
+
+struct Ifoo
+{
+virtual ~Ifoo(){}
+};
+struct foo : Ifoo
+{
+ foo(){};
+};
+foo::~foo() // { dg-error "definition of implicitly-declared" }
+{
+delete this;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/dtor2.C
new file mode 100644
index 000000000..fb673d808
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/dtor2.C
@@ -0,0 +1,7 @@
+/* PR c++/35317 */
+/* { dg-do compile } */
+
+struct A
+{
+ void operator delete[] (void*, ...);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-1.C
new file mode 100644
index 000000000..eb249e798
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-ada-spec" } */
+
+struct S
+{
+ int i;
+};
+
+/* { dg-final { scan-ada-spec "type S is record" } } */
+/* { dg-final { cleanup-ada-spec } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C
new file mode 100644
index 000000000..87c183aab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-ada-spec" } */
+
+struct S
+{
+ int it;
+ __extension__ unsigned char data[];
+};
+
+/* { dg-final { scan-ada-spec "array \\(0 .. -1\\)" } } */
+/* { dg-final { cleanup-ada-spec } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ellipsis1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ellipsis1.C
new file mode 100644
index 000000000..d2501ca85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ellipsis1.C
@@ -0,0 +1,12 @@
+// PR c++/26291
+// { dg-do compile }
+
+struct A
+{
+ A& operator= (A,...); // { dg-error "variable number of arguments" }
+ A operator+ (...); // { dg-error "variable number of arguments" }
+ operator int(...); // { dg-error "variable number of arguments" }
+ int operator() (...);
+};
+
+A operator- (A,...); // { dg-error "variable number of arguments" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/enum1.C
new file mode 100644
index 000000000..aa5c976ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/enum1.C
@@ -0,0 +1,19 @@
+// PR c++/6037
+// This testcase ICEd because start_enum expected pushtag to insert
+// the tag always into current binding level.
+
+struct A
+{
+ ~A () { }
+};
+
+struct B
+{
+ void foo ()
+ {
+ switch (0) { default: ; }
+ A a;
+ enum C { };
+ (void) a;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/enum2.C
new file mode 100644
index 000000000..3a28f2532
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/enum2.C
@@ -0,0 +1,3 @@
+// PR c++/51248
+
+enum E { e = sizeof(const E*) };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/enum3.C
new file mode 100644
index 000000000..23d6c8357
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/enum3.C
@@ -0,0 +1,10 @@
+// PR c++/53848
+
+extern "C"
+{
+ struct s {
+ enum {
+ e = 0
+ } f;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error1.C
new file mode 100644
index 000000000..927efef8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 90, stupid error message `(this + 160)'
+
+class foo {
+ public:
+ int fudge[40];
+ int bar [40];
+ inline int access(int i) {
+ return bar(i); // { dg-error "cannot be used as a function" "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error10.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error10.C
new file mode 100644
index 000000000..546a4d65c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error10.C
@@ -0,0 +1,14 @@
+// PR c++/21930
+// Test case by Volker Reichelt
+// { dg-do compile }
+
+template<int> struct A {};
+
+template<int N>
+void foo(const A<N> &a)
+{ -A<N>(a); } // { dg-error "operand type is 'A<0>'" }
+
+void bar()
+{
+ foo(A<0>()); // { dg-message "required from here" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error11.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error11.C
new file mode 100644
index 000000000..d8a641c2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error11.C
@@ -0,0 +1,17 @@
+/* { dg-options "-O1" } */
+struct A
+{
+ ERROR; /* { dg-error "ERROR" } */
+ ~A();
+};
+
+struct B
+{
+ virtual ~B();
+};
+
+struct C : B, A {};
+
+struct D : C {};
+
+D d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error12.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error12.C
new file mode 100644
index 000000000..253561e8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error12.C
@@ -0,0 +1,9 @@
+//PR c++/28292
+
+extern "Java"
+{
+ struct A
+ {
+ void foo(void; // { dg-error "before|incomplete type|invalid use" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error13.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error13.C
new file mode 100644
index 000000000..4ee935ad6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error13.C
@@ -0,0 +1,12 @@
+//PR c++/28258
+
+struct A // { dg-message "note" }
+{
+ A(void x); // { dg-error "invalid use|incomplete type|candidates" }
+ // { dg-message "" "match candidate text" { target *-*-* } 5 }
+};
+
+struct B : A {}; // { dg-error "no matching function for call|deleted" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 9 }
+
+B b; // { dg-message "synthesized method|deleted" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error14.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error14.C
new file mode 100644
index 000000000..b3c930188
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error14.C
@@ -0,0 +1,7 @@
+//PR c++/26269
+
+void foo()
+{
+ i; // { dg-error "not declared in this scope" }
+ int i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error15.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error15.C
new file mode 100644
index 000000000..d218c13bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error15.C
@@ -0,0 +1,56 @@
+// Test that duplicate function parameters are found in declarations.
+
+extern void g0 (int a, int b);
+extern void g1 (int a, float b);
+
+extern void f0 (int a, // { dg-message "previous" }
+ int a); // { dg-error "redefinition" }
+extern void f1 (int a, // { dg-message "previous" }
+ float a); // { dg-error "conflicting" }
+extern void f3 (int a, int b, int c, // { dg-message "previous" }
+ int a); // { dg-error "redefinition" }
+extern void f4 (int a, int b, int c, // { dg-message "previous" }
+ int a, // { dg-error "redefinition" }
+ int a); // { dg-error "redefinition" }
+extern void f5 (int a, int b, int c, int d, int e, int f, int g, int h, // { dg-message "previous" }
+ int a, // { dg-error "redefinition" }
+ int i, int j, int k, int l, int m, int n, int o, int p,
+ int q, int r, int s, int t, int u, int v, int w, int x, int y,
+ int z);
+
+extern void f6 (int a, int, int, int, int, int, int, int, int, int, int, // { dg-message "previous" }
+ int a, // { dg-error "redefinition" }
+ int, int, int, int, int, int, int, int, int, int, int,
+ float, float, float, float, float, float, float, float,
+ int);
+
+extern void f7 (void (*a)(int), // { dg-message "previous" }
+ void (*a)(int)); // { dg-error "redefinition" }
+extern void f8 (float (*a)(int), // { dg-message "previous" }
+ int (*a)(float)); // { dg-error "conflicting" }
+
+extern void f9 (int a, // { dg-message "previous" }
+ int a, // { dg-error "redefinition" }
+ int a); // { dg-error "redefinition" }
+
+extern void f10 (int a, // { dg-message "previous" }
+ int b, // { dg-message "previous" }
+ int c, // { dg-message "previous" }
+ int c, // { dg-error "redefinition" }
+ int b, // { dg-error "redefinition" }
+ int a); // { dg-error "redefinition" }
+
+class C1 {
+ public:
+ void C1_g0 (int a, int b);
+ void C1_f0 (int a, // { dg-message "previous" }
+ int a); // { dg-error "redefinition" }
+};
+
+template <class T>
+class C2 {
+ public:
+ void C2_g0 (T a, T b);
+ void C2_f0 (T a, // { dg-message "previous" }
+ T a); // { dg-error "redefinition" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error16.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error16.C
new file mode 100644
index 000000000..38c0fd63f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error16.C
@@ -0,0 +1,14 @@
+// PR c++/17763
+
+template <typename U> struct Outer {
+ struct Inner {};
+ Inner foo();
+};
+
+typedef int X;
+typedef Outer<X> XOuter;
+
+int main() {
+ Outer<int> ab;
+ ab.foo() == 1; // { dg-error "operand types are 'Outer<int>::Inner' and 'int'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error17.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error17.C
new file mode 100644
index 000000000..18769ef6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error17.C
@@ -0,0 +1,13 @@
+// PR c++/32870
+
+struct Foo {
+ struct Bar;
+};
+
+namespace N {
+ struct Foo::Bar { }; // { dg-error "in namespace 'N'" }
+}
+
+struct Baz {
+ struct Foo::Bar { }; // { dg-error "in 'struct Baz'" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error18.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error18.C
new file mode 100644
index 000000000..9e4d21cfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error18.C
@@ -0,0 +1,11 @@
+// PR c++/33208
+
+struct A
+{
+ bool b;
+};
+
+void f(A a)
+{
+ a.b--; // { dg-error "Boolean expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error19.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error19.C
new file mode 100644
index 000000000..9389dc170
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error19.C
@@ -0,0 +1,7 @@
+// PR c++/33495
+
+void foo()
+{
+ if (({while(true);})) // { dg-error "forbids|<statement>" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error2.C
new file mode 100644
index 000000000..36089e4b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 196. Misleading diagnostic
+
+namespace N
+{
+ class B { friend void operator>>(int, class B); };
+ class N { friend void operator>>(int,class N); };
+}
+void N::operator>>(int, N::B) // { dg-error "N::N::B|N::operator>>" }
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error20.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error20.C
new file mode 100644
index 000000000..bb7d7b3b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error20.C
@@ -0,0 +1,13 @@
+// PR c++/34275
+// { dg-do compile }
+
+struct A // { dg-message "operator=|no known conversion" }
+{
+ virtual A foo ();
+};
+
+void bar (A& a)
+{
+ a.foo () = 0; // { dg-error "operand types are 'A' and 'int'" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 11 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error21.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error21.C
new file mode 100644
index 000000000..e4d14eab6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error21.C
@@ -0,0 +1,8 @@
+// PR c++/34273
+
+struct A {};
+
+struct B : A
+{
+ B() : A()... {} // { dg-error "cannot expand" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error22.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error22.C
new file mode 100644
index 000000000..225dcae82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error22.C
@@ -0,0 +1,9 @@
+// PR c++/34394
+// { dg-do compile }
+
+extern "C" double fabs (double);
+
+void foo (double x)
+{
+ fabs (x) (); // { dg-error "__builtin_abs" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error23.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error23.C
new file mode 100644
index 000000000..959fe4075
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error23.C
@@ -0,0 +1,5 @@
+// PR c++/34918
+// { dg-do compile }
+
+int v __attribute ((vector_size (8)));
+bool b = !(v - v); // { dg-error "could not convert .\\(__vector.2. int\\)\\{0, 0\\}. from .__vector.2. int. to .bool.|in argument to unary" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error24.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error24.C
new file mode 100644
index 000000000..54343c502
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error24.C
@@ -0,0 +1,13 @@
+// PR c++/34965
+// { dg-do compile }
+// { dg-options "-O" }
+
+int foo (int);
+
+void
+bar (int i, int j, double k)
+{
+ foo (i && j) (); // { dg-error "\\(\\(?i != 0\\)? \\&\\& \\(?j != 0\\)?\\)" }
+ foo (!i || !j) (); // { dg-error "\\(\\(?i == 0\\)? \\|\\| \\(?j == 0\\)?\\)" }
+ foo (!i == !j) (); // { dg-error "\\(\\(?i != 0\\)? \\^ \\(?j == 0\\)?\\)" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error25.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error25.C
new file mode 100644
index 000000000..b5b665a2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error25.C
@@ -0,0 +1,5 @@
+// PR c++/35338
+// { dg-options "" }
+
+int i = 0r; // { dg-error "not supported" }
+bool b = !0r; // { dg-error "not supported" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error26.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error26.C
new file mode 100644
index 000000000..fb2c8b727
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error26.C
@@ -0,0 +1,6 @@
+// PR c++/35333
+
+void foo(__complex__ double x)
+{
+ __builtin_conj(x)(); // { dg-error "~x" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error27.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error27.C
new file mode 100644
index 000000000..ef1e5906b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error27.C
@@ -0,0 +1,13 @@
+// PR c++/35332
+// { dg-do compile }
+// { dg-options "-fno-finite-math-only" { target sh*-*-* } }
+
+void foo (double x, double y)
+{
+ __builtin_isgreater(x, y)(); // { dg-error "cannot be used as a function" }
+ __builtin_isless(x, y)(); // { dg-error "cannot be used as a function" }
+ __builtin_isgreaterequal(x, y)(); // { dg-error "cannot be used as a function" }
+ __builtin_islessequal(x, y)(); // { dg-error "cannot be used as a function" }
+ __builtin_isunordered(x, y)(); // { dg-error "cannot be used as a function" }
+ __builtin_islessgreater(x, y)(); // { dg-error "cannot be used as a function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error28.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error28.C
new file mode 100644
index 000000000..5ac15b7de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error28.C
@@ -0,0 +1,8 @@
+// PR c++/35987
+// { dg-do compile }
+
+void
+foo (char *p)
+{
+ if (++p = true); // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error29.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error29.C
new file mode 100644
index 000000000..a46405875
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error29.C
@@ -0,0 +1,21 @@
+// PR c++/35334
+// { dg-do compile }
+// { dg-bogus "not supported by" "" { target *-*-* } 0 }
+
+__complex__ unsigned int i;
+int j;
+char k;
+__complex__ double l;
+double m;
+float n;
+
+void
+foo ()
+{
+ ((__complex__ int)i)(); // { dg-error "cannot be used as a function" }
+ ((__complex__ int)j)(); // { dg-error "cannot be used as a function" }
+ ((__complex__ int)k)(); // { dg-error "cannot be used as a function" }
+ ((__complex__ long double)l)(); // { dg-error "cannot be used as a function" }
+ ((__complex__ long double)m)(); // { dg-error "cannot be used as a function" }
+ ((__complex__ long double)n)(); // { dg-error "cannot be used as a function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error3.C
new file mode 100644
index 000000000..bd5d70109
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error3.C
@@ -0,0 +1,5 @@
+// Test for proper error message formatting; the throw() should go inside
+// the parens, as below.
+
+void (*g() throw())(); // { dg-error "g\\(\\) throw" "" }
+void (*g())(); // { dg-error "" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error30.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error30.C
new file mode 100644
index 000000000..2df0e6407
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error30.C
@@ -0,0 +1,14 @@
+// PR c++/35336
+// { dg-do compile }
+// { dg-bogus "not supported by" "" { target *-*-* } 0 }
+
+struct A
+{
+ int i : 2;
+};
+
+void foo (bool b)
+{
+ A a;
+ (a.i || b) (); // { dg-error "cannot be used as" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error31.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error31.C
new file mode 100644
index 000000000..95c9d7374
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error31.C
@@ -0,0 +1,14 @@
+// PR c++/35335
+// { dg-do compile }
+// { dg-options "" }
+// { dg-bogus "not supported by" "" { target *-*-* } 0 }
+
+struct A {}; // { dg-message "operator=|no known conversion" }
+
+void
+foo ()
+{
+ A a;
+ a = ({ { 1; } }); // { dg-error "no match for" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 12 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error32.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error32.C
new file mode 100644
index 000000000..56d3b7aec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error32.C
@@ -0,0 +1,8 @@
+// PR c++/33492
+// { dg-options "" }
+
+void foo()
+{
+ if (throw 0) // { dg-error "could not convert .\\<throw-expression\\>. from .void. to .bool." }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error33.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error33.C
new file mode 100644
index 000000000..48fca70d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error33.C
@@ -0,0 +1,11 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/42218
+// { dg-do compile }
+
+template<int> struct A
+{
+ template<int> struct B;
+};
+
+int i = A<0>::B<0>::X::Y; // { dg-error "'A<0>::B<0>::X' has not been declared" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error34.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error34.C
new file mode 100644
index 000000000..d6f3eb590
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error34.C
@@ -0,0 +1,6 @@
+// PR c++/46538
+// { dg-do compile }
+// { dg-options "" }
+
+S () : str(__PRETTY_FUNCTION__) {} // { dg-error "forbids declaration" "decl" }
+// { dg-error "only constructors" "constructor" { target *-*-* } 5 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error4.C
new file mode 100644
index 000000000..a5d5e3c7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error4.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9898. Confusing error message
+
+struct Wrapper {};
+
+void Foo(int const &); // { dg-message "in passing" "" }
+
+void Baz ()
+{
+ Foo (Wrapper ()); // { dg-error "Wrapper" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error5.C
new file mode 100644
index 000000000..44c4a4747
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error5.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <bangerth@ices.utexas.edu>
+// PR c++/11106: Error message gives partially mangled operator name
+
+template <typename T> struct S {
+ struct I {};
+};
+
+template <typename T> struct S2 : S<T> {
+ using S<T>::operator typename S<T>::I*; // { dg-error "operator S\\<int\\>" "" }
+};
+
+template struct S2<int>; // { dg-message "required" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error6.C
new file mode 100644
index 000000000..21180d765
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error6.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Make sure we emit a decent error message when trying to mangle an
+// expression not supported by the C++ ABI due to a defect.
+// Update: Better to make it supported, I think...
+
+template <int N>
+struct A {};
+
+struct B
+{
+ static int foo(void);
+};
+
+template <class T>
+A<sizeof(T::foo())> func(void);
+
+int main()
+{
+ func<B>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error7.C
new file mode 100644
index 000000000..9845b4172
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error7.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// Origin: <andrewp at andypo dot net>
+// c++/8046: ICE on illegal code involving destructor being treated as bit-not
+// expression
+
+class A;
+namespace N {}
+
+void foo(void)
+{
+ N::~A(); // { dg-error "not a class-name" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error8.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error8.C
new file mode 100644
index 000000000..116a6846c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error8.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// Contributed by: Michael Elizabeth Chastain
+// <mec dot gnu at mindspring dot com>
+// PR c++/13927: Wrong error message for redeclartion of type from union
+
+void foo(void)
+{
+ union { int alpha; int beta; }; // { dg-message "previous declaration" }
+ double alpha; // { dg-error "conflicting declaration" }
+}
+
+// This checks both the templated version, and the position of the diagnostic
+// (which is currently wrong).
+template <int>
+void tfoo(void)
+{
+ union {
+ int alpha; // { dg-error "" "" { xfail *-*-* } }
+ int beta;
+ }; // { dg-bogus "" "misplaced position of the declaration" { xfail *-*-* } }
+ double alpha; // { dg-error "" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/error9.C b/gcc-4.9/gcc/testsuite/g++.dg/other/error9.C
new file mode 100644
index 000000000..65a9c58ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/error9.C
@@ -0,0 +1,20 @@
+// { dg-options -Wall }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Sept 2004 <nathan@codesourcery.com>
+
+// Origin: v.haisman@sh.cvut.cz
+// Bug 17681: bad diagnostic text.
+
+struct A
+{ };
+
+struct B
+{ };
+
+struct C : public B, public A
+{
+ C () // { dg-warning "when initialized" "" }
+ : A(), B() // { dg-warning "base .\[AB\]." "" }
+ { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/field1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/field1.C
new file mode 100644
index 000000000..a719135e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/field1.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 9483. accepted fields with same name as class
+
+struct test
+{
+ char test; // { dg-error "with same name as class" "" }
+ test();
+};
+
+template <typename T> struct X
+{
+ char X; // { dg-error "with same name as class" "" }
+ X ();
+};
+
+template <> struct X<int> {
+ char X; // { dg-error "with same name as class" "" }
+ X();
+};
+
+X<float> i; // { dg-message "required from" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/final1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/final1.C
new file mode 100644
index 000000000..db513629b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/final1.C
@@ -0,0 +1,27 @@
+/* Verify that final methods are devirtualized */
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-fdump-tree-original" } */
+
+struct A final
+{
+ virtual void foo ()
+ {
+ }
+};
+
+struct B
+{
+ virtual void foo () final
+ {
+ }
+};
+
+void fun(A* a, B* b)
+{
+ a->foo();
+ b->foo();
+}
+
+/* { dg-final { scan-tree-dump-times "A::foo" 2 "original" } } */
+/* { dg-final { scan-tree-dump-times "B::foo" 2 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/final2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/final2.C
new file mode 100644
index 000000000..92e753796
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/final2.C
@@ -0,0 +1,28 @@
+// PR c++/53186
+// { dg-do compile { target c++11 } }
+// { dg-options "-fdump-tree-original" }
+
+struct F1
+{
+ virtual void operator()() final;
+ virtual operator int() final;
+ virtual int operator++() final;
+};
+
+struct F2 final
+{
+ virtual void operator()();
+ virtual operator int();
+ virtual int operator++();
+};
+
+void fooF1(F1& a) { a(); int m = a; ++a; }
+void fooF2(F2& a) { a(); int m = a; ++a; }
+
+// { dg-final { scan-tree-dump-times "F1::operator\\(\\)" 1 "original" } }
+// { dg-final { scan-tree-dump-times "F1::operator int" 1 "original" } }
+// { dg-final { scan-tree-dump-times "F1::operator\\+\\+" 1 "original" } }
+// { dg-final { scan-tree-dump-times "F2::operator\\(\\)" 1 "original" } }
+// { dg-final { scan-tree-dump-times "F2::operator int" 1 "original" } }
+// { dg-final { scan-tree-dump-times "F2::operator\\+\\+" 1 "original" } }
+// { dg-final { cleanup-tree-dump "original" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/first-global.C b/gcc-4.9/gcc/testsuite/g++.dg/other/first-global.C
new file mode 100644
index 000000000..d58bc7164
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/first-global.C
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-add-options bind_pic_locally } */
+/* { dg-final { scan-assembler "_GLOBAL__(I|sub_I)(_|_65535_0_)foobar" } } */
+
+struct foo { foo (); };
+foo foobar;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/fold1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/fold1.C
new file mode 100644
index 000000000..23d34546e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/fold1.C
@@ -0,0 +1,8 @@
+// PR middle-end/27384
+// { dg-do compile }
+
+struct A
+{
+ static const int i = i; // { dg-error "not declared" }
+ int x[i]; // { dg-error "constant-expression" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/friend1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/friend1.C
new file mode 100644
index 000000000..3193180ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/friend1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 10 Oct 2001 <nathan@codesourcery.com>
+
+// Bug 4476. We tangled up inline friends and pure virtuals during
+// class definition.
+
+struct A {
+ friend void f () { }
+ void g (A a) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/friend2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/friend2.C
new file mode 100644
index 000000000..ce5d2b741
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/friend2.C
@@ -0,0 +1,23 @@
+// { dg-do run }
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/12370
+// Wrong code because of the friend declaration
+
+template <typename T> struct A
+{
+ T x;
+ A(T t) : x(t) {}
+ friend A<int> foo (const A<unsigned>&);
+};
+
+A<int> foo (const A<unsigned>& a)
+{
+ A<int> res(a.x);
+ return res;
+}
+
+int main()
+{
+ return foo(A<unsigned>(0)).x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/friend3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/friend3.C
new file mode 100644
index 000000000..ce872e555
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/friend3.C
@@ -0,0 +1,13 @@
+// PR c++/22293
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+struct A
+{
+ friend ~A(); // { dg-error "qualified name" }
+};
+
+struct B
+{
+ friend ~A(); // { dg-error "qualified name" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/friend4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/friend4.C
new file mode 100644
index 000000000..537643df9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/friend4.C
@@ -0,0 +1,8 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// Misleading diagnostic
+
+struct A
+{
+ friend void A::foo(); // { dg-error "implicitly friends" }
+ friend A::~A(); // { dg-error "implicitly friends" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/friend5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/friend5.C
new file mode 100644
index 000000000..b0ec201fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/friend5.C
@@ -0,0 +1,9 @@
+/* PR c++/32111 */
+/* This used to ICE. */
+
+/* { dg-do compile } */
+
+struct A
+{
+ friend A::~A() {} /* { dg-error "implicitly friends of their class" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/gc1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/gc1.C
new file mode 100644
index 000000000..3c7a16998
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/gc1.C
@@ -0,0 +1,49 @@
+// This test failed with GGC_ALWAYS_COLLECT because not all unparsed
+// inline methods were registered with GC.
+// { dg-do compile }
+
+const char *foo ()
+{
+ struct A
+ {
+ const char *a1 ()
+ {
+ return "a1";
+ }
+ const char *a2 ()
+ {
+ struct B
+ {
+ const char *b1 ()
+ {
+ return "b1";
+ }
+ const char *b2 ()
+ {
+ struct C
+ {
+ const char *c1 ()
+ {
+ return "c1";
+ }
+ const char *c2 ()
+ {
+ return "c2";
+ }
+ };
+ return "b2";
+ }
+ const char *b3 ()
+ {
+ return "b3";
+ }
+ };
+ return "a2";
+ }
+ const char *a3 ()
+ {
+ return "a3";
+ }
+ };
+ return "foo";
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/gc2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/gc2.C
new file mode 100644
index 000000000..142229475
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/gc2.C
@@ -0,0 +1,38 @@
+// PR c++/12316
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// { dg-do compile }
+// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+
+inline void FOO() {}
+
+template<typename> struct A
+{
+ A() {}
+ ~A() throw() {}
+};
+
+template<typename> struct B
+{
+ static void foo();
+ static void bar() { foo(); }
+};
+
+struct C {};
+
+template<typename> struct D : C
+{
+ D() {}
+ ~D() { B<void>::bar(); }
+};
+
+template<typename> struct E : D<void>
+{
+ static void baz() {}
+ E(A<void>) { baz(); }
+};
+
+void BAR()
+{
+ new E<void>(A<void>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/gc3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/gc3.C
new file mode 100644
index 000000000..500d109e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/gc3.C
@@ -0,0 +1,8 @@
+// PR c++/21687
+// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+
+template <class Union>
+void perform_test_trivial() {
+ struct check_union { void perform_test_trivial() {} };
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/gc4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/gc4.C
new file mode 100644
index 000000000..50c16b366
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/gc4.C
@@ -0,0 +1,14 @@
+// PR c++/41120
+// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0" }
+
+struct A
+{
+ A();
+};
+
+struct B
+{
+ A a;
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/gc5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/gc5.C
new file mode 100644
index 000000000..00184fc0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/gc5.C
@@ -0,0 +1,27 @@
+// PR c++/51852
+// { dg-do compile { target c++11 } }
+// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0" }
+
+template <typename, typename>
+class transformed {};
+
+template <class R, class F>
+transformed<F, R> transform (R r, F f);
+
+template <typename, typename>
+class joined {};
+
+template <typename T, typename U>
+joined<T, U> join (T t, U u);
+
+template <typename T, typename U, typename V, typename... Rest>
+auto join (T t, U u, V v, Rest... rest) -> decltype (join (join (t, u), v, rest...));
+
+template <typename F, typename... Rs>
+auto polymorphic_transform (F f, Rs... rs) -> decltype (join (transform(rs, f)...));
+
+int
+main ()
+{
+ polymorphic_transform (0, 0, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-1.C
new file mode 100644
index 000000000..ec572ec94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-1.C
@@ -0,0 +1,28 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-msse2" } */
+/* { dg-require-effective-target sse2_runtime } */
+
+#include <xmmintrin.h>
+
+static void
+sse2_test (void)
+{
+ float a = 1.0f;
+ float b = 2.0f;
+ float c = 3.0f;
+ float r;
+
+ __m128 v = _mm_set_ps(a, b, c, 0);
+
+ v = (__m128)_mm_srli_si128((__m128i)v, 4);
+ _mm_store_ss(&r, v);
+ if (r != 3.0f)
+ abort ();
+}
+
+int
+main ()
+{
+ sse2_test ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-2.C
new file mode 100644
index 000000000..2f8650a66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-2.C
@@ -0,0 +1,12 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1" } */
+
+/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
+ xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h,
+ popcntintrin.h, fmaintrin.h and mm_malloc.h.h are usable with
+ -O -pedantic-errors. */
+
+#include <x86intrin.h>
+
+int dummy;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-3.C
new file mode 100644
index 000000000..df0bd2797
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-3.C
@@ -0,0 +1,9 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1" } */
+
+/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
+ xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h,
+ popcntintrin.h, fmaintrin.h and mm_malloc.h are usable with
+ -O -fkeep-inline-functions. */
+
+#include <x86intrin.h>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-4.C
new file mode 100644
index 000000000..3e0d94e95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-4.C
@@ -0,0 +1,29 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O1 -msse2" } */
+
+#include <xmmintrin.h>
+
+void ConvertFloatSSE (void *inBuff, void *outBuff, int len)
+{
+ unsigned char *inByteBuffer = reinterpret_cast < unsigned char *>(inBuff);
+ float *outFloatBuffer = reinterpret_cast < float *>(outBuff);
+
+ for (int i = 0; i < len / 4; i++)
+ {
+ __m128i register1 =
+ _mm_set_epi8 (*inByteBuffer, *(inByteBuffer + 1),
+ *(inByteBuffer + 2), 0,
+ *(inByteBuffer + 3), *(inByteBuffer + 4),
+ *(inByteBuffer + 5), 0,
+ *(inByteBuffer + 6), *(inByteBuffer + 7),
+ *(inByteBuffer + 8), 0,
+ *(inByteBuffer + 9), *(inByteBuffer + 10),
+ *(inByteBuffer + 11), 0);
+ __m128i register2 = _mm_srai_epi32 (register1, 8);
+ __m128 register3 = _mm_cvtepi32_ps (register2);
+
+ _mm_store_ps (outFloatBuffer, register3);
+ outFloatBuffer += 4;
+ inByteBuffer += 12;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-7.C
new file mode 100644
index 000000000..e2ad51e52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-7.C
@@ -0,0 +1,8 @@
+/* Test that x86intrin.h is usable with -O -pedantic-errors. */
+/* We were using SSE4.2 builtins without the extension available. */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O -pedantic-errors" } */
+
+#include <x86intrin.h>
+
+int dummy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-8.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-8.C
new file mode 100644
index 000000000..cf833a524
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-8.C
@@ -0,0 +1,22 @@
+// PR rtl-optimization/45400
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O2 -msse2" }
+// { dg-options "-O2 -msse2 -fpic" { target fpic } }
+
+#include <xmmintrin.h>
+
+static inline unsigned short
+bar (unsigned short x)
+{
+ return ((x << 8) | (x >> 8));
+}
+
+unsigned int
+foo (float *x, short *y)
+{
+ __m128 a = _mm_set_ps1 (32767.5f);
+ __m128 b = _mm_mul_ps (_mm_load_ps (x), a);
+ __m64 c = _mm_cvtps_pi16 (b);
+ __builtin_memcpy (y, &c, sizeof (short) * 4);
+ y[0] = bar (y[0]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/i386-9.C b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-9.C
new file mode 100644
index 000000000..796405791
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/i386-9.C
@@ -0,0 +1,12 @@
+// PR target/48142
+// Testcase by Zdenek Sojka <zsojka@seznam.cz>
+
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-options "-Os -mpreferred-stack-boundary=5 -fstack-check -fno-omit-frame-pointer" }
+
+int main()
+{
+ try { throw 0; }
+ catch (...) {}
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete1.C
new file mode 100644
index 000000000..cb7970fad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete1.C
@@ -0,0 +1,7 @@
+// PR c++/23089
+// Origin: Flash Sheridan <flash@pobox.com>
+// ICE on incomplete type
+// { dg-do compile }
+// { dg-options "-O" }
+
+void foo(struct A) {} // { dg-error "incomplete type|forward declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete2.C
new file mode 100644
index 000000000..127bf588e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete2.C
@@ -0,0 +1,14 @@
+// PR c++/19963
+// { dg-do compile }
+
+struct A;
+
+struct B
+{
+ A a : 1; // { dg-error "incomplete" }
+};
+
+struct S
+{
+ S : 1; // { dg-error "incomplete" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete3.C
new file mode 100644
index 000000000..14de98eb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/incomplete3.C
@@ -0,0 +1,9 @@
+//PR c++/28054
+
+struct A;
+
+struct B
+{
+ friend A : 2; // { dg-error "incomplete type" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/increment1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/increment1.C
new file mode 100644
index 000000000..506157ef2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/increment1.C
@@ -0,0 +1,19 @@
+// PR c++/37561
+// { dg-do compile }
+// { dg-options "-Wno-int-to-pointer-cast" }
+
+__PTRDIFF_TYPE__ p;
+char q;
+
+void
+foo ()
+{
+ ((char *) p)++; // { dg-error "lvalue" }
+ ((char *) q)++; // { dg-error "lvalue" }
+ ((char *) p)--; // { dg-error "lvalue" }
+ ((char *) q)--; // { dg-error "lvalue" }
+ ++(char *) p; // { dg-error "lvalue" }
+ ++(char *) q; // { dg-error "lvalue" }
+ --(char *) p; // { dg-error "lvalue" }
+ --(char *) q; // { dg-error "lvalue" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/infloop-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/infloop-1.C
new file mode 100644
index 000000000..6c851c7e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/infloop-1.C
@@ -0,0 +1,16 @@
+// PR 18300: This sends old compilers into an infinite loop on x86_64
+// Testcase and patch contributed by Zak Kipling <zak@transversal.com>
+
+struct base1 { };
+struct base2 { };
+struct base3 { };
+
+struct derived : base1, base2, base3 { };
+
+void foo(derived);
+
+int main()
+{
+ foo(derived());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/init1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/init1.C
new file mode 100644
index 000000000..7fc7db66a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/init1.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Nov 2001 <nathan@codesourcery.com>
+
+// Bug 3154
+
+class A {};
+
+struct B : A
+{
+ typedef A Parent;
+
+ B () : Parent () {}
+};
+
+class T
+{
+ typedef int Foo;
+ T () : Foo () {} // { dg-error "T::Foo' is not" "" }
+};
+
+struct S : B
+{
+ int Parent;
+
+ S () :Parent (1) {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/init2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/init2.C
new file mode 100644
index 000000000..0b85aa67d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/init2.C
@@ -0,0 +1,49 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 160. Wrong code emitted for some reference initializers.
+
+void Foo ()
+{
+}
+
+int fail;
+
+class C
+{
+ public:
+ int m;
+ int &r;
+
+ C () ;
+};
+
+C::C ()
+ : m (1), r ((Foo (), m))
+{
+ m = 10;
+
+ if (r != m)
+ fail = 1;
+ else if (&m != &r)
+ fail = 2;
+}
+int main ()
+{
+ int m (1);
+ int &r ((Foo (),m));
+
+ m = 10;
+ if (r != m)
+ fail = 3;
+ else if (&r != &m)
+ fail = 4;
+
+ if (!fail)
+ {
+ C c;
+ }
+ return fail;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/isnan.C b/gcc-4.9/gcc/testsuite/g++.dg/other/isnan.C
new file mode 100644
index 000000000..f80523dc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/isnan.C
@@ -0,0 +1,8 @@
+// PR c++/48369
+
+extern "C" int isnan (double);
+
+void f(double d)
+{
+ bool b = isnan(d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/java1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/java1.C
new file mode 100644
index 000000000..38b5e0c30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/java1.C
@@ -0,0 +1,22 @@
+// { dg-options "-w -ansi -pedantic" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+
+extern "Java" {
+ class One
+ {
+ ~One (); // { dg-error "cannot have a destructor" "" }
+ One ();
+ };
+
+ class Two {};
+
+ class Three : One {}; // { dg-error "cannot have an implicit" "" }
+
+ class Four : Two {};
+
+ class Five : Two, Four {}; // { dg-error "cannot have multiple bases" "" }
+
+ class Six : virtual Two {}; // { dg-error "cannot have virtual base" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/java2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/java2.C
new file mode 100644
index 000000000..8ba4d5a72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/java2.C
@@ -0,0 +1,11 @@
+// PR c++/???
+// { dg-do compile }
+
+extern "Java"
+{
+ struct A {};
+}
+
+typedef void* jclass;
+
+A* p = new A; // { dg-error "class\\$" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/java3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/java3.C
new file mode 100644
index 000000000..1bc0a8874
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/java3.C
@@ -0,0 +1,7 @@
+// PR c++/11006
+
+typedef int* jclass;
+
+void foo () {
+ new __java_boolean; // { dg-error "valid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/label1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/label1.C
new file mode 100644
index 000000000..74572dc7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/label1.C
@@ -0,0 +1,7 @@
+//PR c++/27820
+
+void foo()
+{
+ L: L: ; // { dg-error "duplicate label" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/large-size-array.C b/gcc-4.9/gcc/testsuite/g++.dg/other/large-size-array.C
new file mode 100644
index 000000000..9614fb125
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/large-size-array.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+#include <limits.h>
+
+#ifdef _WIN64
+#define DIM ULLONG_MAX>>1
+#else
+#ifdef __LP64__
+#define DIM UINT_MAX>>1
+#else
+#define DIM USHRT_MAX>>1
+#endif
+#endif
+
+int
+sub (int *a)
+{
+ return a[0];
+}
+
+int
+main (void)
+{
+ int a[DIM][DIM]; /* { dg-error "size of array 'a' is too large" } */
+ return sub (&a[0][0]); /* { dg-error "declared" } */
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/linkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/linkage1.C
new file mode 100644
index 000000000..c2676bac1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/linkage1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 9 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 51
+// This example snippet is from the ISO C++ standard, sect 7.5 para 4:
+
+extern "C" typedef void FUNC_c();
+
+class C {
+ public:
+ static FUNC_c* q;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/macro-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/macro-1.C
new file mode 100644
index 000000000..e1d9d34cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/macro-1.C
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/main1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/main1.C
new file mode 100644
index 000000000..ba945741e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/main1.C
@@ -0,0 +1,4 @@
+// PR c++/30021
+// { dg-do compile }
+
+int main(void,char**); // { dg-error "incomplete type|invalid use" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/mmintrin.C b/gcc-4.9/gcc/testsuite/g++.dg/other/mmintrin.C
new file mode 100644
index 000000000..417a1acc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/mmintrin.C
@@ -0,0 +1,4 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-msse" }
+
+#include <xmmintrin.h>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/mult-stor1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/mult-stor1.C
new file mode 100644
index 000000000..1eaec4f14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/mult-stor1.C
@@ -0,0 +1,8 @@
+// PR c++/20646
+// Origin: Dan Rosen <dan.rosen@gmail.com>
+// { dg-do compile }
+
+struct A
+{
+ extern static int i; // { dg-error "conflicting specifiers" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-1.C
new file mode 100644
index 000000000..6533a2ade
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-1.C
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+// { dg-additional-sources "nested-extern.cc" }
+/* PR 31775 */
+extern "C" void abort();
+extern int *p;
+int main()
+{
+ extern int i;
+ i = 1;
+ *p = 2;
+ if (i == 2)
+ abort ();
+ return 0;
+}
+
+static int i;
+int *p = &i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-2.C
new file mode 100644
index 000000000..58f53e083
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern-2.C
@@ -0,0 +1,18 @@
+/* { dg-do run } */
+// { dg-additional-sources "nested-extern.cc" }
+/* PR 31775 */
+extern "C" void abort();
+static int i;
+int *p = &i;
+int main()
+{
+ int i;
+ {
+ extern int i;
+ i = 1;
+ *p = 2;
+ if (i == 2)
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern.cc b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern.cc
new file mode 100644
index 000000000..048f715b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/nested-extern.cc
@@ -0,0 +1 @@
+int i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/new-size-type.C b/gcc-4.9/gcc/testsuite/g++.dg/other/new-size-type.C
new file mode 100644
index 000000000..04933fd4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/new-size-type.C
@@ -0,0 +1,10 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/36741
+
+#include <stddef.h>
+const char*
+foo()
+{
+ return new char[~static_cast<size_t>(0)];// { dg-bogus "large" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/new1.C
new file mode 100644
index 000000000..71383706e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/new1.C
@@ -0,0 +1,14 @@
+// PR c++/28267
+// { dg-do compile }
+
+struct A
+{
+ A();
+ void* operator new(__SIZE_TYPE__, int = X); // { dg-error "not declared" }
+ void operator delete(void*, int);
+};
+
+void foo()
+{
+ new A; // { dg-error "default argument" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/nontype-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/nontype-1.C
new file mode 100644
index 000000000..11bbfb829
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/nontype-1.C
@@ -0,0 +1,7 @@
+template <class Op>
+bool asfun(Op f,
+ Op::first_argument_type a, // { dg-error "not a type" }
+ Op::second_argument_type b) // { dg-error "not a type" }
+{
+ return Op(a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ns1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ns1.C
new file mode 100644
index 000000000..cb77780dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ns1.C
@@ -0,0 +1,13 @@
+// PR c++/14821
+
+namespace A {
+ namespace B {}
+}
+
+namespace A {
+ namespace Alias = ::A::B;
+}
+
+namespace A {
+ namespace Alias = ::A::B;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof1.C
new file mode 100644
index 000000000..78738892a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Aug 2002 <nathan@codesourcery.com>
+
+// PR c++ 7598, offsetof broke
+// PR c++ 11072, DR 273's solution is broken
+
+#include <cstddef>
+
+struct F
+{
+ char i;
+ char j;
+};
+
+static int ary[offsetof(F, j)];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof2.C
new file mode 100644
index 000000000..3ab63981d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof2.C
@@ -0,0 +1,47 @@
+// { dg-do run }
+// { dg-options -Wold-style-cast }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Apr 2003 <nathan@codesourcery.com>
+
+// DR273 POD can have an operator&, offsetof is still required to work
+
+#include <stddef.h>
+
+struct POD1
+{
+ int m;
+
+ void *operator& () const {return 0;} // yes, still a pod!
+};
+
+struct POD2
+{
+ int m;
+};
+
+void *operator& (POD2 const &) {return 0;} // ouch!
+
+struct POD3
+{
+ int prefix;
+
+ POD1 m;
+};
+
+struct POD4
+{
+ int prefix;
+
+ POD1 m;
+};
+
+int main ()
+{
+ if (offsetof (POD3, m) != sizeof (int))
+ return 1;
+ if (offsetof (POD4, m) != sizeof (int))
+ return 2;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof3.C
new file mode 100644
index 000000000..5946c812c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof3.C
@@ -0,0 +1,17 @@
+/* Verify that offsetof warns if given a non-standard-layout class */
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+/* Contributed by Matt Austern <austern@apple.com> 15 May 2003 */
+/* { dg-do compile } */
+
+struct X
+{
+ int x, y;
+protected:
+ int z;
+};
+
+typedef X* pX;
+typedef __SIZE_TYPE__ size_t;
+
+size_t yoff = size_t(&(pX(0)->y)); /* { dg-warning "invalid access" "" } */
+/* { dg-warning "macro was used incorrectly" "macro" { target *-*-* } 16 } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof4.C
new file mode 100644
index 000000000..ab2282e25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof4.C
@@ -0,0 +1,16 @@
+/* Verify that -Wno-invalid-offsetof disables warning */
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+/* Contributed by Matt Austern <austern@apple.com> 15 May 2003 */
+/* { dg-do compile } */
+/* { dg-options "-Wno-invalid-offsetof" } */
+
+struct X
+{
+ X() : x(3), y(4) { }
+ int x, y;
+};
+
+typedef X* pX;
+typedef __SIZE_TYPE__ size_t;
+
+size_t yoff = size_t(&(pX(0)->y));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof5.C
new file mode 100644
index 000000000..b53b06ffb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof5.C
@@ -0,0 +1,22 @@
+// PR c++/35741
+// { dg-do compile }
+
+#include <stddef.h>
+
+struct A
+{
+ char c;
+ int &i;
+};
+
+int j = offsetof (A, i); // { dg-warning "invalid access|offsetof" }
+
+template <typename T>
+struct S
+{
+ T h;
+ T &i;
+ static const int j = offsetof (S, i); // { dg-warning "invalid access|offsetof" }
+};
+
+int k = S<int>::j; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof6.C
new file mode 100644
index 000000000..b77d1b99a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof6.C
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/38699
+// { dg-do compile }
+
+template<class T>
+struct A
+{
+ const T *p;
+};
+
+struct B
+{
+ A<int> a;
+};
+
+template class A<char>;
+
+void
+f0 ()
+{
+ __builtin_offsetof(A<char>, p); // OK
+ __builtin_offsetof(A<char>, p[1]); // { dg-error "non constant address" }
+ __builtin_offsetof(B, a.p); // OK
+ __builtin_offsetof(B, a.p[1]); // { dg-error "non constant address" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof7.C
new file mode 100644
index 000000000..0ce2ee02a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/offsetof7.C
@@ -0,0 +1,17 @@
+// PR c++/50608
+// Testcase by <dberger@oubliette.org>
+// { dg-do compile }
+
+struct A {
+ int offset;
+};
+
+struct B: public A {
+};
+
+struct C {
+ A a;
+ B b;
+};
+
+int fails = __builtin_offsetof (C, b.offset);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-1.C
new file mode 100644
index 000000000..5cdaeafe3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-1.C
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+
+#define __vector __attribute__((vector_size(8)))
+typedef float __vector __ev64_fs__;
+
+__ev64_fs__ f;
+__ev64_opaque__ o;
+
+int here = 0;
+
+void bar (__ev64_opaque__ x)
+{
+ here = 0;
+}
+
+void bar (__ev64_fs__ x)
+{
+ here = 888;
+}
+
+int main ()
+{
+ f = o;
+ o = f;
+ bar (f);
+ if (here != 888)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-2.C
new file mode 100644
index 000000000..3bb4af2c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-2.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+
+#define __vector __attribute__((vector_size(8)))
+typedef float __vector __ev64_fs__;
+
+__ev64_fs__ f;
+__ev64_opaque__ o;
+
+extern void bar (__ev64_opaque__);
+
+int main ()
+{
+ f = o;
+ o = f;
+ bar (f);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-3.C
new file mode 100644
index 000000000..5ece652c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/opaque-3.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+
+__ev64_opaque__ o;
+#define v __attribute__((vector_size(8)))
+v unsigned int *p;
+
+void m()
+{
+ o = __builtin_spe_evldd(p, 5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/operator1.C
new file mode 100644
index 000000000..86841c999
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/operator1.C
@@ -0,0 +1,9 @@
+// PR c++/27547
+// { dg-do compile }
+
+int operator=(int); // { dg-error "member function" }
+
+void foo()
+{
+ operator=(0); // { dg-error "not defined" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/operator2.C
new file mode 100644
index 000000000..4b952bf11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/operator2.C
@@ -0,0 +1,10 @@
+// PR c++/28852
+// { do-do compile }
+
+struct A
+{
+ operator int&(int); // { dg-error "void" }
+};
+
+A a;
+int& i = a; // { dg-error "initialization" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/packed1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/packed1.C
new file mode 100644
index 000000000..74e4962a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/packed1.C
@@ -0,0 +1,29 @@
+// { dg-do run { xfail lm32-*-* } }
+
+// NMS:2003-04-21 this fails on strict aligned architectures again,
+// the patch was reverted because it broke something more important.
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Aug 2002 <nathan@codesourcery.com>
+
+// WRS SPR 63496, lost packed attribute when accessing a packed
+// field. This matters on aligned architectures like sh
+
+struct thing { int m; };
+
+struct pod
+ {
+ char a;
+ thing m __attribute__ ((packed)); // { dg-warning "attribute ignored" "" { target default_packed } }
+ };
+
+int main ()
+{
+ thing t;
+ pod p;
+
+ p.m = t; /* runtime bus error here */
+
+ return 0;
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr20366.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr20366.C
new file mode 100644
index 000000000..36a689ebf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr20366.C
@@ -0,0 +1,80 @@
+// Test fix for PR20366
+//
+// { dg-do compile { target *-*-aix* } }
+// { dg-options "-D_LARGE_FILES" }
+//
+// cstdio includes stdio.h and undefs most of the functions declared
+// therein, unfortunately this means that #define fopen fopen64 goes
+// away. This tests the fix, and ensures that with -D_LARGE_FILES
+// fopen et. al. are indeed aliased to the large file equivalents.
+//
+// There are many other #define foo foo64 in the AIX headers, but
+// these all work out fine as they are not undefined in libstdc++.
+// This list is probably incomplete:
+//
+// Symbol Return type Large file declaration.
+//
+// aio.h (different for different AIX versions)
+// =====
+// aio_read int aio_read64(int, struct aiocb64 *);
+// aio_write int aio_write64(int, struct aiocb64 *);
+// lio_listio int lio_listio64(int, struct liocb64 *[], int, void *);
+// aio_cancel int aio_cancel64(int, struct aiocb64 *);
+// aio_suspend int aio_suspend64(int, struct aiocb64 *[]);
+//
+// stdio.h
+// =======
+// fgetpos int fgetpos64(FILE *, fpos64_t *);
+// fopen FILE *fopen64(const char *, const char *);
+// freopen FILE *freopen64(const char *, const char *, FILE *);
+// fseeko int fseeko64(FILE *, off64_t, int);
+// fsetpos int fsetpos64(FILE *, const fpos64_t *);
+// ftello off64_t ftello64(FILE *);
+//
+// unistd.h
+// ========
+// fclear off64_t fclear64(int, off64_t);
+// fsync_range int fsync_range64(int, int, off64_t, off64_t);
+// ftruncate int ftruncate64(int, off64_t);
+// truncate int truncate64(const char *, off64_t);
+// lseek off64_t lseek64(int, off64_t, int);
+// pread ssize_t pread64(int, void *, size_t, off64_t);
+// pwrite ssize_t pwrite64(int, const void *, size_t, off64_t);
+//
+// fcntl.h
+// =======
+// open int open64(const char *, int, ...);
+// creat int creat64(const char *, mode_t);
+//
+// sys/stat.h
+// ==========
+// stat int stat64(const char *, struct stat64 *);
+// fstat int fstat64(int, struct stat64 *);
+// lstat int lstat64(const char *, struct stat64 *);
+//
+// stdlib.h
+// ========
+// mkstemp int mkstemp64(char *);
+//
+// ftw.h
+// =====
+// ftw int ftw64(const char *, int (*)(const char *,const struct stat64 *, int), int);
+// nftw int nftw64(const char *, int (*)(const char *, const struct stat64 *, int, struct FTW*), int, int);
+//
+// It seems unlikely that any of these will be used (and #undef'ed) by
+// libstdc++ in the future, if they are then this test and its
+// associated patch to fixincludes will have to be revisited.
+
+#include <cstdio>
+
+extern "C" {
+int fgetpos(FILE *, fpos64_t *);
+FILE *fopen(const char *, const char *);
+FILE *freopen(const char *, const char *, FILE *);
+int fseeko(FILE *, off64_t, int);
+int fsetpos(FILE *, const fpos64_t *);
+off64_t ftello(FILE *);
+}
+int main() {
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr22003.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr22003.C
new file mode 100644
index 000000000..222ccac7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr22003.C
@@ -0,0 +1,25 @@
+/* PR rtl-optimization/22003 */
+/* { dg-do compile } */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -fno-exceptions -freorder-blocks-and-partition" } */
+
+struct c1
+{
+ virtual ~c1();
+};
+class c4;
+
+struct c2
+{
+ virtual c4* func();
+};
+
+struct c3 : c1, c2
+{
+ c4* func();
+};
+
+c4* c3::func()
+{
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr22358.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr22358.C
new file mode 100644
index 000000000..dbce0f8a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr22358.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+struct a
+{
+ virtual ~a();
+};
+struct b : virtual a { };
+b a11;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr23205-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr23205-2.C
new file mode 100644
index 000000000..c7eefaa58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr23205-2.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-skip-if "No stabs" { aarch64*-*-* mmix-*-* *-*-aix* alpha*-*-* hppa*64*-*-* ia64-*-* tile*-*-* nios2-*-* } { "*" } { "" } } */
+/* { dg-options "-gstabs+ -fno-eliminate-unused-debug-types -ftoplevel-reorder" } */
+
+const int foobar = 4;
+int foo ()
+{
+ return foobar + 1;
+}
+
+int main()
+{
+ int i;
+ i = foo();
+ return i;
+}
+
+/* { dg-final { scan-assembler ".stabs.*foobar:c=i" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr24623.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr24623.C
new file mode 100644
index 000000000..480bb39b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr24623.C
@@ -0,0 +1,69 @@
+/* This used to ICE due to a backend problem on s390. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+class ReferenceCounted
+{
+public:
+
+ virtual ~ ReferenceCounted ()
+ {
+ }
+ void decrementRefCount () const
+ {
+ if (--const_cast < unsigned int &>(_ref_count) == 0)
+ {
+ delete this;
+ }
+ }
+ unsigned int _ref_count;
+};
+
+template < class T > class RefCountPointer
+{
+public:
+
+RefCountPointer (T * p = 0):_p (p)
+ {
+ }
+ RefCountPointer & operator= (const RefCountPointer < T > &o)
+ {
+ if (_p != o._p)
+ {
+ if (_p != 0)
+ _p->decrementRefCount ();
+ }
+ }
+ ~RefCountPointer ()
+ {
+ }
+ T *_p;
+};
+class Item:public ReferenceCounted
+{
+public:
+
+ typedef RefCountPointer < const Item > Ptr;
+};
+class AnyAtomicType:public Item
+{
+};
+class StaticContext
+{
+};
+class DynamicContext:public StaticContext
+{
+};
+class SortableItem
+{
+ SortableItem ();
+ int m_bAscending:1;
+ DynamicContext *m_context;
+ AnyAtomicType::Ptr m_item;
+};
+SortableItem::SortableItem ()
+{
+ m_context = __null;
+ m_item = __null;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr25632.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr25632.C
new file mode 100644
index 000000000..e66ae3b51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr25632.C
@@ -0,0 +1,19 @@
+/* PR c++/25632 */
+
+/* { dg-do compile } */
+
+__extension__ typedef __INTPTR_TYPE__ intptr_t;
+
+struct sockaddr_un {
+ char sun_path[1];
+};
+const unsigned SI_SUN_HEAD_LEN = (intptr_t)(((struct sockaddr_un *)0)->sun_path);
+int SiGetPeerName ()
+{
+ return SI_SUN_HEAD_LEN;
+}
+int SiAccept ()
+{
+ return SI_SUN_HEAD_LEN;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr27495.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr27495.C
new file mode 100644
index 000000000..990b1ee5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr27495.C
@@ -0,0 +1,8 @@
+
+// Test to make sure we do not ICE on this invalid program.
+
+struct A
+{
+ template<int> void foo();
+ void bar() { this.A::foo<0>(); } // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr28114.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28114.C
new file mode 100644
index 000000000..63ecbf51f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28114.C
@@ -0,0 +1,10 @@
+
+// Test to make sure we do not ICE on this invalid program.
+
+template<int> void foo(struct {}*); // { dg-message "" }
+
+void bar()
+{
+ foo<0>(0); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr28304.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28304.C
new file mode 100644
index 000000000..9a0e9cdd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28304.C
@@ -0,0 +1,11 @@
+
+// Test to make sure we do not ICE on this invalid program.
+
+struct A {};
+
+template<typename T> void A::foo(T) {} // { dg-error "" }
+
+void bar()
+{
+ A::foo(1); // { dg-error "not a member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr28432.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28432.C
new file mode 100644
index 000000000..2b9c76343
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr28432.C
@@ -0,0 +1,7 @@
+
+// Test to make sure we do not ICE on this invalid program.
+
+// { dg-options "" }
+
+struct A {};
+void A::foo(); // { dg-error "member function declared in class|outside of class is not definition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr29610.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr29610.C
new file mode 100644
index 000000000..6566fb9a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr29610.C
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -funswitch-loops" } */
+
+struct __normal_iterator
+{
+ typedef int*const *_Iterator;
+ int*const * _M_current;
+ __normal_iterator(const _Iterator& __i) : _M_current(__i){}
+ const _Iterator& base() const {}
+};
+struct string { ~string(){} };
+struct vector
+{
+ int** _M_finish;
+ __normal_iterator end() const { return __normal_iterator (_M_finish); }
+ int size() const { return end().base() - end().base(); }
+};
+class Painter
+{
+ int redraw_window(void);
+ typedef int (Painter::* SliceWindowFunc)(void);
+ int for_each(vector&, SliceWindowFunc);
+ void tcl_command(void);
+};
+inline int Painter::for_each(vector &layout, SliceWindowFunc func)
+{
+ for (unsigned int window = 0; window < layout.size();++window)
+ (this->*func)();
+}
+int t;
+int Painter::redraw_window(void) {t = 1;}
+string t2(int);
+vector *g(const string&);
+void Painter::tcl_command(void)
+{
+ for_each(*g(t2(2)), &Painter::redraw_window);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr31078.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr31078.C
new file mode 100644
index 000000000..7f6107130
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr31078.C
@@ -0,0 +1,31 @@
+typedef int SLONG;
+typedef char SCHAR;
+typedef short SSHORT;
+typedef char TEXT;
+typedef long ISC_STATUS;
+const SLONG gds_arg_string = 2;
+const SLONG gds_sys_request = 335544373L;
+enum jrd_blk_t
+{
+ type_str, type_dcc, type_sbm, type_smb, type_blb, type_irb, type_jrn
+};
+struct blk
+{
+};
+template < class RPT, SSHORT BLOCK_TYPE = 0 > class pool_alloc_rpt:public blk
+{
+};
+class jrn:public pool_alloc_rpt < SCHAR, type_jrn >
+{
+public:ISC_STATUS * jrn_status_vector;
+ TEXT jrn_server[1];
+};
+typedef jrn *JRN;
+extern void IBERR_build_status (ISC_STATUS *, ISC_STATUS, ...);
+static void
+error (ISC_STATUS * status_vector, JRN journal, int status, TEXT * string)
+{
+ IBERR_build_status (status_vector, gds_sys_request, gds_arg_string, string,
+ gds_arg_string, (journal) ? journal->jrn_server : "",
+ 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558-2.C
new file mode 100644
index 000000000..a8df840b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558-2.C
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } */
+
+class X {
+ mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558.C
new file mode 100644
index 000000000..1a340af59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33558.C
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+
+class X {
+ mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr33601.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33601.C
new file mode 100644
index 000000000..0c170092a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr33601.C
@@ -0,0 +1,8 @@
+struct A
+{
+ int membervar;
+};
+
+typedef const A type;
+
+int type::* getmemberptr() { return &type::membervar; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr34435.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr34435.C
new file mode 100644
index 000000000..5352a40eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr34435.C
@@ -0,0 +1,19 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-msse2 -Wno-abi" } */
+
+#include <emmintrin.h>
+
+class Vec {
+ __m128i vec;
+public:
+ Vec(int mm) {
+ vec = _mm_set1_epi16(mm);
+ }
+ operator __m128i() const {
+ return vec;
+ }
+};
+
+int main() {
+ _mm_shuffle_epi32(Vec(5), _MM_SHUFFLE(3,3,3,3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr35011.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr35011.C
new file mode 100644
index 000000000..ca75516d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr35011.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-O3 -fcheck-data-deps" }
+
+double foo(const double* p0, const double* p1, const double* q0)
+{
+ double d;
+ for (; p0 != p1; ++p0, ++q0)
+ d += *p0 * *q0;
+ return d;
+}
+
+struct A
+{
+ double x[3];
+ const double* begin() const { return x; }
+};
+
+struct B
+{
+ A a0, a1;
+ double d;
+ B(const A&);
+};
+
+B::B(const A& a) : a0(a), a1(a), d(foo(a0.begin(), a0.begin()+3, a1.begin()))
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr35504.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr35504.C
new file mode 100644
index 000000000..a37b8b371
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr35504.C
@@ -0,0 +1,159 @@
+// { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+#define ATTR0 __attribute__((__regparm__(0)))
+#define ATTR1 __attribute__((__regparm__(1)))
+#define ATTR2 __attribute__((__regparm__(2)))
+#define ATTR3 __attribute__((__regparm__(3)))
+#define ATTR4 __attribute__((__fastcall__))
+#define ATTR5 __attribute__((__stdcall__))
+#define ATTR6 __attribute__((__cdecl__))
+#define ATTR7
+#define ATTR8 __attribute__((__thiscall__))
+
+extern "C" void abort (void);
+
+struct long_struct
+{
+ int a[3];
+};
+
+struct long_struct ret;
+
+class c3 *this3;
+
+class c1
+{
+ int val1;
+public:
+ virtual void foo () { }
+};
+
+class c2
+{
+public:
+ virtual ATTR0 struct long_struct method0 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR1 struct long_struct method1 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR2 struct long_struct method2 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR3 struct long_struct method3 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR4 struct long_struct method4 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR5 struct long_struct method5 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR6 struct long_struct method6 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR7 struct long_struct method7 ()
+ {
+ return ret;
+ }
+
+ virtual ATTR8 struct long_struct method8 ()
+ {
+ return ret;
+ }
+};
+
+class c3:c1, public c2
+{
+public:
+ c3 ()
+ {
+ this3 = this;
+ }
+
+ struct long_struct check_this (int a)
+ {
+ if (this3 != this)
+ abort ();
+
+ return ret;
+ }
+
+ virtual ATTR0 struct long_struct method0 ()
+ {
+ return check_this (0);
+ }
+
+ virtual ATTR1 struct long_struct method1 ()
+ {
+ return check_this (1);
+ }
+
+ virtual ATTR2 struct long_struct method2 ()
+ {
+ return check_this (2);
+ }
+
+ virtual ATTR3 struct long_struct method3 ()
+ {
+ return check_this (3);
+ }
+
+ virtual ATTR4 struct long_struct method4 ()
+ {
+ return check_this (4);
+ }
+
+ virtual ATTR5 struct long_struct method5 ()
+ {
+ return check_this (5);
+ }
+
+ virtual ATTR6 struct long_struct method6 ()
+ {
+ return check_this (6);
+ }
+
+ virtual ATTR7 struct long_struct method7 ()
+ {
+ return check_this (7);
+ }
+
+ virtual ATTR8 struct long_struct method8 ()
+ {
+ return check_this (7);
+ }
+};
+
+class c3 c3_instance;
+class c2 *c2_ptr = &c3_instance;
+
+int
+main ()
+{
+ c2_ptr->method0 ();
+ c2_ptr->method1 ();
+ c2_ptr->method2 ();
+ c2_ptr->method3 ();
+ c2_ptr->method4 ();
+ c2_ptr->method5 ();
+ c2_ptr->method6 ();
+ c2_ptr->method7 ();
+ c2_ptr->method8 ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr36944.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr36944.C
new file mode 100644
index 000000000..b4a1dfa46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr36944.C
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+class XObject
+{
+public:
+ int foo;
+};
+
+class XObjectPtr
+{
+public:
+ explicit
+ XObjectPtr(XObject* theXObject = 0) : m_xobjectPtr(theXObject)
+ {
+ }
+
+private:
+ XObject * m_xobjectPtr;
+};
+
+class SelectionEvent
+{
+public:
+ SelectionEvent(bool selection) : m_selection() {}
+ const XObjectPtr m_selection;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr37394.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr37394.C
new file mode 100644
index 000000000..7b5772e8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr37394.C
@@ -0,0 +1,12 @@
+// Origin: Martin Michlmayr <tbm@cyrius.com>
+// { dg-do compile { target ia64-*-* } }
+// { dg-options "-O -fschedule-insns2" }
+
+struct _Words
+{
+ void *_M_pword;
+ _Words ():
+ _M_pword (0)
+ {
+ }
+} _M_word_zero;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr37789.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr37789.C
new file mode 100644
index 000000000..728c2fcc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr37789.C
@@ -0,0 +1,7 @@
+// PR c++/37789
+// { dg-do compile }
+
+void foo():
+{ // { dg-error "initializers|identifier" }
+ __FUNCTION__;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr38706.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr38706.C
new file mode 100644
index 000000000..ec10d90ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr38706.C
@@ -0,0 +1,19 @@
+// PR target/38706
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class ios_base
+{
+public:
+ virtual ~ios_base ();
+
+};
+
+class istrstream:virtual public ios_base
+{
+public:
+ virtual ~istrstream ();
+
+};
+
+istrstream::~istrstream () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr39060.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr39060.C
new file mode 100644
index 000000000..e1494106b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr39060.C
@@ -0,0 +1,19 @@
+// PR c++/39060
+// { dg-do compile }
+
+struct A
+{
+ A(void* i=); // { dg-error "with|specification|primary-expression" }
+ A(void* i=); // { dg-error "overloaded|primary-expression" }
+ A(void* i=); // { dg-error "overloaded|primary-expression" }
+
+ void operator+ (void* i=); // { dg-error "arguments" }
+
+ virtual void foo1(=); // { dg-error "identifier|primary-expression" }
+ void foo2(=); // { dg-error "identifier|primary-expression" }
+ void foo3(=); // { dg-error "identifier|primary-expression" }
+ void foo4(=); // { dg-error "identifier|primary-expression" }
+ void foo5(=); // { dg-error "identifier|primary-expression" }
+};
+
+A::A (void* i=) {} // { dg-error "primary-expression|argument" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr39496.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr39496.C
new file mode 100644
index 000000000..c9e55df43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr39496.C
@@ -0,0 +1,36 @@
+// PR target/39496
+// { dg-do compile { target { { i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } && ia32 } } }
+// { dg-options "-O0 -fverbose-asm -fno-omit-frame-pointer -mtune=i686 -msse2 -mfpmath=sse" }
+
+// Verify that {foo,bar}{,2}param are all passed on the stack, using
+// normal calling conventions, when not optimizing.
+// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*fooparam," } }
+// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*barparam," } }
+// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*foo2param," } }
+// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*bar2param," } }
+
+static inline int foo (int fooparam)
+{
+ return fooparam;
+}
+
+static int bar (int barparam)
+{
+ return foo (barparam);
+}
+
+static inline double foo2 (double foo2param)
+{
+ return foo2param;
+}
+
+static double bar2 (double bar2param)
+{
+ return foo2 (bar2param);
+}
+
+int
+main ()
+{
+ return bar (0) + bar2 (0.0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr40446.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr40446.C
new file mode 100644
index 000000000..72cd19606
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr40446.C
@@ -0,0 +1,38 @@
+// PR middle-end/40446
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O1 -msse2" }
+// { dg-require-effective-target sse2_runtime }
+
+#include <emmintrin.h>
+
+extern "C" void abort ();
+
+struct S
+{
+ S (double r, double i) { __real__ s = r; __imag__ s = i; }
+ __complex__ double s;
+};
+
+__m128d
+foo ()
+{
+ S c (0, 1);
+ return _mm_load_pd ((double *) &c);
+}
+
+static void
+__attribute__((noinline))
+sse2_test ()
+{
+ union { __m128d vec; double val[2]; } u;
+ u.vec = foo ();
+ if (u.val[0] != 0 || u.val[1] != 1)
+ abort ();
+}
+
+int
+main ()
+{
+ sse2_test ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr40561.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr40561.C
new file mode 100644
index 000000000..c94dfa4bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr40561.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+#include <set>
+
+class SyAccess;
+class VamsBase
+{
+ public:
+ virtual ~VamsBase(void);
+};
+
+class VamsFnct : public VamsBase
+{
+ public:
+ ~VamsFnct(void);
+ std::set<SyAccess*> getNullDependencies(void) const
+ { return std::set<SyAccess*>();
+ }
+};
+
+class VamsFnctSystem:public VamsFnct
+{ public:
+ VamsFnctSystem(
+ const bool _bPassDependencies);
+};
+
+template< std::set<SyAccess*> (VamsFnct::*__GET_DEP__)(void) const >
+class VamsSystemFunction:public VamsFnctSystem
+{ public:
+ VamsSystemFunction()
+ :VamsFnctSystem(
+ __GET_DEP__ != &VamsFnct::getNullDependencies
+ )
+ {
+ }
+};
+
+VamsSystemFunction<&VamsFnct::getNullDependencies> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-1.C
new file mode 100644
index 000000000..5dc76f9ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-1.C
@@ -0,0 +1,26 @@
+// PR tree-optimization/42645
+// { dg-do compile }
+// { dg-options "-fcompare-debug -O1" }
+
+extern void foo ();
+
+struct S
+{
+ struct T
+ {
+ int t1;
+ char t2[4];
+ T *t3;
+ } t;
+ int m1 () const { return t.t3[0].t1; }
+ char *m2 () { foo (); }
+ void m3 (int x) { char *m = m2 (); if (m1 () > 0 && x > 0); }
+ void m4 () { if (m1 () > 0) for (int i = 0; i < 4; i++) t.t2[i] = 0; }
+};
+
+void
+f (S *a)
+{
+ a->m3 (0);
+ a->m4 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-2.C
new file mode 100644
index 000000000..67632e51d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42645-2.C
@@ -0,0 +1,34 @@
+// PR tree-optimization/42645
+// { dg-do compile }
+// { dg-options "-fcompare-debug -O1" }
+
+struct C
+{
+ bool b;
+ C ();
+};
+
+static inline C *foo () {}
+
+extern void f4 ();
+
+static inline int
+f3 ()
+{
+ f4 ();
+}
+
+static inline void
+f2 (bool b)
+{
+ int tmp = f3 ();
+ if (C ().b && b)
+ C ();
+}
+
+void
+f1 ()
+{
+ C *c = foo ();
+ f2 (c->b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr42685.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42685.C
new file mode 100644
index 000000000..3c55955ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42685.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-O -funroll-loops -fcompare-debug" }
+// { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+
+void Remap(int n, int *src, int *dst, int *map)
+{
+ do {
+ int i = *src;
+ if (i != 0) *dst = map[i];
+ } while (--n != 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr42806.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42806.C
new file mode 100644
index 000000000..9823238d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr42806.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-O -fcompare-debug" }
+
+struct S1 {
+ ~S1() { }
+};
+
+struct S2 {
+ S1 s1;
+ void m();
+ ~S2() { m(); }
+};
+
+struct S3 {
+ S3(int, S2);
+};
+
+void foo()
+{
+ S3(0, S2());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr43116.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr43116.C
new file mode 100644
index 000000000..f0d9d01e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr43116.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+extern "C" int rpl_open (const char *filename, int flags, ...) __attribute__
+((__nonnull__ (1)));
+
+namespace gnulib
+{
+ int (*const open) (const char *filename, int flags, ...) __attribute__
+ ((__nonnull__ (1))) = rpl_open;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr43631.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr43631.C
new file mode 100644
index 000000000..eb4f57861
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr43631.C
@@ -0,0 +1,15 @@
+// PR middle-end/43631
+// { dg-do compile }
+// { dg-options "-g -O2" }
+// { dg-additional-options "-mtune=atom" { target i?86-*-* x86_64-*-* } }
+
+typedef void (*T) ();
+struct S { T t; };
+void bar (T) __attribute__ ((__noreturn__));
+S *p;
+
+void
+foo ()
+{
+ try { bar (p->t); } catch (...) { throw 1; }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218-1.C
new file mode 100644
index 000000000..aeb070b0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218-1.C
@@ -0,0 +1,10 @@
+#include "pr47218.h"
+
+Foo2::~Foo2 ()
+{
+ ((FooBaseBase1*)this)->Bar();
+}
+
+void Foo2::Bar()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.C
new file mode 100644
index 000000000..57245c036
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.C
@@ -0,0 +1,21 @@
+/* { dg-do link } */
+/* { dg-options "-save-temps" } */
+/* { dg-additional-sources "pr47218-1.C" } */
+
+#include "pr47218.h"
+
+Foo3::~Foo3 ()
+{
+ ((FooBaseBase1*)this)->Bar();
+}
+
+void Foo3::Bar()
+{
+}
+
+int main ()
+{
+ return 0;
+}
+
+// { dg-final { cleanup-saved-temps } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.h b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.h
new file mode 100644
index 000000000..1b07da746
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr47218.h
@@ -0,0 +1,33 @@
+
+class FooBaseBase0
+{
+public:
+ virtual ~FooBaseBase0 () {}
+};
+
+class FooBaseBase1
+{
+public:
+ virtual void Bar() {}
+};
+
+
+class FooBase: public FooBaseBase0, public FooBaseBase1
+{
+public:
+ virtual void Bar() {}
+};
+
+class Foo2: public FooBase
+{
+public:
+ ~Foo2 ();
+ virtual void Bar();
+};
+
+class Foo3: public FooBase
+{
+public:
+ ~Foo3 ();
+ virtual void Bar();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr49133.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr49133.C
new file mode 100644
index 000000000..a59687f9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr49133.C
@@ -0,0 +1,36 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2" } */
+/* { dg-require-effective-target sse2_runtime } */
+
+#include <xmmintrin.h>
+
+extern "C" void abort ();
+
+typedef double double_a __attribute__((__may_alias__));
+
+struct V
+{
+ __m128d data;
+};
+
+int
+main()
+{
+ V a;
+ __m128d b;
+
+ b = _mm_set_pd (1., 0.);
+ a.data = _mm_set_pd (1., 0.);
+ a.data = _mm_add_pd (a.data,
+ _mm_and_pd (_mm_cmpeq_pd (a.data, _mm_set1_pd (0.)),
+ _mm_set1_pd (2.)));
+ reinterpret_cast<double_a *>(&a.data)[1] += 1.;
+ b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (0.)),
+ _mm_set1_pd (1.)));
+ b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (1.)),
+ _mm_set1_pd (1.)));
+ if (_mm_movemask_pd (_mm_cmpeq_pd (a.data, b)) != 0x3)
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr49912.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr49912.C
new file mode 100644
index 000000000..b8c3e5bed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr49912.C
@@ -0,0 +1,38 @@
+// PR rtl-optimization/49912
+// { dg-do compile }
+// { dg-require-effective-target freorder }
+// { dg-options "-O -freorder-blocks-and-partition" }
+
+int foo (int *);
+
+struct S
+{
+ int *m1 ();
+ S (int);
+ ~S () { foo (m1 ()); }
+};
+
+template <int>
+struct V
+{
+ S *v1;
+ void m2 (const S &);
+ S *base ();
+};
+
+template <int N>
+void V<N>::m2 (const S &x)
+{
+ S a = x;
+ S *l = base ();
+ while (l)
+ *v1 = *--l;
+}
+
+V<0> v;
+
+void
+foo ()
+{
+ v.m2 (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr50212.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr50212.C
new file mode 100644
index 000000000..c0b030d23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr50212.C
@@ -0,0 +1,17 @@
+// PR rtl-optimization/50212
+// { dg-do compile }
+// { dg-require-effective-target freorder }
+// { dg-options "-O -fnon-call-exceptions -ftrapv -freorder-blocks-and-partition" }
+
+void
+foo (int n)
+{
+ try
+ {
+ int i = 0;
+ while (i++ < n);
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr50464.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr50464.C
new file mode 100644
index 000000000..8c6721373
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr50464.C
@@ -0,0 +1,170 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O3 -mxop" }
+
+typedef long unsigned int size_t;
+typedef unsigned long ulong_t;
+typedef signed long slong_t;
+
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::reference reference;
+ };
+
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef _Tp& reference;
+ };
+
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ protected:
+ _Iterator _M_current;
+ typedef iterator_traits<_Iterator> __traits_type;
+
+ public:
+ typedef typename __traits_type::reference reference;
+
+ explicit
+ __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
+
+ reference
+ operator*() const
+ { return *_M_current; }
+
+ __normal_iterator&
+ operator++()
+ {
+ ++_M_current;
+ return *this;
+ }
+
+ const _Iterator&
+ base() const
+ { return _M_current; }
+ };
+
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+
+ template<typename _Tp>
+ class allocator
+ {
+ public:
+ typedef _Tp* pointer;
+ typedef _Tp value_type;
+
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+
+ pointer allocate(size_t __n, const void* = 0)
+ {
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ };
+
+ template<typename _Tp, typename _Alloc>
+ struct _Vector_base
+ {
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+
+ struct _Vector_impl
+ : public _Tp_alloc_type
+ {
+ typename _Tp_alloc_type::pointer _M_start;
+ typename _Tp_alloc_type::pointer _M_finish;
+ typename _Tp_alloc_type::pointer _M_end_of_storage;
+
+ _Vector_impl(_Tp_alloc_type const& __a) { }
+ };
+
+ public:
+ typedef _Alloc allocator_type;
+
+ _Vector_base(size_t __n, const allocator_type& __a)
+ : _M_impl(__a)
+ {
+ this->_M_impl._M_start = this->_M_allocate(__n);
+ this->_M_impl._M_finish = this->_M_impl._M_start;
+ this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
+ }
+
+ public:
+ _Vector_impl _M_impl;
+
+ typename _Tp_alloc_type::pointer
+ _M_allocate(size_t __n)
+ { return __n != 0 ? _M_impl.allocate(__n) : 0; }
+
+ };
+
+ template<typename _Tp, typename _Alloc = allocator<_Tp> >
+ class vector : protected _Vector_base<_Tp, _Alloc>
+ {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+
+ public:
+ typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef __normal_iterator<pointer, vector> iterator;
+ typedef _Alloc allocator_type;
+
+ protected:
+ using _Base::_M_allocate;
+ using _Base::_M_impl;
+
+ public:
+
+ explicit
+ vector(size_t __n, const value_type& __value = value_type(),
+ const allocator_type& __a = allocator_type())
+ : _Base(__n, __a)
+ { _M_fill_initialize(__n, __value); }
+
+ iterator begin()
+ { return iterator(this->_M_impl._M_start); }
+
+ iterator end()
+ { return iterator(this->_M_impl._M_finish); }
+
+ protected:
+ void
+ _M_fill_initialize(size_t __n, const value_type& __value)
+ {
+ this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
+ }
+ };
+
+ template<typename _InputIterator, typename _OutputIterator, typename _Tp>
+ _OutputIterator
+ replace_copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result,
+ const _Tp& __old_value, const _Tp& __new_value)
+ {
+ ;
+ for (; __first != __last; ++__first, ++__result)
+ if (*__first == __old_value)
+ *__result = __new_value;
+ else
+ *__result = *__first;
+ return __result;
+ }
+
+extern size_t shape_rank;
+
+void createDataspaceIdentifier()
+{
+ vector< ulong_t > dataspaceDims( shape_rank );
+ vector< ulong_t > maxDataspaceDims( shape_rank );
+
+ replace_copy(
+ dataspaceDims.begin(), dataspaceDims.end(),
+ maxDataspaceDims.begin(), ulong_t( 0 ), ((ulong_t)(slong_t)(-1)) );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr52048.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr52048.C
new file mode 100644
index 000000000..6bf51f1e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr52048.C
@@ -0,0 +1,79 @@
+// PR debug/52048
+// { dg-do compile }
+// { dg-options "-fcompare-debug -fnon-call-exceptions -fno-tree-dominator-opts -O2" }
+
+template <typename T> struct A;
+template <typename T>
+struct A <T *>
+{
+ typedef T &a;
+};
+template <typename T>
+struct B
+{
+ typedef typename A <T>::a a;
+ a operator *() {}
+};
+template <typename T, typename U>
+bool operator != (B <T>, B <U>)
+{
+}
+template <typename T>
+struct C
+{
+ typedef T *c;
+ template <typename>
+ struct D { typedef C d; };
+};
+template <typename T, typename U> struct E
+{
+ typedef typename U::template D <T>::d e;
+};
+template <typename T, typename U = C <T> >
+struct F
+{
+ typedef E <T, U> b;
+ typedef typename b::e e;
+ typedef typename e::c c;
+ typedef B <c> i;
+ i begin ();
+ i end ();
+};
+class G;
+class H;
+struct I
+{
+ void *i;
+ template <typename T> T foo ();
+};
+struct J : public I
+{
+ virtual bool bar ();
+};
+class K {};
+struct L
+{
+ bool baz () {}
+};
+struct M
+{
+ K m1 (K);
+ K m2 (H *) {}
+};
+struct N : J
+{
+ bool bar (G &);
+};
+bool
+N::bar (G &)
+{
+ M m = foo <M> ();
+ F <H *> f;
+ for (F <H *>::i I = f.begin (), E = f.end (); I != E;)
+ {
+ H *h = *I;
+ L l;
+ if (l.baz ())
+ m.m1 (m.m2 (h));
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr53811.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr53811.C
new file mode 100644
index 000000000..c00b7f6d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr53811.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-mcmodel=large" { target { { i?86-*-* x86_64-*-* } && lp64 } } }
+
+struct ICCStringClass
+{
+ virtual void *
+ CreateString (const char *fromText) = 0;
+};
+
+struct AGSCCDynamicObject
+{
+ virtual void
+ Unserialize (int index, const char *serializedData, int dataSize) = 0;
+};
+
+
+struct ScriptString:AGSCCDynamicObject, ICCStringClass
+{
+ virtual void *CreateString (const char *fromText);
+};
+
+const char *
+CreateNewScriptString (const char *fromText, bool reAllocate = true);
+
+void *
+ScriptString::CreateString (const char *fromText)
+{
+ return (void *) CreateNewScriptString (fromText);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.C
new file mode 100644
index 000000000..c565b06ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.C
@@ -0,0 +1,22 @@
+// PR gcov-profile/55650
+// { dg-do link }
+// { dg-require-profiling "-fprofile-generate" }
+// { dg-options "-O2 -fprofile-generate" }
+// { dg-additional-sources "pr55650.cc" }
+
+struct A
+{
+ virtual void foo ();
+};
+
+struct B : public A
+{
+ B ();
+ void foo () {}
+};
+
+inline A *
+bar ()
+{
+ return new B;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.cc b/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.cc
new file mode 100644
index 000000000..70b41462b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr55650.cc
@@ -0,0 +1,4 @@
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pr59492.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pr59492.C
new file mode 100644
index 000000000..84bd25554
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pr59492.C
@@ -0,0 +1,18 @@
+// { dg-do assemble { target { { i?86-*-* x86_64-*-* } && fpic } } }
+// { dg-options "-mx32 -fPIC" }
+// { dg-require-ifunc "" }
+// { dg-require-effective-target maybe_x32 }
+
+void
+__throw_runtime_error(const char*) __attribute__((__noreturn__));
+unsigned int
+__attribute__ ((target("rdrnd")))
+__x86_rdrand(void)
+{
+ unsigned int retries = 100;
+ unsigned int val;
+ while (__builtin_ia32_rdrand32_step(&val) == 0)
+ if (--retries == 0)
+ __throw_runtime_error(("random_device::__x86_rdrand(void)"));
+ return val;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-1.C
new file mode 100644
index 000000000..6a94c5d68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-1.C
@@ -0,0 +1,57 @@
+/* { dg-final { scan-assembler "bar" } } */
+/* { dg-final { scan-assembler-not "foo" } } */
+/* { dg-final { scan-assembler "_Z3bazv" } } */
+/* { dg-final { scan-assembler-not "baq" } } */
+/* { dg-final { scan-assembler "tut" } } */
+/* { dg-final { scan-assembler-not "gee" } } */
+/* { dg-final { scan-assembler "bang" } } */
+/* { dg-final { scan-assembler-not "whiz" } } */
+/* { dg-final { scan-assembler "eek" } } */
+/* { dg-final { scan-assembler-not "boo" } } */
+
+#ifndef __PRAGMA_REDEFINE_EXTNAME
+#error
+#endif
+
+/* This one is expected to work. */
+#pragma redefine_extname foo bar
+extern "C" int foo(void);
+int (*p)(void) = foo;
+
+/* This one is expected not to work (redefine_extname
+ can only be applied to extern "C" names). */
+#pragma redefine_extname baz baq
+extern int baz(void);
+int (*q)(void) = baz;
+
+// PR c++/30112
+// These are expected to work.
+#pragma redefine_extname gee tut
+namespace somewhere {
+ extern "C" int gee(void);
+ int (*r)(void) = gee;
+
+ extern "C" int whiz(void);
+ int whiz(int);
+}
+#pragma redefine_extname whiz bang
+int (*s)() = somewhere::whiz;
+
+namespace elsewhere {
+ extern "C" int whiz(void);
+}
+int (*t)() = elsewhere::whiz;
+
+namespace A
+{
+ extern "C" int boo(void);
+}
+
+namespace B
+{
+ extern "C" int boo(void);
+}
+#pragma redefine_extname boo eek
+
+int (*u)() = A::boo;
+int (*v)() = B::boo;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-2.C
new file mode 100644
index 000000000..ca71a01a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/pragma-re-2.C
@@ -0,0 +1,24 @@
+/* PR c++/14962 */
+/* Originator: <phil@fsel.com> */
+
+/* { dg-final { scan-assembler "new_name" } } */
+/* { dg-final { scan-assembler-not "old_name" } } */
+
+#ifndef __PRAGMA_REDEFINE_EXTNAME
+#error
+#endif
+
+extern "C" {
+
+struct old_name { int i; };
+
+#pragma redefine_extname old_name new_name
+
+int old_name(void);
+
+}
+
+int foo(void)
+{
+ return old_name();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/profile1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/profile1.C
new file mode 100644
index 000000000..a4bf6b3d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/profile1.C
@@ -0,0 +1,54 @@
+// PR 11767
+// { dg-do run }
+// { dg-require-profiling "" }
+// { dg-options "-fnon-call-exceptions -fprofile-arcs" }
+
+#include <string>
+
+typedef unsigned long ACE_UINT32;
+extern "C" void abort();
+
+static ACE_UINT32 const msc_maxCurrencyID = 9999;
+
+class ResourceBalanceType2
+{
+ public:
+ explicit ResourceBalanceType2(
+ ACE_UINT32 resourceBalanceTypeID,
+ ACE_UINT32 isoValue,
+ const std::string& rc_shortName,
+ const std::string& rc_symbol
+ );
+ public:
+ const ACE_UINT32 mc_resBalTypeID;
+ const ACE_UINT32 mc_isoValue;
+ const std::string mc_shortName;
+ const std::string mc_symbol;
+};
+
+void f(){}
+
+ResourceBalanceType2::ResourceBalanceType2(
+ ACE_UINT32 resourceBalanceTypeID,
+ ACE_UINT32 isoValue,
+ const std::string& rc_shortName,
+ const std::string& rc_symbol)
+ : mc_resBalTypeID(resourceBalanceTypeID),
+ mc_isoValue(isoValue),
+ mc_shortName(rc_shortName),
+ mc_symbol(rc_symbol)
+{
+ bool isGreater = (mc_isoValue > msc_maxCurrencyID);
+ f();
+ bool temp = mc_isoValue > msc_maxCurrencyID;
+ if (!isGreater) abort();
+ if (!temp) abort();
+}
+
+int main (int argc, char * argv[])
+{
+ ACE_UINT32 const mc_isoValue = 10000;
+ ResourceBalanceType2 rbResourceBalanceType2(3, mc_isoValue, "ATM", "M");
+}
+
+// { dg-final { cleanup-coverage-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem1.C
new file mode 100644
index 000000000..fa9115e50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem1.C
@@ -0,0 +1,66 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4379. We created pointers to member references and pointers to
+// member fields when we shouldn't have.
+
+int gs;
+int gm;
+
+struct D {
+ D () :m (gm) {}
+
+ int &m;
+ static int &s;
+
+ int Foo ();
+};
+
+int &D::s = gs;
+
+template<class T> int f1(T x)
+{
+ return x != &gm;
+}
+template<class T> int f2(T x)
+{
+ return x != &gs;
+}
+
+int D::Foo ()
+{
+ int r;
+
+ if (f1( &(D::m)))
+ return 3;
+
+ if (f2( &D::s))
+ return 1;
+ if (f2( &(D::s)))
+ return 2;
+ return 0;
+}
+
+int Foo ()
+{
+ if (f2( &D::s))
+ return 4;
+ if (f2( &(D::s)))
+ return 5;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r = d.Foo ();
+ if (r)
+ return r;
+ r = Foo ();
+ if (r)
+ return r;
+ return 0;
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem10.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem10.C
new file mode 100644
index 000000000..ff8c84341
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem10.C
@@ -0,0 +1,29 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/37093
+
+template <class C, void (C::*M) ()>
+static
+void foo(void *obj)
+{
+ C *p = static_cast<C*>(obj);
+ (p->*M)();
+}
+
+template <class C>
+static void
+bar(C *c, void (C::*m) ())
+{
+ foo<C,m>((void *)c);// { dg-error "(not a valid template arg|pointer-to-member|no matching fun|could not convert|constant)" }
+}
+
+struct S
+{
+ void baz () {}
+};
+
+int
+main ()
+{
+ S a;
+ bar(&a, &S::baz);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem11.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem11.C
new file mode 100644
index 000000000..e18abddd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem11.C
@@ -0,0 +1,21 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/37093
+
+struct A {};
+
+template <int A::* p>
+int
+foo(A* q)
+{
+ return q->*p;
+}
+
+template <typename T>
+int
+bar(int T::* p)
+{
+ return foo<p>(0);// { dg-error "(not a valid template arg|no matching func|pointer-to-member|could not convert|constant)" }
+}
+
+int i = bar<A>(0);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem2.C
new file mode 100644
index 000000000..d267df15b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem2.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4379. We created pointers to member references and pointers to
+// member fields when we shouldn't have.
+
+struct D {
+
+ int &m; // { dg-error "invalid use of non-static data member" "" }
+ static int &s;
+
+ int Foo ();
+};
+
+template<class T> int f1(T x);
+template<class T> int f2(T x);
+
+int D::Foo ()
+{
+ f1( &D::m); // { dg-error "cannot create pointer to ref" "" }
+ f1( &(D::m)); // ok
+ f2( &D::s); // ok
+ f2( &(D::s)); // ok
+ return 0;
+}
+
+int Foo ()
+{
+ f1( &D::m); // { dg-error "cannot create pointer to ref" "" }
+ f1( &(D::m)); // { dg-error "from this location" "" }
+ f2( &D::s); // ok
+ f2( &(D::s)); // ok
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem3.C
new file mode 100644
index 000000000..ed6d87574
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem3.C
@@ -0,0 +1,14 @@
+// Bug: The double cast had an TREE_INT_CST_HIGH of 0, while the single
+// cast had -1, so the comparison failed.
+
+// { dg-do run }
+
+struct A { };
+
+typedef int A::* aip;
+typedef long A::* alp;
+
+int main()
+{
+ return ((aip)(alp)0 != (aip)0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem4.C
new file mode 100644
index 000000000..4f3f541e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem4.C
@@ -0,0 +1,18 @@
+// Bug: This checks that the pointer-to-member-function type is not
+// shared between differently-qualified pointer-to-method types.
+
+// { dg-do compile }
+struct A
+{
+ void f () {}
+};
+
+void (A::*const cp)() = &A::f;
+
+int main ()
+{
+ void (A::* p)();
+ void (A::** ip)() = &p;
+
+ *ip = &A::f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem5.C
new file mode 100644
index 000000000..75a78b2f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem5.C
@@ -0,0 +1,12 @@
+// PR 14123
+
+struct a
+{
+ int x[8];
+};
+
+int main()
+{
+ int a::*n[8];
+ n = &a::x; // { dg-error "int \\(a::\\*\\)" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem6.C
new file mode 100644
index 000000000..5fe796e1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem6.C
@@ -0,0 +1,10 @@
+// PR c++/19666
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// { dg-do compile }
+
+struct A { int i; };
+
+int foo (A *p)
+{
+ return &p->i - &(p->*&A::i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem7.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem7.C
new file mode 100644
index 000000000..e7722b8de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem7.C
@@ -0,0 +1,4 @@
+// PR c++/27447
+// { dg-do compile }
+
+void (A::* p)(); // { dg-error "declared|token" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem8.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem8.C
new file mode 100644
index 000000000..d0b0ba722
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem8.C
@@ -0,0 +1,16 @@
+// PR c++/33844
+// { dg-do compile }
+
+struct A {};
+
+template<int> void foo(void (A::* f)())
+{
+ A a;
+ &(a.*f); // { dg-error "invalid use of\[^\n\]*\\.\\*\[^\n\]*to form|qualified-id is required" }
+}
+
+template<int> void bar(void (A::* f)())
+{
+ A *p;
+ &(p->*f); // { dg-error "invalid use of\[^\n\]*->\\*\[^\n\]*to form|qualified-id is required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem9.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem9.C
new file mode 100644
index 000000000..c4d3656a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ptrmem9.C
@@ -0,0 +1,5 @@
+// PR c++/33969
+// { dg-do compile }
+
+struct A;
+void (*A::* fp)() const; // { dg-error "invalid in variable declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/qual1.C
new file mode 100644
index 000000000..e4bae2315
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/qual1.C
@@ -0,0 +1,11 @@
+// PR c++/28257
+// { dg-do compile }
+
+struct A
+{
+ int i;
+ void foo()
+ {
+ int A::i = i; // { dg-error "qualified" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/redecl1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/redecl1.C
new file mode 100644
index 000000000..cfcf66826
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/redecl1.C
@@ -0,0 +1,10 @@
+// PR c++/5857
+// This testcase failed because during duplicate_decls the type was promoted
+// to int.
+
+// { dg-do compile }
+
+typedef char baz;
+extern const char foo[];
+const baz foo[] = "xyz";
+const char bar[] = "abc";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/redecl2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/redecl2.C
new file mode 100644
index 000000000..6c8913c1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/redecl2.C
@@ -0,0 +1,11 @@
+// PR c++/17816
+// We failed to report duplicate definitions of pure virtual ns.
+
+// { dg-do compile }
+
+struct S {
+ virtual int foo() = 0;
+};
+
+int S::foo() { return 0; } // { dg-message "defined here" }
+int S::foo() { return 0; } // { dg-error "redefinition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/return1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/return1.C
new file mode 100644
index 000000000..2473b8deb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/return1.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com>
+
+// PR 21117:ICE after error
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+struct wxString;
+struct wxString* wxGetEmptyString();
+
+struct wxString GetHeader() // { dg-error "return type" "" }
+{
+ return *wxGetEmptyString();
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/s390-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/s390-1.C
new file mode 100644
index 000000000..bf37ca449
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/s390-1.C
@@ -0,0 +1,32 @@
+// { dg-do compile { target s390x-*-* } }
+// { dg-options "-O3 -fPIC" }
+
+class A
+{
+public:
+ void f (void) { _M_a = 0; }
+ void g (void) { _M_a = 1; }
+ void h (void);
+
+private:
+ int _M_a;
+};
+
+class B : virtual public A
+{
+};
+
+void
+test (B& x)
+{
+ for (int i = 0; i < 17; i++)
+ {
+ x.f ();
+ (x.*&A::g) ();
+ x.h ();
+ }
+}
+
+// Check that every call to A::g goes via the PLT.
+// { dg-final { scan-assembler-not "brasl\[^@\]*\n" } }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/scope1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/scope1.C
new file mode 100644
index 000000000..73b141bdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/scope1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2001 <nathan@nathan@codesourcery.com>
+
+// PR 3381
+
+namespace N {
+ template<class T>
+ class A { };
+}
+
+template class N::A<unsigned>; // this works (by itself)
+template class ::N::A<int>; // but this doesn't
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/semicolon.C b/gcc-4.9/gcc/testsuite/g++.dg/other/semicolon.C
new file mode 100644
index 000000000..8797bd32f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/semicolon.C
@@ -0,0 +1,10 @@
+// PR c++/18368
+// Origin: Chris Lattner <sabre@nondot.org>
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+
+struct A
+{
+ struct B { int i; } // { dg-error "after struct definition" }
+ void foo();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/spu2vmx-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/spu2vmx-1.C
new file mode 100644
index 000000000..d9c8faf94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/spu2vmx-1.C
@@ -0,0 +1,15 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_spu } */
+/* { dg-options "-maltivec" } */
+
+#include <altivec.h>
+#include <spu2vmx.h>
+
+vec_uint4 f(vec_uint4 a, vec_uint4 b)
+{
+ return spu_add(a, b);
+}
+vec_float4 f(vec_float4 a, vec_float4 b)
+{
+ return spu_add(a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/static1.C
new file mode 100644
index 000000000..5cf0b9256
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/static1.C
@@ -0,0 +1,17 @@
+// PR c++/9574
+// Origin: fche@redhat.com and bangerth@dealii.org
+// The new parser ICE on this test and then it could
+// not find z in bar::bar().
+
+// { dg-do compile }
+
+struct X {
+ void operator[](const int& __k);
+};
+struct foo {
+ static X x;
+};
+struct bar {
+ int z;
+ bar () { foo::x[z]; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/static11.C b/gcc-4.9/gcc/testsuite/g++.dg/other/static11.C
new file mode 100644
index 000000000..e04cbc154
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/static11.C
@@ -0,0 +1,34 @@
+// This is a copy of g++.old-deja/g++.pt/static11.C which at one
+// time got a SEGV for mmix-knuth-mmixware when compiled with
+// -da (or either -dj or -df).
+// { dg-do compile }
+// { dg-options "-da" }
+
+extern "C" void _exit (int);
+
+int r = 1;
+
+struct A
+{
+ void f(){};
+ A(){ ++r; }
+ ~A(){ r -= 2; _exit (r); }
+};
+
+template<class T>
+struct C
+{
+ C(){ a.f(); }
+ static A a;
+};
+
+template <class T> A C<T>::a;
+typedef C<int> B;
+
+int main()
+{
+ C<int> c;
+ return r;
+}
+
+// { dg-final { cleanup-rtl-dump "*" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/static2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/static2.C
new file mode 100644
index 000000000..ff1478c2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/static2.C
@@ -0,0 +1,12 @@
+//PR c++/26573
+
+void foo()
+{
+ struct A { static int i; }; // { dg-error "shall not have" }
+}
+
+template<typename T>
+void bar()
+{
+ struct B { static int j; }; // { dg-error "shall not have" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg1.C
new file mode 100644
index 000000000..1ac9e8fb2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg1.C
@@ -0,0 +1,27 @@
+// Test stdarg function with anonymous argument
+// { dg-do run }
+// { dg-options "-Wno-abi" { target arm_eabi } }
+
+#include <stdarg.h>
+
+extern "C" void abort (void);
+
+void baz (va_list list)
+{
+ if (va_arg (list, long) != 3)
+ abort ();
+}
+
+void foo (long p1, long, long p2, ...)
+{
+ va_list list;
+ va_start (list, p2);
+ baz (list);
+ va_end (list);
+}
+
+int main ()
+{
+ foo (0, 1, 2, (long)3);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg2.C
new file mode 100644
index 000000000..99e904013
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg2.C
@@ -0,0 +1,12 @@
+// PR c++/11929
+// Bug: We were complaining about the call to va_start because o is of
+// non-POD type.
+
+struct s {
+ s(int);
+};
+
+void test(s o, ...) {
+ __builtin_va_list varg;
+ __builtin_va_start(varg, o);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg3.C
new file mode 100644
index 000000000..0e7abd8dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/stdarg3.C
@@ -0,0 +1,16 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Mar 2005 <nathan@codesourcery.com>
+
+// PR 20375: ICE
+// Origin: Joseph S. Myers <jsm28@gcc.gnu.org>
+// { dg-options "-mlp64" { target "ia64-*-hpux*" } }
+
+union U
+{
+ void *m[7];
+};
+
+struct C;
+
+void f(struct C *c, float f, union U, ...)
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/struct-va_list.C b/gcc-4.9/gcc/testsuite/g++.dg/other/struct-va_list.C
new file mode 100644
index 000000000..769b909ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/struct-va_list.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR target/13302
+
+#include <stdarg.h>
+
+struct NumArgState{
+ va_list ap;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/switch1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/switch1.C
new file mode 100644
index 000000000..a22d2b573
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/switch1.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Contributed by: Nick Savoiu <savoiu at ics dot uci dot edu>
+// PR c++/14250: Incomplete type in switch statement
+
+template <typename T>
+struct A {
+ operator int();
+};
+
+struct C1 {
+ static A<void> t1;
+
+ void fun()
+ {
+ switch(t1)
+ {
+ default: break;
+ }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/switch2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/switch2.C
new file mode 100644
index 000000000..6994e2a39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/switch2.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Oct 2005 <nathan@codesourcery.com>
+
+// PR 22551:ICE
+// Origin: Johnny Casey <emailwastefilter-bugzillagccorg@yahoo.com>
+
+const int B = ~(~0u >> 1);
+
+#define b(x) (B + x)
+
+
+int Foo (int error)
+{
+ switch (error)
+ {
+ case b (1): return 0;
+ case b (2): return 0;
+ case b (3): return 0;
+ case b (4): return 0;
+ case b (5): return 0;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/switch3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/switch3.C
new file mode 100644
index 000000000..4f9b5485e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/switch3.C
@@ -0,0 +1,25 @@
+// PR c++/39371
+// { dg-do compile }
+
+void
+foo (bool b)
+{
+ switch ((unsigned int) b)
+ {
+ case 1:
+ case 2:
+ break;
+ }
+}
+
+void
+bar (unsigned char b)
+{
+ switch ((unsigned int) b)
+ {
+ case 1:
+ case 257:
+ case 513:
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/synth1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/synth1.C
new file mode 100644
index 000000000..5829c6c78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/synth1.C
@@ -0,0 +1,31 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18975: Rejects legal
+// Origin: Wolfgang Roehrl <wolfgang.roehrl@de.gi-de.com>
+
+struct PTR
+{
+ PTR ();
+ PTR (PTR&);
+ PTR& operator= (PTR&);
+
+private:
+ PTR (const PTR&);
+ PTR& operator= (const PTR&);
+};
+
+
+struct XYZ
+{
+ XYZ (PTR& p) : ptr(p) {}
+
+ mutable PTR ptr;
+};
+
+
+XYZ f1 ();
+
+
+XYZ f2 (void) { return f1(); }
+void f3 (XYZ& dst, const XYZ& src) { dst = src; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef1.C
new file mode 100644
index 000000000..ef1684d7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef1.C
@@ -0,0 +1,7 @@
+// PR c++/27572
+// { dg-do compile }
+
+void f1(typedef) {} // { dg-error "no type|typedef declaration" }
+void f2(typedef x) {} // { dg-error "type|typedef declaration" }
+void f3(typedef x[]) {} // { dg-error "type|typedef declaration" }
+void f4(typedef int x) {} // { dg-error "typedef declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef2.C
new file mode 100644
index 000000000..902e102d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef2.C
@@ -0,0 +1,3 @@
+typedef void fn() const;
+
+fn* fp; // { dg-error "pointer.*qualified function type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/typedef3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef3.C
new file mode 100644
index 000000000..8ead5b845
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef3.C
@@ -0,0 +1,12 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40357
+// { dg-do compile }
+
+struct XalanCProcessor
+{
+ typedef enum {eInvalid, eXalanSourceTree, eXercesDOM} ParseOptionType;
+ ParseOptionType getParseOption(void);
+};
+typedef XalanCProcessor::ParseOptionType ParseOptionType;
+ParseOptionType XalanCProcessor::getParseOption(void) {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/typedef4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef4.C
new file mode 100644
index 000000000..b752f2cae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/typedef4.C
@@ -0,0 +1,7 @@
+// { dg-options "-g" }
+// { dg-do compile }
+
+// On some platforms like MIPS, __builtin_va_list is a
+// RECORD_TYPE. Make sure we don't wrongly try to generate debug info
+// for its TYPE_DECL and crash.
+typedef __builtin_va_list foo;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/ucnid-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/ucnid-1.C
new file mode 100644
index 000000000..9a2728f25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/ucnid-1.C
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-fextended-identifiers" } */
+/* { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } } */
+/* { dg-skip-if "" { ! ucn } { "*" } { "" } } */
+#include <cstdlib>
+
+int \u00C0(void) { return 1; }
+int \u00C1(void) { return 2; }
+int \U000000C2(void) { return 3; }
+int wh\u00ff(void) { return 4; }
+int a\u00c4b\u0441\U000003b4e(void) { return 5; }
+
+int main (void)
+{
+
+ if (\u00C0() != 1)
+ abort ();
+ if (\u00c1() != 2)
+ abort ();
+ if (\u00C2() != 3)
+ abort ();
+ if (wh\u00ff() != 4)
+ abort ();
+ if (a\u00c4b\u0441\U000003b4e() != 5)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/unreachable1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/unreachable1.C
new file mode 100644
index 000000000..da468a099
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/unreachable1.C
@@ -0,0 +1,11 @@
+// PR middle-end/17827
+// Origin: Andre Woebbeking <Woebbeking@web.de>
+// Testcase by Volker Reichelt <reichelt@gcc.gnu.org>
+// { dg-do compile }
+
+void foo()
+{
+ if (false)
+ if (int i=0)
+ int j=i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/unused1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/unused1.C
new file mode 100644
index 000000000..b28d69874
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/unused1.C
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+/* { dg-skip-if "" { { hppa*-*-hpux* *-*-solaris2.[56]* powerpc-ibm-aix* } && { ! hppa*64*-*-* } } { "*" } { "" } } */
+
+/* Make sure we didn't eliminate casted types because we thought they were
+ unused. */
+
+void *voidp;
+
+struct foo { int i; };
+int bar (void)
+{
+ return ((struct foo *)0x1234)->i;
+}
+
+struct boo { int i; };
+int bar2 (void)
+{
+ return reinterpret_cast<struct boo *>(0xC0FFEE)->i;
+}
+
+struct cue { int i; };
+int bar3 (void)
+{
+ return static_cast<struct cue *>(voidp)->i;
+}
+
+class printer { public: int i; };
+const printer *dotmatrix;
+int bar4 (void)
+{
+ return const_cast<printer *>(dotmatrix)->i;
+}
+
+class class1 { public: virtual ~class1(); } *c1;
+class class2 : class1 { char j; };
+int bar5 (void)
+{
+ if (dynamic_cast <class2 *>(c1))
+ return 5;
+ else
+ return 6;
+}
+/* { dg-final { scan-assembler "foo" } } */
+/* { dg-final { scan-assembler "boo" } } */
+/* { dg-final { scan-assembler "cue" } } */
+/* The xfail below is for PR33429. */
+/* { dg-final { scan-assembler "(string|ascii?)z?\[\t \]\"class2(\"|\\\\0)" { xfail *-*-* } } } */
+/* { dg-final { scan-assembler "(string|ascii?)z?\[\t \]\"printer(\"|\\\\0)" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/var_copy-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/var_copy-1.C
new file mode 100644
index 000000000..192af7582
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/var_copy-1.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+// Test to allow for va_copy with C++0x standard.
+
+#include <cstdarg>
+
+va_list x;
+va_list y;
+
+int main ()
+{
+ va_copy (y, x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-1.C
new file mode 100644
index 000000000..f25606e93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-1.C
@@ -0,0 +1,20 @@
+// C++/15119
+// This ICEd in substitute_placeholder_in_expr because it did not
+// implement the 4 element trees.
+// Orginal test by: <wanderer@rsu.ru>
+// Reduced by: <bangerth@dealii.org>
+/* { dg-do compile } */
+
+template<typename T>
+const T& xmin(const T& a, const T& b);
+
+void bar (char *, ...);
+
+char const* descs[4];
+
+int main() {
+ int t = 1;
+ char buf[100];
+ bar( buf, descs[ xmin(t-1,4) ], 0 );
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-2.C
new file mode 100644
index 000000000..5b3b9a3bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+struct QString {};
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+ QString & sprintf(QString &s,const QString &szFmt,...)
+ {
+ va_list list;
+ __builtin_va_start(list,((const char *)(&(szFmt))));
+ __builtin_va_end(list);
+ return s;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-3.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-3.C
new file mode 100644
index 000000000..4585f3249
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-3.C
@@ -0,0 +1,16 @@
+// PR c++/31488: va_list considered non-POD on alpha
+// { dg-do compile }
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+extern int foo (int a, int b, ...);
+
+int bar (int a, int b, ...)
+{
+ va_list args;
+ __builtin_va_start(args,b);
+ int result = foo (a, b, args);
+ __builtin_va_end(args);
+ return result;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-4.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-4.C
new file mode 100644
index 000000000..e242cfcef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vararg-4.C
@@ -0,0 +1,12 @@
+// PR c++/37404
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+template <class> struct S { static void foo () { } };
+template <class T, int N>
+struct S<T [N]> { static void foo () { T(); } };
+
+int main () {
+ S<va_list>::foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vector-compare.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vector-compare.C
new file mode 100644
index 000000000..03ff5fd72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vector-compare.C
@@ -0,0 +1,36 @@
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-Wall" } */
+
+// Check that we can compare vector types that really are the same through
+// typedefs.
+
+typedef float v4f __attribute__((vector_size(4*sizeof(float))));
+
+template <class T> void eat (T&&) {}
+
+template <class T, int n>
+struct Vec
+{
+ typedef T type __attribute__((vector_size(4*sizeof(T))));
+
+ template <class U>
+ static void fun (type const& t, U& u) { eat (t > u); }
+};
+
+long long
+f (v4f *x, v4f const *y)
+{
+ return ((*x < *y) | (*x <= *y))[2];
+}
+
+int main ()
+{
+ v4f x = {0,1,2,3};
+ Vec<const volatile float,4>::type f = {-1,5,2,3.1};
+ auto c = (x == f) == (x >= x);
+ eat (c[3]);
+ Vec<const volatile float,4>::fun (f, x);
+ Vec<const volatile float,4>::fun (x, f);
+ Vec<const volatile float,4>::fun (f, f);
+ Vec<const volatile float,4>::fun (x, x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/virtual1.C
new file mode 100644
index 000000000..5f44fa78a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/virtual1.C
@@ -0,0 +1,7 @@
+// PR c++/26070
+// { dg-do compile }
+
+struct A
+{
+ virtual static int i; // { dg-error "virtual" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/virtual2.C
new file mode 100644
index 000000000..f007403df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/virtual2.C
@@ -0,0 +1,7 @@
+// PR c++/26071
+// { dg-do compile }
+
+struct A
+{
+ virtual static ~A(); // { dg-error "virtual" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/void1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/void1.C
new file mode 100644
index 000000000..691e6f782
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/void1.C
@@ -0,0 +1,16 @@
+// PR c++/9278
+// { dg-do compile }
+
+typedef void VOID;
+
+int foo(void);
+int bar(VOID); // { dg-error "type|invalid use" }
+
+template<int> int foo(void);
+template<int> int bar(VOID); // { dg-error "type|invalid use" }
+
+struct A
+{
+ int foo(void);
+ int bar(VOID); // { dg-error "type|invalid use" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/void2.C b/gcc-4.9/gcc/testsuite/g++.dg/other/void2.C
new file mode 100644
index 000000000..153e0f181
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/void2.C
@@ -0,0 +1,5 @@
+// PR c++/27423
+// { dg-do compile }
+
+void foo(void = 0); // { dg-error "incomplete type|invalid use" }
+void bar() { foo(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vrp1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vrp1.C
new file mode 100644
index 000000000..0a798c995
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vrp1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+// This caused a crash in VRP because TREE_OVERFLOW was set for MIN.
+
+template<long long MIN>
+long long mod (long long l, long long r)
+{
+ if (l == MIN && r == -1)
+ return 0LL;
+ return l % r;
+}
+template long long mod<-0x8000000000000000LL> (long long, long long);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/vthunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/vthunk1.C
new file mode 100644
index 000000000..90165628b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/vthunk1.C
@@ -0,0 +1,26 @@
+// PR c++/12007 Multiple inheritance float pass by value fails
+// { dg-do run }
+
+extern "C" void abort (void);
+
+class gvImpl
+{
+public:
+ virtual void PutVal(float value){}
+};
+
+class foo { public: virtual void Bar(){} };
+
+class myGv: public foo, public gvImpl
+{
+ void PutVal(float value){ if (value != 3.14159f) abort (); }
+};
+
+myGv x;
+gvImpl* object = &x;
+
+int main()
+{
+ object->PutVal(3.14159f);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/other/warning1.C b/gcc-4.9/gcc/testsuite/g++.dg/other/warning1.C
new file mode 100644
index 000000000..a23d0ca6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/other/warning1.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// PR c++/7804
+// Floating point formatting in error and warning messages
+
+extern "C" int printf(const char *, ...);
+
+struct S
+{
+ static const float inf = 1.0f / 0.0f; // { dg-error "1.0|float|initializ" }
+ static const float nan = 0.0f / 0.0f; // { dg-error "0.0|float|initializ" }
+};
+
+int main()
+{
+ // { dg-prune-output "not a member" }
+ printf("%f\n%f\n", S::inf, S::nan);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/VLA.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/VLA.C
new file mode 100644
index 000000000..0c748f50c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/VLA.C
@@ -0,0 +1,16 @@
+//Origin: kengole@us.ibm.com
+
+//PR c++/2478
+// G++ was rejecting this as it could not convert `int (*)[]' to `int (*)[0]'.
+// Using the C99 VLA style arrays in a struct.
+
+// { dg-do compile }
+
+struct S {
+ int (*p)[];
+} B;
+
+void foo() {
+ int (*p)[];
+ B.p=p; // { dg-bogus "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/addr1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/addr1.C
new file mode 100644
index 000000000..25856a20f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/addr1.C
@@ -0,0 +1,50 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com>
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/11788 we failed to instantiate a decl, and we lost some side
+// effects
+
+static int flag = 0;
+
+template <typename> struct A
+{
+ A &active () { flag++;}
+
+ static void foo() {}
+
+ static void bar () {}
+ static void bar (int) {}
+
+ int m;
+};
+
+void (*baz ()) ()
+{
+ A<int> a;
+ return &a.active ().foo;
+}
+
+void (*boz ()) ()
+{
+ A<int> a;
+ return &a.active ().bar;
+}
+
+int *buz ()
+{
+ A<int> a;
+
+ return &a.active ().m;
+}
+
+int main ()
+{
+ baz ();
+ boz ();
+ buz ();
+
+ return flag != 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/addr2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/addr2.C
new file mode 100644
index 000000000..1d0c66bff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/addr2.C
@@ -0,0 +1,13 @@
+// PR c++/29143
+
+void f(int);
+
+void g(int,int);
+void g(int,int,int);
+
+void
+h ()
+{
+ (&f)(1);
+ (&g)(1,2,3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig1.C
new file mode 100644
index 000000000..d11e00a18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig1.C
@@ -0,0 +1,24 @@
+// [over.best.ics]: For the purpose of ranking implicit conversion
+// sequences as described in _over.ics.rank_, the ambiguous conversion
+// sequence is treated as a user-defined sequence that is indistinguishable
+// from any other user- defined conversion sequence.
+
+struct A
+{
+ A(long);
+ A(char);
+};
+
+struct B
+{
+ B(int);
+};
+
+void f(A); // { dg-message "note" "candidate" }
+void f(B); // { dg-message "note" "candidate" }
+
+int main()
+{
+ f (42); // { dg-error "ambiguous" "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig2.C
new file mode 100644
index 000000000..614166f9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ambig2.C
@@ -0,0 +1,22 @@
+// Bug: g++ thought that the QChar overload was a viable but ambiguous
+// candidate. It isn't viable, because there's no conversion from const
+// char * to QChar.
+
+class QChar {
+public:
+ QChar( char c );
+ QChar( unsigned char c );
+};
+
+class QString
+{
+public:
+ QString( const char *str ); // deep copy
+
+ QString &insert( unsigned int index, const QString & );
+ QString &insert( unsigned int index, QChar );
+ QString &prepend( const char* );
+};
+
+inline QString &QString::prepend( const char* s )
+{ return insert(0,s); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg1.C
new file mode 100644
index 000000000..c765a9902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg1.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+ B(int);
+ B(B &);
+ B(A);
+};
+
+void foo(B);
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/arg2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg2.C
new file mode 100644
index 000000000..1e39186f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg2.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+ B(int);
+ B(A);
+};
+
+void foo(B);
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/arg3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg3.C
new file mode 100644
index 000000000..34624cd22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg3.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+ B(int); // { dg-message "B::B|no known conversion" "" }
+ B(B&); // { dg-message "note" "" }
+};
+
+void foo(B); // { dg-error "initializing" }
+
+void bar()
+{
+ foo(0); // { dg-error "no matching function" "no matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 21 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/arg4.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg4.C
new file mode 100644
index 000000000..13e4bad63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg4.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+ B(int);
+ B(B&);
+ B(A);
+};
+
+struct C
+{
+ operator B () const;
+};
+
+
+void foo(B);
+
+void bar()
+{
+ C c;
+ foo(c);}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/arg5.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg5.C
new file mode 100644
index 000000000..63c66d4a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/arg5.C
@@ -0,0 +1,24 @@
+// PR c++/34111
+
+class QChar
+{
+};
+struct QString
+{
+ QString(QChar);
+};
+struct QPainter
+{
+ void drawText (int x, int y, const QString &);
+};
+
+ class KHEChar:public QChar
+ {
+ public:KHEChar (QChar C);
+ };
+
+void
+drawByte (QPainter * P, char, KHEChar B)
+{
+ P->drawText (0, 0, B);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/autoptr1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/autoptr1.C
new file mode 100644
index 000000000..fc8108350
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/autoptr1.C
@@ -0,0 +1,29 @@
+// PR c++/35773
+
+template< typename T >
+class auto_ptr
+{
+ struct auto_ptr_ref { };
+public:
+ auto_ptr(auto_ptr&);
+ auto_ptr(auto_ptr_ref);
+
+ operator auto_ptr_ref();
+};
+
+template< typename T >
+class reference_wrapper
+{
+public:
+ reference_wrapper(T& t);
+ operator T& () const;
+};
+
+struct X { };
+
+void f(auto_ptr< X >);
+
+void g(reference_wrapper< auto_ptr< X > > r)
+{
+ f(r);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin1.C
new file mode 100644
index 000000000..fdd208135
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin1.C
@@ -0,0 +1,18 @@
+// Test that we don't discard builtin candidates inappropriately.
+
+struct B { };
+
+struct A {
+ operator int ();
+ operator B ();
+};
+
+void operator+ (B, B); // { dg-message "operator" "operator" }
+
+int main ()
+{
+ A a;
+ a + a; // { dg-error "ambiguous" "ambiguous" }
+ // { dg-message "operator" "match candidate text" { target *-*-* } 15 }
+ // { dg-message "candidates" "candidates" { target *-*-* } 15 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin2.C
new file mode 100644
index 000000000..4f9f52dda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin2.C
@@ -0,0 +1,8 @@
+namespace __gnu_cxx {
+ void llabs(long long x);
+}
+
+namespace std {
+ using __gnu_cxx::llabs;
+ using __gnu_cxx::llabs;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin3.C
new file mode 100644
index 000000000..dcd9fd02e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/builtin3.C
@@ -0,0 +1,10 @@
+// PR c++/11409
+// { dg-do compile }
+
+namespace std {
+ double fabs (double);
+}
+using std::fabs;
+
+double (*p) (double) = &fabs; // { dg-bogus "is ambiguous" "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/cond1.C
new file mode 100644
index 000000000..74f0f3c49
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/cond1.C
@@ -0,0 +1,24 @@
+// Test that converting a COND_EXPR to void doesn't result in trying to
+// bitwise copy a class with a nontrivial copy constructor (and thus a
+// compiler abort).
+
+// { dg-options "-O" }
+
+struct A {
+ virtual ~A() { }
+};
+
+A a1, a2;
+inline A& one () { return a1; }
+inline A& two () { return a2; }
+
+inline void f (int i)
+{
+ i ? a1 : a2;
+ i ? one() : two();
+}
+
+int main ()
+{
+ f (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/cond2.C
new file mode 100644
index 000000000..cbcdc6ed0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/cond2.C
@@ -0,0 +1,15 @@
+struct C
+{
+ operator int();
+};
+
+struct D
+{
+ operator int();
+};
+
+int main()
+{
+ C c; D d;
+ true ? c : d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/conv-op1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/conv-op1.C
new file mode 100644
index 000000000..6a63cbaeb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/conv-op1.C
@@ -0,0 +1,17 @@
+// PR c++/47703
+
+typedef void (*pfn)(int &);
+
+struct A
+{
+ operator pfn() { return 0; }
+};
+
+void f()
+{
+ const int i = 42;
+ A()(i); // { dg-message "<conversion>" }
+}
+
+// { dg-prune-output "no match" }
+// { dg-prune-output "candidate" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/copy1.C
new file mode 100644
index 000000000..f0ec385fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/copy1.C
@@ -0,0 +1,21 @@
+// PR c++/34824
+
+struct A;
+
+struct B
+{
+ B (A const &); // { dg-message "note" }
+ B (B &); // { dg-message "note" }
+};
+
+struct A
+{
+ A (B); // { dg-error "initializing" }
+};
+
+B
+f (B const& b)
+{
+ return b; // { dg-error "matching" "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 19 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg1.C
new file mode 100644
index 000000000..fcbb43b7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg1.C
@@ -0,0 +1,11 @@
+// PR c++/5247
+
+template<typename T>
+int foo (T t, int = foo(T())); // { dg-error "recursive" }
+
+struct A { };
+
+int main()
+{
+ foo(A()); // { dg-message "default argument" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg2.C
new file mode 100644
index 000000000..d8ecb2fa7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg2.C
@@ -0,0 +1,17 @@
+// PR c++/37971
+// { dg-do compile }
+
+class C {
+private:
+ static int f(int);
+ static int f(char);
+
+public:
+ static void g(int (*)(int) = f);
+};
+
+void h() {
+ /* Although C::f is inaccessible here, it is accessible in the
+ context of C::g, so there is no error. */
+ C::g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg3.C
new file mode 100644
index 000000000..6622e430a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg3.C
@@ -0,0 +1,15 @@
+// PR c++/37971
+// { dg-do compile }
+
+class C {
+private:
+ static int f(int); // { dg-error "private" }
+ static int f(char);
+};
+
+class D {
+public:
+ /* C::f is inaccessible, so this is an error, even if this function
+ is never called. */
+ static void g(int (*)(int) = C::f); // { dg-error "context" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg4.C
new file mode 100644
index 000000000..3fa0751b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg4.C
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39987
+// { dg-do compile }
+
+class foo
+{
+ template<typename U>
+ static bool func(const U& x)
+ {}
+public:
+ template<typename U>
+ unsigned int Find(const U& x, bool (*pFunc) (const U&) = func) const
+ {}
+};
+
+class bar {
+ bool Initialize();
+protected:
+ foo b;
+};
+
+bool bar::Initialize()
+{
+ b.Find(b);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg5.C
new file mode 100644
index 000000000..d022b0ca5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg5.C
@@ -0,0 +1,7 @@
+// PR c++/39055
+
+struct A
+{
+ int i; // { dg-message "" }
+ A() { void foo(int=i); } // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg6.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg6.C
new file mode 100644
index 000000000..b750184c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg6.C
@@ -0,0 +1,7 @@
+class A
+{
+ int i;
+ A(int i): i(i) {} // { dg-error "private" }
+};
+
+void f (A = 1) { } // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg7.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg7.C
new file mode 100644
index 000000000..8cc08f538
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg7.C
@@ -0,0 +1,12 @@
+struct A
+{
+ A(const char *);
+ explicit A(const int *);
+};
+
+void f (A a = 0);
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg8.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg8.C
new file mode 100644
index 000000000..b3ddfbb76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/defarg8.C
@@ -0,0 +1,22 @@
+// PR c++/60367
+// { dg-do run { target c++11 } }
+
+extern "C" int printf (const char *, ...);
+extern "C" void abort();
+
+void *p;
+struct foo {
+ foo() { p = this; }
+ foo (const foo &) { abort(); }
+ ~foo() { if (p != this) abort(); }
+};
+
+void do_something( foo f = {} )
+{
+ if (&f != p) abort();
+}
+
+int main()
+{
+ do_something();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis1.C
new file mode 100644
index 000000000..3dedaa6be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis1.C
@@ -0,0 +1,18 @@
+// PR c++/15142
+// Bug: We were aborting after giving a warning about passing a non-POD.
+
+struct B {
+ B() throw() { }
+ B(const B&) throw() { }
+};
+
+struct X {
+ B a;
+ X& operator=(const X&);
+};
+
+struct S { S(...); };
+
+void SillyFunc() {
+ throw S(X()); // { dg-error "copy" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis2.C
new file mode 100644
index 000000000..d9118ba64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ellipsis2.C
@@ -0,0 +1,13 @@
+// PR c++/60253
+
+struct A
+{
+ ~A();
+};
+
+struct B
+{
+ B(...);
+};
+
+B b(0, A()); // { dg-error "cannot pass" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/error1.C
new file mode 100644
index 000000000..dd10d9053
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/error1.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+struct S
+{
+ void f () {} // { dg-error "with" "" }
+ int f () { return 0; } // { dg-error "overloaded" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/error2.C
new file mode 100644
index 000000000..327062133
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/error2.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com>
+
+// PR 22604
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A
+{
+ void foo(); // { dg-error "with" "" }
+ virtual void foo(); // { dg-error "cannot be overloaded" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/error3.C
new file mode 100644
index 000000000..e0003dd88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/error3.C
@@ -0,0 +1,41 @@
+// PR c++/42701
+// Test for error-recovery on code that is ill-formed by DR 147.
+
+namespace Glib {
+ class ustring {
+ public:
+ typedef unsigned size_type;
+ ustring(const char* src, size_type n);
+ ustring(const char* src);
+ };
+}
+namespace Gdk {
+ class Color {
+ public:
+ explicit Color(const Glib::ustring& value);
+ };
+}
+namespace Gtk {
+ enum StateType { STATE_NORMAL };
+ class Widget {
+ public:
+ void modify_bg(StateType state, const Gdk::Color& color);
+ };
+ class Label {
+ public:
+ void set_text(const Glib::ustring &str);
+ };
+}
+typedef enum Result { eSuccess = 0 } Result;
+class MainWindow {
+ void update_status(Result result);
+ Gtk::Widget status_frame;
+ Gtk::Label status_label;
+};
+void MainWindow::update_status(Result result) {
+ switch (result) {
+ status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("green")); // { dg-error "" }
+ status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("red")); // { dg-error "" }
+ status_label.set_text("Out of memory");
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-1.C
new file mode 100644
index 000000000..839a0b49a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-1.C
@@ -0,0 +1,17 @@
+// PR c++/34691
+
+namespace A {
+ extern "C" void f(int = 5); // { dg-message "= 5" }
+}
+namespace B {
+ extern "C" void f(int = 4); // { dg-message "= 4" }
+}
+
+using A::f;
+using B::f;
+int main() {
+ void (*fp)(int) = f; // OK
+ f(3); // OK
+ f(); // { dg-error "default argument mismatch" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-2.C
new file mode 100644
index 000000000..562786c04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/extern-C-2.C
@@ -0,0 +1,22 @@
+// PR c++/39742
+
+void f( int, ...);
+
+struct S
+{
+};
+
+void
+g()
+{
+ void f( int, ...);
+
+ S t;
+
+ f(1, t);
+}
+
+void
+f( int i, ...)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig1.C
new file mode 100644
index 000000000..a46125919
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig1.C
@@ -0,0 +1,19 @@
+// PR c++/9336
+// Bug: The first, invalid call to f caused us to crash on the second,
+// valid call.
+
+namespace N {
+ template <class T> void f (T); // { dg-message "N::f" }
+ struct A;
+}
+
+struct B;
+
+void g ()
+{
+ B *bp;
+ N::A *ap;
+ f (bp); // { dg-error "not declared" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 16 }
+ f (ap);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig2.C
new file mode 100644
index 000000000..f35aa1a31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/koenig2.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com>
+
+// PR 21383
+// Origin: Matthew Hall <mahall@ncsa.uiuc.edu>
+
+template <class T>
+void dummy(T& t);
+
+void anyfunc(int x);
+
+void Foo ()
+{
+ anyfunc (&dummy<>); // { dg-error "cannot resolve overload" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/member1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/member1.C
new file mode 100644
index 000000000..29896a511
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/member1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com>
+
+struct X
+{
+ template<typename T> static void ProcessProxy ();
+ typedef void (*Callback) ();
+ void Process (Callback);
+
+ template<typename T> void Process ()
+ {
+ Process (&ProcessProxy<T>);
+ }
+
+};
+
+void foo (X *x)
+{
+ x->Process<int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/member2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/member2.C
new file mode 100644
index 000000000..b8914146f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/member2.C
@@ -0,0 +1,41 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com>
+
+// PR 7676. We didn't notice template members were different.
+
+struct foo
+{
+ template<class T>
+ int bar() {return 1;}
+
+ template<int I>
+ int bar() {return 2;}
+
+};
+
+struct baz : foo
+{
+ using foo::bar;
+ template<int I>
+ int bar () {return 3;}
+};
+
+int main ()
+{
+ baz b;
+ foo f;
+
+ if (f.bar<1> () != 2)
+ return 1;
+ if (f.bar<int> () != 1)
+ return 2;
+
+ if (b.bar<1> () != 3)
+ return 1;
+ if (b.bar<int> () != 1)
+ return 2;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/new1.C
new file mode 100644
index 000000000..bf2190b8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/new1.C
@@ -0,0 +1,21 @@
+typedef __SIZE_TYPE__ size_t;
+void *operator new(size_t, unsigned int);
+
+struct X{
+ X();
+ X(int);
+};
+
+
+void f(X *x = new X); // { dg-message "" }
+
+void f(X *x = new X(4)); // { dg-error "" }
+
+void f(X *x = new X[4]); // { dg-error "" }
+
+void f(X *x = new (3) X(6)); // { dg-error "" }
+
+void f(X *x = new (2) X[10]); // { dg-error "" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 18 }
+
+void f(X *x = new X[10][5]); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator-star-1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator-star-1.C
new file mode 100644
index 000000000..8780d5f62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator-star-1.C
@@ -0,0 +1,27 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/70
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// { dg-do compile }
+
+template <class T>
+ struct S;
+
+template <class T>
+ void operator* (S<T>, S<T>);
+
+template <class T>
+ struct S
+ {
+ friend void operator*<> (S, S); // { } // okay
+ void operator* (T) { }
+ };
+
+template <class T>
+ void operator* (S<T>, S<T>) { }
+
+int main()
+{
+ S<int> s1, s2;
+ s1 * s2;
+ s1 * 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator1.C
new file mode 100644
index 000000000..f4d1f53f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator1.C
@@ -0,0 +1,34 @@
+typedef struct _GdkDrawable GdkDrawable;
+typedef struct _GdkDrawable GdkBitmap;
+typedef struct _GdkDrawable GdkPixmap;
+
+class Drawable
+{
+public:
+ operator GdkDrawable* () const;
+};
+
+
+class Pixmap : public Drawable
+{
+public:
+ operator GdkPixmap* () const;
+
+};
+
+
+class Bitmap : public Pixmap
+{
+public:
+ operator GdkBitmap* () const;
+
+};
+
+class Event
+{
+};
+
+Bitmap::operator GdkBitmap* () const
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator2.C
new file mode 100644
index 000000000..aba162244
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator2.C
@@ -0,0 +1,14 @@
+// PR c++/19966
+// { dg-do compile }
+
+struct A
+{
+ static operator int(); // { dg-error "must be a nonstatic" }
+};
+
+struct B
+{
+ static int operator*(); // { dg-error "must be either" }
+};
+
+static operator int(); // { dg-error "must be a nonstatic" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator3.C
new file mode 100644
index 000000000..ff5696788
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator3.C
@@ -0,0 +1,31 @@
+// PR c++/32756
+// { dg-do compile }
+
+// bogus overload warning
+
+class QString;
+
+struct QByteArray
+{
+ QByteArray ();
+ bool operator!= (const QString & s2) const;
+};
+
+bool operator!= (const QByteArray & a1, const QByteArray & a2);
+
+struct QString
+{
+ QString ();
+ QString (const QByteArray & a);
+};
+
+QByteArray abbreviation ();
+
+void
+fromString ()
+{
+ QByteArray zoneAbbrev;
+ if (abbreviation () != zoneAbbrev)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator4.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator4.C
new file mode 100644
index 000000000..3ec1eb472
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator4.C
@@ -0,0 +1,14 @@
+// PR c++/38174
+
+struct VolatileIntPtr {
+ operator int volatile *();
+};
+
+struct ConstIntPtr {
+ operator int const *();
+};
+
+void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip) {
+ bool b1 = (vip == cip);
+ long p1 = vip - cip;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator5.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator5.C
new file mode 100644
index 000000000..6e7703b9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator5.C
@@ -0,0 +1,16 @@
+// PR c++/50858
+
+class String {
+ typedef struct ImplicitConversionFromWTFStringToBoolDisallowedA*
+ (String::*UnspecifiedBoolTypeA);
+ typedef struct ImplicitConversionFromWTFStringToBoolDisallowedB*
+ (String::*UnspecifiedBoolTypeB);
+ operator UnspecifiedBoolTypeA() const;
+ operator UnspecifiedBoolTypeB() const;
+};
+inline bool equalIgnoringCase(const String& a, const String& b) { }
+inline bool equalPossiblyIgnoringCase(const String& a,
+ const String& b,
+ bool ignoreCase) {
+ return ignoreCase ? equalIgnoringCase(a, b) : (a == b); } // { dg-error "ambiguous" }
+// { dg-message "note" "note" { target *-*-* } 15 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/operator6.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator6.C
new file mode 100644
index 000000000..5002602b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/operator6.C
@@ -0,0 +1,27 @@
+// PR c++/17805
+
+// Per 13.3.1.2/3 bullet 2, an operator function is not a candidate
+// for overload resolution if neither argument is of class type and
+// neither enumerator-typed argument gets an exact match, with or
+// without reference binding, for the corresponding parameter.
+
+struct A
+{
+ A(int);
+ A(const char*);
+};
+
+bool operator==(const A&, const A&);
+const A& operator*(const A&);
+
+enum E { e };
+
+bool b1 = (e == ""); // { dg-error "no match" }
+
+bool b2 = (A(1) == "");
+
+bool b3 = (e == A(1));
+
+const A& a1 = *e; // { dg-error "no match" }
+
+const A& a2 = *A(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf1.C
new file mode 100644
index 000000000..d20074931
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 04 Mar 2002 <nathan@codesourcery.com>
+// Jason Merrill <jason@redhat.com>
+
+struct A { int i; };
+struct B: private A {};
+struct C {
+ C (int A::*);
+};
+
+int A::*aip = &A::i;
+
+void f (int B::*) {} // should choose this, even though it's ill-formed
+void f (C) {} // even though this would be well-formed
+
+int main ()
+{
+ f (aip); // { dg-error "'A' is an inaccessible base of 'B'|conversion" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf2.C
new file mode 100644
index 000000000..e95e1f83a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/pmf2.C
@@ -0,0 +1,20 @@
+// PR c++/561
+
+class A { };
+
+struct B : public A
+{
+ void foo ();
+ void foo (int);
+ template <class T>
+ void bar (T);
+ template <class T>
+ void bar (T, T);
+};
+
+int main ()
+{
+ void (A::*f1)() = (void (A::*)()) &B::foo;
+ void (A::*f2)(int) = (void (A::*)(int)) &B::bar;
+ void (A::*f3)(int) = (void (A::*)(int)) &B::bar<int>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/prom1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/prom1.C
new file mode 100644
index 000000000..9eb387dc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/prom1.C
@@ -0,0 +1,9 @@
+void foo(signed char) {}
+typedef int bar;
+void foo(bar) {}
+
+int main (int, char **) {
+ char c;
+ foo(c);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv1.C
new file mode 100644
index 000000000..7e1411412
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv1.C
@@ -0,0 +1,6 @@
+// PR c++/50442
+
+template <typename T> struct MoveRef { operator T& () {} };
+template <typename T> MoveRef <T> Move(T&) {}
+struct Thing {};
+Thing foo(const Thing* p) { return Thing(Move(*p)); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv2.C
new file mode 100644
index 000000000..bb0ad39d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref-conv2.C
@@ -0,0 +1,15 @@
+// PR c++/50523
+
+template <class T>
+struct A
+{
+ A(const T&);
+ operator T&() const;
+ operator const T&() const;
+};
+
+int main()
+{
+ A<int> a(1);
+ A<int> a2(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref1.C
new file mode 100644
index 000000000..e239d88a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/ref1.C
@@ -0,0 +1,21 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Mar 2004 <nathan@codesourcery.com>
+
+// Origin: schmid@snake.iap.physik.tu-darmstadt.de
+// Bug 14397: Bogus access error.
+
+struct S {
+ S (int);
+ S(S const&);
+ private:
+ S(S&);
+};
+
+S foo()
+{
+ int result = 0;
+
+ S s ((0,S (result)));
+
+ return S (result);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp1.C
new file mode 100644
index 000000000..89f941817
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp1.C
@@ -0,0 +1,13 @@
+// PR c++/25950
+
+struct X {
+ X();
+ explicit X(const X&);
+};
+
+void g(const X&);
+
+int main()
+{
+ g(X());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp2.C
new file mode 100644
index 000000000..365d5b13f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/reftemp2.C
@@ -0,0 +1,23 @@
+// DR 391 says that we always bind a reference to the base subobject; it is
+// incorrect to call the A copy constructor to initialize the parameter of
+// f.
+
+int fail;
+
+struct A {
+ A() { }
+ A(const A&) { fail = 1; }
+};
+struct B : public A { };
+struct X {
+ operator B() { return B(); }
+};
+X x;
+
+void f (const A&) { }
+
+int main()
+{
+ f(x);
+ return fail;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue1.C
new file mode 100644
index 000000000..41805949d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue1.C
@@ -0,0 +1,10 @@
+// PR c++/42655
+
+void unused(const bool &) { }
+
+int main() {
+ volatile bool x = false;
+ unused(!!x); // type of "!x" is bool
+ unused(!x); // type of "!x" is bool
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue2.C
new file mode 100644
index 000000000..8a2290dc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue2.C
@@ -0,0 +1,11 @@
+// PR c++/49812
+// The call should choose the second f because i++ is an int rvalue.
+
+template <class T> void f(const volatile T& t) { t.i; }
+template <class T> void f(const T&);
+
+int main()
+{
+ volatile int i = 0;
+ f(i++);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue3.C
new file mode 100644
index 000000000..5a5d23742
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/rvalue3.C
@@ -0,0 +1,8 @@
+// PR c++/50512
+
+void foo (const char *const& s);
+template<typename C> void foo (const C& x) { x.a; }
+
+void f () {
+ foo ("abc");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/scope1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/scope1.C
new file mode 100644
index 000000000..f783b7613
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/scope1.C
@@ -0,0 +1,10 @@
+// PR c++/9868
+
+template <typename T> struct D {
+ void (*p)();
+
+ void clear() {
+ D::p();
+ }
+};
+template class D<bool>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/template1.C
new file mode 100644
index 000000000..5bfad8464
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/template1.C
@@ -0,0 +1,12 @@
+template<typename T> T Foo (int) {T d;}
+
+void Baz (void (*)(int), int);
+
+int Foo ();
+int Baz (int (*)(), float);
+
+void Bar ()
+{
+ Baz (Foo, 1.0f);
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/template2.C
new file mode 100644
index 000000000..e7bdaa74b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/template2.C
@@ -0,0 +1,8 @@
+typedef int PyObject;
+typedef PyObject *(*PyCFunction)(PyObject *, PyObject *);
+template<class T> int _clear(PyObject* self);
+
+void _typeInfo()
+{
+ reinterpret_cast<PyCFunction>(_clear); // { dg-error "overloaded function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/template3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/template3.C
new file mode 100644
index 000000000..90ccfd8ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/template3.C
@@ -0,0 +1,15 @@
+// PR c++/33962
+// { dg-do compile }
+
+template <class T> struct A;
+
+template <class U> void foo (const U &x, ...);
+template <class T> void foo (const A<T> &x, ...);
+
+void bar (const A<int> &x, const char *y)
+{
+ foo (x, y);
+}
+
+/* { dg-final { scan-assembler "_Z3fooIiEvRK1AIT_Ez" } } */
+/* { dg-final { scan-assembler-not "_Z3fooI1AIiEEvRKT_z" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/template4.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/template4.C
new file mode 100644
index 000000000..8f00d4171
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/template4.C
@@ -0,0 +1,24 @@
+// PR c++/35986
+// { dg-do compile }
+
+namespace
+{
+ template <int> void foo (...); // { dg-message "foo" }
+ template <int> void bar (int, ...); // { dg-message "bar" }
+ void baz (...); // { dg-message "baz" }
+}
+
+template <int> void foo (...); // { dg-message "note" }
+template <int> void bar (int, ...); // { dg-message "note" }
+void baz (...); // { dg-message "note" }
+
+void
+test ()
+{
+ foo <0> (0); // { dg-error "is ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 18 }
+ bar <1> (0, 1); // { dg-error "is ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 20 }
+ baz (0); // { dg-error "is ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/template5.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/template5.C
new file mode 100644
index 000000000..b1dc65ebe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/template5.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+template<typename T>
+int low(T a, T b, T c) { return a + b + c; } // { dg-message "template" }
+
+template<typename T>
+int high(T a, T b, T c) { return a + b + c; } // { dg-message "template" }
+
+int test (void)
+{
+ low (5, 6); // { dg-error "no matching function" }
+ // { dg-message "(candidate|3 arguments, 2 provided)" "" { target *-*-* } 11 }
+ high (5, 6, 7, 8); // { dg-error "no matching function" }
+ // { dg-message "(candidate|3 arguments, 4 provided)" "" { target *-*-* } 13 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/unknown1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/unknown1.C
new file mode 100644
index 000000000..128c4344f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/unknown1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+void foo(void);
+int foo(int);
+template <typename T> void bar(T f); // { dg-message "note" }
+
+void baz() {
+ bar(foo); // { dg-error "<unresolved overloaded function type>" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/using1.C
new file mode 100644
index 000000000..bc46c6049
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/using1.C
@@ -0,0 +1,11 @@
+void f();
+
+namespace N {
+ using ::f;
+}
+
+bool b;
+
+void g() {
+ b = N::f == ::f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/using2.C
new file mode 100644
index 000000000..d1824548a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/using2.C
@@ -0,0 +1,92 @@
+// { dg-do compile }
+
+// Copyright 2005 Free Software Foundation
+// by Alexandre Oliva <aoliva@redhat.com>
+// based on https://bugzilla.redhat.com/beta/show_bug.cgi?id=149098
+
+// Per the ISO C++ 90 Standard, using declarations before of after a
+// declaration of the same function name and prototype should be
+// errors (7.3.3/11). However, DR 101's resolution recommends
+// accepting such duplicates if they denote the same function, which
+// means extern "C" declarations are supposed to match and be
+// accepted.
+
+// This test makes sure we reject or accept regular and using
+// declarations regardless of order as appropriate, and that having
+// built-in declarations or overloads doesn't affet the outcome.
+
+namespace std {
+ extern "C" void exit (int) throw (); // these are built-in (extern "C")
+ extern "C" void *malloc (__SIZE_TYPE__) throw () __attribute__((malloc));
+
+ void abort (void) throw (); // these aren't
+ void _exit (int) throw (); // { dg-message "std::_exit" }
+
+ extern "C" void c1 (void) throw ();
+ void C1 (void) throw (); // { dg-message "std::C1" }
+
+ extern "C" void c2 (void) throw ();
+ void C2 (void) throw ();
+
+ extern "C" void c3 (void) throw ();
+ void C3 (void) throw (); // { dg-message "std::C3" }
+}
+
+namespace other {
+ extern "C" void c3 (void) throw ();
+ void C3 (void) throw (); // { dg-message "other::C3" }
+}
+
+using std::exit;
+using std::_exit;
+using std::c1;
+using std::C1;
+
+ extern "C" void exit (int) throw ();
+ extern "C" void *malloc (__SIZE_TYPE__) throw () __attribute__((malloc));
+
+ void abort (void) throw (); // { dg-message "previous" }
+ void _exit (int) throw (); // { dg-error "conflicts" "conflicts" }
+ // { dg-message "void _exit" "_exit" { target *-*-* } 49 }
+
+ extern "C" void c1 (void) throw ();
+ void C1 (void) throw (); // { dg-error "conflicts" "conflicts" }
+ // { dg-message "void C1" "C1" { target *-*-* } 53 }
+
+ extern "C" void c2 (void) throw ();
+ void C2 (void) throw (); // { dg-message "previous" }
+
+ int C3 (int) throw ();
+
+using std::malloc;
+using std::abort; // { dg-error "conflicts" }
+using std::c2;
+using std::C2; // { dg-error "conflicts" }
+
+using std::c3; using other::c3;
+using std::C3; using other::C3;
+
+ long C3 (long) throw ();
+
+int main () {
+ malloc (0);
+ exit (0);
+
+ _exit (0); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 75 }
+ abort ();
+
+ c1 ();
+ C1 (); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 80 }
+
+ c2 ();
+ C2 (); // one might expect an ambiguous call error here as well, but
+ // we don't add the using decl if we find it to be in error.
+
+ c3 ();
+ C3 (); // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 88 }
+ C3 (0);
+ C3 (0l);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/using3.C
new file mode 100644
index 000000000..38344e48a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/using3.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+namespace a
+{
+ void f(int);
+}
+
+namespace b
+{
+ void f(int); // { dg-message "previous" }
+ void g()
+ {
+ f (3);
+ }
+ using a::f; // { dg-error "conflicts" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual1.C
new file mode 100644
index 000000000..8940aefd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual1.C
@@ -0,0 +1,21 @@
+// Test that explicit scope suprresses virtual lookup even after an
+// explicit object.
+
+extern "C" int printf (const char *, ...);
+
+struct A
+{
+ virtual int f () { return 0; }
+};
+
+struct B: public A
+{
+ int f () { return 1; }
+ int g() { return this->A::f(); }
+};
+
+int main()
+{
+ B b;
+ return b.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual2.C
new file mode 100644
index 000000000..c93ba9e29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/virtual2.C
@@ -0,0 +1,31 @@
+// PR c++/52746
+// { dg-do run }
+
+extern "C" int printf(const char*,...);
+extern "C" void abort();
+bool db;
+
+struct A
+{
+ virtual ~A() {}
+};
+
+struct B : public A
+{
+ virtual ~B() { db = true; }
+};
+
+template<int> void test()
+{
+ B * b = new B;
+ A * a = b;
+ a->~A();
+ ::operator delete(b);
+}
+
+int main()
+{
+ test<0>();
+ if (!db)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/overload/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/overload/volatile1.C
new file mode 100644
index 000000000..baf467d81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/overload/volatile1.C
@@ -0,0 +1,14 @@
+// PR c++/48118
+// { dg-prune-output "note" }
+
+struct A { };
+
+void f (A); // { dg-error "argument 1" }
+void (*g)(A);
+
+int main()
+{
+ volatile A a;
+ f(a); // { dg-error "no match" }
+ g(a); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access1.C
new file mode 100644
index 000000000..f8994e39e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Volker Lukas <vlukas@gmx.de>
+
+// PR c++/9554: Access checking for template ID as class head.
+
+class enclose
+{
+ template<typename T> struct enclosed;
+};
+
+template <>
+struct enclose::enclosed<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access10.C
new file mode 100644
index 000000000..62adc1b16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access10.C
@@ -0,0 +1,11 @@
+// PR c++/18698
+// The compiler was giving an error message for invalid syntax
+// that irrelevantly talked about using-declarations.
+
+template<int> struct A
+{
+ ::A~(); // { dg-bogus "using-declaration" }
+};
+
+// Instead of the bogus error we get a different error.
+// { dg-error "template-name" "" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access11.C
new file mode 100644
index 000000000..7004fa764
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access11.C
@@ -0,0 +1,35 @@
+// PR c++/24926
+
+class A {
+ union {
+ int i; // { dg-error "private" }
+ };
+ union {
+ int j; // { dg-error "private" }
+ };
+ union {
+ union {
+ int k; // { dg-error "private" }
+ };
+ union {
+ union {
+ int l; // { dg-error "private" }
+ };
+ union {
+ int m; // { dg-error "private" }
+ union {
+ int n; // { dg-error "private" }
+ int o; // { dg-error "private" }
+ };
+ };
+ };
+ };
+};
+
+int a1 = A().i; // { dg-error "context" }
+int a2 = A().j; // { dg-error "context" }
+int a3 = A().k; // { dg-error "context" }
+int a4 = A().l; // { dg-error "context" }
+int a5 = A().m; // { dg-error "context" }
+int a6 = A().n; // { dg-error "context" }
+int a7 = A().o; // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access2.C
new file mode 100644
index 000000000..ee8cd234e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access2.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Deferred access checking of variable declaration.
+
+class A {
+ typedef int X; // { dg-error "private" }
+ static X a, b, c;
+};
+
+A::X A::a;
+A::X A::b, x; // { dg-error "this context" }
+A::X y, A::c; // { dg-error "this context" }
+A::X z; // { dg-error "this context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access3.C
new file mode 100644
index 000000000..43303c95a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access3.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: <bagnara@cs.unipr.it>
+
+// PR c++/7809: Befriending inaccessible name.
+
+class A {
+private:
+ void f(); // { dg-error "private" }
+};
+
+class B {
+ friend void A::f(); // { dg-error "context" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access4.C
new file mode 100644
index 000000000..d3870bd34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access4.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Mike Reed <mike.reed@amadron.com>
+
+// PR c++/11174: Access checking of pointer-to-member function
+
+class A {
+protected:
+ void foo() {} // { dg-error "protected" }
+public:
+ A();
+};
+
+class B : public A {
+ void bar() {
+ A a;
+ void (A::*pmf)() = &A::foo; // { dg-error "this context" }
+ (a.*pmf)();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access5.C
new file mode 100644
index 000000000..cd1789eed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access5.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/11174: Access checking on pointer to member data.
+
+struct A
+{
+protected:
+ int a; // { dg-error "protected" }
+};
+
+struct B : A
+{
+ void foo() {
+ (void)&A::a; // { dg-error "this context" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access6.C
new file mode 100644
index 000000000..33d509058
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access6.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: David Baron <dbaron@fas.harvard.edu>
+
+// PR c++/3765: Changing access from public to private by member
+// using declaration.
+
+class A
+{
+ public:
+ int foo() { return 1; } // { dg-error "inaccessible" }
+};
+
+class B : public A
+{
+ private:
+ using A::foo;
+};
+
+int main()
+{
+ B b;
+ return b.foo(); // { dg-error "this context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access7.C
new file mode 100644
index 000000000..2a7ca3c42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access7.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Paolo Carlini <pcarlini@unitus.it>
+
+// PR c++/5655: Access of member redeclaration.
+
+struct S {
+ class A;
+ template <class T> class B;
+private:
+ class A {}; // { dg-error "different access" }
+ template <class T> class B {}; // { dg-error "different access" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access8.C
new file mode 100644
index 000000000..205b7f271
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access8.C
@@ -0,0 +1,12 @@
+// PR c++/22618
+
+class foo
+{
+ typedef int memfun; // { dg-error "private" }
+};
+
+template<foo::memfun> // { dg-error "context" }
+struct fm_obj { };
+
+template <typename T = foo::memfun> // { dg-error "context" }
+struct S {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/access9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/access9.C
new file mode 100644
index 000000000..2c29016b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/access9.C
@@ -0,0 +1,5 @@
+// PR c++/24782
+
+class Foo { public: typedef int type1; };
+class Bar { private: typedef Foo type2; }; // { dg-error "private" }
+void g(Bar::type2::type1) {} // { dg-error "context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig1.C
new file mode 100644
index 000000000..2645879b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9109. Ambiguity. [dcl.ambig.res]/7
+
+template <typename T> void Foo (int (T))
+{
+ try {}
+ catch (int (T)) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig2.C
new file mode 100644
index 000000000..7b000c620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9212. We erroneously accepted an ill-formed
+// function-declaration, rather than a variable initializer.
+
+
+struct A
+{
+ enum E { e };
+ A(E);
+};
+
+struct B
+{
+ enum F { f };
+ B(F);
+};
+
+struct C
+{
+ C(A, B, A);
+};
+
+C c(A(A::e), B(B::f), A(A::e)); // This is not a function declaration
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig3.C
new file mode 100644
index 000000000..41390710f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig3.C
@@ -0,0 +1,21 @@
+// PR c++/9452
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int> struct A { static const int i = 1; };
+template <int> struct B {};
+
+template <typename> int foo(B<0>)
+{
+ return 0;
+}
+
+template <typename, int j> B<A<j>::i-1> foo(B<j>)
+{
+ return B<0>();
+}
+
+int main()
+{
+ return foo<int>(B<0>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig4.C
new file mode 100644
index 000000000..02e39b80f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig4.C
@@ -0,0 +1,18 @@
+// PR c++/20293
+
+namespace hide { // { dg-message "hide" }
+ int k;
+}
+
+namespace {
+ int i;
+ namespace hide { // { dg-message "hide" }
+ int j;
+ }
+}
+
+void F(int) {}
+
+int main() {
+ F(hide::j); // { dg-error "ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig5.C
new file mode 100644
index 000000000..e554d961f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig5.C
@@ -0,0 +1,7 @@
+// PR c++/41786
+
+struct A { A(int, char const*); };
+int main() {
+ int i = 0, *b = &i;
+ A a(int(b[i]), "hello");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig6.C
new file mode 100644
index 000000000..0bd2302fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig6.C
@@ -0,0 +1,12 @@
+// PR c++/48046
+
+namespace N1 { typedef int T; } // { dg-message "" }
+namespace N2 { typedef float T; } // { dg-message "" }
+
+int main()
+{
+ using namespace N1;
+ using namespace N2;
+
+ static T t; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig7.C
new file mode 100644
index 000000000..9a5b8791d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig7.C
@@ -0,0 +1,16 @@
+// PR c++/60361
+
+struct Helper
+{
+ Helper(int a, void (*pfunc)());
+};
+
+template <int I> void function();
+
+const int A = 1;
+const int B = 2;
+
+Helper testOk(A, function<A>);
+Helper testOk2(int(A), function<B>);
+Helper testOk3((int(A)), function<A>);
+Helper testFail(int(A), function<A>);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig8.C
new file mode 100644
index 000000000..016df8ae7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig8.C
@@ -0,0 +1,15 @@
+// PR c++/60415
+
+namespace b {
+ enum type_t { warning };
+}
+
+struct d {
+ d(b::type_t) { }
+ int operator()() { return 0; }
+};
+
+int main()
+{
+ d(b::warning)() + 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig9.C
new file mode 100644
index 000000000..68744d1ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ambig9.C
@@ -0,0 +1,10 @@
+// PR c++/49691
+
+struct A { int x; };
+A* f();
+struct B {
+ void g()
+ {
+ int(f()->x);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket.C
new file mode 100644
index 000000000..39bb4eb10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket.C
@@ -0,0 +1,9 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Origin: Bill Somerville <bill@classdesign.com>
+// { dg-do compile }
+
+int main()
+{
+ ( int() > int() );
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket2.C
new file mode 100644
index 000000000..fb758e33f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/angle-bracket2.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// Contributed by MattyT <mattyt-bugzilla at tpg dot com dot au>
+// PR c++/14028: Parser accepts invalid unbalanced bracket.
+
+template <int> struct A {};
+template <typename TP> class B : public A<4 {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/args1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/args1.C
new file mode 100644
index 000000000..0eb6e64b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/args1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 11050. Accepted ill-formed
+
+
+void Foo (int)
+{
+ Foo(2 2); // { dg-error "expected" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size1.C
new file mode 100644
index 000000000..2bc31f758
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size1.C
@@ -0,0 +1,13 @@
+// PR c++/38
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// { dg-do compile }
+
+template <int i> struct A
+{
+ static const int n = 1;
+ typedef double X[n];
+
+ A (const X&);
+};
+
+template <int i> A<i>::A (const X&) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size2.C
new file mode 100644
index 000000000..355ed6133
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/array-size2.C
@@ -0,0 +1,20 @@
+// PR c/25682
+// { dg-do compile }
+// Test whether we don't ICE on questionable constructs where offsetof
+// should have been used instead.
+
+struct S
+{
+ char a[4];
+ int b;
+};
+
+extern void bar (char *, char *);
+
+void
+foo (void)
+{
+ char g[(char *) &((struct S *) 0)->b - (char *) 0];
+ char h[(__SIZE_TYPE__) &((struct S *) 8)->b];
+ bar (g, h);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/asm1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm1.C
new file mode 100644
index 000000000..009ffbd3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm1.C
@@ -0,0 +1,6 @@
+//PR c++/30849
+
+void foo()
+{
+ asm("" : 0); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/asm2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm2.C
new file mode 100644
index 000000000..09924c9c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm2.C
@@ -0,0 +1,6 @@
+//PR c++/30850
+
+void foo()
+{
+ asm("" :: 0); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/asm3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm3.C
new file mode 100644
index 000000000..91f19e48c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/asm3.C
@@ -0,0 +1,6 @@
+//PR c++/30851
+
+void foo()
+{
+ asm ("%[x]" : [0](x)); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-ctor1.C
new file mode 100644
index 000000000..23d488a20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-ctor1.C
@@ -0,0 +1,9 @@
+// PR c++/6992
+// Origin: <petr@scssoft.com>
+// { dg-do compile }
+// { dg-require-named-sections "" }
+
+class A
+{
+ __attribute__((section("whatever"))) A();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C
new file mode 100644
index 000000000..845d873aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C
@@ -0,0 +1,49 @@
+// { dg-do compile }
+// { dg-options "-O3 -fwhole-program" }
+// { dg-add-options bind_pic_locally }
+// { dg-final { scan-assembler "foo1" } }
+// { dg-final { scan-assembler "foo2" } }
+// { dg-final { scan-assembler "foo3" } }
+// { dg-final { scan-assembler "foo4" } }
+// { dg-final { scan-assembler "foo5" } }
+// { dg-final { scan-assembler-not "foo6" } }
+// { dg-final { scan-assembler "bar1" } }
+// { dg-final { scan-assembler "bar2" } }
+// { dg-final { scan-assembler "bar3" } }
+// { dg-final { scan-assembler "bar4" } }
+// { dg-final { scan-assembler "bar5" } }
+// { dg-final { scan-assembler-not "bar6" } }
+
+extern void foo1 (void) __attribute__((externally_visible));
+void foo1 (void) { }
+
+extern void foo2 (void) __attribute__((externally_visible));
+__attribute__((externally_visible)) void foo2 (void) { }
+
+extern void foo3 (void);
+__attribute__((externally_visible)) void foo3 (void) { }
+
+__attribute__((externally_visible)) void foo4 (void) { }
+
+void foo5 (void) { }
+extern void foo5 (void) __attribute__((externally_visible));
+
+void foo6 (void) { }
+
+extern char *bar1 __attribute__((externally_visible));
+char *bar1;
+
+extern char *bar2 __attribute__((externally_visible));
+char *bar2 __attribute__((externally_visible));
+
+extern char *bar3;
+char *bar3 __attribute__((externally_visible));
+
+char *bar4 __attribute__((externally_visible));
+
+char *bar5;
+extern char *bar5 __attribute__((externally_visible));
+
+char *bar6;
+
+int main (void) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C
new file mode 100644
index 000000000..d7feaabb2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-O -fwhole-program" }
+
+static void foo1 (void) { } // { dg-warning "have effect only on public" }
+extern void foo1 (void) __attribute__((externally_visible));
+
+struct C
+{
+ __attribute__((externally_visible)) void foo3 (void) { }
+};
+
+__attribute__((externally_visible)) static void foo3 (void) { } // { dg-warning "have effect only on public" }
+
+static int bar1;
+extern int bar1 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+
+static int bar2 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+
+void fn1 (void)
+{
+ static int bar3 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+}
+
+void fn2 (void)
+{
+ int bar4 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+}
+
+struct A
+{
+} __attribute__((externally_visible)); // { dg-warning "does not apply to types" }
+
+typedef int B __attribute__((externally_visible)); // { dg-warning "attribute ignored" }
+
+struct D
+{
+ static int d __attribute__((externally_visible));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr1.C
new file mode 100644
index 000000000..10d6f57d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr1.C
@@ -0,0 +1,50 @@
+// Test whether attributes are accepted both immediately after
+// struct/union keyword and after the closing brace.
+// { dg-do compile }
+
+struct foo
+{
+ union __attribute__ ((packed))
+ {
+ int a;
+ long b;
+ };
+ union __attribute__ ((packed)) __attribute__ ((unused))
+ {
+ int c;
+ long d;
+ };
+};
+
+union __attribute__ ((packed)) bar
+{
+ int c;
+ long d;
+};
+
+struct __attribute__ ((packed)) baz
+{
+ int e;
+ long f;
+};
+
+struct foo2
+{
+ union
+ {
+ int a;
+ long b;
+ } __attribute__ ((packed));
+};
+
+union bar2
+{
+ int c;
+ long d;
+} __attribute__ ((packed));
+
+struct baz2
+{
+ int e;
+ long f;
+} __attribute__ ((packed));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr2.C
new file mode 100644
index 000000000..ce770029c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr2.C
@@ -0,0 +1,12 @@
+// PR c++/16337
+
+#define vector __attribute__((vector_size(16)))
+void foo (void)
+{
+ vector signed int v1 = { 1, 2, 3, 4 };
+ vector signed int v2, v3;
+ vector signed int v4;
+ v2 = v1;
+ v3 = v1;
+ v4 = v1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/attr3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr3.C
new file mode 100644
index 000000000..848df055c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/attr3.C
@@ -0,0 +1,14 @@
+// PR c++/39219
+
+enum __attribute__ ((deprecated)) E { e };
+struct S { enum __attribute__ ((deprecated)) F { f = e }; };
+
+int main () {
+ E x; // { dg-warning "'E' is deprecated" "" }
+ x = e;
+
+ S::F y; // { dg-warning "'F' is deprecated" "" }
+ y = S::f;
+
+ return x + y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield1.C
new file mode 100644
index 000000000..2e0760585
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield1.C
@@ -0,0 +1,11 @@
+// PR c++/27803
+
+struct A
+{
+ double i : 8; // { dg-error "type" }
+};
+
+void foo(A& a)
+{
+ (char)a.i; // { dg-error "no member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield2.C
new file mode 100644
index 000000000..f84cc673e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield2.C
@@ -0,0 +1,34 @@
+//PR c++/28053
+
+struct X {};
+
+struct A
+{
+ X x : 2; // { dg-error "non-integral type" }
+};
+struct B : A {};
+
+template <typename T>
+struct C
+{
+ T t : 3;
+};
+
+C<int> c;
+
+template <typename T>
+struct D
+{
+ T t : 3; // { dg-error "non-integral type" }
+};
+
+D<double> d; // { dg-message "required" }
+
+template <typename T>
+struct E
+{
+ typedef T* U;
+ U t : 3; // { dg-error "non-integral type" }
+};
+
+E<double> e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield3.C
new file mode 100644
index 000000000..387548a68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield3.C
@@ -0,0 +1,9 @@
+/* PR c++/35320 */
+/* { dg-do compile } */
+
+typedef void (func_type)();
+
+struct A
+{
+ friend func_type f : 2; /* { dg-error "with non-integral type" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield4.C
new file mode 100644
index 000000000..e10fa5f33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield4.C
@@ -0,0 +1,6 @@
+// PR c++/58700
+
+struct A
+{
+ static int : 4; // { dg-error "bit-field" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield5.C
new file mode 100644
index 000000000..15661320d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/bitfield5.C
@@ -0,0 +1,8 @@
+// PR c++/46282
+
+template<int>
+class A
+{
+ A : i() {} // { dg-message "" }
+ int i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/break-in-for.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/break-in-for.C
new file mode 100644
index 000000000..3028cdc80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/break-in-for.C
@@ -0,0 +1,12 @@
+/* PR17412 - ICE in fold_const.c during parsing.
+ fold would try to fold the operands of the break statement. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+
+void foo ()
+{
+ for (;;)
+ for (;;({break;}));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin1.C
new file mode 100644
index 000000000..3b826bd86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin1.C
@@ -0,0 +1,16 @@
+namespace std {
+class Base {};
+}
+
+struct Derived : public std::Base {
+ operator const char*() const;
+ operator bool(void) const;
+};
+
+void log(const char* str);
+
+void nothing()
+{
+ Derived temp;
+ log(temp);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin2.C
new file mode 100644
index 000000000..c524ea684
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/builtin2.C
@@ -0,0 +1,5 @@
+// PR c++/14432
+// { dg-options "" }
+
+struct Y {};
+Y y1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cast1.C
new file mode 100644
index 000000000..c8dbed1ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cast1.C
@@ -0,0 +1,11 @@
+// PR c++/13536
+// { dg-require-effective-target ilp32 } */
+// { dg-options "-w" }
+
+#include <typeinfo>
+
+void f() {
+ (int((char*)0));
+ sizeof ((int((char*)0)));
+ typeid ((int((char*)0)));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cast2.C
new file mode 100644
index 000000000..d447bb4ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cast2.C
@@ -0,0 +1,13 @@
+// PR c++/13736
+
+struct string
+{
+ string() {}
+ string(const string&) {}
+ string(const char*) {}
+};
+
+int main()
+{
+ string s2(string( (const char*)("")));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator1.C
new file mode 100644
index 000000000..867221a35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator1.C
@@ -0,0 +1,11 @@
+// PR c++/8578
+// Origin: <Delana.Lorenzo@libero.it>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ typedef typename T::X X;
+ operator X();
+};
+
+template <typename T> A<T>::operator typename A<T>::X () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator2.C
new file mode 100644
index 000000000..008fa62dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/casting-operator2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Contributed by Martin Loewis <loewis at informatik dot hu-berlin dot de>
+// PR c++/8856: Make sure template conversion operators are not parsed as
+// template names.
+
+struct K {};
+template <bool> struct K2 {};
+
+template <class T> struct A {
+ template <class U> operator U() { return U(); }
+};
+
+int main() {
+ A<double> a;
+
+ (void)a.operator int();
+ (void)a.operator double();
+ (void)a.operator K2<true>();
+ (void)a.A<double>::operator int();
+ (void)a.A<double>::operator double();
+ (void)a.A<double>::operator K2<true>();
+
+ (void)a.operator double<int>(); // { dg-error "not a template" }
+ (void)a.operator K<int>(); // { dg-error "not a template" }
+ (void)a.A<double>::operator double<int>(); // { dg-error "not a template" }
+ (void)a.A<double>::operator K<int>(); // { dg-error "not a template" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/catch1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/catch1.C
new file mode 100644
index 000000000..877402231
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/catch1.C
@@ -0,0 +1,8 @@
+// PR c++/28249
+// { dg-do compile }
+
+void foo()
+{
+ try {}
+ catch (long long long) {} // { dg-error "long long long" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/class1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/class1.C
new file mode 100644
index 000000000..819c48d9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/class1.C
@@ -0,0 +1,10 @@
+namespace N
+{
+ struct A;
+ int f() {
+ struct N::A { // { dg-error "" }
+ A() {}
+ };
+ return 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/class2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/class2.C
new file mode 100644
index 000000000..2014f9b50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/class2.C
@@ -0,0 +1,14 @@
+// PR c++/13140
+
+struct foo {
+ foo();
+ void f();
+ static int i;
+};
+
+
+namespace bar {
+ foo::foo() {} // { dg-error "namespace" }
+ void foo::f() {} // { dg-error "namespace" }
+ int foo::i; // { dg-error "namespace" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C
new file mode 100644
index 000000000..8e25fbac2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C
@@ -0,0 +1,31 @@
+// PR c++/44522
+// { dg-do compile }
+
+namespace x {
+ struct a { };
+ a A0;
+}
+
+x:a a2; // { dg-error "nested-name-specifier" }
+x::a a3 = a2;
+
+x:a f (void) // { dg-error "nested-name-specifier" }
+{
+ x::a a4; // x:a would parse like a label
+ return a4;
+}
+
+x::a g (x:a a4) // { dg-error "nested-name-specifier" }
+{
+ return a4;
+}
+
+class B
+{
+ x::a f(void) // x:a would parse like a bitfield
+ {
+ x::a a4;
+ a4 = x:A0; // { dg-error "nested-name-specifier" }
+ return a4;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C
new file mode 100644
index 000000000..1dfcbc068
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C
@@ -0,0 +1,15 @@
+// PR c++/44523
+// { dg-do compile }
+
+namespace x {
+ struct a { };
+}
+
+template <typename t>
+class foo {
+};
+
+foo<x::a> a1;
+foo<x:a> a2; // { dg-error "nested-name-specifier" }
+
+x::a a3 = a2; // { dg-error "conversion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/comma1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/comma1.C
new file mode 100644
index 000000000..4983535a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/comma1.C
@@ -0,0 +1,14 @@
+// PR c++/14278
+// { dg-options "" }
+
+struct X {
+ X (int p);
+};
+
+struct A {
+ A(X);
+};
+
+void *p_fun;
+
+A a(X ((*(int (*)(int, int)) p_fun)(0, 0)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/comma2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/comma2.C
new file mode 100644
index 000000000..0f405876d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/comma2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+
+// PR c++/24907 [3.4/4.0/4.1/4.2 Regression] "int x, ;" accepted
+
+int x;
+int y,; /* { dg-error "expected" } */
+
+int main()
+{
+ int a;
+ int b,; /* { dg-error "expected" } */
+ int c,d;
+ int e,f,; /* { dg-error "expected" } */
+ int g,h,i;
+ int j,k,l,;/* { dg-error "expected" } */
+ int m,,,n; /* { dg-error "expected" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/concat1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/concat1.C
new file mode 100644
index 000000000..7bf97a628
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/concat1.C
@@ -0,0 +1,15 @@
+/* PR c/3581 */
+/* { dg-do compile } */
+
+/* Intended as a compile-time test for string literal concatenation.
+ The fact that the string isn't actually used in the resulting program
+ should allow this to compile for any target. */
+
+#define e0 "a"
+#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0
+#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1
+#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2
+#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3
+#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4
+
+void foo() { (void)(e5); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond1.C
new file mode 100644
index 000000000..699477305
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond1.C
@@ -0,0 +1,6 @@
+// PR c++/18389
+
+void foo()
+{
+ for (; struct A {}; ); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond2.C
new file mode 100644
index 000000000..2dbe42b34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond2.C
@@ -0,0 +1,14 @@
+// PR c++/20905
+
+struct name {};
+
+int
+f ();
+
+void
+g ()
+{
+ if (int name = f ())
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond3.C
new file mode 100644
index 000000000..96d9c1e3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond3.C
@@ -0,0 +1,15 @@
+// PR c++/30847
+// { dg-do compile }
+// { dg-options "" }
+
+int j, k, l;
+extern void baz ();
+
+void
+foo (int i)
+{
+ (i ? j : k) = ({ l++; (void) l; }); // { dg-error "void value not ignored" }
+ (i ? j : k) += ({ l++; (void) l; }); // { dg-error "void value not ignored" }
+ (i ? j : k) = baz (); // { dg-error "void value not ignored" }
+ (i ? j : k) *= baz (); // { dg-error "void value not ignored" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond4.C
new file mode 100644
index 000000000..ae210e0d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond4.C
@@ -0,0 +1,6 @@
+// PR c++/38635
+// { dg-do compile }
+
+void foo()
+{
+ if (struct A{}// { dg-error "types may not be defined|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/cond5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond5.C
new file mode 100644
index 000000000..7ed9fbe89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/cond5.C
@@ -0,0 +1,10 @@
+// PR c++/40566
+
+void
+f (int x, int y)
+{
+ int c = x ? 23 : throw "bla";
+ short d = y ? throw "bla" : 23;
+ char e = x ? 23 : throw "bla";
+ long f = x ? 23 : throw "bla";
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/condexpr1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/condexpr1.C
new file mode 100644
index 000000000..1ca7dbfa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/condexpr1.C
@@ -0,0 +1,13 @@
+// PR c++/10247
+// Origin: Lars Gullik Bjønes <larsbj@lyx.org>
+// { dg-do compile }
+
+struct A {};
+
+A const foo();
+
+void bar()
+{
+ A a = foo();
+ A b = true ? a : foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant1.C
new file mode 100644
index 000000000..c8a948a57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant1.C
@@ -0,0 +1,15 @@
+// { dg-options -std=c++98 }
+
+void f () {
+ switch (0) {
+ case (3, 0): // { dg-error "" }
+ break;
+ }
+}
+
+int g ();
+
+struct S {
+ int i : (false ? g () : 1); // { dg-error "" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant2.C
new file mode 100644
index 000000000..43fad2e28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant2.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// Origin: <gawrilow at math dot tu-berlin dot de>
+// PR c++/10750: error when using a static const member initialized
+// with a dependent expression as constant-expression
+
+struct A
+{
+ enum { a = 42 };
+};
+
+template <class Q>
+struct B
+{
+ static const int b = Q::a;
+};
+
+template <typename T, template <typename> class P>
+struct C
+{
+ static const bool a = T::a;
+ static const bool a_ = a;
+ static const bool b = P<T>::b;
+ static const bool b_ = b;
+ static const int c = sizeof(T);
+ static const int c_ = c;
+};
+
+template struct C<A,B>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant3.C
new file mode 100644
index 000000000..c029e33ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant3.C
@@ -0,0 +1,7 @@
+const int i = 1;
+const int j (2);
+const int k = { 3 };
+
+enum { a = i, b = j, c = k };
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant4.C
new file mode 100644
index 000000000..626dd9e2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant4.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++/11525 incorrect error about non-constant initalizer
+
+template<typename> class X;
+template<unsigned> class Y {};
+
+
+template<typename T>
+void Foo ()
+{
+ static const unsigned I = X<T>::I;
+
+ Y<I> i;
+
+ static const unsigned J = X<T>::J; // { dg-message "not initialized with a constant expression" }
+
+ Y<J> j; // { dg-error "constant|template argument" "" }
+}
+
+struct A
+{
+ operator unsigned () const;
+};
+
+template <typename> struct X
+{
+ enum {I};
+ static A const J;
+};
+
+void Baz ()
+{
+ Foo<int> (); // { dg-message "required" "" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant5.C
new file mode 100644
index 000000000..f868108a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant5.C
@@ -0,0 +1,16 @@
+// { dg-options "-std=c++98 -pedantic-errors" }
+
+enum E {
+ a = 24.2, // { dg-error "constant" }
+ b = (int)3.7,
+ c = int(4.2),
+ d = (int)(4.2 + 3.7), // { dg-error "constant" }
+ e = int(4.2 - 3.7), // { dg-error "constant" }
+ f = (int)17.25
+};
+
+struct S {
+ static const int i = (int)4.2;
+ int j[(int)4.2];
+ static const int k = static_cast<short>(3.7);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant6.C
new file mode 100644
index 000000000..dae01d47b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant6.C
@@ -0,0 +1,23 @@
+// PR c++/19883
+
+template<typename T> struct A
+{
+ static const T i = 1;
+ char a[int(i)];
+};
+
+template<int> struct B {};
+
+template<typename T> struct C
+{
+ static const T i = 2;
+ B<int(i)> a;
+};
+
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constant7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant7.C
new file mode 100644
index 000000000..c54ad55c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constant7.C
@@ -0,0 +1,9 @@
+// PR c++/19991
+
+enum { e = 1 };
+
+template<typename> struct A
+{
+ static const int i = e;
+ char a[i];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor1.C
new file mode 100644
index 000000000..1bb9ee0a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor1.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+
+ACE_Process_Descriptor::ACE_Process_Descriptor () :
+ // { dg-error "does not name a type" "no type" { target *-*-* } 4 }
+ process_ (0)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor2.C
new file mode 100644
index 000000000..e514e9397
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor2.C
@@ -0,0 +1,11 @@
+// PR c++/14260
+
+template <class TClass>
+class T
+{
+public:
+ T(short,short f=0) {}
+ T<TClass>(int f) {}
+ T<TClass>(int f=0,const char* b=0) {}
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor3.C
new file mode 100644
index 000000000..fe741c833
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/constructor3.C
@@ -0,0 +1,14 @@
+/* PR c++/29077 */
+/* { dg-do compile } */
+
+class c {
+ c();
+ c(const c&);
+ ~c();
+};
+
+namespace m {
+ c::c() {} /* { dg-error "c::c" } */
+ c::c(const c&) {} /* { dg-error "c::c" } */
+ c::~c() {} /* { dg-error "c::~c" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/conv_op1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/conv_op1.C
new file mode 100644
index 000000000..e892f01aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/conv_op1.C
@@ -0,0 +1,30 @@
+
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Dec 2002 <nathan@codesourcery.com>
+
+// PR 8572. ICE with templated conversion operators.
+
+template <typename T> struct A
+{
+ struct B { };
+ operator B* () const;
+ B *Foo ();
+};
+
+template <typename T> typename A<T>::B *A<T>::Foo ()
+{
+ return 0;
+}
+
+template <typename T> A<T>::operator typename A<T>::B* () const
+{
+ return 0;
+}
+
+void Foo (A<int> &p)
+{
+ p.Foo ();
+ static_cast <A<int>::B *> (p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash1.C
new file mode 100644
index 000000000..750ed18e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash1.C
@@ -0,0 +1 @@
+struct s { s(std::b o) { } }; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash10.C
new file mode 100644
index 000000000..712e87674
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash10.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 10953. ICE
+
+// { dg-bogus "" "" { target *-*-* } 14 }
+
+class
+{
+ typename::
+; // { dg-error "" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash11.C
new file mode 100644
index 000000000..eb5cf3c24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash11.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Origin: priesnit@math.uni-goettingen.de
+
+// PR c++/5767: ICE parsing typename with invalid scope.
+
+template <template <typename> class TP>
+struct A
+{
+ template <typename T>
+ struct Template
+ {
+ typedef typename TP<T>::Type Type;
+ };
+};
+template <template <typename> class TP>
+struct B
+{
+ template <typename T>
+ struct Template
+ {
+ typedef typename A<A<TP>::Template> // { dg-error "mismatch|class template" }
+ ::template Template<T>::Type Type; // { dg-error "" }
+ };
+};
+template <typename T>
+struct C
+{
+ typedef void Type;
+};
+int main()
+{
+ typedef B<C>::Template<void>::Type Type; // { dg-error "does not name a type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash12.C
new file mode 100644
index 000000000..769ca2e93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash12.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: Martin von Loewis <martin@v.loewis.de>
+
+// PR c++/157: Incorrect type/template decision in function parameter.
+
+template <class _Tp> class auto_ptr {};
+template <class _Tp>
+class counted_ptr
+{
+public:
+ counted_ptr(::auto_ptr<_Tp>& __a); // { dg-error "candidate" }
+ ::auto_ptr<_Tp> auto_ptr();
+};
+
+template <class _Tp>
+inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required|not match|template" }
+{
+}
+
+template <class _Tp>
+inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash13.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash13.C
new file mode 100644
index 000000000..3c298ec8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash13.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/10583: ICE using template function with invalid signature.
+
+template <typename>
+struct A
+{
+ struct B
+ {};
+};
+
+template <typename T>
+void func(A<T>::B* ) // { dg-error "variable|template|expression" }
+{
+}
+
+int main()
+{
+ func<void>(0); // { dg-error "not declared|expression|;" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash14.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash14.C
new file mode 100644
index 000000000..b4cf49a99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash14.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Contributed by: Giovanni Bajo <giovannibajo at libero dot it>
+// PR c++/14448: Fold constant initializers in templates
+
+template <int> struct A
+{
+ A();
+};
+
+
+template<typename T> void foo(T)
+{
+ static const int n=1+1;
+ A<n+1> a;
+}
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash15.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash15.C
new file mode 100644
index 000000000..afad4c1fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash15.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Jun 2004 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 16260. ICE
+
+template<typename T> int foo() { return T::X::Y; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash16.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash16.C
new file mode 100644
index 000000000..c7da3eb70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash16.C
@@ -0,0 +1,8 @@
+// PR c++/16971
+
+namespace N {
+ int i; // { dg-message "" }
+ // By checking for an explicit keyword on the next line we avoid
+ // matching an ICE message.
+ int i; // { dg-error "redefinition" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash17.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash17.C
new file mode 100644
index 000000000..e50f07af4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash17.C
@@ -0,0 +1,9 @@
+// PR c++/16716
+
+template <typename> class allocator;
+
+template<typename T> class vector {
+ // With the dg-error on the next line, we are really just trying to
+ // check that the message is not an ICE message.
+ typedef typename allocator<T> allocator_type; // { dg-error "expected|invalid" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash18.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash18.C
new file mode 100644
index 000000000..94be360ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash18.C
@@ -0,0 +1,7 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// PR 18095: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A // { dg-error "expected" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash19.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash19.C
new file mode 100644
index 000000000..cc50d9507
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash19.C
@@ -0,0 +1,7 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// PR 18095: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {} // { dg-error "expected" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash2.C
new file mode 100644
index 000000000..ccf89ccc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+int main(void)
+{
+ char x, y;
+ if ('A' == x) && ('B' == y)) { } /* { dg-error "" } */
+ if (x == 'A') && (y == 'B')) { } /* { dg-error "" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash20.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash20.C
new file mode 100644
index 000000000..b601408a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash20.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18729: ICE on ill formed
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<typename T> struct A
+{
+ typedef typename T::X Y; // { dg-error "not a class" "" }
+};
+
+A<int>::Y y; // { dg-message "required from here" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash21.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash21.C
new file mode 100644
index 000000000..623bbec81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash21.C
@@ -0,0 +1,7 @@
+namespace N
+{
+ struct A; // { dg-message "previous declaration" "" }
+}
+
+template<int I>
+struct N::A {}; // { dg-error "redeclared" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash22.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash22.C
new file mode 100644
index 000000000..ba8870376
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash22.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2005 <nathan@codesourcery.com>
+
+// PR 19030: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A; // { dg-message "A" }
+
+namespace N
+{
+ struct A; // { dg-message "A" }
+}
+
+using namespace N;
+
+int A::i; // { dg-message "ambiguous|declared here" "" }
+int A::i; // { dg-message "ambiguous|redefinition of" "" }
+
+namespace N
+{
+ struct C;
+ struct C {};
+}
+
+class D : N::C {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash23.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash23.C
new file mode 100644
index 000000000..19ad70a64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash23.C
@@ -0,0 +1,12 @@
+// PR c++/19733
+
+struct A {};
+typedef int I;
+void foo() {
+ A().~A; // { dg-error "" }
+ A().A::~A; // { dg-error "" }
+ (int().I::~I, 3); // { dg-error "" }
+ int().I::~I; // { dg-error "" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash24.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash24.C
new file mode 100644
index 000000000..fdc4f1e7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash24.C
@@ -0,0 +1,6 @@
+// PR c++/20461
+// { dg-do compile }
+
+class C; // { dg-error "forward declaration" }
+
+C::C() : f() {} // { dg-error "invalid use|does not have" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash25.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash25.C
new file mode 100644
index 000000000..d7f20c62f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash25.C
@@ -0,0 +1,10 @@
+// PR c++/20536
+// Found by Wolfgang Wieser 03/2005.
+// { dg-do compile }
+
+struct yyguts_t
+{
+ class TestScanner* yyextra_r; // { dg-error "forward declaration" }
+};
+
+TestScanner::TestScanner() {} // { dg-error "invalid use" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash26.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash26.C
new file mode 100644
index 000000000..2b4f165f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash26.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 21929: ICE on invalid
+
+template<int> struct A
+{
+ struct B;
+};
+
+template<> struct A<void>::B {}; // { dg-error "mismatch|expected|name a type|extra" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash27.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash27.C
new file mode 100644
index 000000000..217928781
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash27.C
@@ -0,0 +1,4 @@
+// Bug: 23225
+
+void Dispatcher()
+ (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize|end of input" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash28.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash28.C
new file mode 100644
index 000000000..68a975915
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash28.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 10 Aug 2005 <nathan@codesourcery.com>
+
+// PR 23219, ICE
+// Origin:Andrew Pinski <pinskia@gcc.gnu.org>
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+template <class _Tp> class insert_iterator<slist<_Tp> > {}; // { dg-error "not a class template|not declared in this scope|expected unqualified-id|extra" }
+template <class _Value> class insert_iterator<int > { // { dg-error "template" }
+ hash_set<_Value>;
+};
+
+template<int> struct A<X<> > {}; // { dg-error "not a class template|not declared in this scope|expected unqualified-id|extra" }
+struct A {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash29.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash29.C
new file mode 100644
index 000000000..29ede042b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash29.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Aug 2005 <nathan@codesourcery.com>
+
+// PR 22454: ICE
+// Origin: Volker Reichelt reichelt@gcc.gnu.org
+
+template<int> struct A
+{
+ A(void* = &operator new);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash3.C
new file mode 100644
index 000000000..5a48ebc7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash3.C
@@ -0,0 +1,2 @@
+template <class T> struct L { struct I {}; };
+template <class T> void L<T>::I::foo() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash30.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash30.C
new file mode 100644
index 000000000..9b68535fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash30.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+namespace N { template<int> struct A { operator int() const; }; }
+namespace M { template<int> struct A {}; }
+namespace P { typedef int I; }
+
+template<typename> void foo()
+{
+ +typename N::A<0>(); // { dg-bogus "expected" }
+}
+
+template<typename> void bar()
+{
+ +typename M::A<0>; // { dg-error "expected" }
+}
+
+template<typename T> void baz() {
+ typename P::I i; // { dg-bogus "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash31.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash31.C
new file mode 100644
index 000000000..b0a7e1877
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash31.C
@@ -0,0 +1,9 @@
+struct A // { dg-error "forward declaration" }
+{
+ A : A; // { dg-error "expected|incomplete" }
+ A : B; // { dg-error "not declared|incomplete" }
+ A : A(); // { dg-error "undefined type|incomplete" }
+ A : B(); // { dg-error "function call|incomplete|not declared" }
+ A : A[]; // { dg-error "expected|array reference|incomplete" }
+ A : B[]; // { dg-error "not declared|expected|array reference|incomplete" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash32.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash32.C
new file mode 100644
index 000000000..df6aa55a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash32.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+struct Visitor;
+
+struct Ast
+{
+ virtual void accept (Visitor& v);
+};
+
+void
+Ast::accept (Visitor& v)
+{
+ v (*this); // { dg-error "no match for call" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash33.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash33.C
new file mode 100644
index 000000000..5ccb6529c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash33.C
@@ -0,0 +1,11 @@
+// PR c++/28878
+// { dg-do compile }
+
+template<int>
+void foo()
+[
+ throw;
+}
+
+// { dg-prune-output "expected" }
+// { dg-prune-output "array bound" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash34.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash34.C
new file mode 100644
index 000000000..181e58417
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash34.C
@@ -0,0 +1,6 @@
+/* PR c++/31745 */
+/* { dg-do compile } */
+
+void foo()
+{
+ namespace N { /* { dg-error "is not allowed|at end of input" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash35.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash35.C
new file mode 100644
index 000000000..161edad32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash35.C
@@ -0,0 +1,7 @@
+/* This used to ICE. */
+/* { dg-do compile } */
+
+struct a {};
+
+class foo : public a, a // { dg-error "duplicate base" }
+{ /* { dg-error "at end of input" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash36.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash36.C
new file mode 100644
index 000000000..a5a142c2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash36.C
@@ -0,0 +1,12 @@
+// PR c++/32567
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+template <typename... T> struct A // { dg-warning "variadic templates" }
+{
+ static T &t; // { dg-error "not expanded with" "not expanded" }
+ // { dg-message "T" "T" { target *-*-* } 7 }
+ static const int i = sizeof (++t); // { dg-error "was not declared in this scope" }
+};
+
+int x[A <int>::i]; // { dg-error "constant-expression" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash37.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash37.C
new file mode 100644
index 000000000..8320dfaa5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash37.C
@@ -0,0 +1,15 @@
+// PR c++/31941
+// { dg-do compile }
+
+struct S
+{
+ S() throw () { }
+ virtual ~S () throw ();
+ virtual const char* what () const throw ();
+};
+
+const char *
+foo (S &e)
+{
+ return e.what ().c_str (); // { dg-error "c_str.*S::what.*which is of non-class type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash38.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash38.C
new file mode 100644
index 000000000..7a0c26556
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash38.C
@@ -0,0 +1,11 @@
+/* PR c++/33207 */
+
+/* This would not ICE. */
+namespace M { } /* { dg-message "previous declaration" } */
+struct M; /* { dg-error "redeclared as different kind of symbol" } */
+M *p; /* { dg-error "does not name a type" } */
+
+/* This would ICE when processing 'p'. */
+namespace N { } /* { dg-message "previous declaration" } */
+struct N; /* { dg-error "redeclared as different kind of symbol" } */
+struct N* p; /* { dg-error "redeclared as different kind of symbol|invalid type" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash39.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash39.C
new file mode 100644
index 000000000..2f39c10e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash39.C
@@ -0,0 +1,3 @@
+// PR c++/31747
+
+static extern int i; // { dg-error "conflicting specifiers" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash4.C
new file mode 100644
index 000000000..a24f0dd00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash4.C
@@ -0,0 +1,12 @@
+struct Bar
+ {
+ typedef int type;
+ };
+
+ struct Foo
+ {
+ void func(void)
+ {
+ mutable Bar::type x; // { dg-error "" }
+ }
+ };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash40.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash40.C
new file mode 100644
index 000000000..6b67d8dfe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash40.C
@@ -0,0 +1,42 @@
+/* PR c++/34059 */
+/* { dg-do compile } */
+
+struct A
+{
+ template<int> void foo();
+};
+struct B : A {};
+struct C : A {};
+
+class AA
+{
+ template<int> void foo(); /* { dg-error "is private" } */
+};
+struct BB : AA {};
+
+class AAA {
+ int get() const {}
+};
+struct BBB {
+ static BBB *foo();
+private:
+ int get() const {} /* { dg-error "is private" } */
+};
+template<bool> struct S {
+ S(unsigned int = BBB::foo()->AAA::get()); /* { dg-error "is not a base of" } */
+};
+template<bool> struct SS {
+ SS(unsigned int = BBB::foo()->get()); /* { dg-error "within this context" } */
+};
+
+void bar()
+{
+ B().C::foo<0>(); /* { dg-error "is not a member of" } */
+ BB().AA::foo<0>(); /* { dg-error "within this context" } */
+
+ int i;
+ i.C::foo<0>(); /* { dg-error "which is of non-class type" } */
+
+ S<false> s; /* { dg-error "default argument" } */
+ SS<false> ss;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash41.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash41.C
new file mode 100644
index 000000000..746dbbca8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash41.C
@@ -0,0 +1,8 @@
+// PR c++/35327
+
+struct A
+{
+ A(int)(); // { dg-error "declared" }
+};
+
+template<int> void foo(bool b, A a) { b ? a : 0; } // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash42.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash42.C
new file mode 100644
index 000000000..9cb07d514
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash42.C
@@ -0,0 +1,9 @@
+// Created by: Dodji Seketeli <dseketel@redhat.com>
+// { dg-do compile }
+// { dg-options "-O2 -fprofile-arcs" }
+// Origin: PR C++/36767
+
+struct A { A (); ~A (); };
+A a[2];
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash43.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash43.C
new file mode 100644
index 000000000..ff073cf46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash43.C
@@ -0,0 +1,9 @@
+// PR c++/34600
+
+namespace N
+{
+ void foo()
+ {
+ extern int i = 0; // { dg-error "'i' has both 'extern' and initializer" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash44.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash44.C
new file mode 100644
index 000000000..41947b7d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash44.C
@@ -0,0 +1,15 @@
+// PR c++/37260
+// { dg-options "" }
+
+struct pthread_once_t { };
+struct test {
+ pthread_once_t once;
+};
+
+int main(void) {
+ struct test foo = {
+ once: PTHREAD_ONCE_INITIALIZER // { dg-error "'PTHREAD_ONCE_INITIALIZER' was not declared in this scope" }
+ };
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash45.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash45.C
new file mode 100644
index 000000000..d2fbc8ca9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash45.C
@@ -0,0 +1,7 @@
+// PR c++/37348
+// { dg-do compile }
+
+struct A
+{
+ template <class> int f (B); // { dg-error "was not declared in this scope|cannot be a member template|has not been declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash46.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash46.C
new file mode 100644
index 000000000..0ae22480f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash46.C
@@ -0,0 +1,18 @@
+// PR c++/37532
+// { dg-do compile }
+
+void
+foo (_Decimal32) // { dg-error "declared void" "declared" }
+{
+}
+ // { dg-error "was not declared" "not" { target *-*-* } 5 }
+void
+bar (_Bool) // { dg-error "declared void" "declared" }
+{
+}
+ // { dg-error "was not declared" "not" { target *-*-* } 10 }
+void
+baz (_Fract) // { dg-error "declared void" "declared" }
+{
+}
+ // { dg-error "was not declared" "not" { target *-*-* } 15 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash47.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash47.C
new file mode 100644
index 000000000..e77c49fe4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash47.C
@@ -0,0 +1,9 @@
+// PR c++/37531
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+void
+foo ()
+{
+ (int[i]) { 0 }; // { dg-error "was not declared in this scope" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash48.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash48.C
new file mode 100644
index 000000000..020ddf079
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash48.C
@@ -0,0 +1,9 @@
+// PR c++/37530
+// { dg-do compile }
+
+void
+foo (bool b)
+{
+ if (b)
+ try { throw 0; } catch (X) { } // { dg-error "type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash49.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash49.C
new file mode 100644
index 000000000..07d7c3b2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash49.C
@@ -0,0 +1,10 @@
+// PR c++/37552
+// { dg-do compile }
+
+extern struct A a[1]; // { dg-error "forward declaration" }
+
+void
+foo ()
+{
+ a[0]; // { dg-error "invalid use of incomplete type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash5.C
new file mode 100644
index 000000000..0ac702979
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash5.C
@@ -0,0 +1,15 @@
+// { dg-options "-w" }
+
+class QString { // { dg-error "previous definition" }
+ QString (const QString & a); // { dg-message "QString::QString|candidate expects" }
+};
+
+class QString { }; // { dg-error "redefinition" }
+
+const QString q () {
+ QString z; // { dg-error "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 10 }
+ int x;
+ return x ? QString () : QString (); // { dg-error "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash50.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash50.C
new file mode 100644
index 000000000..711048de1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash50.C
@@ -0,0 +1,10 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/38636
+// { dg-do compile }
+
+struct A; // { dg-error "forward declaration of 'struct A'" }
+
+A::A(
+
+struct B; // { dg-error "expected '\\)' before ';' token|invalid use of incomplete type 'struct A'" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash51.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash51.C
new file mode 100644
index 000000000..03fcd3613
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash51.C
@@ -0,0 +1,9 @@
+// PR c++/37554
+
+struct A {};
+class B : A {};
+
+void foo(B b)
+{
+ (A)b; // { dg-error "inaccessible base" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash52.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash52.C
new file mode 100644
index 000000000..bc7f03c8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash52.C
@@ -0,0 +1,3 @@
+// PR c++/39053
+
+void foo() = // { dg-error "initialized|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash53.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash53.C
new file mode 100644
index 000000000..c19feafc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash53.C
@@ -0,0 +1,13 @@
+// PR c++/35112
+
+namespace X { struct A; } // { dg-message "struct X::A" }
+namespace Y { struct A; } // { dg-message "struct Y::A" }
+namespace Z { struct A; } // { dg-message "struct Z::A" }
+namespace W { struct A; } // { dg-message "struct W::A" }
+
+using namespace X;
+using namespace Y;
+using namespace Z;
+using namespace W;
+
+A* p; // { dg-error "reference to 'A' is ambiguous|'A' does not name a type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash54.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash54.C
new file mode 100644
index 000000000..222082ab7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash54.C
@@ -0,0 +1,15 @@
+// PR c++/42057
+
+struct A; // { dg-error "forward declaration" }
+
+struct B
+{
+ virtual B* foo(A);
+};
+
+struct C : virtual B
+{
+ virtual C* foo(A) { return 0; } // { dg-error "incomplete type" }
+};
+
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash55.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash55.C
new file mode 100644
index 000000000..7676d49bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash55.C
@@ -0,0 +1,8 @@
+// PR c++/42038
+
+extern int __cxa_begin_catch;
+
+void f(void)
+{
+ try { } catch (int) { } // { dg-error "cannot be used" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash56.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash56.C
new file mode 100644
index 000000000..6da84f8a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash56.C
@@ -0,0 +1,16 @@
+/* PR c++/43081 */
+/* { dg-do compile { target c++11 } } */
+
+struct A
+{
+ typedef void (F)();
+ F f = []{}; /* { dg-error "invalid pure" } */
+};
+
+struct B
+{
+ typedef void (F)();
+ F f = 1; /* { dg-error "invalid pure" } */
+ virtual F f2 = 2; /* { dg-error "invalid pure" } */
+ F f3 = 3; /* { dg-error "invalid pure" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash57.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash57.C
new file mode 100644
index 000000000..c6daf777e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash57.C
@@ -0,0 +1,10 @@
+// PR c++/46117
+
+struct A
+{
+ A (typename int); // { dg-error "before|declaration" }
+};
+
+struct B : A {};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash58.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash58.C
new file mode 100644
index 000000000..37f1c09d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash58.C
@@ -0,0 +1,16 @@
+// PR c++/51223
+
+struct A
+{
+ A foo(void i = 0); // { dg-error "incomplete type|invalid use" }
+};
+
+void bar()
+{
+ A().foo();
+}
+
+A A::foo(void i) // { dg-error "incomplete type|invalid use" }
+{
+ return A();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash59.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash59.C
new file mode 100644
index 000000000..e5e62986a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash59.C
@@ -0,0 +1,3 @@
+// PR c++/53003
+
+struct A{ void a{} return b // { dg-error "function definition|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash6.C
new file mode 100644
index 000000000..0cc5c84fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash6.C
@@ -0,0 +1,10 @@
+struct P {};
+
+template <typename >
+struct O
+{
+ struct I;
+};
+
+template <typename T>
+struct O<T>::I::S : P {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash60.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash60.C
new file mode 100644
index 000000000..e51539677
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash60.C
@@ -0,0 +1,14 @@
+// PR c++/53491
+
+struct M
+{
+ void pop();
+};
+
+void foo()
+{
+ int result = 0;
+ M m;
+
+ result += m.pop(); // { dg-error "invalid operands|in evaluation" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash61.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash61.C
new file mode 100644
index 000000000..790df0e4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash61.C
@@ -0,0 +1,6 @@
+// PR c++/56241
+// { dg-do compile }
+
+struct pair { constexpr pair (const) : }; // { dg-error "" }
+template <0> make_pair () {} // { dg-error "" }
+pair prefix[] = { 0, make_pair } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash62.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash62.C
new file mode 100644
index 000000000..230d162f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash62.C
@@ -0,0 +1,6 @@
+// PR c++/57352
+
+struct x
+{
+ operator class {} (); // { dg-error "types|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash63.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash63.C
new file mode 100644
index 000000000..c7189c2c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash63.C
@@ -0,0 +1,10 @@
+// PR c++/57947
+// { dg-options "-std=c++98" }
+
+namespace std
+{
+ template <class E> class initializer_list {};
+ template <int N> struct D { D(initializer_list<int>) {} };
+ D<0> d {1, 2, 3}; // { dg-error "constructor|no matching" }
+ // { dg-warning "initializer list" "" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash64.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash64.C
new file mode 100644
index 000000000..9e1dfea6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash64.C
@@ -0,0 +1,7 @@
+// PR c++/58565
+// { dg-options "" }
+
+void foo()
+{
+ int i = ({ L: ; }); // { dg-error "void value not ignored" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash65.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash65.C
new file mode 100644
index 000000000..04154f40c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash65.C
@@ -0,0 +1,6 @@
+// PR c++/58535
+
+struct A
+{
+ template<int> virtual void foo(); // { dg-error "templates" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash66.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash66.C
new file mode 100644
index 000000000..ceedd2be2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash66.C
@@ -0,0 +1,11 @@
+// PR c++/58647
+
+struct A
+{
+ static void foo();
+};
+
+template<typename> void bar()
+{
+ A().foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash7.C
new file mode 100644
index 000000000..86fa47726
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash7.C
@@ -0,0 +1,10 @@
+struct A
+{
+ int foo () const { return 0; }
+};
+
+template <typename> void bar (int x[], const A &a)
+{
+ const int i=a.foo();
+ x[i]=0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/crash9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash9.C
new file mode 100644
index 000000000..d121d5dd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/crash9.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/10793: ICE in handling base class when the current class
+// contains error.
+
+template <typename> struct A {};
+template <typename> struct A<INVALID> : A<int> { }; // { dg-error "not declared|invalid|token|extra" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor1.C
new file mode 100644
index 000000000..38428842c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor1.C
@@ -0,0 +1,9 @@
+class L {
+public:
+ L(int);
+};
+
+class R {
+ friend L::L(int);
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor2.C
new file mode 100644
index 000000000..604fb2ffd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor2.C
@@ -0,0 +1,4 @@
+// PR c++/19244
+
+typedef struct { void f(); } f;
+void f::f() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor3.C
new file mode 100644
index 000000000..e597d926f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor3.C
@@ -0,0 +1,8 @@
+// PR c++/25633
+
+struct A {};
+
+struct B : A
+{
+ B() : A {} // { dg-error "initializer|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor4.C
new file mode 100644
index 000000000..a3e4868e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor4.C
@@ -0,0 +1,7 @@
+// PR c++/27279
+// { dg-do compile }
+
+struct A
+{
+ A(void,void); // { dg-error "incomplete type|invalid use" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor5.C
new file mode 100644
index 000000000..f980b4a18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor5.C
@@ -0,0 +1,14 @@
+// PR c++/27309
+
+struct A
+{
+ int i; // { dg-message "previous" }
+ A() i() {} // { dg-error "declaration" }
+};
+
+struct B
+{
+ A a;
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor6.C
new file mode 100644
index 000000000..0b14ecc6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// There is no ambiguity in finding a right constructor for X b(a).
+
+class X {
+public:
+ X(const X&, int = 3);
+};
+
+extern X a;
+X b(a);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor7.C
new file mode 100644
index 000000000..9fa051b79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor7.C
@@ -0,0 +1,15 @@
+//PR c++/28505
+
+struct A
+{
+ A : (); // { dg-error "primary-expression|incomplete type" }
+ A : (int); // { dg-error "primary-expression|incomplete type|'int'" }
+};
+
+struct B
+{
+ char c;
+ A a;
+};
+
+B b = (B){0}; // { dg-error "compound-literals" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor8.C
new file mode 100644
index 000000000..e43ce4023
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor8.C
@@ -0,0 +1,9 @@
+//PR c++/28505
+
+struct A
+{
+ A : (); // { dg-error "primary-expression|incomplete type" }
+ A : (int); // { dg-error "primary-expression|incomplete type|'int'" }
+};
+
+A a = (A){0}; // { dg-error "too many initializers|compound-literals" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor9.C
new file mode 100644
index 000000000..8b2cbf7a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ctor9.C
@@ -0,0 +1,7 @@
+/* PR c++/37647 */
+/* { dg-do compile } */
+
+struct A
+{
+ A() { void A(); } /* { dg-error "return type specification for constructor invalid|non-class scope" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dce1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dce1.C
new file mode 100644
index 000000000..f4de52257
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dce1.C
@@ -0,0 +1,13 @@
+/* Make sure that dead code isn't eliminated too early, avoiding
+ detection of errors. */
+/* { dg-do compile } */
+
+void foo(void)
+{
+ if (0)
+ break; /* { dg-error "" } */
+ if (1)
+ ;
+ else
+ continue; /* { dg-error "" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
new file mode 100644
index 000000000..baf0fe778
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
@@ -0,0 +1,17 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: PRs 7721 and 7803
+// { dg-do compile }
+
+namespace N
+{
+ template<typename>
+ struct X { }; // { dg-message "N::X" }
+}
+
+N::X X; // { dg-error "" "" }
+
+int main()
+{
+ return sizeof(X); // { dg-error "" "" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 15 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C
new file mode 100644
index 000000000..6c3659f75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C
@@ -0,0 +1,9 @@
+// PR c++/8895
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename X, typename Y = B<X> > struct A // { dg-error "" }
+{
+ A();
+ A(const A&);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg1.C
new file mode 100644
index 000000000..77c50e8c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg1.C
@@ -0,0 +1,5 @@
+class A
+{
+public:
+ A(int nBits = ((int)0x8) | ((int)0x4) | ((int)0x2));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg10.C
new file mode 100644
index 000000000..bbf9ac04b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg10.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jun 2005 <nathan@codesourcery.com>
+
+// From java library.
+
+void Foo (int = 0);
+
+class Klasse
+{
+ friend void Foo (int);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg11.C
new file mode 100644
index 000000000..60199c2e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg11.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-pedantic" }
+
+class foo {
+public:
+ void operator& (int = 1); // { dg-error "default argument" }
+ void operator++ (int = 2); // { dg-warning "default argument" }
+ void operator-- (int = 3); // { dg-warning "default argument" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg12.C
new file mode 100644
index 000000000..2d2d7e7a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg12.C
@@ -0,0 +1,13 @@
+/* PR28266 This used to ICE in gimple_add_tmp_var */
+/* { dg-do compile } */
+
+struct A
+{
+ int i;
+ A(int = X); /* { dg-error "was not declared in this scope" }*/
+};
+
+void foo()
+{
+ A().i; /* { dg-error "default argument" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg13.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg13.C
new file mode 100644
index 000000000..27c6db50a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg13.C
@@ -0,0 +1,8 @@
+// PR c++/38485
+
+template <class Key, class T>
+class QMap { };
+
+class XMLConfigurations {
+ void translateToOther(QMap<int, int> match = (QMap<int, int>()));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg14.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg14.C
new file mode 100644
index 000000000..0930b45ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg14.C
@@ -0,0 +1,6 @@
+// PR c++/28274
+
+extern "C" {
+void foo (int i, int j = 6);
+void foo (int i = 4, int j);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg15.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg15.C
new file mode 100644
index 000000000..b93af4c92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg15.C
@@ -0,0 +1,5 @@
+// PR c++/44991
+
+class bar {
+ void foo(bool a = 3 < 2, bool b = true) {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg16.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg16.C
new file mode 100644
index 000000000..8eb0014dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg16.C
@@ -0,0 +1,4 @@
+// PR c++/28262
+
+typedef void (funcptrhack) (int = 10); // { dg-error "default arguments" }
+typedef funcptrhack * funcptr;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg2.C
new file mode 100644
index 000000000..571855a3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com>
+
+// We erroneously prohibited default args on parenthesized function
+// declarations.
+
+void (foo)(int i = 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg3.C
new file mode 100644
index 000000000..5c81c69e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg3.C
@@ -0,0 +1,5 @@
+struct A {
+ enum { value = 10 };
+ A() { f(); }
+ static int f(int i=value);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg4.C
new file mode 100644
index 000000000..bafdadb94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg4.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 9162. default args got left unprocessed
+
+struct S {
+ friend int foo (const S&, int = 100);
+};
+S s;
+int i = foo (s);
+
+struct R
+{
+ template <typename T> R (T, int = 0);
+};
+
+int Foo ()
+{
+ R s (1);
+}
+
+template <typename T> struct Q
+{
+ int Foo (T, int = 0);
+};
+
+int Foo (Q<int> *s)
+{
+ s->Foo (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg5.C
new file mode 100644
index 000000000..01a67ed59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg5.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Sep 2003 <nathan@codesourcery.com>
+// Origin:Wolfgang Bangerth bangerth@dealii.org
+
+// PR c++/12167 - infinite recursion
+
+class A {
+ void report(int d
+ // the default arg is what NAN etc can expand to, but
+ // with the floatiness removed.
+ = (__extension__ ((union { unsigned l; int d; })
+ { l: 0x7fc00000U }).d));
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg6.C
new file mode 100644
index 000000000..827b605b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Falk Hueffner <falk@debian.org>
+
+// PR c++/13166: ICE default function argument for friend declaration.
+
+namespace sc_dt {
+ class sc_length_param {
+ friend int compare_unsigned(int if_v_signed = 0) {}
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg7.C
new file mode 100644
index 000000000..c1f75ce8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg7.C
@@ -0,0 +1,5 @@
+// PR c++/14361
+
+class A {
+ A ( int n=0 int n ); // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg8.C
new file mode 100644
index 000000000..1f1f078aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg8.C
@@ -0,0 +1,10 @@
+struct A {
+ static void g(int);
+};
+
+struct S {
+ static int i;
+
+ friend void f(int = i);
+ friend void A::g(int = i);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg9.C
new file mode 100644
index 000000000..8496cfb26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/defarg9.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 21903:Reject legal with default arg confusion
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+
+struct O {
+ template<typename T> struct B {
+ void set (T, bool=true);
+ };
+
+ struct D : public B<int> {};
+};
+
+void x ()
+{
+ O::D d;
+ d.set(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/direct-initialization-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/direct-initialization-2.C
new file mode 100644
index 000000000..f362c74a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/direct-initialization-2.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/729
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// { dg-do compile }
+
+struct A {
+ A(int) { }
+};
+
+struct B {
+ typedef B T;
+ B(A, char**) {}
+};
+
+int main(int argc, char** argv)
+{
+ B::T t(A(argc), argv);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dot1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dot1.C
new file mode 100644
index 000000000..3b027d7c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dot1.C
@@ -0,0 +1,4 @@
+// PR c++/24560
+
+struct A { void f(); };
+void g() { A().f.a; } // { dg-error "class" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor1.C
new file mode 100644
index 000000000..08d070ea5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor1.C
@@ -0,0 +1,6 @@
+struct A { typedef int I; };
+int main(void)
+{
+ int * p;
+ p->A::I::~I();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor10.C
new file mode 100644
index 000000000..a6e905422
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor10.C
@@ -0,0 +1,9 @@
+// PR c++/27508
+// { dg-do compile }
+
+namespace N
+{
+ struct A { ~A(); };
+}
+
+N::~A () {} // { dg-error "not a class-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor11.C
new file mode 100644
index 000000000..63ffb60ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor11.C
@@ -0,0 +1,12 @@
+// PR c++/28606
+// { dg-do compile }
+
+struct A
+{
+ ~A A(); // { dg-error "destructor" }
+};
+
+struct B
+{
+ A::~B B(); // { dg-error "as member of" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor12.C
new file mode 100644
index 000000000..1acdfa36b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor12.C
@@ -0,0 +1,6 @@
+// PR c++/29408
+
+template <class T> class a
+{
+ ~a<T>();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor13.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor13.C
new file mode 100644
index 000000000..96c0d227b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor13.C
@@ -0,0 +1,8 @@
+/* PR c++/34963 This used to ICE */
+/* { dg-do compile } */
+
+struct A
+{
+ static friend A::~A(); /* { dg-error "storage class specifiers|extra qualification|implicitly friend" } */
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor14.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor14.C
new file mode 100644
index 000000000..6ba7a5b6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor14.C
@@ -0,0 +1,8 @@
+// PR c++/39054
+
+struct A {};
+
+template<typename> void foo()
+{
+ A().~int(); // { dg-error "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor15.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor15.C
new file mode 100644
index 000000000..ae85a702a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor15.C
@@ -0,0 +1,16 @@
+// PR c++/39225
+
+template <class T>
+class A
+{
+public:
+ A() {}
+ ~B() {} // { dg-error "~B" }
+};
+
+int main()
+{
+ A<int> *a = new A<int>;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor16.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor16.C
new file mode 100644
index 000000000..ff445c388
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor16.C
@@ -0,0 +1,8 @@
+// PR c++/25666
+
+struct A { ~A(); };
+
+struct B
+{
+ template<int> friend A::~A(); // { dg-error "member template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor2.C
new file mode 100644
index 000000000..60e132b4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor2.C
@@ -0,0 +1,4 @@
+struct A {
+ typedef A A2;
+ ~A2(); // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor3.C
new file mode 100644
index 000000000..3041ae4a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor3.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Contributed by Wolfgang Bangerth <bangerth at dealii dot org>
+// PR c++/12335: Make sure we don't ICE on the qualified-id form of a
+// destructor call.
+
+struct Y {
+ ~Y() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } }
+};
+
+struct X : Y {
+ ~X() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } }
+ void f() {
+ X::~X(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } }
+ Y::~Y(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor4.C
new file mode 100644
index 000000000..729ee2fa1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor4.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// Contributed by Paul Koning <pkoning at equallogic dot com>
+// PR c++/15947: Accept destructor as template in qualified-id
+
+template <int N> struct X {
+ ~X();
+};
+
+template <int N>
+X<N>::~X<N>(){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor5.C
new file mode 100644
index 000000000..297a0e737
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor5.C
@@ -0,0 +1,12 @@
+// PR c++/19732
+
+struct A;
+typedef int ~A; // { dg-error "non-function" }
+struct B {
+ ~A(); // { dg-error "" }
+ typedef int ~A; // { dg-error "non-function" }
+ void f() {
+ extern ~B(); // { dg-error "non-member" }
+ }
+};
+void ~A(); // { dg-error "non-member" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor6.C
new file mode 100644
index 000000000..86370d5d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor6.C
@@ -0,0 +1,8 @@
+// PR c++/25638
+
+struct A { ~A(); };
+
+struct B : A
+{
+ template<int> friend A::~A(); // { dg-error "member template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor7.C
new file mode 100644
index 000000000..a80951266
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor7.C
@@ -0,0 +1,4 @@
+// PR c++/25856
+
+struct A; // { dg-error "forward" }
+A::~A() {} // { dg-error "incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor8.C
new file mode 100644
index 000000000..2fe0a974b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor8.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct A {};
+
+struct B
+{
+ friend A::~B(); // { dg-error "as member of" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor9.C
new file mode 100644
index 000000000..64c82ce67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dtor9.C
@@ -0,0 +1,5 @@
+// PR c++/27508
+// { dg-do compile }
+
+struct A;
+using ::~A; // { dg-error "not a class-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C
new file mode 100644
index 000000000..a7beabc90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C
@@ -0,0 +1,13 @@
+// PR c++/8928
+// Origin: <sebor@roguewave.com>
+// { dg-do compile }
+
+namespace N
+{
+
+template <typename T, typename U> struct A {};
+typedef A<int, int> B;
+
+}
+
+N::B<int, int> a; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/eh-decl.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/eh-decl.C
new file mode 100644
index 000000000..1c72fd39f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/eh-decl.C
@@ -0,0 +1,8 @@
+// PR c++/41876
+
+struct A;
+
+void foo()
+{
+ try {} catch(int A) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/elab1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/elab1.C
new file mode 100644
index 000000000..8108e1d0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/elab1.C
@@ -0,0 +1,9 @@
+namespace Name {
+
+ typedef void *(*Function)( void *, int ); // { dg-message "previous declaration" }
+
+ struct Foo {
+ struct Function xyz[5]; // { dg-error "" }
+ };
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/elab2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/elab2.C
new file mode 100644
index 000000000..bf59f1b71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/elab2.C
@@ -0,0 +1,7 @@
+struct A {};
+
+struct B
+{
+ typedef A T; // { dg-message "previous declaration" }
+ friend struct T; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/else-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/else-2.C
new file mode 100644
index 000000000..7f0b23cd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/else-2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options " " }
+
+int f()
+{
+
+ else // { dg-error "'else' without a previous 'if'" }
+ {
+ return 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/else.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/else.C
new file mode 100644
index 000000000..87ea982a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/else.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options " " }
+
+int f()
+{
+ if (1)
+ {
+ return 1;
+ else // { dg-error "expected .\}. before 'else'" }
+ {
+ return 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum1.C
new file mode 100644
index 000000000..d5c5f8688
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum1.C
@@ -0,0 +1,4 @@
+// PR c++/15862
+
+enum yn { Y, N };
+enum yn x = Y;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum10.C
new file mode 100644
index 000000000..8760597a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum10.C
@@ -0,0 +1,2 @@
+namespace A { }
+enum A::B { }; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum11.C
new file mode 100644
index 000000000..68ddedbee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum11.C
@@ -0,0 +1,6 @@
+// PR c++/58980
+
+template<typename> struct A
+{
+ enum A::B::C {}; // { dg-error "has not been declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum2.C
new file mode 100644
index 000000000..f77f91701
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18123: ICE pushing tag from invalid template.
+
+template<int> enum E { e }; // { dg-error "declaration|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum3.C
new file mode 100644
index 000000000..dc07193d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum3.C
@@ -0,0 +1,5 @@
+// PR c++/28261
+
+struct A {}; // { dg-error "A::A" }
+
+A::A (enum { e }) {} // { dg-error "defined|prototype" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum4.C
new file mode 100644
index 000000000..6a20ea9cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum4.C
@@ -0,0 +1,10 @@
+// PR c++/37389
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+enum
+{
+ A = 9223372036854775807ULL * 2 + 1,
+ B = B0, // { dg-error "was not declared|overflow" }
+ C = C0 // { dg-error "was not declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum5.C
new file mode 100644
index 000000000..18480520a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum5.C
@@ -0,0 +1,17 @@
+// PR c++/41127
+
+#define CHAR_BIT 8
+enum EE {ee};
+typedef unsigned int T;
+
+struct D {
+ T : sizeof(unsigned int) * CHAR_BIT; // OK
+ EE : sizeof(EE) * CHAR_BIT; // OK
+ enum EE : sizeof(EE) * CHAR_BIT; // not OK
+ enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK
+ T x : sizeof(unsigned int) * CHAR_BIT; // OK
+ enum FF {ff} : sizeof(FF) * CHAR_BIT; // OK
+} element;
+
+enum EE xx;
+EE yy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum6.C
new file mode 100644
index 000000000..e753f5170
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum6.C
@@ -0,0 +1,8 @@
+// PR c++/51587
+
+namespace N
+{
+ struct X; // { dg-message "previous declaration" }
+}
+
+enum N::X {}; // { dg-error "conflicting declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum7.C
new file mode 100644
index 000000000..d9e3a89d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum7.C
@@ -0,0 +1,9 @@
+// PR c++/51588
+
+enum A {};
+
+struct B : A { // { dg-error "" }
+ int i;
+};
+
+int A::* p = &B::i; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum8.C
new file mode 100644
index 000000000..83dd6e0e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum8.C
@@ -0,0 +1,11 @@
+// PR c++/16603
+
+char const c = 'q';
+
+enum
+ {
+ x = c,
+ y = sizeof(x)
+ };
+
+int test[y == sizeof(char) ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/enum9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum9.C
new file mode 100644
index 000000000..559db31d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/enum9.C
@@ -0,0 +1,13 @@
+// PR c++/53995
+
+enum E1 { e };
+void f(E1);
+
+struct A {
+ int i1,i2,i3,i4,i5,i6,i7,i8,i9,i10;
+ void g();
+ void h();
+};
+
+void A::g() { enum E2 { e }; }
+void A::h() { f(e); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error-column.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error-column.C
new file mode 100644
index 000000000..18dc4633a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error-column.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Make sure column information is correctly shown in error reporting
+// { dg-options "-fshow-column" }
+
+
+void foo ()
+{
+ cout << "blah"; // { dg-error "3:'cout'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error1.C
new file mode 100644
index 000000000..1f8bb3773
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error1.C
@@ -0,0 +1,7 @@
+// { dg-options "-fshow-column" }
+struct INCOMPLETE;
+template <int> struct X {
+ static INCOMPLETE value;
+};
+template <> INCOMPLETE X<1>::value = 0; // { dg-error "30:variable 'INCOMPLETE X<1>::value' has initializer but incomplete type" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error10.C
new file mode 100644
index 000000000..c2cd7e26b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error10.C
@@ -0,0 +1,19 @@
+// PR c++/3478
+// { dg-options "-fshow-column" }
+
+template <typename> struct A
+{
+ enum E {};
+};
+
+template <typename T> void foo()
+{
+ enum A<void>::E e1;
+ typename A<T>::E e2;
+ enum A<T>::E e3;
+ enum typename A<T>::E e4;
+}
+
+// Here, columns nums are not very accurate either. Still acceptable though
+// { dg-error "30:invalid type in declaration before ';' token" "invalid" { target *-*-* } 14 }
+// { dg-error "30:two or more data types in declaration of 'e4'" "2 or more" { target *-*-* } 14 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error11.C
new file mode 100644
index 000000000..319e6acf2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error11.C
@@ -0,0 +1,69 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }"
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// Try to find out when the digraph '<:' is used as a mistake, and parse it
+// correctly to avoid cascaded errors.
+
+struct B;
+
+template <class A>
+struct Foo
+{
+ template <class T>
+ struct Nested
+ {
+ static void method(void) {}
+ };
+
+ void method(void) {
+ typename Foo<::B>::template Nested<::B> n; // { dg-error "17:'<::' cannot begin" "17-begin" { target { ! c++11 } } }
+// { dg-message "17:'<:' is an alternate spelling" "17-alt" { target { ! c++11 } } 19 }
+// { dg-error "39:'<::' cannot begin" "39-begin" { target { ! c++11 } } 19 }
+// { dg-message "39:'<:' is an alternate spelling" "39-alt" { target { ! c++11 } } 19 }
+ n.template Nested<B>::method();
+ n.template Nested<::B>::method(); // { dg-error "22:'<::' cannot begin" "error" { target { ! c++11 } } }
+// { dg-message "22:'<:' is an alternate" "note" { target { ! c++11 } } 24 }
+ Nested<B>::method();
+ Nested<::B>::method(); // { dg-error "11:'<::' cannot begin" "error" { target { ! c++11 } } }
+// { dg-message "11:'<:' is an alternate" "note" { target { ! c++11 } } 27 }
+ }
+};
+
+template <int N> struct Foo2 {};
+template struct Foo2<::B>; // { dg-error "21:'<::' cannot begin" "begin" { target { ! c++11 } } }
+// { dg-message "21:'<:' is an alternate" "alt" { target { ! c++11 } } 33 }
+// { dg-message "25:type/value mismatch" "mismatch" { target *-*-* } 33 }
+// { dg-error "25:expected a constant" "const" { target *-*-* } 33 }
+
+int value = 0;
+
+void func(void)
+{
+ Foo<::B> f; // { dg-error "cannot begin" "begin" { target { ! c++11 } } }
+// { dg-message "alternate spelling" "alt" { target { ! c++11 } } 42 }
+ f.Foo<B>::method();
+ f.Foo<::B>::method(); // { dg-error "8:cannot begin" "begin" { target { ! c++11 } } }
+// { dg-message "8:alternate spelling" "alt" { target { ! c++11 } } 45 }
+
+ // Check cases where we the token sequence is the correct one, but there
+ // was no digraph or whitespaces in the middle, so we should not emit
+ // the special error message.
+ Foo<: :B> k2; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" }
+ Foo[:B> k1; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" }
+// { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } }
+// { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 }
+// { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 }
+// { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 }
+// { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 }
+// { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 }
+//
+ int Foo[2];
+ Foo[::value] = 0;
+}
+
+template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" { target { ! c++11 } } }
+// { dg-message "20:is an alternate" "alt" { target { ! c++11 } } 64 }
+
+// On the first error message, an additional note about the use of
+// -fpermissive should be present
+// { dg-message "17:\\(if you use '-fpermissive' or '-std=c\\+\\+11', or '-std=gnu\\+\\+11' G\\+\\+ will accept your code\\)" "-fpermissive" { target { ! c++11 } } 19 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error12.C
new file mode 100644
index 000000000..3e6d374e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error12.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// Make sure the error about '<:' can be turned into a warning
+// { dg-options "-fpermissive -fshow-column" }
+
+struct B;
+
+template <class A>
+struct Foo {};
+
+Foo<::B> foo; // { dg-bogus "error" "error in place of warning" { target { ! c++11 } } }
+// { dg-warning "4: '<::' cannot begin a template-argument list" "warning <::" { target { ! c++11 } } 11 }
+// { dg-message "4:'<:' is an alternate spelling for '.'. Insert whitespace between '<' and '::'" "note <:" { target { ! c++11 } } 11 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error13.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error13.C
new file mode 100644
index 000000000..9bce98d7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error13.C
@@ -0,0 +1,14 @@
+// { dg-options "-fshow-column" }
+// PR c++/13975
+
+public: // { dg-error "1:expected unqualified-id before 'public'" }
+
+int i;
+
+protected: // { dg-error "1:expected unqualified-id before 'protected'" }
+
+int j;
+
+private: // { dg-error "1:expected unqualified-id before 'private'" }
+
+int k;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error14.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error14.C
new file mode 100644
index 000000000..37a3d2001
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error14.C
@@ -0,0 +1,24 @@
+// { dg-options "-fshow-column" }
+// PR c++/13970
+
+struct X
+{
+ template< typename Z > Z Zunc()
+ {
+ return Z();
+ }
+
+ template< typename Z > void Zinc()
+ {
+ }
+
+ void tst()
+ {
+ Zunc<int>();
+
+ Zinc<int>( //);
+ // }
+
+}; // { dg-error "2:expected '.' at end of input" "at end of input" }
+ // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 }
+ // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error15.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error15.C
new file mode 100644
index 000000000..deba54aca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error15.C
@@ -0,0 +1,41 @@
+// { dg-do compile }
+// Contributed by Volker Reichelt <reichelt at gcc dot gnu dot org>
+// { dg-options "-fshow-column" }
+// PR c++/14008: Improve diagnostic on invalid types in declarators.
+
+namespace N
+{
+ template<int> struct A {};
+ struct C {};
+ int K;
+}
+
+N::A f2; // { dg-error "1:invalid use of template-name 'N::A' without an argument list" }
+N::INVALID f3; // { dg-error "4:'INVALID' in namespace 'N' does not name a type" }
+N::C::INVALID f4; // { dg-error "7:'INVALID' in 'struct N::C' does not name a type" }
+N::K f6; // { dg-error "4:'K' in namespace 'N' does not name a type" }
+typename N::A f7;
+// { dg-error "13:invalid use of template-name 'N::A' without an argument list" "13" { target *-*-* } 17 }
+// { dg-error "17:invalid type in declaration before ';' token" "17" { target *-*-* } 17 }
+
+struct B
+{
+ N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
+ N::INVALID f3; // { dg-error "6:'INVALID' in namespace 'N' does not name a type" }
+ N::C::INVALID f4; // { dg-error "9:'INVALID' in 'struct N::C' does not name a type" }
+ N::K f6; // { dg-error "6:'K' in namespace 'N' does not name a type" }
+ typename N::A f7;
+// { dg-error "15:invalid use of template-name 'N::A' without an argument list" "15" { target *-*-* } 27 }
+};
+
+template <int>
+struct C
+{
+ N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
+ N::INVALID f3; // { dg-error "6:'INVALID' in namespace 'N' does not name a type" }
+ N::C::INVALID f4; // { dg-error "9:'INVALID' in 'struct N::C' does not name a type" }
+ N::K f6; // { dg-error "6:'K' in namespace 'N' does not name a type" }
+ typename N::A f7; // { dg-error "15:invalid use of template-name 'N::A' without an argument list" }
+};
+
+// { dg-bogus "bogus excess errors in declaration" "bogus excess errors in declaration" { target *-*-* } 17 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error16.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error16.C
new file mode 100644
index 000000000..3d9dcc334
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error16.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+// PR c++/16964
+
+struct A
+{
+ struct B {}; // { dg-error "10:previous definition of 'struct A::B'" }
+};
+
+struct A::B{}; // { dg-error "11:redefinition of 'struct A::B'" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error17.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error17.C
new file mode 100644
index 000000000..b308c912f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error17.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+// PR c++/16965
+
+template <typename T> struct B {
+ static int Bar(T); // { dg-error "14:candidates are: |with T = int" }
+};
+struct D : B<int>, B<char> {};
+
+int i2 = D::Bar(2); // { dg-error "10:reference to 'Bar' is ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error18.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error18.C
new file mode 100644
index 000000000..b5e722221
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error18.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column" }
+// PR c++/16002
+
+void f()
+{
+ double Q *= 5.0; // { dg-error "12:expected initializer before '..' token" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error19.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error19.C
new file mode 100644
index 000000000..6d84f7142
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error19.C
@@ -0,0 +1,15 @@
+// { dg-options "-fshow-column -fmessage-length=0 -ansi -pedantic-errors -Wno-long-long " }
+// PR C++/17867
+
+struct A // { dg-message "8:operator=|no known conversion for implicit" }
+{
+ A(int);
+};
+
+const A& foo();
+
+void bar()
+{
+ foo()=A(0); // { dg-error "8:no match for 'operator='" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error2.C
new file mode 100644
index 000000000..713957a31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error2.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-fshow-column -std=c++98" }
+// Properly print CALL_EXPRs while dumping expressions
+
+double g;
+int func(double);
+
+template <int>
+struct Foo {};
+
+Foo<func(g)> f; // { dg-error "5:'int func.double.' cannot appear in a constant-expression" "func double" { target *-*-* } 11 }
+// { dg-error "10:'g' cannot appear in a constant-expression" "g" { target *-*-* } 11 }
+// { dg-error "11:a function call cannot appear in a constant-expression" "call" { target *-*-* } 11 }
+// { dg-error "12:template argument 1 is invalid" "invalid template argument" { target *-*-* } 11 }
+// { dg-error "15:invalid type in declaration before ';' token" "invalid type" { target *-*-* } 11 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error20.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error20.C
new file mode 100644
index 000000000..6119df9b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error20.C
@@ -0,0 +1,18 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/17821
+
+struct A {
+ A(int i) {}
+};
+struct B {
+ int i;
+};
+struct C {
+ B* p;
+};
+int main() {
+ C c;
+ A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of pointer type 'B" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error21.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error21.C
new file mode 100644
index 000000000..469e5fb4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error21.C
@@ -0,0 +1,13 @@
+// PR c++/17393
+// { dg-options "-Wall -fshow-column" }
+
+struct A { };
+
+void foo()
+{
+ // Check that we do not complain about an unused
+ // compiler-generated variable.
+ A& = a; // { dg-error "6:expected unqualified-id before '=' token" "6" }
+ // { dg-error "8:'a' was not declared in this scope" "8" { target *-*-* } 10 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error22.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error22.C
new file mode 100644
index 000000000..29552c67a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error22.C
@@ -0,0 +1,6 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/15786
+
+struct A {
+ void foo(bar* p); /* { dg-error "12:'bar' has not been declared" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error23.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error23.C
new file mode 100644
index 000000000..9c19b562c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error23.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/19149
+
+struct QChar {
+ QChar( char c );
+ QChar( const QChar& c );
+ //following column number is not accurate enough but will make it for now
+ static const ; // { dg-error "10:declaration does not declare anything" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error24.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error24.C
new file mode 100644
index 000000000..c8ab6d992
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error24.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/19395
+
+struct A {
+ typedef int ::X; // { dg-error "17:typedef name may not be a nested-name-specifier" }
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error25.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error25.C
new file mode 100644
index 000000000..a0fd24c3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error25.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// Origin: Steven Bosscher <steven at gcc dot gnu dot org>
+// PR c++/17401: ICE with invalid pure specifier
+
+// NOTE: This also tests QoI of diagnostic for invalid pure specifiers.
+// Please do *not* relax the dg-error tests.
+
+class foo
+{
+ virtual void bar1 () = 0;
+ virtual void bar2 () = __null; // { dg-error "32:invalid pure specifier" }
+ virtual void bar3 () = 4; // { dg-error "27:invalid pure specifier" }
+ virtual void bar4 () = A::f; // { dg-error "27:invalid pure specifier" }
+ virtual void bar5 () = 0l; // { dg-error "28:invalid pure specifier" }
+ virtual void bar6 () = 00; // { dg-error "28:invalid pure specifier" }
+ virtual void bar7 () = 0x0; // { dg-error "29:invalid pure specifier" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error26.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error26.C
new file mode 100644
index 000000000..1084e76d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error26.C
@@ -0,0 +1,14 @@
+// PR c++/20148
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+
+void foo()
+{
+ if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" }
+ // { dg-error "17:could not convert" "17" { target *-*-* } 6 }
+}
+
+void bar()
+{
+ if (({})); // { dg-error "7:ISO C.. forbids" "7" }
+ // { dg-error "11:could not convert" "11" { target *-*-* } 12 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error27.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error27.C
new file mode 100644
index 000000000..90cb231c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error27.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/20152
+
+struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:previous definition of 'struct KrSelectionMode'" }
+struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:previous definition of 'struct KrKDESelectionMode'" }
+struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:redefinition of 'struct KrSelectionMode'" }
+struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:redefinition of 'struct KrKDESelectionMode'" }
+KrKDESelectionMode krKDESelectionMode;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error28.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error28.C
new file mode 100644
index 000000000..3ca210aa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error28.C
@@ -0,0 +1,12 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/21908
+
+struct virt { virt () {} virt (int i) {} };
+struct der : public virtual virt { // { dg-message "8:der::der|candidate expects" }
+ der (int i) : virt(i) {} // { dg-message "3:der::der|candidate expects" }
+};
+struct top : public der {
+ top () {} // { dg-bogus "der\\(const" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 9 }
+};
+// { dg-error "10:no matching function for call to 'der" "" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error29.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error29.C
new file mode 100644
index 000000000..2c3a3a7f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error29.C
@@ -0,0 +1,13 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/25637
+
+struct A {
+ void foo();
+ A();
+ void operator delete(void *);
+};
+struct B {
+ friend void A::foo() {} // { dg-error "22:cannot define member function 'A::foo' within 'B'" }
+ friend void A::operator delete(void*) {} // { dg-error "39:cannot define member function 'A::operator delete' within 'B'" }
+ friend A::A() {} // { dg-error "15:cannot define member function 'A::A' within 'B'" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error3.C
new file mode 100644
index 000000000..938ab45b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error3.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column" }
+// PR c++/10779
+
+static void InstantiateConstraint(const float&, unsigned,
+ void(*AddFunction)(const TYPE&,bool&,
+ char*, char*,
+ unsigned*));
+// { dg-error "60: 'TYPE' does not name a type" "does not" { target *-*-* } { 5 } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error30.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error30.C
new file mode 100644
index 000000000..aabdcc701
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error30.C
@@ -0,0 +1,12 @@
+// PR c++/30854
+// { dg-do compile }
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+
+struct A
+{
+ A();
+ A(int);
+};
+
+A a = -A(); // { dg-error "operand type is 'A'" }
+A b = -A(5); // { dg-error "operand type is 'A'" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error31.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error31.C
new file mode 100644
index 000000000..e39285227
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error31.C
@@ -0,0 +1,14 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/32190
+
+template<typename T> class foo{ };
+
+int main() {
+ foo<int> i;
+ // this column number is not accurate yet, but that will make it for now.
+ foo<foo<int> j; // { dg-error "18:template argument 1 is invalid" }
+ int k;
+ int l;
+ foo<int> m;
+ return 0;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error32.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error32.C
new file mode 100644
index 000000000..da27afdda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error32.C
@@ -0,0 +1,12 @@
+/* PR c++/37555 */
+/* { dg-do compile } */
+
+struct A {};
+
+typedef void (A::T)(); /* { dg-error "typedef name may not be a nested-name-specifier" } */
+
+void foo()
+{
+ T t;
+ t; /* { dg-error "was not declared" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error33.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error33.C
new file mode 100644
index 000000000..e3a7166ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error33.C
@@ -0,0 +1,16 @@
+/* PR c++/37556 */
+/* { dg-do compile } */
+
+struct A
+{
+ void foo();
+};
+
+typedef void (A::T)(); /* { dg-error "typedef name may not be a nested" } */
+
+void bar(T); /* { dg-message "note: declared here" } */
+
+void baz()
+{
+ bar(&A::foo); /* { dg-error "too many arguments" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error34.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error34.C
new file mode 100644
index 000000000..449ea689a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error34.C
@@ -0,0 +1,8 @@
+// PR c++/33465
+
+int foo(int);
+
+void bar(double d)
+{
+ foo(d)(); // { dg-error "foo\\(\\(int\\)d\\)" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error35.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error35.C
new file mode 100644
index 000000000..59e726a31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error35.C
@@ -0,0 +1,8 @@
+// PR c++/33465
+
+int foo(double);
+
+void bar(int i)
+{
+ foo(i)(); // { dg-error "foo\\(\\(double\\)i\\)" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error36.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error36.C
new file mode 100644
index 000000000..92e27a928
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error36.C
@@ -0,0 +1,31 @@
+// PR c++/15946
+// Test for helpful error message about missing typename.
+
+template <class T> struct A
+{
+ struct B { };
+ static B b;
+};
+
+template <class T>
+void f(T t)
+{
+ typedef A<T>::foo type; // { dg-error "typename" }
+ A<T>::bar b; // { dg-error "typename" "typename" }
+} // { dg-error "expected ';'" "expected" { target *-*-* } 14 }
+
+// PR c++/36353
+template <class T> struct B
+{
+ void f()
+ {
+ A<T>::baz z; // { dg-error "typename" "typename" }
+ } // { dg-error "expected ';'" "expected" { target *-*-* } 22 }
+};
+
+// PR c++/40738
+template <class T>
+void g(const A<T>::type &t); // { dg-error "typename" "typename" }
+
+// PR c++/18451
+template <class T> A<T>::B A<T>::b; // { dg-error "typename" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error37.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error37.C
new file mode 100644
index 000000000..309912647
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error37.C
@@ -0,0 +1,5 @@
+/* PR c++/42054 */
+/* { dg-do compile } */
+
+template<int int> struct A; /* { dg-error "two or more" } */
+template<int int> struct A; /* { dg-error "two or more" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error38.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error38.C
new file mode 100644
index 000000000..63162a8ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error38.C
@@ -0,0 +1,3 @@
+// PR c++/29003
+
+typedef int operator !(); // { dg-error "declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error39.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error39.C
new file mode 100644
index 000000000..431571c12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error39.C
@@ -0,0 +1,14 @@
+// PR c++/41769
+
+void f(void operator+()); // { dg-error "declaration" }
+
+void g()
+{
+ try
+ {
+
+ }
+ catch(void operator+()) // { dg-error "declaration" }
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error4.C
new file mode 100644
index 000000000..792bf4dc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error4.C
@@ -0,0 +1,10 @@
+// PR c++/12160
+// { dg-options "-fshow-column" }
+
+struct X {
+ virtual void f(int,
+ itn,
+ int);
+};
+
+// { dg-error "4:'itn' has not been declared" "" { target *-*-* } 6 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error40.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error40.C
new file mode 100644
index 000000000..9ab7552ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error40.C
@@ -0,0 +1,10 @@
+// PR c++/31489
+
+class foo; // { dg-error "'class foo'" }
+struct bar; // { dg-error "'struct bar'" }
+
+int main()
+{
+ foo* f = new foo; // { dg-error "'class foo'" }
+ bar* b = new bar; // { dg-error "'struct bar'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error41.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error41.C
new file mode 100644
index 000000000..621a2e252
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error41.C
@@ -0,0 +1,11 @@
+// PR c++/44524
+
+template<typename, typename>
+struct map
+{
+ bool empty();
+};
+
+int bar(map<int, float> *X) {
+ return X.empty(); // { dg-error "which is of pointer type 'map" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error42.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error42.C
new file mode 100644
index 000000000..5e4c5bbdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error42.C
@@ -0,0 +1,4 @@
+// PR c++/13657
+
+class C { public: int (*f())(); int bar(); };
+int (*C::f())() { return C::bar; } // { dg-error "cannot convert 'C::bar'" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error43.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error43.C
new file mode 100644
index 000000000..e352fa5c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error43.C
@@ -0,0 +1,5 @@
+// PR c++/31423
+// { dg-options "" }
+
+class C { public: C* f(); int get(); };
+int f(C* p) { return p->f->get(); } // { dg-error "forget the '\\(\\)'|base operand" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error44.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error44.C
new file mode 100644
index 000000000..2ebbe710c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error44.C
@@ -0,0 +1,11 @@
+// PR c++/31423
+// { dg-options "-fms-extensions" }
+
+struct C {
+ int f() { return 1; }
+ int g() { return 2; }
+};
+
+int f(C& c) {
+ return c.g == &c.f; // { dg-error "forget the '&'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error45.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error45.C
new file mode 100644
index 000000000..7df8b13f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error45.C
@@ -0,0 +1,9 @@
+// PR c++/51429
+// { dg-do compile }
+
+struct A
+{
+ void foo (double);
+ void foo (int);
+ A () { foo = 0; } // { dg-error "invalid use of member function" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error47.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error47.C
new file mode 100644
index 000000000..44f14c4e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error47.C
@@ -0,0 +1,9 @@
+struct T { };
+
+T foo();
+
+void bar(int a, int b)
+{
+ if (foo() && a < b) // { dg-error "13:no match for 'operator&&'" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error48.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error48.C
new file mode 100644
index 000000000..8f26bed9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error48.C
@@ -0,0 +1,10 @@
+// PR c++/44516
+
+struct WebService { };
+struct Server { };
+
+void addHTTPService(Server const &server,
+ WebService const *http)
+{
+ server += http; // { dg-error "10:no match for 'operator\\+='" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error49.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error49.C
new file mode 100644
index 000000000..9d392afa8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error49.C
@@ -0,0 +1,6 @@
+// PR c++/39681
+
+int main()
+{
+ int* p = new foo; // { dg-error "16:type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error5.C
new file mode 100644
index 000000000..eb1f9c730
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error5.C
@@ -0,0 +1,19 @@
+// PR c++/13269
+// { dg-options "-fshow-column" }
+
+class Foo { int foo() return 0; } };
+
+// { dg-error "30:expected identifier before numeric constant" "identifier" { target *-*-* } 4 }
+
+// { dg-error "23:named return values are no longer supported" "named return" { target *-*-* } 4 }
+
+// the column number info of this error output is still wrong because the error
+// message has been generated by cp_parser_error() which does not
+// necessarily allow accurate column number display. At some point, we will
+// need make cp_parser_error() report more accurate column numbers.
+// { dg-error "30:expected '\{' at end of input" "brace" { target *-*-* } 4 }
+
+// { dg-error "33:expected ';' after class definition" "semicolon" {target *-*-* } 4 }
+
+// { dg-error "35:expected declaration before '\}' token" "declaration" {target *-*-* } 4 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error50.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error50.C
new file mode 100644
index 000000000..dbd8958c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error50.C
@@ -0,0 +1,18 @@
+// PR c++/18747
+
+template<> int i; // { dg-error "template" }
+
+struct A
+{
+ static int i;
+};
+
+template<> int A::i; // { dg-error "template" }
+
+template <class T>
+struct B
+{
+ static T i;
+};
+
+template<> template <> int B<int>::i; // { dg-error "should be 1" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error51.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error51.C
new file mode 100644
index 000000000..e599304b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error51.C
@@ -0,0 +1,13 @@
+// PR c++/14283
+
+struct A
+{};
+
+namespace N
+{}
+
+template <typename> struct C
+{
+ typedef A::template INVALID<void> X0; // { dg-error "23:'INVALID' in 'struct A' does not name a template type" }
+ typedef N::template INVALID<void> X1; // { dg-error "23:'INVALID' in namespace 'N' does not name a template type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error52.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error52.C
new file mode 100644
index 000000000..d1c6e4a85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error52.C
@@ -0,0 +1,11 @@
+// PR c++/12288
+
+class X {};
+
+struct S {
+ explicit S (const X::T&) {} // { dg-error "does not name a type" }
+};
+
+class Y {};
+
+typedef Y::T xt; // { dg-error "does not name a type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error53.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error53.C
new file mode 100644
index 000000000..3d6fe64c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error53.C
@@ -0,0 +1,3 @@
+// PR c++/43652
+
+static const char const * stdin_name = "<stdin>"; // { dg-error "19:duplicate" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error6.C
new file mode 100644
index 000000000..8b8424fe3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error6.C
@@ -0,0 +1,11 @@
+// PR c++/10603
+// { dg-options "-fshow-column" }
+
+int f(int not) {
+ return 1-not;
+}
+
+// { dg-error "11:expected ',' or '...' before 'not' token" "" { target *-*-* } 4 }
+
+// { dg-error "15:expected primary\\-expression before ';' token" "" { target *-*-* } 5 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error7.C
new file mode 100644
index 000000000..78b7caac9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error7.C
@@ -0,0 +1,7 @@
+// PR c++/12827
+// { dg-options "-fshow-column" }
+
+void f(int x
+ int y);
+
+// { dg-error "8:expected ',' or '...' before 'int'" "" { target *-*-* } 5 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error8.C
new file mode 100644
index 000000000..61e42e029
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error8.C
@@ -0,0 +1,9 @@
+// PR c++/13438
+// { dg-options "-fshow-column" }
+
+struct A { friend typename struct B; };
+
+
+// { dg-error "28:expected nested-name-specifier before 'struct'" "expected" { target *-*-* } 4 }
+// { dg-error "35:multiple types in one declaration" "multiple" { target *-*-* } 4 }
+// { dg-error "12:friend declaration does not name a class or function" "friend decl" { target *-*-* } 4 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/error9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/error9.C
new file mode 100644
index 000000000..3426c6940
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/error9.C
@@ -0,0 +1,9 @@
+// PR c++/12613
+// { dg-options "-fshow-column" }
+
+enum { FOO = 1, BAR = 2 };
+int a[] = { FOO: 1, BAR: 2 };
+
+// the following 2 column locations are still not accurate enough
+// { dg-error "28:name 'FOO' used in a GNU-style designated initializer for an array" "FOO" { target *-*-* } 5 }
+// { dg-error "28:name 'BAR' used in a GNU-style designated initializer for an array" "BAR" { target *-*-* } 5 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/explicit1.C
new file mode 100644
index 000000000..35358749e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/explicit1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: stefaandr@hotmail.com
+
+// PR c++/12403: ICE when explicit specialization is not in
+// namespace scope.
+
+struct foo {
+ template<typename T> void bar (T &t) {}
+ template<> void bar<double>(double &t) {} // { dg-error "non-namespace|template|function" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/expr1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr1.C
new file mode 100644
index 000000000..2ef82185b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr1.C
@@ -0,0 +1,8 @@
+struct A {
+ A (int, int);
+ void f ();
+};
+
+void f (int a) {
+ A (a, a).f ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/expr2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr2.C
new file mode 100644
index 000000000..32800e4f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr2.C
@@ -0,0 +1,8 @@
+struct X {
+ X(double *data, double d0, double d1);
+};
+
+int foo(double d0) {
+ double * data;
+ X(data,d0,d0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/expr3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr3.C
new file mode 100644
index 000000000..95d332f41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/expr3.C
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* PR/18047 Test that operators have the right precedence. */
+/* by bonzini@gnu.org */
+
+#define test(lower, higher, a, b, c, d) \
+ test_(lower, higher, a, b, c, d, __LINE__)
+
+#define test_(lower, higher, a, b, c, d, line)\
+ test__(lower, higher, a, b, c, d, line)
+
+/* The first declaration tests that the parentheses are added correctly
+ by the expression parser. The second tests that the two possible
+ orderings of precedences do give different results. */
+#define test__(lower, higher, a, b, c, d, line) \
+ char test##line[ \
+ (a higher b lower c higher d) == \
+ ((a higher b) lower (c higher d)) \
+ ? 1 : -1]; \
+ char doublecheck##line[ \
+ (a higher b lower c higher d) == \
+ (a higher (b lower c) higher d) \
+ ? -1 : 1];
+
+test (||, &&, 1, 1, 0, 0)
+test (&&, |, 5, 1, 1, 19)
+test (|, ^, 1, 2, 2, 1)
+test (^, &, 1, 3, 2, 6)
+test (&, ==, 1, 3, 2, 0)
+test (==, <, 2, 0, 0, 0)
+test (<, <<, 2, 3, 6, 8)
+test (<<, +, 2, 3, 4, 5)
+test (+, *, 2, 6, 9, 13)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/extern-C-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/extern-C-1.C
new file mode 100644
index 000000000..60a634832
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/extern-C-1.C
@@ -0,0 +1,13 @@
+/* PR c++/4754 */
+/* { dg-do compile } */
+// GCC 3.2 got very confused by the nested extern "C" blocks, and thought
+// there was a storage class specifier on 'int i'.
+
+extern "C"
+{
+ extern "C" struct Test
+ {
+ int i;
+ };
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/extern1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/extern1.C
new file mode 100644
index 000000000..cc95fa694
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/extern1.C
@@ -0,0 +1,14 @@
+// PR c++/21495
+// { dg-do compile }
+
+class A
+{
+ extern void *copy (void) // { dg-error "storage class specified" }
+ {
+ return 0;
+ }
+ extern A &operator= (const A &) // { dg-error "storage class specified" }
+ {
+ return *this;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef1.C
new file mode 100644
index 000000000..ebdc012f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef1.C
@@ -0,0 +1,19 @@
+// PR c++/40750
+// { dg-do run }
+
+extern "C" void abort ();
+
+typedef void Fn() const;
+
+struct Foo {
+ Fn fn;
+};
+
+bool called = false;
+void Foo::fn() const { called = true; }
+
+int main() {
+ Foo f; f.fn();
+ if (!called)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef2.C
new file mode 100644
index 000000000..6bb83024b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/fn-typedef2.C
@@ -0,0 +1,7 @@
+// Test that merge_types preserves fn cv-quals.
+
+typedef void ft() const;
+typedef void V;
+typedef V ft() const;
+
+ft f; // { dg-error "cv-qualifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/for1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/for1.C
new file mode 100644
index 000000000..1e310ee02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/for1.C
@@ -0,0 +1,7 @@
+// PR c++/23440
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+// { dg-options "" }
+
+# 0 "for1.C"
+void foo() { for (;;) // { dg-error "at end of input" "" { target *-*-* } 0 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend-main.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend-main.C
new file mode 100644
index 000000000..e6d32e71b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend-main.C
@@ -0,0 +1,30 @@
+// PR c++/24449
+
+class Fooa
+{
+ friend int main();
+};
+
+template <class T> class Foob
+{
+ friend int main();
+ int i;
+};
+
+int main()
+{
+ Foob<void> a;
+ a.i = 7;
+}
+
+class Fooc
+{
+ template<class T> friend int main(); // { dg-error "cannot declare .::main. to be a template" }
+};
+
+template<class T> class Food
+{
+ template<class U> friend int main(); // { dg-error "cannot declare .::main. to be a template" }
+};
+
+template<class U> int main() {} // { dg-error "cannot declare .::main. to be a template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend1.C
new file mode 100644
index 000000000..f19dc9c62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend1.C
@@ -0,0 +1,9 @@
+namespace N {
+ template <typename T>
+ static void f ();
+
+ struct S {
+ friend void N::f<int> ();
+ static void f (int);
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend2.C
new file mode 100644
index 000000000..1a2ad8bfa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Origin: <struppi@acm.org>
+
+// PR c++/8591
+// Template or class detection in friend declaration
+
+namespace NS {
+ template <class T1, class T2, class T3 = int, class T4 = int>
+ struct C {};
+}
+
+template <class T> class X {
+ friend class NS::C; // { dg-error "template|friend" }
+};
+
+X<int> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend3.C
new file mode 100644
index 000000000..39322021e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend3.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+//
+// PR 11553 catch duplicate friend specifiers
+
+struct S
+{
+ friend friend class C; // { dg-error "duplicate" }
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend4.C
new file mode 100644
index 000000000..5eca512e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend4.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+// PR c++/4100
+// You can't use friend when defining a class.
+
+class A {
+ friend class B { }; // { dg-error "friend" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend5.C
new file mode 100644
index 000000000..43f06129b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend5.C
@@ -0,0 +1,7 @@
+// PR c++/23694
+
+extern "C" struct A
+{
+ friend void foo(int) {} // { dg-message "declaration" }
+ friend void foo() {} // { dg-error "foo" "err" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend6.C
new file mode 100644
index 000000000..2d13606cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend6.C
@@ -0,0 +1,3 @@
+// PR c++/27808
+
+template<typename T> friend void T::foo; // { dg-error "friend|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend7.C
new file mode 100644
index 000000000..668fd35d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend7.C
@@ -0,0 +1,37 @@
+// PR c++/34488
+// { dg-do compile }
+
+struct A
+{
+ A ();
+ ~A ();
+ A (const A &);
+};
+
+struct B
+{
+ friend A::A ();
+ friend A::~A ();
+ friend A::A (const A &);
+};
+
+struct C
+{
+ friend int C (); // { dg-error "return type|in friend decl" }
+ friend int ~C (); // { dg-error "return type|in friend decl" }
+ friend int C (const C &); // { dg-error "return type|in friend decl" }
+};
+
+struct D
+{
+ friend int D () {} // { dg-error "return type|in friend decl" }
+ friend int ~D () {} // { dg-error "return type|in friend decl" }
+ friend int D (const D &) {} // { dg-error "return type|in friend decl" }
+};
+
+struct E
+{
+ friend A::A () {} // { dg-error "cannot define member" }
+ friend A::~A () {} // { dg-error "cannot define member" }
+ friend A::A (const A &) {} // { dg-error "cannot define member" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/friend8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend8.C
new file mode 100644
index 000000000..aac5f0e55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/friend8.C
@@ -0,0 +1,8 @@
+// PR c++/35578
+// Check position of error message
+// { dg-do compile }
+
+int i;
+
+friend // { dg-error "friend" }
+ void foo();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/func-def1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/func-def1.C
new file mode 100644
index 000000000..00c973d88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/func-def1.C
@@ -0,0 +1,11 @@
+// PR c++/7917
+// Origin: VACLAV HAISMAN <V.Haisman@sh.cvut.cz>
+// { dg-do compile }
+
+struct A
+{
+ int i;
+ void foo() = 0 {} // { dg-error "" }
+
+ A() : i(0) {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/funptr1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/funptr1.C
new file mode 100644
index 000000000..bf63c122e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/funptr1.C
@@ -0,0 +1,13 @@
+// PR c++/9282
+// Origin: Thomas Richter <thor@math.tu-berlin.de>
+// { dg-do compile }
+
+typedef void (*fptr)();
+
+struct A
+{
+ template<int> static void foo() {}
+ template<fptr f> static void bar() { (*f)(); }
+};
+
+fptr f = A::bar< A::foo<0> >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/fused-params1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/fused-params1.C
new file mode 100644
index 000000000..33732fc28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/fused-params1.C
@@ -0,0 +1,12 @@
+// PR c++/8785
+// Origin: Alexander Zvyagin <Alexander.Zviagine@cern.ch>
+// { dg-do compile }
+
+template <int N,typename T> struct A // { dg-error "" }
+{
+ typedef T X;
+ template <int M> void foo (const A<M,X>&);
+};
+
+template <int N,int M,typename T>
+void A<N,T>::foo (const A<M,X>&) {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/inline1.C
new file mode 100644
index 000000000..5c3034c6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/inline1.C
@@ -0,0 +1,7 @@
+struct f
+{
+ int oo()
+ {
+ return (2; // { dg-error "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/int-as-enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/int-as-enum1.C
new file mode 100644
index 000000000..c5ed261f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/int-as-enum1.C
@@ -0,0 +1,6 @@
+// PR c++/4207
+// Origin: <wanderer@rsu.ru>
+// { dg-do compile }
+
+typedef int A; // { dg-message "previous" }
+enum ::A {}; // { dg-error "typedef-name|expected unqualified-id" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/invalid-op1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/invalid-op1.C
new file mode 100644
index 000000000..8d745c1a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/invalid-op1.C
@@ -0,0 +1,14 @@
+// PR c++/10150
+// Origin: Tom Evans <te200@eng.cam.ac.uk>
+// { dg-do compile }
+
+template <int I> struct A
+{
+ template <int> struct B
+ {
+ enum { e = I * A<I-1>::B }; // { dg-error "dependent-name" "depname" }
+ // { dg-message "note" "note" { target *-*-* } 9 }
+ };
+};
+
+A<0>::B<0> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ivdep.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ivdep.C
new file mode 100644
index 000000000..23d51de9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ivdep.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+/* PR other/33426 */
+
+void foo(int n, int *a, int *b, int *c, int *d, int *e) {
+ int i, j;
+#pragma GCC ivdep
+ for (i = 0; ; ++i) { /* { dg-error "missing loop condition in loop with 'GCC ivdep' pragma before ';' token" } */
+ a[i] = b[i] + c[i];
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/limits-initializer1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/limits-initializer1.C
new file mode 100644
index 000000000..4b507912f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/limits-initializer1.C
@@ -0,0 +1,37 @@
+// PR middle-end/42803
+// { dg-do compile }
+// { dg-options "-O0" }
+
+#define X2 (a + a)
+#define X4 (X2 + X2)
+#define X8 (X4 + X4)
+#define X16 (X8 + X8)
+#define X32 (X16 + X16)
+#define X64 (X32 + X32)
+#define X128 (X64 + X64)
+#define X256 (X128 + X128)
+#define X512 (X256 + X256)
+#define X1024 (X512 + X512)
+#define X2048 (X1024 + X1024)
+#define X4096 (X2048 + X2048)
+#define X8192 (X4096 + X4096)
+#define X16384 (X8192 + X8192)
+#define X32768 (X16384 + X16384)
+#define X65536 (X32768 + X32768)
+#define X131072 (X65536 + X65536)
+#define X262144 (X131072 + X131072)
+
+int
+foo (int a)
+{
+ int v = X262144;
+ return v;
+}
+
+// Emit an error to just make sure we don't waste too much time
+// in the middle-end compiling this.
+int
+bar (void)
+{
+ return x; // { dg-error "was not declared in this scope" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage1.C
new file mode 100644
index 000000000..5a534251f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage1.C
@@ -0,0 +1,11 @@
+// PR c++/26068
+
+extern "C" auto int a; // { dg-error "linkage|two or more data types" }
+extern "C" register int b; // { dg-error "linkage" }
+extern "C" static void c(); // { dg-error "linkage" }
+extern "C" extern void d(); // { dg-error "linkage" }
+extern "C" mutable int e; // { dg-error "linkage" }
+
+extern "C" {
+ static void f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage2.C
new file mode 100644
index 000000000..aa204df2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage2.C
@@ -0,0 +1,3 @@
+// PR c++/27884
+
+extern "C" void foo(register int *my_perl);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage3.C
new file mode 100644
index 000000000..0d952d1e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/linkage3.C
@@ -0,0 +1,7 @@
+// PR c++/37877
+// { dg-do compile }
+
+extern "C++" struct S
+{
+ static int x;
+} s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/local-class1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/local-class1.C
new file mode 100644
index 000000000..518dd7abd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/local-class1.C
@@ -0,0 +1,14 @@
+ // Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: Jorn Wolfgang Rennecke <amylaar@gcc.gnu.org>
+// Bug 19608: ICE on invalid
+
+
+void f ()
+{
+ class c
+ {
+ friend void g () { } // { dg-error "local class" "" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/local1.C
new file mode 100644
index 000000000..cfcffc908
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/local1.C
@@ -0,0 +1,18 @@
+// PR c++/28056
+
+void f1();
+
+namespace N {
+ void f2();
+}
+
+class C {
+ static void f3();
+};
+
+void foo() {
+ void ::f1(); // { dg-error "qualified" }
+ void N::f2(); // { dg-error "qualified" }
+ void C::f3(); // { dg-error "qualified" }
+ void ::f4(); // { dg-error "qualified" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/long1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/long1.C
new file mode 100644
index 000000000..c22d79117
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/long1.C
@@ -0,0 +1,11 @@
+// PR c++/6634
+// { dg-do compile }
+// { dg-options "" }
+
+long long double x; // { dg-error "long long" }
+long double y;
+long float z; // { dg-error "long" }
+
+typedef short void SV; // { dg-error "short" }
+typedef long struct A LA; // { dg-error "long" }
+typedef short char SC; // { dg-error "short" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup1.C
new file mode 100644
index 000000000..0325d3c69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup1.C
@@ -0,0 +1,9 @@
+#include <list>
+
+using namespace std;
+
+template <class T, class Alloc>
+class new_list : public list<T, Alloc> {
+public:
+ typedef typename list<T, Alloc>::iterator iterator;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup2.C
new file mode 100644
index 000000000..fcf17cde4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup2.C
@@ -0,0 +1,21 @@
+template <typename T> struct A
+{
+ typedef int X;
+};
+
+template <typename T> struct B
+{
+ typename A<T>::X x;
+};
+
+template <typename T> struct C
+{
+ void foo(int);
+ B<A<T>*> b;
+};
+
+template <typename T> struct D
+{
+ enum { e };
+ void bar() { C<T*>::foo(e); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup3.C
new file mode 100644
index 000000000..d4bf79830
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup3.C
@@ -0,0 +1,12 @@
+struct X {};
+
+template <int>
+struct Base {
+ static void foo () {
+ X::NONEXISTENT (); // { dg-error "" }
+ }
+};
+
+int main () {
+ Base<2>::foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup4.C
new file mode 100644
index 000000000..01e5662ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup4.C
@@ -0,0 +1,7 @@
+// PR c++/16637
+
+typedef int I;
+
+struct S {
+ ::I I;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup5.C
new file mode 100644
index 000000000..afdf023b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/lookup5.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+struct A {};
+
+template <class T> struct B
+{
+ T a, b;
+ B() {}
+ B(T x, T y) : a(x), b(y) {}
+ template <class U> operator B<U> () const
+ { return B<U>((U)(this->a), (U)(this->b)); }
+};
+
+template <class T> struct C : public B<int>
+{
+ T *c;
+ inline T & operator *() { return *c; }
+};
+
+template <class T> struct D : virtual public C<T> { };
+
+void
+foo (D<A> x)
+{
+ *x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/memfnquals1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/memfnquals1.C
new file mode 100644
index 000000000..ce8af7b72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/memfnquals1.C
@@ -0,0 +1,6 @@
+// PR c++/48166
+
+struct foo {
+ static void func ();
+};
+void foo::func () const {} // { dg-error "type qualifiers" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/missing-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/missing-template1.C
new file mode 100644
index 000000000..e5e03146d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/missing-template1.C
@@ -0,0 +1,23 @@
+// PR c++/8736
+// Origin: Peter Kolloch <pkolloch@gmx.ne>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> struct B
+ {
+ typedef int X;
+ };
+};
+
+template <typename T> void foo()
+{
+ typedef typename A<T>::B<T>::X Y; // { dg-error "non-template" "non" }
+ // { dg-error "not declare" "decl" { target *-*-* } 15 }
+ // { dg-message "note" "note" { target *-*-* } 15 }
+}
+
+void bar()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/mutable1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/mutable1.C
new file mode 100644
index 000000000..f3ac2e4a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/mutable1.C
@@ -0,0 +1,7 @@
+// PR c++/16518
+
+struct foo {
+ void bar() const { m1=1; m2=1;}
+ mutable int m1,m2;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/named_ops.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/named_ops.C
new file mode 100644
index 000000000..80e514992
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/named_ops.C
@@ -0,0 +1,13 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options -fpreprocessed } */
+
+/* Tests that C++ named ops are still there with -fpreprocessed. */
+
+/* Source: Neil Booth, 23 May 2002. */
+
+int main ()
+{
+ return 2 xor 2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-alias-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-alias-1.C
new file mode 100644
index 000000000..4b443359a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-alias-1.C
@@ -0,0 +1,7 @@
+// PR c++/26155
+
+namespace N
+{
+ namespace M = N; // { dg-message "previous declaration" }
+ namespace M {} // { dg-error "declaration of namespace" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-definition.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-definition.C
new file mode 100644
index 000000000..b7d4034cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace-definition.C
@@ -0,0 +1,10 @@
+// PR 30891
+// { dg-do compile }
+
+int main() {
+ int i = 0;
+ namespace foo { // { dg-error "'namespace' definition is not allowed here" }
+ int j = 0;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace1.C
new file mode 100644
index 000000000..7740bce2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace1.C
@@ -0,0 +1,7 @@
+namespace foo {
+void baz(int);
+}
+
+int bar(int foo) {
+ foo::baz (3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace10.C
new file mode 100644
index 000000000..5e9541adb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace10.C
@@ -0,0 +1,9 @@
+// PR c++/16529
+
+namespace m {} // { dg-message "" }
+
+namespace n {
+ namespace m {}
+}
+
+namespace m = n::m; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace11.C
new file mode 100644
index 000000000..7fa73b6e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace11.C
@@ -0,0 +1,7 @@
+// PR c++/43069
+
+namespace std {
+ template < typename >
+ void swap ();
+}
+template std::swap // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace12.C
new file mode 100644
index 000000000..25d6ae093
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace12.C
@@ -0,0 +1,7 @@
+// PR c++/43109
+
+namespace std {
+ namespace {
+ struct S {};
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace2.C
new file mode 100644
index 000000000..a2c10e053
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace2.C
@@ -0,0 +1,15 @@
+/* PR c++/2537 */
+/* { dg-do compile } */
+
+// Used to have namespace name/identifier conflict, prior to 3.4.
+
+namespace baz {}
+
+namespace foo
+ {
+ struct bar
+ {
+ unsigned baz:1;
+ };
+ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace3.C
new file mode 100644
index 000000000..4665d0e9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace3.C
@@ -0,0 +1,12 @@
+/* PR c+/3816 */
+/* { dg-do compile } */
+namespace A {}
+
+namespace OtherNamespace {
+
+ typedef struct {
+ int member;
+ } A; // used to conflict with A namespace
+
+} // end of namespace
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace4.C
new file mode 100644
index 000000000..2bee8dda8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace4.C
@@ -0,0 +1,18 @@
+/* PR c++/4652 */
+/* { dg-do compile } */
+/* Another conflict between namespace IDs and other things. */
+
+namespace A { }
+
+class B {
+
+ struct {
+ int x;
+ } A;
+
+};
+
+int main() {
+ B b;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace5.C
new file mode 100644
index 000000000..277c0c8e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace5.C
@@ -0,0 +1,5 @@
+// PR c++/7229
+// { dg-do compile }
+
+namespace A { namespace B { typedef int type; } }
+typename A::B<0>::type x; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace6.C
new file mode 100644
index 000000000..06642d429
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace6.C
@@ -0,0 +1,10 @@
+namespace a {
+ namespace b {
+ void foo();
+ }
+}
+
+void
+a::b:foo() // { dg-error "" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace7.C
new file mode 100644
index 000000000..c8ac60882
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace7.C
@@ -0,0 +1,8 @@
+namespace O {
+ struct SO;
+ namespace I {
+ struct SI;
+ struct O::SO {}; // { dg-error "" }
+ }
+ struct I::SI {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace8.C
new file mode 100644
index 000000000..d5a9b0ac1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace8.C
@@ -0,0 +1,6 @@
+namespace X {
+ typedef struct {
+ } x;
+}
+typedef X::x x;
+using X::x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace9.C
new file mode 100644
index 000000000..7ff0267bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/namespace9.C
@@ -0,0 +1,8 @@
+namespace A {
+ void f();
+}
+int g()
+{
+ struct f { };
+ using A::f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new1.C
new file mode 100644
index 000000000..d61c44633
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new1.C
@@ -0,0 +1,7 @@
+struct T; // { dg-error "forward" }
+T* manage(T* t);
+template <class Obj> struct ObjectSlot0_ {
+ void create() {
+ void* tmp = manage(new T()); // { dg-error "incomplete" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new2.C
new file mode 100644
index 000000000..d233b68ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Contributed by David Daney <daney at gcc dot gnu dot org>
+// PR c++/14181: Cryptic error message for ill-formed new expressions
+
+void f1(void)
+{
+ (void)new (char*)[10]; // { dg-error "parenthesized|parentheses" }
+ (void)new char*[10];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new3.C
new file mode 100644
index 000000000..d8faed294
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new3.C
@@ -0,0 +1,4 @@
+// PR c++/28593
+// { dg-do compile }
+
+void *p = new (::X; // { dg-error "declared|type-specifier" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new4.C
new file mode 100644
index 000000000..34bd23230
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new4.C
@@ -0,0 +1,7 @@
+// PR c++/29291
+// { dg-do compile }
+
+template<int> void foo()
+{
+ new int(; // { dg-error "before" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new5.C
new file mode 100644
index 000000000..83937c6e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new5.C
@@ -0,0 +1,4 @@
+// PR c++/47450
+
+struct A { };
+A* ap = new(struct: A { }); // { dg-error "types may not be defined" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/new6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/new6.C
new file mode 100644
index 000000000..213837c3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/new6.C
@@ -0,0 +1,10 @@
+// PR c++/52725
+
+struct A { };
+
+const int n = 42;
+
+void f()
+{
+ A** p = new (A*[n]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/no-type-defn1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-type-defn1.C
new file mode 100644
index 000000000..9e899579e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-type-defn1.C
@@ -0,0 +1,5 @@
+// PR c++/47144
+
+template<typename> struct A { };
+A< struct B { }* >::SomeNonSense // { dg-error "types may not be defined" }
+int y;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/no-typename1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-typename1.C
new file mode 100644
index 000000000..42059ce7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-typename1.C
@@ -0,0 +1,11 @@
+// PR c++/4903
+// Origin: Dan Marinescu <theverylittleone@hotmail.com>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> struct B
+ {
+ A<T>::template B<U> foo(); // { dg-error "" }
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/no-value1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-value1.C
new file mode 100644
index 000000000..443a389ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/no-value1.C
@@ -0,0 +1,14 @@
+// PR c++/5533
+// { dg-do compile }
+
+namespace N
+{
+ template <class T> struct A{};
+}
+
+template <class T> void foo(T) {}
+
+void bar()
+{
+ foo(N::A); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent1.C
new file mode 100644
index 000000000..d85ecb13a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent1.C
@@ -0,0 +1,19 @@
+// PR c++/8921
+// Origin: Chin-Lung Chang <evirt@iis.sinica.edu.tw>
+// { dg-do compile }
+
+struct A
+{
+ template <typename T> void foo();
+};
+
+template <typename T> void bar(A& a)
+{
+ a.foo<T>();
+}
+
+void baz()
+{
+ A a;
+ bar<int>(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent2.C
new file mode 100644
index 000000000..a2ae81d7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent2.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Jul 2003 <nathan@codesourcery.com>
+
+// A non-dependent field_decl can bind at parse time.
+
+template <class T>
+struct Foo {
+ int j; // we never see this one.
+ int k; // { dg-message "Foo" "" }
+
+};
+
+struct Baz
+{
+ int j;
+ int k; // { dg-message "candidates" "" }
+
+};
+
+template <class T>
+struct Bar : public Foo<T>, Baz {
+
+ int baz () { return j; } // binds to Baz::j
+ int foo () { return this->k; } // { dg-error "request for member" "" }
+};
+
+int main()
+{
+ Bar<int> bar;
+
+ bar.baz ();
+ bar.foo (); // { dg-message "required" "" }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent3.C
new file mode 100644
index 000000000..9dfb99636
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-dependent3.C
@@ -0,0 +1,17 @@
+// PR c++/14586
+
+enum E { e };
+
+E & operator |= (E &f1, const E &f2);
+
+E operator | (const E &f1, const E &f2) {
+ E result = f1;
+ result |= f2;
+ return result;
+}
+
+template <typename> void foo () {
+ const E flags = e | e;
+}
+
+template void foo<double> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/non-templ1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-templ1.C
new file mode 100644
index 000000000..07bb3793a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/non-templ1.C
@@ -0,0 +1,10 @@
+// PR c++/9228
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+struct A
+{
+ struct B { B(int); };
+};
+
+template <typename T> typename A<T>::B foo() { return 1; } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/nontype1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/nontype1.C
new file mode 100644
index 000000000..e721700af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/nontype1.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// PR c++/13289: Incorrectly reject non-type template argument that has
+// dependent type
+
+template <class T, T t> class C {};
+template <class T, T t> class D { C<T, t-1> c; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/octal1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/octal1.C
new file mode 100644
index 000000000..8d62eef3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/octal1.C
@@ -0,0 +1 @@
+int i = 08; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof1.C
new file mode 100644
index 000000000..ae9d3110a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof1.C
@@ -0,0 +1,11 @@
+#include <stddef.h>
+
+template <bool> struct StaticAssert;
+template <> struct StaticAssert<true> {};
+
+struct MyPOD
+{
+ int a; int b; int c;
+};
+
+StaticAssert<(offsetof(MyPOD, a) == 0)> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof2.C
new file mode 100644
index 000000000..4552d39fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof2.C
@@ -0,0 +1,12 @@
+#include <cstddef>
+
+struct choke_me
+{
+ int size;
+ char storage[1];
+};
+
+struct offset_is_broken
+{
+ static const int offset = offsetof(choke_me, storage);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof3.C
new file mode 100644
index 000000000..905e5f58a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof3.C
@@ -0,0 +1,11 @@
+// PR c++/13529
+
+#include <cstddef>
+
+struct A { int i; };
+struct B { A a; };
+
+int main()
+{
+ return offsetof(B,a.i) != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof4.C
new file mode 100644
index 000000000..ba051480d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Contributed by Bill Helfinstine <bhelf at flitterfly dot whirpon dot com>
+// PR c++/14932: Allow subscript operator in offsetof
+
+#include <cstddef>
+
+struct A
+{
+ int bar;
+ int foo[22];
+};
+
+const int off = offsetof(A, foo[12]);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof5.C
new file mode 100644
index 000000000..553e33ded
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof5.C
@@ -0,0 +1,13 @@
+// PR c++/16618
+
+#include <stddef.h>
+
+struct test
+{
+ const char a;
+};
+
+int main()
+{
+ offsetof(test,a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof6.C
new file mode 100644
index 000000000..0e07a5380
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof6.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+// From PR28573
+
+struct A
+{
+ char d[44];
+ char &operator [] ( int indx ) { return d[indx]; }
+};
+
+struct B
+{
+ A a;
+};
+
+int main()
+{
+ return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof7.C
new file mode 100644
index 000000000..113a79547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof7.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+// From PR28573
+
+struct A
+{
+ int operator [] ( int indx ) { return indx; }
+};
+
+struct B
+{
+ A a;
+};
+
+int main()
+{
+ return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof8.C
new file mode 100644
index 000000000..e613ddcbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof8.C
@@ -0,0 +1,16 @@
+// PR c++/35321
+
+struct A
+{
+ A operator[] (int);
+};
+
+struct B
+{
+ A a;
+};
+
+void foo()
+{
+ __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply 'offsetof' when 'operator\\\[\\\]' is overloaded" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof9.C
new file mode 100644
index 000000000..efc103837
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/offsetof9.C
@@ -0,0 +1,32 @@
+/* PR c/32041 */
+/* { dg-do run } */
+
+struct S
+{
+ int c;
+ struct { float f; } sa[2];
+};
+
+char a[__builtin_offsetof (S, sa->f)
+ == __builtin_offsetof (S, sa[0].f) ? 1 : -1];
+
+template <int N>
+struct T
+{
+ int c[N];
+ struct { float f; } sa[N];
+ static int foo () { return __builtin_offsetof (T, sa->f); }
+ static int bar () { return __builtin_offsetof (T, sa[0].f); }
+};
+
+char b[__builtin_offsetof (T<5>, sa->f)
+ == __builtin_offsetof (T<5>, sa[0].f) ? 1 : -1];
+
+int
+main ()
+{
+ if (T<1>::foo () != T<1>::bar ())
+ __builtin_abort ();
+ if (T<7>::foo () != T<7>::bar ())
+ __builtin_abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator1.C
new file mode 100644
index 000000000..3a534d182
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator1.C
@@ -0,0 +1,11 @@
+/* PR c++/8982 */
+/* { dg-do compile } */
+namespace foo {
+ template<class X>
+ int operator- (X x);
+}
+
+int main() {
+ using foo::operator-; // syntax error under gcc 3.2
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator2.C
new file mode 100644
index 000000000..a9ebde0d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator2.C
@@ -0,0 +1,15 @@
+// PR c++/7906
+// Origin: Marcel Loose <loose@astron.nl>
+// { dg-do compile }
+
+template <typename> struct A { typedef int X; };
+
+template <typename T> struct B
+{
+ typedef A<T> Y;
+ struct C { operator typename Y::X() const; };
+};
+
+template <typename T> B<T>::C::operator typename B<T>::Y::X() const { return 0; }
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator3.C
new file mode 100644
index 000000000..08f5c83f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator3.C
@@ -0,0 +1,11 @@
+// PR c++/9454
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int> struct A
+{
+ struct B { operator int (); };
+ struct C : B { operator int (); };
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator4.C
new file mode 100644
index 000000000..054ddc835
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator4.C
@@ -0,0 +1 @@
+int operator *(int, ...); // { dg-error "class|variable number of arguments" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator5.C
new file mode 100644
index 000000000..3e453bdf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator5.C
@@ -0,0 +1,7 @@
+// PR c++/17685
+
+struct S {
+ operator int; // { dg-error "" }
+ operator void; // { dg-error "" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator6.C
new file mode 100644
index 000000000..e58a3a682
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator6.C
@@ -0,0 +1,5 @@
+// PR c++/25635
+
+struct A {};
+
+A::operator int(); // { dg-error "class" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/operator7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator7.C
new file mode 100644
index 000000000..e3464f017
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/operator7.C
@@ -0,0 +1,4 @@
+// PR c++/27278
+// { dg-do compile }
+
+int operator+(void,void); // { dg-error "incomplete type|invalid use" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
new file mode 100644
index 000000000..22d6f214d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
@@ -0,0 +1,6 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: Robert Schiele; PR C++/8799
+// { dg-do compile }
+
+struct {
+ a(void = 0; a(0), a(0) // { dg-error "" "" { target *-*-* } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
new file mode 100644
index 000000000..3c983cc74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
@@ -0,0 +1,2 @@
+void f (int i, int p[i]); // { dg-error "use of parameter.*outside function body" }
+// { dg-prune-output "array bound" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parens1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parens1.C
new file mode 100644
index 000000000..f63f50143
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parens1.C
@@ -0,0 +1,18 @@
+/* PR c++/8237 */
+/* { dg-do compile } */
+class A {
+public:
+ A() { }
+};
+
+class B {
+public:
+ B(A a) { }
+ void form() { }
+};
+
+int main() {
+ // This used to give a parse error.
+ B(A()).form();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parens2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parens2.C
new file mode 100644
index 000000000..636dd8df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parens2.C
@@ -0,0 +1,11 @@
+/* PR c++/8842. */
+/* { dg-do compile } */
+int main( int argc, char* argv[] )
+{
+ int i = 5;
+ // This always worked:
+ // double l1 = double(int(i)) / double(int(i));
+ // But this used to give a parse error before the `/' token:
+ double l2 = (double(int(i)) / double(int(i)));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse1.C
new file mode 100644
index 000000000..cbac6da15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse1.C
@@ -0,0 +1,9 @@
+/* PR c++/50 */
+/* { dg-do compile } */
+
+namespace A {typedef int Z;}
+int main(void)
+{
+ A::Z* z;
+ z->A::Z::~Z();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse2.C
new file mode 100644
index 000000000..80a9e38f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse2.C
@@ -0,0 +1,8 @@
+/* PR c++/67 */
+/* { dg-do compile } */
+
+template <class T> struct foo {
+ static const int bar [3];
+};
+// Used to fail if 2+1 rather than 3.
+template <class T> const int foo<T>::bar [2+1] = { 0, 0, 0 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse3.C
new file mode 100644
index 000000000..5f24cd159
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse3.C
@@ -0,0 +1,7 @@
+/* PR c++/80 */
+/* { dg-do compile } */
+
+/* Used to get:
+ bug.C:7: semicolon missing after declaration of `numbers'
+*/
+enum numbers { zero, one, two, three } __attribute__ ((packed)) ;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse4.C
new file mode 100644
index 000000000..9df1754ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse4.C
@@ -0,0 +1,25 @@
+/* PR c++/88 */
+/* { dg-do compile } */
+
+class Hvec
+{
+public:
+ Hvec(double x, double y, double z);
+ ~Hvec();
+};
+
+
+class Camera1
+{
+public:
+ Camera1(const Hvec &basepos=Hvec(0.0,0.0,0.0));
+ ~Camera1();
+};
+
+class Camera2
+{
+public:
+ Camera2(const Hvec &basepos);
+ inline Camera2() { Camera2(Hvec(0.0,0.0,0.0)); }
+ ~Camera2();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse5.C
new file mode 100644
index 000000000..f9e6a0359
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse5.C
@@ -0,0 +1,33 @@
+/* PR c++/590 */
+/* { dg-do compile } */
+
+#include <iostream>
+#include <sstream>
+using namespace std;
+
+enum ExternalEnum { EXTERNAL_VALUE = 2 };
+
+class BadStream : public ostringstream
+{
+public:
+ enum InternalEnum { VALUE = 0 };
+ BadStream( InternalEnum e ) {}
+ BadStream( InternalEnum e, int i ) {}
+};
+
+int main()
+{
+ ( BadStream( BadStream::VALUE ) ) << "foobar" << endl;
+
+ BadStream((BadStream::InternalEnum)BadStream::VALUE ) << "foobar";
+
+ BadStream::InternalEnum in = BadStream::VALUE;
+ BadStream( in ) << "foobar";
+
+ BadStream( BadStream::VALUE, 0 ) << "foobar" << endl;
+
+ // This didn't used to compile:
+ BadStream( BadStream::VALUE ) << "foobar" << endl;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse6.C
new file mode 100644
index 000000000..73f7256d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse6.C
@@ -0,0 +1,31 @@
+/* PR c++/3012 */
+/* { dg-do compile } */
+
+class A
+{
+ public:
+
+ template <class T>
+ void foo() const
+ {
+ }
+};
+
+template <class T>
+class B
+{
+ public:
+
+ void bar(const A& a) const
+ {
+ // Compile used to fail with parse error before `;' token
+ a.foo<double>();
+ }
+};
+
+int main()
+{
+ A a;
+ B<int> b;
+ b.bar(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parse7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse7.C
new file mode 100644
index 000000000..3676ded4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parse7.C
@@ -0,0 +1,24 @@
+/* PR c++/3650 */
+/* { dg-do compile } */
+
+class class1 {
+public:
+ explicit class1(double a) { data = a; }
+ double data;
+};
+
+class class2 {
+public:
+ class2(class1 a, float t) { }
+ class2(float t, class1 a) { }
+};
+
+int main() {
+ float t2 = 1.5;
+ double pir = 3.14159;
+ // Used to get: error: type specifier omitted for parameter `t2'
+ class2 h(class1(double(pir)), t2);
+ class2 i(class1(pir), t2);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C
new file mode 100644
index 000000000..3510aac90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C
@@ -0,0 +1,31 @@
+// PR 14875: When using 'or' keyword, the error message speaks of a '||' token
+// { dg-do compile }
+// { dg-options "" }
+#define CHECK(x) void ::x
+ CHECK (and); // { dg-error "before .and. token" }
+ CHECK (and_eq); // { dg-error "before .and_eq. token" }
+ CHECK (bitand); // { dg-error "before .bitand. token" }
+ CHECK (bitor); // { dg-error "before .bitor. token" }
+ CHECK (compl); // { dg-error "before .compl. token" }
+ CHECK (not); // { dg-error "before .not. token" }
+ CHECK (not_eq); // { dg-error "before .not_eq. token" }
+ CHECK (or); // { dg-error "before .or. token" }
+ CHECK (or_eq); // { dg-error "before .or_eq. token" }
+ CHECK (xor); // { dg-error "before .xor. token" }
+ CHECK (xor_eq); // { dg-error "before .xor_eq. token" }
+#undef CHECK
+#define CHECK(x) int x
+ CHECK (<:); // { dg-error "before .<:. token" }
+ CHECK (:>); // { dg-error "before .:>. token" }
+#undef CHECK
+#define CHECK(x) x
+ CHECK (<%); // { dg-error "before .<%. token" }
+#undef CHECK
+#define CHECK(x) x x
+ CHECK (%>); // { dg-error "before .%>. token" }
+#undef CHECK
+#define CHECK(x) x
+ CHECK (%:); // { dg-error "stray .%:. " }
+ CHECK (%:%:); // { dg-error "stray .%:%:. " }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875.C
new file mode 100644
index 000000000..7a6f06186
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr14875.C
@@ -0,0 +1,20 @@
+// PR 14875: When using 'or' keyword, the error message speaks of a '||' token
+// { dg-do compile }
+// { dg-options "" }
+using namespace std;
+
+class Sample
+{
+
+public:
+ Sample();
+ void or(long Digital); // { dg-error "before .or. token" }
+};
+
+Sample::Sample()
+{
+}
+
+void Sample::or(long Digital) // { dg-error "before .or. token" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
new file mode 100644
index 000000000..c6bc5d39b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
@@ -0,0 +1,11 @@
+/* PR 28152: error messages should mention __complex__ */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+ __complex__ float z;
+
+ z = __complex__ (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '__complex__'" "primary-expression" }
+ z = __complex__ (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '__complex__'" "primaty-expression" }
+ // { dg-error "at end of input" "end" { target *-*-* } 10 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152.C
new file mode 100644
index 000000000..4d08fd063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/parser-pr28152.C
@@ -0,0 +1,11 @@
+/* PR 28152: error messages should mention _Complex */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+ _Complex float z;
+
+ z = _Complex (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '_Complex'" "primary-expression" }
+ z = _Complex (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '_Complex'" "primary-expression" }
+ // { dg-error "at end of input" "end" { target *-*-* } 10 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696-permissive.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
new file mode 100644
index 000000000..1d8a920ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile }
+// { dg-options "-fdiagnostics-show-option -fpermissive" }
+
+
+struct X { void operator++(); };
+struct Y { };
+
+int main () {
+ X x;
+ Y y;
+ x++; // { dg-warning "trying prefix operator" }
+
+ y++; // { dg-warning "trying prefix operator" }
+ // { dg-error "no match" "" { target *-*-* } 14 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696.C
new file mode 100644
index 000000000..902e2a1a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr16696.C
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile }
+// { dg-options "-fdiagnostics-show-option" }
+
+
+struct X { void operator++(); };
+struct Y { };
+
+int main () {
+ X x;
+ Y y;
+ x++; // { dg-bogus "trying prefix operator" }
+ // { dg-error "fpermissive" "" { target *-*-* } 12 }
+ y++; // { dg-bogus "trying prefix operator" }
+ // { dg-error "fpermissive" "" { target *-*-* } 14 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr18770.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr18770.C
new file mode 100644
index 000000000..71d95e331
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr18770.C
@@ -0,0 +1,175 @@
+/* { dg-do compile } */
+
+/* The ISO C++ standard says, in Section 3.3.2 sentence 4, that a name
+ declared in the for-init-statement or in the condition of an if, for
+ while, or switch statement can't be redeclared in the outermost block
+ of the controlled statement. (Note, this is not an error in C.) */
+
+extern void foo (int);
+extern int j;
+
+void
+e0 (void)
+{
+ for (int i = 0; // { dg-message "previously declared here" "prev" }
+ i < 10; ++i)
+ {
+ int i = 2; // { dg-error "redeclaration" "redecl" }
+ foo (i);
+ }
+}
+
+void
+e1 (void)
+{
+ int i;
+ for (i = 0;
+ int k = j; i++) // { dg-message "previously declared here" "prev" }
+ {
+ int k = 2; // { dg-error "redeclaration" "redecl" }
+ foo (k);
+ }
+}
+
+void
+e2 (void)
+{
+ if (int i = 1) // { dg-message "previously declared here" "prev" }
+ {
+ int i = 2; // { dg-error "redeclaration" "redecl" }
+ foo (i);
+ }
+}
+
+void
+e3 (void)
+{
+ if (int i = 1) // { dg-message "previously declared here" "prev" }
+ {
+ foo (i);
+ }
+ else
+ {
+ int i = 2; // { dg-error "redeclaration" "redecl" }
+ foo (i);
+ }
+}
+
+void
+e4 (void)
+{
+ while (int i = 1) // { dg-message "previously declared here" "prev" }
+ {
+ int i = 2; // { dg-error "redeclaration" "redecl" }
+ foo (i);
+ }
+}
+
+void
+e5 (void)
+{
+ switch (int i = j) // { dg-message "previously declared here" "prev" }
+ {
+ int i; // { dg-error "redeclaration" "redecl" }
+ default:
+ {
+ i = 2;
+ foo (i);
+ }
+ }
+}
+
+void
+f0 (void)
+{
+ for (int i = 0; i < 10; ++i)
+ {
+ foo (i);
+ {
+ int i = 2; // OK, not outermost block.
+ foo (i);
+ }
+ }
+}
+
+void
+f1 (void)
+{
+ int i;
+ for (i = 0; int k = j; i++)
+ {
+ foo (k);
+ {
+ int k = 2; // OK, not outermost block.
+ foo (k);
+ }
+ }
+}
+
+void
+f2 (void)
+{
+ if (int i = 1)
+ {
+ foo (i);
+ {
+ int i = 2; // OK, not outermost block.
+ foo (i);
+ }
+ }
+}
+
+void
+f3 (void)
+{
+ if (int i = 1)
+ {
+ foo (i);
+ }
+ else
+ {
+ foo (i+2);
+ {
+ int i = 2; // OK, not outermost block.
+ foo (i);
+ }
+ }
+}
+
+void
+f4 (void)
+{
+ while (int i = 1)
+ {
+ foo (i);
+ {
+ int i = 2; // OK, not outermost block.
+ foo (i);
+ }
+ }
+}
+
+void
+f5 (void)
+{
+ switch (int i = j)
+ {
+ default:
+ {
+ int i = 2; // OK, not outermost block.
+ foo (i);
+ }
+ }
+}
+
+void
+f6 (void)
+{
+ int i = 1;
+
+ for (int j = 0; j < 10; j++)
+ {
+ int i = 2; // OK, not variable from for-init.
+ foo (i);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr20118.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr20118.C
new file mode 100644
index 000000000..94e000a6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr20118.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+template<typename t>struct foo {
+ static const int i; };
+
+const int foo<bool>::i = 5; // { dg-error "11:specializing member .foo<bool>::i. requires .template<>. syntax" }
+
+int main() { return 0; }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr26997.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr26997.C
new file mode 100644
index 000000000..acd1e07be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr26997.C
@@ -0,0 +1,50 @@
+// PR c++/26997
+// { dg-do compile }
+void * malloc (unsigned long size);
+typedef struct { int a; } t;
+
+void foo()
+{
+ t *v3;
+ v3 = (t *)
+ malloc(
+ sizeof(t)
+ *
+ t->a // { dg-error "before '->' token" }
+ );
+}
+
+class C {
+public:
+ void operator[](int);
+};
+
+C bar (void)
+{
+ (C ())(3); // { dg-error "invalid cast" }
+ return (C ());
+}
+
+extern void baz (C,C);
+
+void foo1 (void)
+{
+ baz ((C()), (C()));
+}
+
+struct S {
+ void operator()(int);
+};
+
+int *var;
+void foo2 (void)
+{
+ C ()[2];
+ (C ())[2];
+ (S ())(3); // { dg-error "invalid cast" }
+ (C())*var; // { dg-error "invalid cast" }
+ (C())+var; // { dg-error "invalid cast" }
+ S()(3);
+ (S()(3));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr29234.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr29234.C
new file mode 100644
index 000000000..d2dc735f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr29234.C
@@ -0,0 +1,16 @@
+// PR c++/29234
+
+struct S { void operator()(); };
+
+void foo ()
+{
+ ( S()() );
+}
+
+struct C { void operator[](C); };
+
+void bar ()
+{
+ C x;
+ ( C()[x] );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-1.C
new file mode 100644
index 000000000..aad3a11a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-1.C
@@ -0,0 +1,41 @@
+// PR c++/31952
+
+int
+f0 (int bar) // { dg-message "previously" }
+try
+{
+ return 0;
+}
+catch (...)
+{
+ int bar = 0; // { dg-error "redeclaration" }
+ return 1;
+}
+
+int
+f1 (int bar)
+try
+{
+ return 0;
+}
+catch (...)
+{
+ {
+ int bar = 0; // Ok, not outermost block.
+ }
+ return 1;
+}
+
+int
+f2 (int bar)
+{
+ try
+ {
+ return 0;
+ }
+ catch (...)
+ {
+ int bar = 0; // Ok, not a function-try-block.
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-2.C
new file mode 100644
index 000000000..f09bcab1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-2.C
@@ -0,0 +1,49 @@
+// PR c++/31952
+
+void
+f0()
+{
+ try
+ {
+ }
+ catch (void *e) // { dg-message "previously" }
+ {
+ void *e; // { dg-error "redeclaration" }
+ }
+}
+
+void
+f1()
+{
+ try
+ {
+ }
+ catch (void *e)
+ {
+ {
+ void *e; // Ok, not outermost block.
+ }
+ }
+}
+
+void
+f2()
+try
+{
+}
+catch (void *e) // { dg-message "previously" }
+{
+ void *e; // { dg-error "redeclaration" }
+}
+
+void
+f3()
+try
+{
+}
+catch (void *e)
+{
+ {
+ void *e; // Ok, not outermost block.
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-3.C
new file mode 100644
index 000000000..9fe5f0283
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr31952-3.C
@@ -0,0 +1,25 @@
+// PR c++/31952
+
+int
+f0 (int bar) // { dg-message "previously" }
+try
+{
+ return 0;
+}
+catch (int bar) // { dg-error "redeclaration" }
+{
+ return 1;
+}
+
+int
+f1 (int bar)
+{
+ try
+ {
+ return 0;
+ }
+ catch (int bar) // Ok, not a function-try-block.
+ {
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr34758.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr34758.C
new file mode 100644
index 000000000..d694853e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr34758.C
@@ -0,0 +1,28 @@
+// PR 34758 Bad diagnostic for circular dependency in constructor default argument
+// { dg-do compile }
+// { dg-options "" }
+struct A
+{
+ A (const A& = A()); // { dg-error "recursive evaluation of default argument" }
+};
+
+
+struct S {
+ S(const S& = f()); // { dg-error "default argument\[^\n\]*which is not yet defined" }
+ static const S& f(int i = 3);
+};
+
+struct J {
+ J(const J& = f(2)); // { dg-error "default argument.*which is not yet defined" }
+ static const J& f(int i = 3, int j = 4);
+};
+
+struct Z {
+ Z(const Z& = f(4));
+ static const Z& f(int i = 3);
+};
+
+struct X {
+ X(const X& = g());
+ static const X& g(void);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr37862.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr37862.C
new file mode 100644
index 000000000..89b4b6994
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr37862.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+#include <stdlib.h>
+
+class A {
+public:
+ virtual void get (void) { }
+};
+
+class B : public A {
+public:
+ void get (void) { abort (); }
+};
+
+class C : public B { };
+
+int main (void)
+{
+ C c;
+ C * p = &c;
+
+ p->A::get ();
+ (p->A::get) (); // The C++ parser used to resolve this to B::get()
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr43765.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr43765.C
new file mode 100644
index 000000000..0b341ddb8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr43765.C
@@ -0,0 +1,14 @@
+// PR c++/43765
+// { dg-options "" }
+
+struct SomeType
+{
+ const char *values[];
+};
+const char *temp[] = {"607", "612", 0};
+
+SomeType vals[] =
+ {
+ { values : temp, },
+ 0
+ }; // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr52071.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr52071.C
new file mode 100644
index 000000000..99456c004
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr52071.C
@@ -0,0 +1,23 @@
+// PR c++/52071
+
+struct C1 {
+ C1(int);
+};
+
+struct C2 {
+ C2();
+ C2(C1);
+};
+
+void f()
+{
+ int x;
+ int y = 1;
+ C2 vc;
+
+ vc = C2(C1(x = y));
+
+ vc = (C2(C1(x = y)));
+
+ vc = (C2(C1((0, x = y))));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56037.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56037.C
new file mode 100644
index 000000000..10f145ae5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56037.C
@@ -0,0 +1,12 @@
+// PR c++/56037
+
+struct T
+{
+ T(int, int);
+};
+
+int main()
+{
+ static const int zero = 0;
+ (T(int(zero), int(zero)));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56239.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56239.C
new file mode 100644
index 000000000..08f7f6889
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr56239.C
@@ -0,0 +1,13 @@
+// PR c++/56239
+// { dg-do compile }
+
+struct S
+{
+ int operator () () { return 0; }
+};
+
+int
+main ()
+{
+ return (S ()) ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pr58705.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr58705.C
new file mode 100644
index 000000000..de2b396a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pr58705.C
@@ -0,0 +1,5 @@
+// PR c++/58705
+// { dg-do compile }
+// { dg-options "-Wnarrowing" }
+
+_Complex float f = {{}};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma1.C
new file mode 100644
index 000000000..88a56aafb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma1.C
@@ -0,0 +1,8 @@
+// PR c++/17916
+
+class T {
+#pragma X
+ struct S {
+ };
+#pragma Y
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma2.C
new file mode 100644
index 000000000..c5616ff74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma2.C
@@ -0,0 +1,8 @@
+// PR c++/17595
+
+// Ideally, the #pragma error would come one line further down, but it
+// does not.
+int f(int x,
+#pragma interface // { dg-error "not allowed here" }
+ // The parser gets confused and issues an error on the next line.
+ int y); // { dg-bogus "" "" { xfail *-*-* } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma3.C
new file mode 100644
index 000000000..57793b385
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pragma3.C
@@ -0,0 +1,27 @@
+// PR c++/25294
+// Epiphany makes struct S 8-byte aligned.
+// { dg-do run { target { ! epiphany-*-* } } }
+
+extern "C" void abort (void);
+
+struct S
+{
+ char a[3];
+#pragma pack(1) /* A block comment
+ that ends on the next line. */
+ struct T
+ {
+ char b;
+ int c;
+ } d;
+#pragma pack /*/ */ () // C++ comment
+ int e;
+} s;
+
+int
+main ()
+{
+ if (sizeof (int) == 4 && sizeof (s) != 12)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/primary-expression-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/primary-expression-1.C
new file mode 100644
index 000000000..931ecd88a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/primary-expression-1.C
@@ -0,0 +1,58 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/717
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net
+// { dg-do compile }
+
+class _eAny
+{
+public:
+ _eAny(){}
+};
+
+template <class X>
+class _eSeq
+{
+public:
+ _eSeq(const X thing){}
+ int _oHash() {return 0;}
+ _eSeq<X > _oPlusPlus(const _eSeq<X > other) const
+ {
+ return *this;
+ }
+ _eSeq<X > take(const _eSeq<X > other) const
+ {
+ return *this;
+ }
+};
+
+
+template <class X>
+class _eHndl
+{
+public:
+ _eHndl(const _eAny *obj){}
+};
+
+class VarInstances : public _eAny
+{
+public:
+ VarInstances() : _eAny() {}
+};
+
+void testFunc(const VarInstances *testInstance)
+{
+ const _eSeq<_eHndl<VarInstances> > temp1 =
+ _eSeq<_eHndl<VarInstances> >(_eHndl<VarInstances>(testInstance));
+
+ if((_eSeq<_eHndl<VarInstances>
+ >(_eHndl<VarInstances>(testInstance))._oPlusPlus(temp1)._oHash() ==
+ 7))
+ {
+ return;
+ }
+}
+
+int main(int argc, char** argv)
+{
+ testFunc(new VarInstances());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem1.C
new file mode 100644
index 000000000..b1174c7d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem1.C
@@ -0,0 +1,10 @@
+struct A {
+ void f(int = 0) const;
+};
+
+typedef void (A::*PF)(int) const;
+
+void f()
+{
+ PF pf = &A::f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem2.C
new file mode 100644
index 000000000..bbc116e99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18782: ICE with ptr-to-member
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+namespace A {}
+
+int A::* p; // { dg-error "is a namespace" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem3.C
new file mode 100644
index 000000000..444f25cd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem3.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 19895: ICE on invalid
+
+
+template<typename> struct A
+{
+ int A<0>::* p; // { dg-error "(type/value mismatch)|(expected)" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem4.C
new file mode 100644
index 000000000..fea08f206
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem4.C
@@ -0,0 +1,4 @@
+// PR c++/26295
+
+namespace A {}
+int (A::*B)(); // { dg-error "namespace" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem5.C
new file mode 100644
index 000000000..1101ad9fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem5.C
@@ -0,0 +1,9 @@
+// PR c++/27806
+
+struct A {};
+
+void foo()
+{
+ p; // { dg-error "p" }
+ extern int A::* p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem6.C
new file mode 100644
index 000000000..6dac21cf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ptrmem6.C
@@ -0,0 +1,11 @@
+//PR C++/27805
+
+struct A;
+
+void foo()
+{
+ int A::* p;
+ A a; // { dg-error "incomplete type" }
+ a.*p;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/pure1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/pure1.C
new file mode 100644
index 000000000..2b6f28b7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/pure1.C
@@ -0,0 +1,11 @@
+// PR c++/28506
+
+struct A
+{
+ virtual void* foo() = 1; // { dg-error "pure" }
+};
+
+struct B
+{
+ void operator()()() = 1; // { dg-error "pure|function|initializer" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified1.C
new file mode 100644
index 000000000..6dfb87e17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified1.C
@@ -0,0 +1,14 @@
+struct A {};
+
+struct B : public A
+{
+ static void foo ();
+};
+
+template <typename T> struct C
+{
+ C() : f(B::foo) {}
+ void (*f)();
+};
+
+C<int> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified2.C
new file mode 100644
index 000000000..c582613c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified2.C
@@ -0,0 +1,4 @@
+namespace Glib {
+ template <typename> class Value {};
+ template <> class Glib::Value<int> {}; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified3.C
new file mode 100644
index 000000000..ab160ab8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified3.C
@@ -0,0 +1,8 @@
+// PR c++/18466
+
+int ::i; // { dg-error "" }
+void ::f(); // { dg-error "" }
+namespace N {
+ int N::j; // { dg-error "" }
+ void N::g(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified4.C
new file mode 100644
index 000000000..c827fcfe7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/qualified4.C
@@ -0,0 +1,6 @@
+// PR c++/16782
+// { dg-options "" }
+
+struct X {
+ void X::bar() {} // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/redef1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/redef1.C
new file mode 100644
index 000000000..0235ffb72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/redef1.C
@@ -0,0 +1,10 @@
+// { dg-options "" }
+// PR c++/16193
+
+# 1 "syshdr1.C"
+# 1 "syshdr1.h" 1 3
+// Redefinitions of built-in types are allowed in system headers so
+// that G++ will work with system headers that are not fully
+// C++-aware.
+typedef long wchar_t;
+# 2 "syshdr1.C" 2
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/redef2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/redef2.C
new file mode 100644
index 000000000..85c506445
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/redef2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+char * d [10]; // { dg-message "8: previous declaration as" }
+char e [15][10];
+int (*f)();
+
+int d; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual1.C
new file mode 100644
index 000000000..e3f60c09c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual1.C
@@ -0,0 +1,29 @@
+// PR c++/57068
+
+enum Enums {
+ Enum1 = 0x00000000,
+ Enum2 = 0x00000001
+};
+
+class Flags {
+public:
+ Flags() : i(0) {}
+ Flags(int i): i(i) {}
+ Flags operator&(Enums f) { return Flags(Enums(i & f)); }
+
+ operator bool() { return i; }
+private:
+ int i;
+};
+
+Flags windowState()
+{
+ return Flags();
+}
+
+int main()
+{
+ if (bool(windowState() & Enum1) == true)
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual2.C
new file mode 100644
index 000000000..a78597b0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref-qual2.C
@@ -0,0 +1,6 @@
+// PR c++/57532
+
+int main()
+{
+ return (int() & int());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref1.C
new file mode 100644
index 000000000..d1dffb067
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ref1.C
@@ -0,0 +1,17 @@
+// PR c++/6402
+// Origin: Wolfgang Bangerth <wolfgang@dealii.org>
+// { dg-do compile }
+
+class A
+{
+ A (const A&);
+ public:
+ A();
+};
+
+struct B { A a; };
+
+struct C : public B
+{
+ void foo() { const A &ref = B::a; } // taking reference, not a copy!
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/register1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/register1.C
new file mode 100644
index 000000000..3be2e6525
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/register1.C
@@ -0,0 +1,14 @@
+// PR c++/23839
+
+class C
+{
+ int i;
+public:
+ C(int j) : i(j) { }
+ operator int() { return i; }
+};
+
+C f (register C x)
+{
+ return x + 31;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/repo1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/repo1.C
new file mode 100644
index 000000000..efadd5872
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/repo1.C
@@ -0,0 +1,10 @@
+// { dg-options "-frepo" }
+// { dg-require-host-local "" }
+
+extern "C" inline void f() {}
+
+int main () {
+ f();
+}
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type1.C
new file mode 100644
index 000000000..a5dc93ab0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type1.C
@@ -0,0 +1,10 @@
+// PR c++/2738
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+// { dg-do compile }
+
+template <int i> class A
+{
+ class C { C(); };
+};
+
+template <int i> void A<i>::C::C () {} // { dg-error "return type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type2.C
new file mode 100644
index 000000000..35638c28a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type2.C
@@ -0,0 +1,10 @@
+struct S {} f(); // { dg-error "return" "err" }
+// { dg-message "note" "note" { target *-*-* } 1 }
+struct T {} *g(); // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 3 }
+struct U {} h() {} // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 5 }
+struct V {} *i() {} // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 7 }
+struct W {} (*p) (); // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type3.C
new file mode 100644
index 000000000..33ee31748
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/ret-type3.C
@@ -0,0 +1,8 @@
+// PR c++/21369
+
+struct bar;
+
+template <class T> struct bar *foo (T *p)
+{
+ return p->t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/saved1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/saved1.C
new file mode 100644
index 000000000..f7281088f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/saved1.C
@@ -0,0 +1,6 @@
+// Test that the parser doesn't go into an infinite loop from ignoring the
+// PRE_PARSED_FUNCTION_DECL token.
+
+class C { static void* operator new(size_t); }; // { dg-error "" "" }
+void* C::operator new(size_t) { return 0; } // { dg-error "" "" }
+class D { D(int i): integer(i){}}; // { dg-error "" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.C
new file mode 100644
index 000000000..22c1e86e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.C
@@ -0,0 +1,4 @@
+// PR c++/12479
+// { dg-options "-pedantic" }
+
+#include "semicolon1.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.h b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.h
new file mode 100644
index 000000000..0487fc783
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon1.h
@@ -0,0 +1,2 @@
+#pragma GCC system_header
+;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon2.C
new file mode 100644
index 000000000..d14a225a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon2.C
@@ -0,0 +1,9 @@
+// PR c++/45332
+// { dg-do compile }
+
+class C
+{
+ int x // { dg-error "at end of member declaration" }
+
+ const int foo() { return x; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon3.C
new file mode 100644
index 000000000..8a2b1ac46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon3.C
@@ -0,0 +1,260 @@
+// PR c++/45331
+// { dg-do compile }
+// { dg-options -std=c++98 }
+
+struct OK1
+{
+ int a;
+} // no complaints
+ *s5;
+
+struct OK2
+{
+ int a;
+} // no complaints
+ &s6 = *(new OK2());
+
+struct OK3
+{
+ int a;
+} // no complaints
+ (s7);
+
+__SIZE_TYPE__
+test_offsetof (void)
+{
+ // no complaints about a missing semicolon
+ return __builtin_offsetof (struct OK4 { int a; int b; }, b);
+}
+
+struct OK5
+{
+ int a;
+} ok5_var; // no complaints
+
+struct OK6
+{
+ int a;
+} static ok6_var; // no complaints
+
+class OK7
+{
+public:
+ OK7() { };
+ int a;
+} const ok7_var; // no complaints
+
+class OK8
+{
+ int a;
+} extern ok8_var; // no complaints
+
+class OK9
+{
+ class OK9sub { int a; } mutable ok9sub; // no complaints
+ int a;
+};
+
+int
+autotest (void)
+{
+ struct OK10 { int a; } auto ok10 = { 0 }; // no complaints
+
+ return ok10.a;
+}
+
+struct OK11
+{
+ int a;
+} // no complaints
+ const *ok11_var;
+
+struct OK12
+{
+ int a;
+} // no complaints
+ const &ok12_var = *(new OK12());
+
+struct OK13
+{
+ int a;
+} // no complaints
+ static *ok13_var;
+
+class OK14
+{
+ struct OK14sub
+ {
+ int a;
+ } // no complaints
+ static &ok14_var;
+};
+
+class OK15
+{
+ int a;
+} typedef tOK15;
+
+class OK16
+{
+ int a;
+} typedef *pOK16;
+
+class OK17
+{
+ int a;
+} typedef &rOK16;
+
+struct E1
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+typedef float BAR;
+
+struct E2
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+const int i0 = 1;
+
+struct E3
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+volatile long l0 = 1;
+
+struct E4
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+extern char c0;
+
+struct E5
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+static wchar_t wc0;
+
+struct E6
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+bool b0;
+
+class E7
+{
+ int a;
+} // { dg-error "after class definition" }
+
+extern double d0;
+
+class E8
+{
+ int a;
+} // { dg-error "after class definition" }
+
+inline short f(void)
+{
+ return 2;
+}
+
+class E9
+{
+ int a;
+} // { dg-error "after class definition" }
+
+class D0
+{
+ int a;
+};
+
+class E10
+{
+ int a;
+} // { dg-error "after class definition" }
+
+extern class D0 &f0 (void);
+
+class E11
+{
+ int a;
+} // { dg-error "after class definition" }
+
+const struct E6 *f1 (void) { return 0; }
+
+union U0 {
+ int i;
+ double d;
+};
+
+class E12
+{
+ int a;
+} // { dg-error "after class definition" }
+
+const union U0 *f2 (void) { return 0; }
+
+enum e {
+ U, V
+};
+
+class E13
+{
+ int a;
+} // { dg-error "after class definition" }
+
+static enum e f3 (void) { return U; }
+
+union E14
+{
+ int i;
+ double d;
+} // { dg-error "after union definition" }
+
+unsigned int i1 = 2;
+
+union E15
+{
+ int i;
+ double d;
+} // { dg-error "after union definition" }
+
+signed long l1 = 3;
+
+class E16
+{
+ class sub0 { int a; } // { dg-error "after class definition" }
+ virtual int f2 (void);
+} // { dg-error "after class definition" }
+
+class E17
+{
+ class sub0 { int a; } // { dg-error "after class definition" }
+ mutable int i;
+} // { dg-error "after class definition" }
+
+class E18
+{
+ int a;
+} // { dg-error "after class definition" }
+
+typedef int E18int;
+
+/* This was the original test from the PR. */
+
+class C0
+{
+public:
+ int a;
+} // { dg-error "after class definition" }
+
+const int foo(const C0 &x)
+{
+ return x.a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon4.C
new file mode 100644
index 000000000..adba7a873
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/semicolon4.C
@@ -0,0 +1,37 @@
+// PR c++/46890
+// { dg-do compile }
+
+struct OK1
+{
+ int i;
+} const *ok1_var; // No complains
+
+struct OK2;
+extern OK2 ok2a_var;
+
+struct OK2
+{
+ int i;
+} const &ok2_var = ok2a_var; // No complains
+
+struct OK3
+{
+ int i;
+} volatile (ok3_var); // No complains
+
+struct E1
+{
+ int i;
+} const; // { dg-error "qualifiers can only be specified for objects and functions" }
+
+void foo (
+struct E2
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} volatile);
+
+void bar (
+struct E3
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} const, int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/specialization1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/specialization1.C
new file mode 100644
index 000000000..8a47f1772
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/specialization1.C
@@ -0,0 +1,7 @@
+// PR c++/5723, PR c++/8522
+// Origin: Matthias Kleinmann, Peter Karl Mueller <peter.karl.mueller@gmx.de>
+// { dg-do compile }
+
+template <typename T> class A;
+template <typename T> class A<T>::B; // { dg-error "declaration" "err" }
+// { dg-warning "declaration" "warn" { target *-*-* } 6 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/stack1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/stack1.C
new file mode 100644
index 000000000..ac26e6006
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/stack1.C
@@ -0,0 +1,14 @@
+/* PR c/2161: parser stack overflow. */
+/* { dg-do compile } */
+
+#define ONE else if (0) { }
+#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE
+#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN
+#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN
+
+void foo()
+{
+ if (0) { }
+ /* 11,000 else if's. */
+ THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr1.C
new file mode 100644
index 000000000..4455398bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr1.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "" }
+
+int
+main (int argc, char **argv)
+{
+ int a = ({ 1 ? 0 : 1; });
+ return ({ argc > 1 ? 1 : 0; });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr2.C
new file mode 100644
index 000000000..44f7f85bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#define DMAX(a,b) ({double _a = (a), _b = (b); _a > _b ? _a : _b; })
+
+void foo(void)
+{
+ double xl, dy;
+ xl = DMAX(dy, 0.0);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr3.C
new file mode 100644
index 000000000..79f689316
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/stmtexpr3.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "" }
+
+struct B
+{
+ int a;
+ B() : a(({ 1; })) {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-1.C
new file mode 100644
index 000000000..6e0d93aad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-1.C
@@ -0,0 +1,4 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+template<typename T> struct T::A {}; // { dg-error "invalid class name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-2.C
new file mode 100644
index 000000000..b63045bf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-2.C
@@ -0,0 +1,7 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+template<typename T> struct A
+{
+ struct T::B {}; // { dg-error "invalid class name" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-3.C
new file mode 100644
index 000000000..8e73ce4f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-3.C
@@ -0,0 +1,10 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+struct A
+{
+ struct B;
+ typedef B C;
+};
+
+struct A::C {}; // { dg-error "invalid class name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-4.C
new file mode 100644
index 000000000..6d01f3e88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-4.C
@@ -0,0 +1,13 @@
+/* PR c/35437 */
+/* { dg-do compile } */
+
+struct A
+{
+ int i;
+ struct A a; /* { dg-error "has incomplete type" } */
+};
+
+void foo()
+{
+ struct A b = { 0 };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-5.C
new file mode 100644
index 000000000..4cd1b5d33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-5.C
@@ -0,0 +1,3 @@
+// PR c++/55368
+
+struct A { struct B *C,; }; // { dg-error "stray" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-as-enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-as-enum1.C
new file mode 100644
index 000000000..a6cb6b592
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/struct-as-enum1.C
@@ -0,0 +1,10 @@
+// PR c++/163, PR c++/8595
+// Origin: <martin@loewis.home.cs.tu-berlin.de>, Mark Leone <mleone@pixar.com>
+// { dg-do compile }
+
+namespace N
+{
+ struct A {}; // { dg-message "previous declaration" }
+}
+
+typedef enum N::A B; // { dg-error "enum|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template1.C
new file mode 100644
index 000000000..d7bbb073f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template1.C
@@ -0,0 +1,11 @@
+struct CPU {
+ typedef int (*pfun)();
+
+ template <pfun step1>
+ static int dispatch();
+};
+
+template<int>
+static int foo();
+
+template int CPU::dispatch<&template foo<2> > (); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template10.C
new file mode 100644
index 000000000..d5dec6ed1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template10.C
@@ -0,0 +1,15 @@
+// PR c++/9486
+// Origin: John Levon <levon@movementarian.org>
+// { dg-do compile }
+
+template <typename> struct A
+{
+ template <typename T> void foo(T);
+};
+
+template <typename T> void bar()
+{
+ A<void>().template foo<T>(0);
+}
+
+template void bar<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template11.C
new file mode 100644
index 000000000..e651a3bd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template11.C
@@ -0,0 +1,15 @@
+// PR c++/9488
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+struct A
+{
+ template <typename> void foo() {}
+};
+
+template <typename T> struct B
+{
+ void bar() { A().foo<T>(); }
+};
+
+template struct B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template12.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template12.C
new file mode 100644
index 000000000..ba375bc43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template12.C
@@ -0,0 +1,10 @@
+template <int J>
+struct A {
+};
+
+struct B {
+ template <int I>
+ struct C : public A<I> {};
+
+ typedef double I;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template13.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template13.C
new file mode 100644
index 000000000..b1c03690b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template13.C
@@ -0,0 +1,10 @@
+// PR c++/14002
+
+template <typename T> void foo (T x) { x; }
+
+void bar() { foo(0); }
+
+struct A
+{
+ friend void foo<int> (int);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template14.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template14.C
new file mode 100644
index 000000000..ada875243
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template14.C
@@ -0,0 +1,17 @@
+// PR c++/14550
+
+struct A {
+ A();
+};
+
+template <int> void foo()
+{
+ A *p = new A;
+}
+
+void bar()
+{
+ foo<0>();
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template15.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template15.C
new file mode 100644
index 000000000..ce2d13036
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template15.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// Contributed by: Peter Schmid
+// <schmid at snake dot iap dot physik dot tu-darmstadt dot de>
+// PR c++/14545: constructor calls are not integer constant expressions
+
+struct A1 { A1(); };
+struct A2 { };
+
+template <class T>
+struct B
+{
+ void foo() {
+ A1();
+ A1 a1 = A1();
+
+ A2();
+ A2 a2 = A2();
+
+ int();
+ int a3 = int();
+ float();
+ float a4 = float();
+ }
+};
+
+template struct B<void>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template16.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template16.C
new file mode 100644
index 000000000..bc41b0f45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template16.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 May 2005 <nathan@codesourcery.com>
+
+// Origin:Volker Reichelt reichelt@gcc.gnu.org
+// PR 21681. ICE with inappropriate access check.
+
+template<int X> struct A;
+
+struct B
+{
+ template<int N> void foo()
+ {
+ A<N>::X::Y;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template17.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template17.C
new file mode 100644
index 000000000..ade598d39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template17.C
@@ -0,0 +1,13 @@
+// PR c++/23841
+
+template <int I>
+struct S
+{
+ int f(int i = I) { return i; }
+};
+
+void
+g ()
+{
+ S<(int)0.> a2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template18.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template18.C
new file mode 100644
index 000000000..4c2d2e7fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template18.C
@@ -0,0 +1,52 @@
+// PR c++/22173
+
+struct A
+{
+ static void a1();
+ template <typename T>
+ static void b1(T);
+ template <int I>
+ struct B {
+ static void b1();
+ template <typename T>
+ static void b2(T);
+ };
+ struct C {
+ static void c1();
+ };
+};
+
+template<int I> void f1()
+{
+ A* p;
+ A::template a1(); // { dg-error "template" }
+ A::template b1(0);
+ p->template a1(); // { dg-error "template" }
+ p->template b1('a');
+
+ A::template B<0>::b1();
+ A::template B<0>::template b1(); // { dg-error "template" }
+ A::template B<0>::template b2(0);
+ A::template B<0>::template b2<double>(0);
+
+ // Because B<I> is dependent, none of these are errors, as this
+ // function is not instantiated.
+ A::template B<I>::b1();
+ A::template B<I>::template b1();
+ A::template B<I>::template b2(0);
+ A::template B<I>::template b2<double>(0);
+
+ A::template C::c1(); // { dg-error "template" }
+}
+
+template<int I> void f2()
+{
+ // These are copies of lines from f1, but this function is
+ // instantiated, so we should get errors here.
+ A::template B<I>::b1();
+ A::template B<I>::template b1(); // { dg-error "template" }
+ A::template B<I>::template b2(0);
+ A::template B<I>::template b2<double>(0);
+}
+
+template void f2<0>(); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template19.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template19.C
new file mode 100644
index 000000000..dc1a67334
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template19.C
@@ -0,0 +1,11 @@
+// PR c++/26558
+// Origin: Jan Gorski <slimak@yk74.internetdsl.tpnet.pl>
+// { dg-do compile }
+
+template<int> struct A
+{
+ template<int> void foo()
+ {
+ foo<0>::; // { dg-error "before" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template2.C
new file mode 100644
index 000000000..6689c8bfa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template2.C
@@ -0,0 +1,7 @@
+namespace N {
+ template < typename T > class C : T {};
+}
+
+int main() {
+ N::C(); // { dg-error "template" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template20.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template20.C
new file mode 100644
index 000000000..2705f4629
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template20.C
@@ -0,0 +1,7 @@
+// PR c++/28858
+// { dg-do compile }
+
+template<int N struct A; // { dg-error "before" }
+
+bool i = 1 > 0; // { dg-bogus "" }
+int j = i; // { dg-bogus "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template21.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template21.C
new file mode 100644
index 000000000..af2194cb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template21.C
@@ -0,0 +1,5 @@
+// PR c++/28211
+
+template <const int*> class Helper { };
+const int foo = 0;
+typedef Helper<&foo> HelperType; // { dg-error "linkage|type" "" { target { ! c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template22.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template22.C
new file mode 100644
index 000000000..c93375685
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template22.C
@@ -0,0 +1,5 @@
+/* PR c++/29731. This used to ICE in uses_template_parms. */
+
+template<int> struct A {};
+
+A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template23.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template23.C
new file mode 100644
index 000000000..9f76d0ddf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template23.C
@@ -0,0 +1,10 @@
+/* PR c++/30895 This used to ICE. */
+/* { dg-do compile } */
+
+template<int> struct A {};
+
+template<typename T> struct B
+{
+ A<T(0i)> a1; /* { dg-error "imaginary constants are a GCC extension|literal operator" } */
+ A<T(0i)> a2; /* { dg-error "imaginary constants are a GCC extension|literal operator" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template24.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template24.C
new file mode 100644
index 000000000..33d9d4cfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template24.C
@@ -0,0 +1,8 @@
+/* PR c++/29731. This used to ICE in uses_template_parms. */
+
+template<int> struct A {};
+
+void foo()
+{
+ A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template25.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template25.C
new file mode 100644
index 000000000..03017ab3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template25.C
@@ -0,0 +1,13 @@
+// PR c++/22318. Improve diagnostic for local template declaration.
+// { dg-do compile }
+void f(void)
+{
+ template<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */
+ {
+ };
+}
+
+void g(void)
+{
+ template f<int>(); /* { dg-error "expected primary-expression" "primary-expression" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template26.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template26.C
new file mode 100644
index 000000000..aab9763cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template26.C
@@ -0,0 +1,18 @@
+// PR c++/50864
+
+namespace impl
+{
+ template <class T> T create();
+}
+
+template <class T, class U, __SIZE_TYPE__
+ = sizeof(impl::create<T>()->*impl::create<U>())>
+struct foo1;
+
+template <class T, class U, __SIZE_TYPE__
+ = sizeof(impl::create<T>()->impl::create<U>())> // { dg-error "not a class member" }
+struct foo2;
+
+template <class T, class U, __SIZE_TYPE__
+ = sizeof(impl::create<T>().impl::create<U>())> // { dg-error "not a class member" }
+struct foo3;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template27.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template27.C
new file mode 100644
index 000000000..8eee471ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template27.C
@@ -0,0 +1,12 @@
+// PR c++/53563
+
+template<class T>
+struct s
+{
+ template<class U>
+ s(){}
+};
+
+int main() {
+ struct s<void>::s<int> a; // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template3.C
new file mode 100644
index 000000000..d10d46d81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template3.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9403. We failed to parse template keyword, and we accepted code
+// which required one.
+
+template<bool> struct Outer;
+
+template <bool b, typename T>
+struct X : Outer<b>::template Inner<T>
+{};
+
+template <bool b, typename T>
+struct Y : Outer<b>::Inner<T> {}; // { dg-error "used as template" "temp" }
+// { dg-error "expected" "exp" { target *-*-* } 16 }
+// { dg-message "note" "note" { target *-*-* } 16 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template4.C
new file mode 100644
index 000000000..11f11d535
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template4.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 32 Jan 2003 <nathan@codesourcery.com>
+
+// PR 795. fields are not necessarily a dependent type.
+
+struct V
+{
+ template<typename T> T get ();
+};
+
+struct L
+{
+ V v;
+
+ template<typename T> T at (int i)
+ {
+ return v.get<T> ();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template5.C
new file mode 100644
index 000000000..adc598672
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com>
+
+// PR 3902. More type/decl confusion.
+
+template <class T>
+struct S
+{
+ S foo (T (T));
+ S foo (T(const T&));
+};
+
+int main ()
+{
+ S<int> (S<int>::*pf1)(int (int)) = &S<int>::foo;
+ S<int> (S<int>::*pf2)(int (const int&)) = &S<int>::foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template6.C
new file mode 100644
index 000000000..a83c313d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template6.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Wolfgang Bangerth <bangerth@ticam.utexas.edu> 20 Feb 2003.
+
+// PR c++/9778. Ensure templated functions in other namespaces are
+// correctly instantiated.
+
+namespace NS {
+ template <int N> void foo ();
+}
+
+template <int N> struct X {
+ int m;
+ void g () {
+ NS::foo<sizeof(m)>();
+ }
+};
+
+template class X<2>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template7.C
new file mode 100644
index 000000000..930e259fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template7.C
@@ -0,0 +1,6 @@
+// { dg-options -std=c++98 }
+
+template <int I>
+void f(); // { dg-message "note" }
+
+void g() { f<(3, 2)>(); } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template8.C
new file mode 100644
index 000000000..e4af7eea3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template8.C
@@ -0,0 +1,16 @@
+namespace N
+{
+
+template <typename> struct A
+{
+ template <typename T> A(A<T>);
+};
+
+}
+
+void foo(N::A<int>);
+
+void bar()
+{
+ foo(N::A); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/template9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/template9.C
new file mode 100644
index 000000000..17b7da91f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/template9.C
@@ -0,0 +1,6 @@
+template <typename T>
+void f() {
+ g(); // { dg-error "must be available" "err" }
+ // { dg-message "note" "note" { target *-*-* } 3 }
+ h(3); // { dg-error "must be available" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
new file mode 100644
index 000000000..b628f9972
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
@@ -0,0 +1,10 @@
+// PR c++/3792
+// Origin: <david.abrahams@rcn.com>
+// { dg-do compile }
+
+struct X
+{
+ template <int i> struct Y {};
+};
+
+typedef X::template Y<0> y; // { dg-error "template|invalid" "" { target { ! c++11 } } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside2.C
new file mode 100644
index 000000000..21f1ac04f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-outside2.C
@@ -0,0 +1,19 @@
+// PR c++/50080
+
+template <typename T>
+struct A
+{
+ template <typename U>
+ struct B {};
+};
+
+template <typename T>
+void test()
+{
+ typename A<T>::template B<int> b;
+}
+
+int main()
+{
+ typename A<double>::template B<int> b; // { dg-error "template|expected" "" { target { ! c++11 } } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C
new file mode 100644
index 000000000..dcf2852d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C
@@ -0,0 +1,20 @@
+// PR c++/8857
+// Origin: Martin v. Loewis <loewis@informatik.hu-berlin.de>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> operator U() { return sizeof(U); }
+};
+
+template <typename T> struct B
+{
+ template <template <typename U> class X> operator X<double>() { return X<double>(); }
+};
+
+int main()
+{
+ A<double> a;
+ B<long> b;
+ a = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C
new file mode 100644
index 000000000..1fec1af42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C
@@ -0,0 +1,14 @@
+// PR c++/7259
+// Origin: Philipp Buettgenbach <P.Buettgenbach@FH-Wolfenbuettel.DE>
+// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template <template <int> class T> class A : public T<0> {};
+
+template <typename> struct B
+{
+ template <int> class C {};
+ typedef A<C> D;
+};
+
+B<void>::D d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C
new file mode 100644
index 000000000..4d98e7546
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C
@@ -0,0 +1,11 @@
+// PR c++/9229
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename T> class A // { dg-error "" }
+{
+ struct B;
+ template <typename U> friend typename A<U,void>::B foo(); // { dg-error "" }
+};
+
+template class A<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/try-catch-1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/try-catch-1.C
new file mode 100644
index 000000000..e4ed1ad8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/try-catch-1.C
@@ -0,0 +1,14 @@
+// Test case from: <ncm-nospam@cantrip.org>
+// Reduced by <bangerth@dealii.org>
+// The problem was that g++ was ICE because
+// it was deferring an NULL pointer because
+// it should have been taking the operand 1
+// instead of the chain in finish_fname_decls.
+
+
+void fun()
+try
+{
+ __FUNCTION__;
+}
+catch (...) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef1.C
new file mode 100644
index 000000000..4d6f5b4fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef1.C
@@ -0,0 +1,3 @@
+// PR c++/6477
+typedef struct A_ *A; // { dg-message "previous declaration" }
+typedef struct A B; // { dg-error "typedef|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef2.C
new file mode 100644
index 000000000..3ae347d75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef2.C
@@ -0,0 +1,3 @@
+template <typename T> struct B { typedef typename T::X X; };
+template <typename T> struct A { typedef B<T>::X::Y Z; }; // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef3.C
new file mode 100644
index 000000000..3f6a7cb91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef3.C
@@ -0,0 +1,7 @@
+// PR c++/3004
+// Origin: Travis J.I. Corcoran <tjic@permabit.com>
+// { dg-do compile }
+
+struct A { typedef A* Ptr; }; // { dg-message "previous declaration" }
+
+struct A::Ptr; // { dg-error "typedef|not declare anything" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef4.C
new file mode 100644
index 000000000..d4cec7f9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef4.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Matt Austern <austern@apple.com>
+
+// PR c++/7983: ICE typedef to typename as friend.
+
+template<class T> class smart_ptr2 {
+ T* real_ptr;
+ public:
+ typedef typename T::subT td; // { dg-message "previous declaration" }
+ friend class td; // { dg-error "typedef|not name a class" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef5.C
new file mode 100644
index 000000000..ecd1d513e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef5.C
@@ -0,0 +1,6 @@
+namespace A
+{
+ typedef int T; // { dg-message "previous declaration" }
+}
+
+class A::T x; // { dg-error "using typedef-name|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef6.C
new file mode 100644
index 000000000..d3a39fc85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef6.C
@@ -0,0 +1,6 @@
+// PR c++/14667
+
+template<class T>
+class Class1;
+
+class Class2 {} typedef Class1<Class2> Type1; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef7.C
new file mode 100644
index 000000000..126fb7ed8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef7.C
@@ -0,0 +1,2 @@
+// PR c++/18285
+typedef void int char void double X; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef8.C
new file mode 100644
index 000000000..4c1823e87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef8.C
@@ -0,0 +1,11 @@
+//PR c++ 29024
+
+typedef static int a; // { dg-error "conflicting" }
+typedef register int b; // { dg-error "conflicting" }
+typedef extern int c; // { dg-error "conflicting" }
+static typedef int a; // { dg-error "conflicting" }
+
+int foo()
+{
+ typedef auto int bar; // { dg-error "conflicting|two or more data types" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef9.C
new file mode 100644
index 000000000..7788f781f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typedef9.C
@@ -0,0 +1,8 @@
+// PR c++/38794
+// { dg-do compile }
+
+typedef void foo () {} // { dg-error "invalid function declaration" }
+struct S
+{
+ typedef int bar (void) { return 0; } // { dg-error "invalid member function declaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename1.C
new file mode 100644
index 000000000..2af84e3d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename1.C
@@ -0,0 +1,5 @@
+template <class baz>
+struct bar
+{
+ typedef typename baz::typename rebind<int> foo; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename10.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename10.C
new file mode 100644
index 000000000..64d6ae8c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename10.C
@@ -0,0 +1,8 @@
+// PR c++/19253
+
+namespace N { struct X; }
+
+template<typename> struct A
+{
+ A<typename N::X x> a; // { dg-error "invalid" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename11.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename11.C
new file mode 100644
index 000000000..bbaaec72b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename11.C
@@ -0,0 +1,16 @@
+// PR c++/11987
+
+template <int dim> struct X {
+ struct I { I(); };
+};
+
+template <int dim> struct Y : X<dim> {
+ typedef typename X<dim>::I I;
+};
+
+// note: I is nested type in X, not Y!
+template <int dim>
+Y<dim>::I::I () {} // { dg-error "dependent typedef" "typedef" }
+// { dg-error "no type|dependent type" "no type" { target *-*-* } 13 }
+
+template struct Y<1>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename2.C
new file mode 100644
index 000000000..8878497ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename2.C
@@ -0,0 +1,17 @@
+template<class T, class U>
+struct UnaryReturn {
+ typedef T Type_t;
+};
+
+struct foo
+{
+ template <class T>
+ typename UnaryReturn<T, int>::Type_t
+ bar();
+};
+
+template<class T>
+struct UnaryReturn<T, int> {
+ typedef bool Type_t;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename3.C
new file mode 100644
index 000000000..ce6ecbef8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename3.C
@@ -0,0 +1,8 @@
+template <typename T>
+struct D2 : public T::B {
+ typedef typename T::X::Y Y;
+
+ void f () {
+ Y::f ();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename4.C
new file mode 100644
index 000000000..529889df6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename4.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+
+// PR c++/9364: ICE processing typename with name error.
+
+void find(typename int&); // { dg-error "typename|void|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename5.C
new file mode 100644
index 000000000..36647519f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename5.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10553: ICE processing typename with context error.
+
+template <typename> struct A {};
+
+template <typename> struct B
+{
+ typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename6.C
new file mode 100644
index 000000000..dc458bee5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename6.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Contributed by Matt Austern <austern at apple dot com>
+// PR c++/13407: Gracefully handle keyword typename in base class specifier.
+
+struct A { };
+struct B { typedef A Type; };
+
+template <typename T>
+struct X :
+ public typename T::Type // { dg-error "not allowed in this context" }
+{ };
+
+X<B> x;
+
+struct C :
+ public typename A // { dg-error "not allowed outside of templates" }
+{ };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename7.C
new file mode 100644
index 000000000..e49a1ec39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename7.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and
+// Alexandre Oliva <aoliva@redhat.com>
+
+// PR c++/18757: ICE in get_innermost_template_args
+
+struct A
+{
+ template<typename> void foo(int);
+ template<typename T> void bar(T t) {
+ this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+ template<typename T> void bad(T t) {
+ foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+};
+
+template <typename T>
+struct B
+{
+ void bar(T t) {
+ A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+ void bad(T t) {
+ B<typename T>::bar(t); } // { dg-error "invalid|qualified-id|not a template" }
+};
+
+void baz()
+{
+ A().bar(0);
+ A().bad(0);
+ B<int>().bar(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename8.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename8.C
new file mode 100644
index 000000000..e8e762709
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename8.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com>
+
+// PR 23797:ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// { dg-options "-fpermissive -w" }
+
+struct A { typedef int X; };
+
+int i = typename A::X();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typename9.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename9.C
new file mode 100644
index 000000000..8d7707219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typename9.C
@@ -0,0 +1,6 @@
+// check that using a qualified name with a typename does
+// not report an error.
+
+struct A { typedef int X; };
+
+int i = typename A::X();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/typespec1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/typespec1.C
new file mode 100644
index 000000000..44ee116f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/typespec1.C
@@ -0,0 +1,4 @@
+// PR c++/26571
+
+struct A {};
+unsigned A a; // { dg-error "expected initializer" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined1.C
new file mode 100644
index 000000000..0ae4e8877
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined1.C
@@ -0,0 +1,10 @@
+// PR c++/8143
+// { dg-do compile }
+
+struct foo
+{
+ X x; // { dg-error "" }
+
+ foo(X) {} // { dg-error "" }
+ foo(X y, int) : x() {} // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined2.C
new file mode 100644
index 000000000..a7e76f1b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined2.C
@@ -0,0 +1,12 @@
+// PR c++/9173
+// Origin: <wwieser@gmx.de>
+// { dg-do compile }
+
+class A {};
+
+class B
+{
+ void foo(int,A::X); // { dg-error "" }
+};
+
+void B::foo(int,A::X) {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined3.C
new file mode 100644
index 000000000..6bafd6fc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined3.C
@@ -0,0 +1,6 @@
+// PR c++/5657
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> struct A { A(B); };
+template<typename T> A<T>::A(B) {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined4.C
new file mode 100644
index 000000000..0bdc188d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined4.C
@@ -0,0 +1,11 @@
+// PR c++/5665
+// Origin: Bergur Ragnarsson <bergur@tern.is>
+// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> class A
+{
+ class B { X foo(); }; // { dg-error "" }
+};
+
+template<typename T> X A<T>::B::foo() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined5.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined5.C
new file mode 100644
index 000000000..f1dba6e48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined5.C
@@ -0,0 +1,5 @@
+// PR c++/5975
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+typedef typename X::Y<> y; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined6.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined6.C
new file mode 100644
index 000000000..bc8a86d15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined6.C
@@ -0,0 +1,6 @@
+// PR c++/8596
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int i> struct A {};
+template <int i> struct B : A<x>{}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined7.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined7.C
new file mode 100644
index 000000000..1a525fc65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/undefined7.C
@@ -0,0 +1,5 @@
+// PR c++/9228
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename T> typename A<T>::B foo() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed1.C
new file mode 100644
index 000000000..f5972f11b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed1.C
@@ -0,0 +1,6 @@
+// 9.4.2/4: Unnamed classes and classes contained directly or indirectly
+// within unnamed classes shall not contain static data members.
+
+typedef struct { // { dg-message "unnamed" }
+ static int i; // { dg-error "static data member" }
+} A;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed2.C
new file mode 100644
index 000000000..d2b96f896
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/unnamed2.C
@@ -0,0 +1,6 @@
+// PR c++/30301
+
+template<int T> struct A
+{
+ union { static int i; }; // { dg-error "static data.*unnamed" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/using1.C
new file mode 100644
index 000000000..efe7a0e31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/using1.C
@@ -0,0 +1 @@
+namespace A { using ::B; } // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/using2.C
new file mode 100644
index 000000000..bfdb09f88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/using2.C
@@ -0,0 +1,8 @@
+namespace N {
+ template <typename T>
+ struct foo {};
+}
+
+int main() {
+ using N::foo<double>; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/using3.C
new file mode 100644
index 000000000..c266b68ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/using3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com>
+// Origin: stefaandr@hotmail.com
+
+// PR c++/11794. Using decl in nested classes of a template class
+
+template <typename T> struct a
+{
+ struct a1: T
+ {
+ using T::aa;
+
+ a1() { aa = 5; }
+ };
+};
+struct b { int aa; };
+template <> struct a<int>::a1 { a1 () {} };
+
+a<b>::a1 a_b;
+a<int>::a1 a_i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/using4.C
new file mode 100644
index 000000000..2abe399f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/using4.C
@@ -0,0 +1,20 @@
+// PR c++/58457
+
+struct allocator
+{
+ void operator delete (void*);
+ void* operator new (__SIZE_TYPE__, void*);
+};
+
+struct type : public allocator
+{
+ type() {}
+ using allocator::operator new;
+ using allocator::operator delete;
+};
+
+int main()
+{
+ new (0) type;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/varmod1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/varmod1.C
new file mode 100644
index 000000000..d64f04b78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/varmod1.C
@@ -0,0 +1,7 @@
+int main(int argc, char** argv) {
+ int nx = 2;
+ void theerror(double a[][nx+1]); // { dg-message "" }
+ double** a;
+ theerror(a);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/parse/wrong-inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/parse/wrong-inline1.C
new file mode 100644
index 000000000..22b9a9768
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/parse/wrong-inline1.C
@@ -0,0 +1,12 @@
+// PR c++/5921
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+struct A
+{
+ struct B { B(); };
+};
+
+static A::B b;
+
+inline template <int i> void f (); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.C
new file mode 100644
index 000000000..a8935ed26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.C
@@ -0,0 +1,15 @@
+// PR c++/36852
+
+#include "array-1.H"
+
+template <class T>
+T
+A::foo (T t[3][3])
+{
+ return t[0][1];
+}
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.Hs
new file mode 100644
index 000000000..fb44b675e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/array-1.Hs
@@ -0,0 +1,4 @@
+struct A
+{
+ template <class T> static T foo (T[3][3]);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.C
new file mode 100644
index 000000000..92b3cbcdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.C
@@ -0,0 +1,5 @@
+#include "empty.H"
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.Hs
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/empty.Hs
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.C
new file mode 100644
index 000000000..26ffb50a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.C
@@ -0,0 +1,6 @@
+#include "externc-1.H"
+
+template <typename X> struct foo
+{
+ X y;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.Hs
new file mode 100644
index 000000000..21aaf7436
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/externc-1.Hs
@@ -0,0 +1 @@
+#include <stddef.h>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.C
new file mode 100644
index 000000000..75847e5c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.C
@@ -0,0 +1,6 @@
+#include "local-1.H"
+int main()
+{
+ func<int> ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.Hs
new file mode 100644
index 000000000..56a6c7e47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/local-1.Hs
@@ -0,0 +1,7 @@
+template<typename T> void func()
+{
+ struct object
+ {
+ object() {}
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.C
new file mode 100644
index 000000000..9483efad0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.C
@@ -0,0 +1,9 @@
+// { dg-options "-save-temps -fpch-preprocess -I." }
+
+#include "pch.H"
+int main()
+{
+ return 0;
+}
+
+// { dg-final { cleanup-saved-temps ".s" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.Hs
new file mode 100644
index 000000000..4bd8276f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.Hs
@@ -0,0 +1 @@
+// empty file
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.exp b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.exp
new file mode 100644
index 000000000..dd7466354
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/pch.exp
@@ -0,0 +1,41 @@
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite for precompiled header interaction,
+# that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib "g++-dg.exp"
+load_lib dg-pch.exp
+
+# Initialize `dg'.
+dg-init
+pch-init
+
+set old_dg_do_what_default "${dg-do-what-default}"
+
+# Main loop.
+foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
+ # We don't try to use the loop-optimizing options, since they are highly
+ # unlikely to make any difference to PCH.
+ dg-pch $subdir $test [list "-g" "-O2 -g" "-O2"] ".H"
+}
+
+set dg-do-what-default "$old_dg_do_what_default"
+
+# All done.
+pch-finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.C
new file mode 100644
index 000000000..21e778982
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.C
@@ -0,0 +1,10 @@
+#include "static-1.H"
+int LocalStaticTest()
+{
+ static A sa;
+}
+
+int main(int argc, char **argv)
+{
+ A::StaticTest();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.Hs
new file mode 100644
index 000000000..d277b787b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/static-1.Hs
@@ -0,0 +1,13 @@
+class A
+{
+public:
+ int val;
+
+ ~A() {
+ int i = 2;
+ }
+
+ static void StaticTest() {
+ static A a;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.C
new file mode 100644
index 000000000..72bea3c9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.C
@@ -0,0 +1,7 @@
+#include "system-1.H"
+
+int main()
+{
+ std::cout << "hello world!" << '\n';
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.Hs
new file mode 100644
index 000000000..604782e4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-1.Hs
@@ -0,0 +1 @@
+#include <iostream>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.C
new file mode 100644
index 000000000..44f3ec018
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.C
@@ -0,0 +1,7 @@
+#include "system-2.H"
+
+int main()
+{
+ std::cout << "hello world!" << std::endl;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.Hs
new file mode 100644
index 000000000..13c79d104
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/system-2.Hs
@@ -0,0 +1,2 @@
+#include <iostream>
+#include <string>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.C
new file mode 100644
index 000000000..c1718a991
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.C
@@ -0,0 +1,8 @@
+// PR c++/28217
+
+#include "template-1.H"
+
+int
+main (void)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.Hs
new file mode 100644
index 000000000..afdb13f08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/template-1.Hs
@@ -0,0 +1,5 @@
+template<int> struct A
+{
+ enum { a, b = a };
+ void foo(A<b>);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.C
new file mode 100644
index 000000000..b7cd8bfc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.C
@@ -0,0 +1,8 @@
+#include "uninst.H"
+
+template <class Type> void FOO() { }
+
+int main() {
+ FOO<char>(); // stage 2 needs this
+ return min<unsigned long>(5, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.Hs
new file mode 100644
index 000000000..2f2b6dd3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/uninst.Hs
@@ -0,0 +1,2 @@
+#include <bits/stl_algobase.h>
+using namespace std;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.C
new file mode 100644
index 000000000..6cb5fe15e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.C
@@ -0,0 +1 @@
+#include "wchar-1.H"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.Hs b/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.Hs
new file mode 100644
index 000000000..431908b88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pch/wchar-1.Hs
@@ -0,0 +1,2 @@
+#include <stddef.h>
+const wchar_t test_var[] = L"wide string";
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C
new file mode 100644
index 000000000..1ca321d1f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C
@@ -0,0 +1,16 @@
+// { dg-warning "Callback to register attributes" "" { target *-*-* } 0 }
+
+void normal_func (char c, char c2);
+void normal_func (char __attribute__((user("param"))) c, char);
+void normal_func (char c, char __attribute__((user("param"))) c2)
+{
+} // { dg-warning "attribute 'user' on param 'c' of function normal_func" }
+// { dg-warning "attribute 'user' on param 'c2' of function normal_func" "" { target *-*-* } 7 }
+
+class Foo {
+ void method (char __attribute__((user("param"))) c);
+};
+
+void Foo::method(char c)
+{
+} // { dg-warning "attribute 'user' on param 'c' of function method" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin.c
new file mode 100644
index 000000000..8de5f44cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/attribute_plugin.c
@@ -0,0 +1,71 @@
+/* Demonstrates how to add custom attributes */
+
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "toplev.h"
+#include "plugin.h"
+#include "diagnostic.h"
+
+int plugin_is_GPL_compatible;
+
+/* Attribute handler callback */
+
+static tree
+handle_user_attribute (tree *node, tree name, tree args,
+ int flags, bool *no_add_attrs)
+{
+ return NULL_TREE;
+}
+
+/* Attribute definition */
+
+static struct attribute_spec user_attr =
+ { "user", 1, 1, false, false, false, handle_user_attribute, false };
+
+/* Plugin callback called during attribute registration */
+
+static void
+register_attributes (void *event_data, void *data)
+{
+ warning (0, G_("Callback to register attributes"));
+ register_attribute (&user_attr);
+}
+
+/* Callback function to invoke before the function body is genericized. */
+
+void
+handle_pre_generic (void *event_data, void *data)
+{
+ tree fndecl = (tree) event_data;
+ tree arg;
+ for (arg = DECL_ARGUMENTS(fndecl); arg; arg = DECL_CHAIN (arg)) {
+ tree attr;
+ for (attr = DECL_ATTRIBUTES (arg); attr; attr = TREE_CHAIN (attr)) {
+ tree attrname = TREE_PURPOSE (attr);
+ tree attrargs = TREE_VALUE (attr);
+ warning (0, G_("attribute '%s' on param '%s' of function %s"),
+ IDENTIFIER_POINTER (attrname),
+ IDENTIFIER_POINTER (DECL_NAME (arg)),
+ IDENTIFIER_POINTER (DECL_NAME (fndecl))
+ );
+ }
+ }
+}
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ const char *plugin_name = plugin_info->base_name;
+ register_callback (plugin_name, PLUGIN_PRE_GENERICIZE,
+ handle_pre_generic, NULL);
+
+ register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl-plugin-test.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl-plugin-test.C
new file mode 100644
index 000000000..08a2ff2aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl-plugin-test.C
@@ -0,0 +1,30 @@
+extern int global; // { dg-warning "Decl Global global" }
+int global_array[] = { 1, 2, 3 }; // { dg-warning "Decl Global global_array" }
+
+int takes_args(int arg1, int arg2)
+{
+ int local = arg1 + arg2 + global; // { dg-warning "Decl Local local" }
+ return local + 1;
+}
+
+int global = 12; // { dg-warning "Decl Global global" }
+
+struct test_str {
+ int field; // { dg-warning "Decl Field field" }
+};
+
+class test_class {
+ int class_field1; // { dg-warning "Decl Field class_field1" }
+ int class_field2; // { dg-warning "Decl Field class_field2" }
+
+ test_class() // { dg-warning "Decl Function test_class" }
+ : class_field1(0), class_field2(0)
+ {}
+
+ void swap_fields(int bias) // { dg-warning "Decl Function swap_fields" }
+ {
+ int temp = class_field1 + bias; // { dg-warning "Decl Local temp" }
+ class_field1 = class_field2 - bias;
+ class_field2 = temp;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c
new file mode 100644
index 000000000..d44c8f9d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c
@@ -0,0 +1,52 @@
+/* A plugin example that shows which declarations are caught by FINISH_DECL */
+
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "diagnostic.h"
+
+int plugin_is_GPL_compatible;
+
+/* Callback function to invoke after GCC finishes a declaration. */
+
+void plugin_finish_decl (void *event_data, void *data)
+{
+ tree decl = (tree) event_data;
+
+ const char *kind = NULL;
+ switch (TREE_CODE(decl)) {
+ case FUNCTION_DECL:
+ kind = "Function"; break;
+ case PARM_DECL:
+ kind = "Parameter"; break;
+ case VAR_DECL:
+ if (DECL_FILE_SCOPE_P(decl))
+ kind = "Global";
+ else
+ kind = "Local";
+ break;
+ case FIELD_DECL:
+ kind = "Field"; break;
+ default:
+ kind = "Unknown";
+ }
+
+ warning (0, G_("Decl %s %s"),
+ kind, IDENTIFIER_POINTER (DECL_NAME (decl)));
+}
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ const char *plugin_name = plugin_info->base_name;
+
+ register_callback (plugin_name, PLUGIN_FINISH_DECL,
+ plugin_finish_decl, NULL);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C
new file mode 100644
index 000000000..70101c868
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C
@@ -0,0 +1,53 @@
+// Test case for the dumb plugin.
+// { dg-do compile }
+// { dg-options "-O -fplugin-arg-dumb_plugin-ref-pass-name=ccp -fplugin-arg-dumb_plugin-ref-pass-instance-num=1" }
+
+class Foo {
+ private:
+ int a_;
+
+ public:
+ Foo() : a_(a_) {} // { dg-warning "Before genericizing function" }
+
+ void setA(int a) {
+ a_ = a_;
+ } // { dg-warning "Before genericizing function" }
+
+ void operator=(Foo& rhs) {
+ this->a_ = rhs.a_;
+ } // { dg-warning "Before genericizing function" }
+}; // { dg-warning "Process struct Foo" }
+
+struct Bar {
+ int b_;
+ int c_;
+}; // { dg-warning "Process struct Bar" }
+
+int g = g;
+Foo foo = foo;
+
+int func()
+{
+ Bar *bar1, bar2;
+ Foo local_foo;
+ int x = x;
+ static int y = y;
+ float *f;
+ Bar bar_array[5];
+ char n;
+ int overflow;
+
+ *f = *f;
+ bar1->b_ = bar1->b_;
+ bar2.c_ = bar2.c_;
+ local_foo = local_foo;
+ foo = foo;
+ foo.setA(5);
+ bar_array[3].c_ = bar_array[3].c_;
+ bar_array[x+g].b_ = bar_array[x+g].b_;
+ y = x;
+ x = y;
+} // { dg-warning "Before genericizing function" }
+
+// { dg-warning "Analyze function" "" { target *-*-* } 50 }
+// { dg-warning "End of compilation unit" "" { target *-*-* } 50 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb_plugin.c
new file mode 100644
index 000000000..e197d6672
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/dumb_plugin.c
@@ -0,0 +1,161 @@
+/* A trivial (dumb) plugin example that shows how to use the GCC plugin
+ mechanism. */
+
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "toplev.h"
+#include "diagnostic.h"
+#include "context.h"
+
+int plugin_is_GPL_compatible;
+
+/* Callback function to invoke after GCC finishes parsing a struct. */
+
+void
+handle_struct (void *event_data, void *data)
+{
+ tree type = (tree) event_data;
+ warning (0, G_("Process struct %s"),
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
+}
+
+/* Callback function to invoke before the function body is genericized. */
+
+void
+handle_pre_generic (void *event_data, void *data)
+{
+ tree fndecl = (tree) event_data;
+ warning (0, G_("Before genericizing function %s"),
+ IDENTIFIER_POINTER (DECL_NAME (fndecl)));
+}
+
+/* Callback function to invoke after GCC finishes the compilation unit. */
+
+void
+handle_end_of_compilation_unit (void *event_data, void *data)
+{
+ warning (0, G_("End of compilation unit"));
+}
+
+
+static unsigned int
+execute_dumb_plugin_example (void)
+{
+ warning (0, G_("Analyze function %s"),
+ IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
+ return 0;
+}
+
+static bool
+gate_dumb_plugin_example (void)
+{
+ return true;
+}
+
+namespace {
+
+const pass_data pass_data_dumb_plugin_example =
+{
+ GIMPLE_PASS, /* type */
+ "dumb_plugin_example", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ true, /* has_gate */
+ true, /* has_execute */
+ TV_NONE, /* tv_id */
+ PROP_cfg, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0, /* todo_flags_finish */
+};
+
+class pass_dumb_plugin_example : public gimple_opt_pass
+{
+public:
+ pass_dumb_plugin_example(gcc::context *ctxt)
+ : gimple_opt_pass(pass_data_dumb_plugin_example, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ bool gate () { return gate_dumb_plugin_example (); }
+ unsigned int execute () { return execute_dumb_plugin_example (); }
+
+}; // class pass_dumb_plugin_example
+
+} // anon namespace
+
+static gimple_opt_pass *
+make_pass_dumb_plugin_example (gcc::context *ctxt)
+{
+ return new pass_dumb_plugin_example (ctxt);
+}
+
+/* Initialization function that GCC calls. This plugin takes an argument
+ that specifies the name of the reference pass and an instance number,
+ both of which determine where the plugin pass should be inserted. */
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ struct register_pass_info pass_info;
+ const char *plugin_name = plugin_info->base_name;
+ int argc = plugin_info->argc;
+ struct plugin_argument *argv = plugin_info->argv;
+ char *ref_pass_name = NULL;
+ int ref_instance_number = 0;
+ int i;
+
+ /* Process the plugin arguments. This plugin takes the following arguments:
+ ref-pass-name=<PASS_NAME> and ref-pass-instance-num=<NUM>. */
+ for (i = 0; i < argc; ++i)
+ {
+ if (!strcmp (argv[i].key, "ref-pass-name"))
+ {
+ if (argv[i].value)
+ ref_pass_name = argv[i].value;
+ else
+ warning (0, G_("option '-fplugin-arg-%s-ref-pass-name'"
+ " requires a pass name"), plugin_name);
+ }
+ else if (!strcmp (argv[i].key, "ref-pass-instance-num"))
+ {
+ if (argv[i].value)
+ ref_instance_number = strtol (argv[i].value, NULL, 0);
+ else
+ warning (0, G_("option '-fplugin-arg-%s-ref-pass-instance-num'"
+ " requires an integer value"), plugin_name);
+ }
+ else
+ warning (0, G_("plugin %qs: unrecognized argument %qs ignored"),
+ plugin_name, argv[i].key);
+ }
+
+ if (!ref_pass_name)
+ {
+ error (G_("plugin %qs requires a reference pass name"), plugin_name);
+ return 1;
+ }
+
+ pass_info.pass = make_pass_dumb_plugin_example (g);
+ pass_info.reference_pass_name = ref_pass_name;
+ pass_info.ref_pass_instance_number = ref_instance_number;
+ pass_info.pos_op = PASS_POS_INSERT_AFTER;
+
+ register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
+
+ register_callback (plugin_name, PLUGIN_FINISH_TYPE, handle_struct, NULL);
+
+ register_callback (plugin_name, PLUGIN_PRE_GENERICIZE,
+ handle_pre_generic, NULL);
+
+ register_callback (plugin_name, PLUGIN_FINISH_UNIT,
+ handle_end_of_compilation_unit, NULL);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/header-plugin-test.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/header-plugin-test.C
new file mode 100644
index 000000000..bd6aff11f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/header-plugin-test.C
@@ -0,0 +1,3 @@
+// Test case for the dumb plugin.
+// { dg-do compile }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/header_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/header_plugin.c
new file mode 100644
index 000000000..a024194e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/header_plugin.c
@@ -0,0 +1,31 @@
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "tree-pass.h"
+#include "intl.h"
+
+/* reqs */
+#include "tm.h"
+
+/* gcc/ headers. */
+#include "cp/cp-tree.h"
+#include "diagnostic.h"
+#include "c-family/c-common.h"
+#include "c-family/c-pretty-print.h"
+#include "tree-iterator.h"
+#include "plugin.h"
+#include "langhooks.h"
+#include "cp/cxx-pretty-print.h"
+#include "cp/name-lookup.h"
+
+int plugin_is_GPL_compatible;
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/plugin.exp b/gcc-4.9/gcc/testsuite/g++.dg/plugin/plugin.exp
new file mode 100644
index 000000000..e97fb76a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/plugin.exp
@@ -0,0 +1,70 @@
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Test the functionality of the GCC plugin support
+
+load_lib target-supports.exp
+load_lib g++-dg.exp
+
+global TESTING_IN_BUILD_TREE
+global ENABLE_PLUGIN
+
+# The plugin testcases currently only work when the build tree is available.
+# Also check whether the host supports plugins.
+if { ![info exists TESTING_IN_BUILD_TREE] || ![info exists ENABLE_PLUGIN] } {
+ return
+}
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CXXFLAGS
+if ![info exists DEFAULT_CXXFLAGS] then {
+ set DEFAULT_CXXFLAGS " -pedantic-errors -Wno-long-long"
+}
+
+# The procedures in plugin-support.exp need these parameters.
+set default_flags $DEFAULT_CXXFLAGS
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# Load support procs.
+load_lib plugin-support.exp
+
+# Specify the plugin source file and the associated test files in a list.
+# plugin_test_list={ {plugin1 test1 test2 ...} {plugin2 test1 ...} ... }
+set plugin_test_list [list \
+ { attribute_plugin.c attribute_plugin-test-1.C } \
+ { pragma_plugin.c pragma_plugin-test-1.C } \
+ { selfassign.c self-assign-test-1.C self-assign-test-2.C self-assign-test-3.C } \
+ { dumb_plugin.c dumb-plugin-test-1.C } \
+ { header_plugin.c header-plugin-test.C } \
+ { decl_plugin.c decl-plugin-test.C } ]
+
+foreach plugin_test $plugin_test_list {
+ # Replace each source file with its full-path name
+ for {set i 0} {$i < [llength $plugin_test]} {incr i} {
+ set basename [lindex $plugin_test $i]
+ set plugin_test [lreplace $plugin_test $i $i $srcdir/$subdir/$basename]
+ }
+ set plugin_src [lindex $plugin_test 0]
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $plugin_src] then {
+ continue
+ }
+ set plugin_input_tests [lreplace $plugin_test 0 0]
+ plugin-test-execute $plugin_src $plugin_input_tests
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C
new file mode 100644
index 000000000..3c084208b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C
@@ -0,0 +1,18 @@
+// { dg-warning "Callback to register pragmas" "" { target *-*-* } 0 }
+
+int some_func (int c);
+
+#pragma GCCPLUGIN sayhello "here" // { dg-warning "'pragma GCCPLUGIN sayhello' outside of function: here" }
+
+int some_func (const char* s)
+{
+#pragma GCCPLUGIN sayhello "at start" // { dg-warning "'pragma GCCPLUGIN sayhello' from function 'some_func': at start" }
+
+#define DO_PRAGMA(x) _Pragma(#x)
+ if (!s)
+ {
+ DO_PRAGMA(GCCPLUGIN sayhello "in block"); // { dg-warning "'pragma GCCPLUGIN sayhello' from function 'some_func': in block" }
+ return 0;
+ }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin.c
new file mode 100644
index 000000000..940c302df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/pragma_plugin.c
@@ -0,0 +1,62 @@
+/* Demonstrates how to add custom pragmas */
+
+#include "gcc-plugin.h"
+#include <stdlib.h>
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "rtl.h"
+#include "tree.h"
+#include "function.h"
+#include "c-family/c-pragma.h"
+#include "cpplib.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "toplev.h"
+#include "diagnostic.h"
+
+int plugin_is_GPL_compatible;
+
+
+/* handler of #pragma GCCPLUGIN sayhello "message" is quite similar to
+ handler of #pragma GCC message...*/
+
+static void
+handle_pragma_sayhello (cpp_reader *dummy)
+{
+ tree message = 0;
+ if (pragma_lex (&message) != CPP_STRING)
+ {
+ warning (OPT_Wpragmas, "%<#pragma GCCPLUGIN sayhello%> is not a string");
+ return;
+ }
+ if (TREE_STRING_LENGTH (message) > 1)
+ if (cfun)
+ warning (OPT_Wpragmas,
+ "%<pragma GCCPLUGIN sayhello%> from function %qE: %s",
+ cfun->decl, TREE_STRING_POINTER (message));
+ else
+ warning (OPT_Wpragmas,
+ "%<pragma GCCPLUGIN sayhello%> outside of function: %s",
+ TREE_STRING_POINTER (message));
+}
+
+/* Plugin callback called during pragma registration */
+
+static void
+register_my_pragma (void *event_data, void *data)
+{
+ warning (0, G_("Callback to register pragmas"));
+ c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
+}
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ const char *plugin_name = plugin_info->base_name;
+
+ register_callback (plugin_name, PLUGIN_PRAGMAS, register_my_pragma, NULL);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C
new file mode 100644
index 000000000..607381fb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C
@@ -0,0 +1,50 @@
+// Test the self-assignemnt detection plugin.
+// { dg-do compile }
+// { dg-options "-O" }
+
+class Foo {
+ private:
+ int a_;
+
+ public:
+ Foo() : a_(a_) {} // { dg-warning "assigned to itself" }
+
+ void setA(int a) {
+ a_ = a_; // { dg-warning "assigned to itself" }
+ }
+
+ void operator=(Foo& rhs) {
+ this->a_ = rhs.a_;
+ }
+};
+
+struct Bar {
+ int b_;
+ int c_;
+};
+
+int g = g; // { dg-warning "assigned to itself" }
+Foo foo = foo; // { dg-warning "assigned to itself" }
+
+int func()
+{
+ Bar *bar1, bar2;
+ Foo local_foo;
+ int x = x; // { dg-warning "assigned to itself" }
+ static int y = y; // { dg-warning "assigned to itself" }
+ float *f;
+ Bar bar_array[5];
+ char n;
+ int overflow;
+
+ *f = *f; // { dg-warning "assigned to itself" }
+ bar1->b_ = bar1->b_; // { dg-warning "assigned to itself" }
+ bar2.c_ = bar2.c_; // { dg-warning "assigned to itself" }
+ local_foo = local_foo; // { dg-warning "assigned to itself" }
+ foo = foo; // { dg-warning "assigned to itself" }
+ foo.setA(5);
+ bar_array[3].c_ = bar_array[3].c_; // { dg-warning "assigned to itself" }
+ bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-warning "self-assignment detected" }
+ y = x;
+ x = y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C
new file mode 100644
index 000000000..35e1fb8f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C
@@ -0,0 +1,50 @@
+// Test the self-assignemnt detection plugin without checking of operator-eq.
+// { dg-do compile }
+// { dg-options "-O -fplugin-arg-selfassign-no-check-operator-eq" }
+
+class Foo {
+ private:
+ int a_;
+
+ public:
+ Foo() : a_(a_) {} // { dg-warning "assigned to itself" }
+
+ void setA(int a) {
+ a_ = a_; // { dg-warning "assigned to itself" }
+ }
+
+ void operator=(Foo& rhs) {
+ this->a_ = rhs.a_;
+ }
+};
+
+struct Bar {
+ int b_;
+ int c_;
+};
+
+int g = g; // { dg-warning "assigned to itself" }
+Foo foo = foo; // { dg-warning "assigned to itself" }
+
+int func()
+{
+ Bar *bar1, bar2;
+ Foo local_foo;
+ int x = x; // { dg-warning "assigned to itself" }
+ static int y = y; // { dg-warning "assigned to itself" }
+ float *f;
+ Bar bar_array[5];
+ char n;
+ int overflow;
+
+ *f = *f; // { dg-warning "assigned to itself" }
+ bar1->b_ = bar1->b_; // { dg-warning "assigned to itself" }
+ bar2.c_ = bar2.c_; // { dg-warning "assigned to itself" }
+ local_foo = local_foo; // { dg-bogus "assigned to itself" }
+ foo = foo; // { dg-bogus "assigned to itself" }
+ foo.setA(5);
+ bar_array[3].c_ = bar_array[3].c_; // { dg-warning "assigned to itself" }
+ bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-warning "self-assignment detected" }
+ y = x;
+ x = y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C
new file mode 100644
index 000000000..e5b354baf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C
@@ -0,0 +1,50 @@
+// Test the self-assignemnt detection plugin with the 'disable' argument.
+// { dg-do compile }
+// { dg-options "-O -fplugin-arg-selfassign-disable" }
+
+class Foo {
+ private:
+ int a_;
+
+ public:
+ Foo() : a_(a_) {} // { dg-bogus "assigned to itself" }
+
+ void setA(int a) {
+ a_ = a_; // { dg-bogus "assigned to itself" }
+ }
+
+ void operator=(Foo& rhs) {
+ this->a_ = rhs.a_;
+ }
+};
+
+struct Bar {
+ int b_;
+ int c_;
+};
+
+int g = g; // { dg-bogus "assigned to itself" }
+Foo foo = foo; // { dg-bogus "assigned to itself" }
+
+int func()
+{
+ Bar *bar1, bar2;
+ Foo local_foo;
+ int x = x; // { dg-bogus "assigned to itself" }
+ static int y = y; // { dg-bogus "assigned to itself" }
+ float *f;
+ Bar bar_array[5];
+ char n;
+ int overflow;
+
+ *f = *f; // { dg-bogus "assigned to itself" }
+ bar1->b_ = bar1->b_; // { dg-bogus "assigned to itself" }
+ bar2.c_ = bar2.c_; // { dg-bogus "assigned to itself" }
+ local_foo = local_foo; // { dg-bogus "assigned to itself" }
+ foo = foo; // { dg-bogus "assigned to itself" }
+ foo.setA(5);
+ bar_array[3].c_ = bar_array[3].c_; // { dg-bogus "assigned to itself" }
+ bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-bogus "self-assignment detected" }
+ y = x;
+ x = y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/selfassign.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/selfassign.c
new file mode 100644
index 000000000..041f25dce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/selfassign.c
@@ -0,0 +1,402 @@
+/* This plugin contains an analysis pass that detects and warns about
+ self-assignment statements. */
+/* { dg-options "-O" } */
+
+#include "gcc-plugin.h"
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "tree.h"
+#include "stringpool.h"
+#include "toplev.h"
+#include "basic-block.h"
+#include "pointer-set.h"
+#include "hash-table.h"
+#include "vec.h"
+#include "ggc.h"
+#include "basic-block.h"
+#include "tree-ssa-alias.h"
+#include "internal-fn.h"
+#include "gimple-fold.h"
+#include "tree-eh.h"
+#include "gimple-expr.h"
+#include "is-a.h"
+#include "gimple.h"
+#include "gimple-iterator.h"
+#include "tree.h"
+#include "tree-pass.h"
+#include "intl.h"
+#include "plugin-version.h"
+#include "diagnostic.h"
+#include "context.h"
+
+int plugin_is_GPL_compatible;
+
+/* Indicate whether to check overloaded operator '=', which is performed by
+ default. To disable it, use -fplugin-arg-NAME-no-check-operator-eq. */
+bool check_operator_eq = true;
+
+/* Given a rhs EXPR of a gimple assign statement, if it is
+ - SSA_NAME : returns its var decl, or, if it is a temp variable,
+ returns the rhs of its SSA def statement.
+ - VAR_DECL, PARM_DECL, FIELD_DECL, or a reference expression :
+ returns EXPR itself.
+ - any other expression : returns NULL_TREE. */
+
+static tree
+get_real_ref_rhs (tree expr)
+{
+ switch (TREE_CODE (expr))
+ {
+ case SSA_NAME:
+ {
+ /* Given a self-assign statement, say foo.x = foo.x,
+ the IR (after SSA) looks like:
+
+ D.1797_14 = foo.x;
+ foo.x ={v} D.1797_14;
+
+ So if the rhs EXPR is an SSA_NAME of a temp variable,
+ e.g. D.1797_14, we need to grab the rhs of its SSA def
+ statement (i.e. foo.x). */
+ tree vdecl = SSA_NAME_VAR (expr);
+ if ((!vdecl || DECL_ARTIFICIAL (vdecl))
+ && !gimple_nop_p (SSA_NAME_DEF_STMT (expr)))
+ {
+ gimple def_stmt = SSA_NAME_DEF_STMT (expr);
+ /* We are only interested in an assignment with a single
+ rhs operand because if it is not, the original assignment
+ will not possibly be a self-assignment. */
+ if (gimple_assign_single_p (def_stmt))
+ return get_real_ref_rhs (gimple_assign_rhs1 (def_stmt));
+ else
+ return NULL_TREE;
+ }
+ else
+ return vdecl;
+ }
+ case VAR_DECL:
+ case PARM_DECL:
+ case FIELD_DECL:
+ case COMPONENT_REF:
+ case MEM_REF:
+ case ARRAY_REF:
+ return expr;
+ default:
+ return NULL_TREE;
+ }
+}
+
+/* Given an expression tree, EXPR, that may contains SSA names, returns an
+ equivalent tree with the SSA names converted to var/parm/field decls
+ so that it can be used with '%E' format modifier when emitting warning
+ messages.
+
+ This function currently only supports VAR/PARM/FIELD_DECL, reference
+ expressions (COMPONENT_REF, INDIRECT_REF, ARRAY_REF), integer constant,
+ and SSA_NAME. If EXPR contains any other tree nodes (e.g. an arithmetic
+ expression appears in array index), NULL_TREE is returned. */
+
+static tree
+get_non_ssa_expr (tree expr)
+{
+ if (!expr)
+ return NULL_TREE;
+ switch (TREE_CODE (expr))
+ {
+ case VAR_DECL:
+ case PARM_DECL:
+ case FIELD_DECL:
+ {
+ if (DECL_NAME (expr))
+ return expr;
+ else
+ return NULL_TREE;
+ }
+ case COMPONENT_REF:
+ {
+ tree base, orig_base = TREE_OPERAND (expr, 0);
+ tree component, orig_component = TREE_OPERAND (expr, 1);
+ base = get_non_ssa_expr (orig_base);
+ if (!base)
+ return NULL_TREE;
+ component = get_non_ssa_expr (orig_component);
+ if (!component)
+ return NULL_TREE;
+ /* If either BASE or COMPONENT is converted, build a new
+ component reference tree. */
+ if (base != orig_base || component != orig_component)
+ return build3 (COMPONENT_REF, TREE_TYPE (component),
+ base, component, NULL_TREE);
+ else
+ return expr;
+ }
+ case MEM_REF:
+ {
+ tree orig_base = TREE_OPERAND (expr, 0);
+ if (TREE_CODE (orig_base) == SSA_NAME)
+ {
+ tree base = get_non_ssa_expr (orig_base);
+ if (!base)
+ return NULL_TREE;
+ return fold_build2 (MEM_REF, TREE_TYPE (expr),
+ base, TREE_OPERAND (expr, 1));
+ }
+ return expr;
+ }
+ case ARRAY_REF:
+ {
+ tree array, orig_array = TREE_OPERAND (expr, 0);
+ tree index, orig_index = TREE_OPERAND (expr, 1);
+ array = get_non_ssa_expr (orig_array);
+ if (!array)
+ return NULL_TREE;
+ index = get_non_ssa_expr (orig_index);
+ if (!index)
+ return NULL_TREE;
+ /* If either ARRAY or INDEX is converted, build a new array
+ reference tree. */
+ if (array != orig_array || index != orig_index)
+ return build4 (ARRAY_REF, TREE_TYPE (expr), array, index,
+ TREE_OPERAND (expr, 2), TREE_OPERAND (expr, 3));
+ else
+ return expr;
+ }
+ case SSA_NAME:
+ {
+ tree vdecl = SSA_NAME_VAR (expr);
+ if ((!vdecl || DECL_ARTIFICIAL (vdecl))
+ && !gimple_nop_p (SSA_NAME_DEF_STMT (expr)))
+ {
+ gimple def_stmt = SSA_NAME_DEF_STMT (expr);
+ if (gimple_assign_single_p (def_stmt))
+ vdecl = gimple_assign_rhs1 (def_stmt);
+ }
+ return get_non_ssa_expr (vdecl);
+ }
+ case INTEGER_CST:
+ return expr;
+ default:
+ /* Return NULL_TREE for any other kind of tree nodes. */
+ return NULL_TREE;
+ }
+}
+
+/* Given the LHS and (real) RHS of a gimple assign statement, STMT, check if
+ they are the same. If so, print a warning message about self-assignment. */
+
+static void
+compare_and_warn (gimple stmt, tree lhs, tree rhs)
+{
+ if (operand_equal_p (lhs, rhs, OEP_PURE_SAME))
+ {
+ location_t location;
+ location = (gimple_has_location (stmt)
+ ? gimple_location (stmt)
+ : (DECL_P (lhs)
+ ? DECL_SOURCE_LOCATION (lhs)
+ : input_location));
+ /* If LHS contains any tree node not currently supported by
+ get_non_ssa_expr, simply emit a generic warning without
+ specifying LHS in the message. */
+ lhs = get_non_ssa_expr (lhs);
+ if (lhs)
+ warning_at (location, 0, G_("%qE is assigned to itself"), lhs);
+ else
+ warning_at (location, 0, G_("self-assignment detected"));
+ }
+}
+
+/* Check and warn if STMT is a self-assign statement. */
+
+static void
+warn_self_assign (gimple stmt)
+{
+ tree rhs, lhs;
+
+ /* Check assigment statement. */
+ if (gimple_assign_single_p (stmt))
+ {
+ rhs = get_real_ref_rhs (gimple_assign_rhs1 (stmt));
+ if (!rhs)
+ return;
+
+ lhs = gimple_assign_lhs (stmt);
+ if (TREE_CODE (lhs) == SSA_NAME)
+ {
+ lhs = SSA_NAME_VAR (lhs);
+ if (!lhs || DECL_ARTIFICIAL (lhs))
+ return;
+ }
+
+ compare_and_warn (stmt, lhs, rhs);
+ }
+ /* Check overloaded operator '=' (if enabled). */
+ else if (check_operator_eq && is_gimple_call (stmt))
+ {
+ tree fdecl = gimple_call_fndecl (stmt);
+ if (fdecl && (DECL_NAME (fdecl) == maybe_get_identifier ("operator=")))
+ {
+ /* If 'operator=' takes reference operands, the arguments will be
+ ADDR_EXPR trees. In this case, just remove the address-taken
+ operator before we compare the lhs and rhs. */
+ lhs = gimple_call_arg (stmt, 0);
+ if (TREE_CODE (lhs) == ADDR_EXPR)
+ lhs = TREE_OPERAND (lhs, 0);
+ rhs = gimple_call_arg (stmt, 1);
+ if (TREE_CODE (rhs) == ADDR_EXPR)
+ rhs = TREE_OPERAND (rhs, 0);
+
+ compare_and_warn (stmt, lhs, rhs);
+ }
+ }
+}
+
+/* Entry point for the self-assignment detection pass. */
+
+static unsigned int
+execute_warn_self_assign (void)
+{
+ gimple_stmt_iterator gsi;
+ basic_block bb;
+
+ FOR_EACH_BB_FN (bb, cfun)
+ {
+ for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ warn_self_assign (gsi_stmt (gsi));
+ }
+
+ return 0;
+}
+
+/* Pass gate function. Currently always returns true. */
+
+static bool
+gate_warn_self_assign (void)
+{
+ return true;
+}
+
+namespace {
+
+const pass_data pass_data_warn_self_assign =
+{
+ GIMPLE_PASS, /* type */
+ "warn_self_assign", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ true, /* has_gate */
+ true, /* has_execute */
+ TV_NONE, /* tv_id */
+ PROP_ssa, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0, /* todo_flags_finish */
+};
+
+class pass_warn_self_assign : public gimple_opt_pass
+{
+public:
+ pass_warn_self_assign(gcc::context *ctxt)
+ : gimple_opt_pass(pass_data_warn_self_assign, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ bool gate () { return gate_warn_self_assign (); }
+ unsigned int execute () { return execute_warn_self_assign (); }
+
+}; // class pass_warn_self_assign
+
+} // anon namespace
+
+static gimple_opt_pass *
+make_pass_warn_self_assign (gcc::context *ctxt)
+{
+ return new pass_warn_self_assign (ctxt);
+}
+
+/* The initialization routine exposed to and called by GCC. The spec of this
+ function is defined in gcc/gcc-plugin.h.
+
+ PLUGIN_NAME - name of the plugin (useful for error reporting)
+ ARGC - the size of the ARGV array
+ ARGV - an array of key-value argument pair
+
+ Returns 0 if initialization finishes successfully.
+
+ Note that this function needs to be named exactly "plugin_init". */
+
+int
+plugin_init (struct plugin_name_args *plugin_info,
+ struct plugin_gcc_version *version)
+{
+ struct register_pass_info pass_info;
+ const char *plugin_name = plugin_info->base_name;
+ int argc = plugin_info->argc;
+ struct plugin_argument *argv = plugin_info->argv;
+ bool enabled = true;
+ int i;
+
+ if (!plugin_default_version_check (version, &gcc_version))
+ return 1;
+
+ /* Self-assign detection should happen after SSA is constructed. */
+ pass_info.pass = make_pass_warn_self_assign (g);
+ pass_info.reference_pass_name = "ssa";
+ pass_info.ref_pass_instance_number = 1;
+ pass_info.pos_op = PASS_POS_INSERT_AFTER;
+
+ /* Process the plugin arguments. This plugin takes the following arguments:
+ check-operator-eq, no-check-operator-eq, enable, and disable.
+ By default, the analysis is enabled with 'operator=' checked. */
+ for (i = 0; i < argc; ++i)
+ {
+ if (!strcmp (argv[i].key, "check-operator-eq"))
+ {
+ if (argv[i].value)
+ warning (0, G_("option '-fplugin-arg-%s-check-operator-eq=%s'"
+ " ignored (superfluous '=%s')"),
+ plugin_name, argv[i].value, argv[i].value);
+ else
+ check_operator_eq = true;
+ }
+ else if (!strcmp (argv[i].key, "no-check-operator-eq"))
+ {
+ if (argv[i].value)
+ warning (0, G_("option '-fplugin-arg-%s-no-check-operator-eq=%s'"
+ " ignored (superfluous '=%s')"),
+ plugin_name, argv[i].value, argv[i].value);
+ else
+ check_operator_eq = false;
+ }
+ else if (!strcmp (argv[i].key, "enable"))
+ {
+ if (argv[i].value)
+ warning (0, G_("option '-fplugin-arg-%s-enable=%s' ignored"
+ " (superfluous '=%s')"),
+ plugin_name, argv[i].value, argv[i].value);
+ else
+ enabled = true;
+ }
+ else if (!strcmp (argv[i].key, "disable"))
+ {
+ if (argv[i].value)
+ warning (0, G_("option '-fplugin-arg-%s-disable=%s' ignored"
+ " (superfluous '=%s')"),
+ plugin_name, argv[i].value, argv[i].value);
+ else
+ enabled = false;
+ }
+ else
+ warning (0, G_("plugin %qs: unrecognized argument %qs ignored"),
+ plugin_name, argv[i].key);
+ }
+
+ /* Register this new pass with GCC if the analysis is enabled. */
+ if (enabled)
+ register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL,
+ &pass_info);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr37742.C b/gcc-4.9/gcc/testsuite/g++.dg/pr37742.C
new file mode 100644
index 000000000..2bbb01723
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr37742.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+__extension__ typedef __SIZE_TYPE__ size_t;
+void* __valarray_get_memory(size_t __n);
+int*__restrict__
+__valarray_get_storage(size_t __n)
+{
+ return static_cast<int* __restrict__>(__valarray_get_memory(__n));
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr44328.C b/gcc-4.9/gcc/testsuite/g++.dg/pr44328.C
new file mode 100644
index 000000000..bbfe23334
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr44328.C
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-c -O2 -Wextra" } */
+#define O_RDONLY (1<<0)
+#define O_WRONLY (1<<1)
+#define O_RDWR (O_RDONLY|O_WRONLY)
+#define O_CREAT (1<<3)
+#define O_TRUNC (1<<6)
+
+typedef enum {
+ OM_READ = 0,
+ OM_WRITE,
+ OM_READWRITE_NOCREATE,
+ OM_READWRITE_CREATE
+} OpenMode;
+
+extern int open(const char *name, int mode);
+
+void open_file(const char *filename, const OpenMode rw)
+{
+ int mode = 0;
+
+ switch( rw )
+ {
+ case OM_WRITE:
+ mode = O_WRONLY|O_CREAT|O_TRUNC;
+ break;
+ case OM_READ:
+ mode = O_RDONLY;
+ break;
+ case OM_READWRITE_NOCREATE:
+ mode = O_RDWR;
+ break;
+ case OM_READWRITE_CREATE:
+ mode = O_RDWR|O_CREAT|O_TRUNC;
+ break;
+ }
+
+ open( filename, mode );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr44486.C b/gcc-4.9/gcc/testsuite/g++.dg/pr44486.C
new file mode 100644
index 000000000..01e84289f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr44486.C
@@ -0,0 +1,10 @@
+// PR c++/44486 missing space in __PRETTY_FUNCTION__ expansion in anonymous namespace
+// { dg-do compile }
+// { dg-options "" }
+
+struct S { };
+namespace { S f() { const char * s = __PRETTY_FUNCTION__; return S(); } }
+
+int main() { f(); }
+
+// { dg-final { scan-assembler "S \{anonymous\}::f" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45038.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45038.C
new file mode 100644
index 000000000..57c0c4417
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45038.C
@@ -0,0 +1,9 @@
+// PR preprocessor/45038
+// { dg-do compile }
+// { dg-options "-Werror -Wold-style-cast" }
+
+double f(void)
+{
+ // We used to produce old-style casts for this.
+ return __DBL_MIN__;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45049-1.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45049-1.C
new file mode 100644
index 000000000..7b1dcd568
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45049-1.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+namespace n1 {
+ void modf ();
+}
+
+namespace n2 {
+ void trunc ();
+ void modf ();
+}
+
+void max ()
+{
+ using n1::modf;
+ using n2::trunc;
+ using n2::modf;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45049-2.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45049-2.C
new file mode 100644
index 000000000..a9518842e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45049-2.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ void bar(int);
+ void baz(int);
+ void baz(void);
+ void bar(void);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45056.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45056.C
new file mode 100644
index 000000000..1f3fda08f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45056.C
@@ -0,0 +1,55 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fschedule-insns2 -fschedule-insns -g" } */
+/* { dg-require-effective-target scheduling } */
+
+template < class _T1, class _T2 > struct pair
+{
+ _T1 first;
+ _T2 second;
+ pair (_T1 & __a, _T2 & __b)
+ :first (__a), second (__b)
+ { }
+}
+;
+template < typename _Tp > struct _Vector_base
+{
+ ~_Vector_base ();
+}
+;
+template < typename _Tp>struct vector
+: _Vector_base < _Tp>
+{
+ template < typename _ForwardIterator > inline void _Destroy (_ForwardIterator) { }
+ _Tp * _M_finish;
+ ~vector ()
+ {
+ _Destroy ( this->_M_finish);
+ }
+} ;
+template < typename ITV > struct Box
+{
+ Box (const Box &);
+ Box ();
+ typedef vector < ITV > Sequence;
+ Sequence seq;
+};
+template < typename D > struct Powerset
+{
+ Powerset (const Powerset &y) :reduced (y.reduced) {}
+ bool reduced;
+} ;
+template < typename PS > struct Pointset_Powerset :Powerset < int >
+{
+ Pointset_Powerset ();
+ int space_dim;
+} ;
+pair
+<
+Box<int>,
+Pointset_Powerset < int > >
+linear_partition ()
+{
+ Pointset_Powerset < int > r ;
+ Box<int> qq;
+ return pair<Box<int>,Pointset_Powerset < int > > (qq, r);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45112.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45112.C
new file mode 100644
index 000000000..34dd3e1bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45112.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+struct JSString
+{
+ unsigned char mLength;
+ static JSString unitStringTable[];
+};
+
+JSString JSString::unitStringTable[] __attribute__ ((aligned (8))) = { 1 };
+
+int bug [__alignof__ (JSString::unitStringTable) >= 8 ? 1 : -1];
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45310.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45310.C
new file mode 100644
index 000000000..335c78257
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45310.C
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fnon-call-exceptions" } */
+
+static inline const int &
+max (const int &a, const int &b)
+{
+ return a ? a : b;
+}
+
+static inline int
+baz ()
+{
+ return max (0, 0);
+}
+
+struct S
+{
+ ~S ()
+ {
+ baz ();
+ }
+};
+
+void bar ();
+void
+foo ()
+{
+ S s;
+ bar ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45330.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45330.C
new file mode 100644
index 000000000..02d9b3f63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45330.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// Search std, __cxxabiv1, and global namespaces, plus one more.
+// { dg-options "--param cxx-max-namespaces-for-diagnostic-help=4" }
+
+#define NSPACE(NAME) namespace NAME { int foo; }
+
+namespace A
+{
+ int foo; // { dg-message "A::foo" "suggested alternative" }
+}
+
+namespace B
+{
+ int foo;
+}
+
+namespace C
+{
+ int foo;
+}
+
+namespace D
+{
+ int foo;
+}
+
+namespace E
+{
+ int foo;
+}
+
+int bar()
+{
+ return foo; // { dg-error "was not declared" }
+ // { dg-message "maximum limit of 4 namespaces" "maximum limit" { target *-*-* } 34 }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 34 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr45788.C b/gcc-4.9/gcc/testsuite/g++.dg/pr45788.C
new file mode 100644
index 000000000..de3340df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr45788.C
@@ -0,0 +1,108 @@
+// { dg-do compile { target x86_64-*-* } }
+// { dg-options "-O3 -fwhole-program -msse2" }
+
+typedef long unsigned int __darwin_size_t;
+typedef __darwin_size_t size_t;
+
+typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
+typedef float __v4sf __attribute__ ((__vector_size__ (16)));
+extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_mul_ps (__m128 __A, __m128 __B) {
+ return (__m128) __builtin_ia32_mulps ((__v4sf)__A, (__v4sf)__B);
+}
+extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_set1_ps (float __F) {
+ return __extension__ (__m128)(__v4sf){
+ __F, __F, __F, __F };
+}
+extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_setr_ps (float __Z, float __Y, float __X, float __W) {
+}
+typedef float real;
+template <typename T, int N> struct vectorX {
+};
+template<> struct vectorX<float, 3> {
+ union {
+ __m128 s;
+ struct {
+ };
+ };
+ vectorX(__m128 s) : s(s) {
+ }
+
+}
+__attribute__((aligned));
+template<> struct vectorX<float, 4> {
+ typedef float T;
+ typedef vectorX<float, 4> V;
+ union {
+ __m128 s;
+ struct {
+ T r, g, b, a;
+ };
+ };
+ vectorX(T a_, T b, T c, T d = 1) : s(_mm_setr_ps(a_,b,c,d)) {
+ }
+ vectorX(__m128 s) : s(s) {
+ }
+ vectorX(const V &t) : s(t.s) {
+ }
+ V &operator *=(const T t) {
+ s = _mm_mul_ps(s, _mm_set1_ps(t));
+ return *this;
+ }
+ inline V operator *(const T t) const __attribute__((always_inline)) {
+ return V(*this) *= t;
+ };
+}
+__attribute__((aligned));
+typedef vectorX<real, 3> color3;
+typedef vectorX<real, 4> color4;
+typedef color3 color;
+static inline color4 c3to4(color c) {
+ color4 res(c.s);
+ res.a=1;
+ return res;
+}
+static inline color c4to3(color4 c) {
+ return color(c.s);
+}
+static inline color4 to_premultiplied(color c, real a) {
+ color4 res = c3to4(c);
+ return res * a;
+}
+static inline color4 to_premultiplied(color4 cs) {
+ return to_premultiplied(c4to3(cs), cs.a);
+}
+struct texture {
+};
+struct flat_texture : public texture {
+ color4 c;
+ flat_texture(const color4 &c) : c(to_premultiplied(c)) {
+ }
+};
+struct checkerboard_texture : public texture {
+ color4 even, odd;
+ checkerboard_texture(const color4 &even, const color4 &odd) : even(to_premultiplied(even)), odd(to_premultiplied(odd)) {
+ }
+};
+struct texture_placement {
+ texture *tex;
+};
+struct surface {
+ texture_placement textures[16];
+ size_t texcount;
+};
+struct primitive {
+ surface mat;
+};
+static void set_color(primitive *p, color4 c) {
+ p->mat.textures[0].tex = new flat_texture(c);
+}
+static primitive **checkerboard_scene(int *pi) {
+ primitive **prims = new primitive*[6];
+ set_color(prims[0], color4(.7,.7,.7));
+ prims[1]->mat.textures[prims[1]->mat.texcount++].tex = new checkerboard_texture(color4(1,.1,.1),color4(.1,.15,1));
+ set_color(prims[2], color4(.7,.9,.7));
+}
+int main (int argc, char * const argv[]) {
+ int primi;
+ primitive **prims = checkerboard_scene(&primi);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr46065.C b/gcc-4.9/gcc/testsuite/g++.dg/pr46065.C
new file mode 100644
index 000000000..75c171db6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr46065.C
@@ -0,0 +1,11 @@
+// PR c++/46065
+// { dg-do compile }
+
+void bar ();
+
+void
+foo ()
+{
+ using ::bar;
+label:;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr46852.C b/gcc-4.9/gcc/testsuite/g++.dg/pr46852.C
new file mode 100644
index 000000000..2c9d8dd41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr46852.C
@@ -0,0 +1,7 @@
+// PR c++/46852
+// { dg-do compile }
+
+template
+<
+class
+{ // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr46868.C b/gcc-4.9/gcc/testsuite/g++.dg/pr46868.C
new file mode 100644
index 000000000..544c7b219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr46868.C
@@ -0,0 +1,4 @@
+// PR c++/46868
+// { dg-do compile }
+
+template < int > struct S { S < // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr46890.C b/gcc-4.9/gcc/testsuite/g++.dg/pr46890.C
new file mode 100644
index 000000000..3ecef5a52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr46890.C
@@ -0,0 +1,6 @@
+// PR c++/46890
+// { dg-do compile }
+
+struct MdatResource {
+const char *mdatAlloc;
+} const *_resource;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr47053.C b/gcc-4.9/gcc/testsuite/g++.dg/pr47053.C
new file mode 100644
index 000000000..186e3a7ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr47053.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions" } */
+struct A
+{
+ int i;
+ virtual ~A ()
+ {}
+};
+
+struct B : virtual A
+{};
+
+struct C : public B
+{
+ C ();
+ ~C (){}
+};
+
+void foo ()
+{
+ C c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr47589.C b/gcc-4.9/gcc/testsuite/g++.dg/pr47589.C
new file mode 100644
index 000000000..6bc3c8034
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr47589.C
@@ -0,0 +1,26 @@
+// PR c++/47589
+// { dg-do compile }
+
+struct F
+{
+ typedef void(*Cb)();
+
+ F(Cb);
+};
+
+struct C
+{
+ template<class D> static void f();
+};
+
+template<class D>
+struct TF : F
+{
+ TF() : F(C::f<D>) { }
+};
+
+struct DTC : TF<DTC>
+{
+ DTC() { }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr48484.C b/gcc-4.9/gcc/testsuite/g++.dg/pr48484.C
new file mode 100644
index 000000000..3f17f39a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr48484.C
@@ -0,0 +1,105 @@
+/* { dg-do compile } */
+/* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" } */
+
+
+struct SQObjectPtr
+{
+ int _type;
+ SQObjectPtr operator = (long);
+};
+struct SQObjectPtrVec
+{
+ SQObjectPtr fff (unsigned);
+ SQObjectPtr *_vals;
+};
+
+struct SQInstruction
+{
+ int _arg1;
+ unsigned op;
+ unsigned _arg0;
+ unsigned _arg2;
+};
+struct SQVM
+{
+ struct CallInfo
+ {
+ SQInstruction *_ip;
+ };
+ bool
+ Execute (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int);
+ bool
+ FOREACH_OP
+ (SQObjectPtr
+ &, SQObjectPtr &, SQObjectPtr &, SQObjectPtr &, long, int, int &);
+ SQObjectPtrVec _stack;
+ CallInfo *ci;
+ long _nnativecalls;
+ bool ShouldSuspend ();
+};
+struct AutoDec
+{
+ AutoDec (long *);
+ ~AutoDec ();
+};
+bool
+ SQVM::FOREACH_OP
+ (SQObjectPtr
+ &
+ o1,
+ SQObjectPtr & o2, SQObjectPtr &, SQObjectPtr & o4, long, int, int &jump)
+{
+ long
+ nrefidx = 0;
+ switch (o1._type)
+ {
+ case 0x02000000:
+ o4 = nrefidx;
+ jump = 1;
+ return true;
+ case 0x00000080:
+ {
+ long
+ idx = 10;
+ o2 = idx;
+ jump = 0;
+ }
+ }
+}
+
+bool
+ SQVM::Execute
+ (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int)
+{
+ AutoDec
+ ad (&_nnativecalls);
+ for (;;)
+ {
+ if (ShouldSuspend ())
+ return true;
+ SQInstruction
+ _i_ = *ci->_ip;
+ switch (_i_.op)
+ {
+ case 0:
+ {
+ int
+ tojump;
+
+ FOREACH_OP
+ (_stack._vals
+ [_i_._arg0],
+ _stack._vals
+ [_i_._arg2],
+ _stack._vals
+ [_i_._arg2],
+ _stack._vals[_i_._arg2], _i_._arg2, _i_._arg1, tojump);
+
+ ci += tojump; /* { dg-warning "uninitialized" "warning" } */
+ }
+ case 1:
+ _stack.fff (_i_._arg1);
+ }
+ }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr48633.C b/gcc-4.9/gcc/testsuite/g++.dg/pr48633.C
new file mode 100644
index 000000000..90f053a74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr48633.C
@@ -0,0 +1,28 @@
+/* { dg-do compile} */
+/* { dg-options "-O2 -fira-region=all -fnon-call-exceptions" } */
+extern long double getme (void);
+extern void useme (long double);
+struct Frame {
+ long double tmp;
+};
+void bugme (int n, long double ld1, long double ld2, long double ld3,
+ long double ld4, long double ld5)
+{
+ Frame f;
+ int i;
+ f.tmp = getme();
+ try {
+ for (i = 0; i < n; i++)
+ {
+ f.tmp += 1.0;
+ }
+ } catch (...) {
+ f.tmp += 1.0;
+ }
+ ld1++;
+ ld2++;
+ ld3++;
+ ld4++;
+ ld5++;
+ useme (f.tmp);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr48660.C b/gcc-4.9/gcc/testsuite/g++.dg/pr48660.C
new file mode 100644
index 000000000..37b61741a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr48660.C
@@ -0,0 +1,22 @@
+template<int N> struct val { char a[N]; };
+
+class Base
+{
+public:
+ virtual val<1> get1() const = 0;
+ virtual val<2> get2() const = 0;
+ virtual val<3> get3() const = 0;
+ virtual val<4> get4() const = 0;
+};
+
+class Derived : public virtual Base
+{
+public:
+ virtual val<1> get1() const { return foo->get1(); }
+ virtual val<2> get2() const { return foo->get2(); }
+ virtual val<3> get3() const { return foo->get3(); }
+ virtual val<4> get4() const { return foo->get4(); }
+ Base *foo;
+};
+
+Base* make() { return new Derived; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr48772.C b/gcc-4.9/gcc/testsuite/g++.dg/pr48772.C
new file mode 100644
index 000000000..39c1094e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr48772.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions -fno-tree-ccp -fno-tree-dce" }
+
+extern "C" void abort ();
+
+struct A
+{
+ void foo ()
+ {
+ this->bar ();
+ }
+ virtual void bar ()
+ {
+ abort ();
+ }
+ ~A ()
+ {
+ }
+};
+
+struct B:A
+{
+ virtual void bar ()
+ {
+ }
+};
+
+int
+main ()
+{
+ B b;
+ b.foo ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C b/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C
new file mode 100644
index 000000000..d7f2710a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -finstrument-functions" } */
+/* { dg-additional-options "-mno-explicit-relocs" { target alpha*-*-* } } */
+/* { dg-additional-options "-mno-relax-pic-calls" { target mips*-*-* } } */
+/* { dg-final { scan-assembler-times "__cyg_profile_func_enter" 1} } */
+
+#define NOINSTR __attribute__((no_instrument_function))
+
+struct t
+{
+ public:
+ /* Function code should be instrumented */
+ __attribute__((noinline)) t() {}
+
+ /* Function t::a() should not be instrumented */
+ NOINSTR void a(){
+ }
+ /* Function t::b() should not be instrumented */
+ void NOINSTR b(){
+ }
+ /* Function t::c() should not be instrumented */
+ void c() NOINSTR {
+ }
+ /* Function t::d() should not be instrumented */
+ void d() NOINSTR;
+};
+
+void t::d()
+{
+}
+
+/* Function call_all_functions() should not be instrumented */
+struct t call_all_functions() __attribute__((no_instrument_function));
+struct t call_all_functions()
+{
+ struct t a; /* Constructor not inlined */
+ a.a(); /* Inlined t::a() should not be instrumented */
+ a.b(); /* Inlined t::b() should not be instrumented */
+ a.c(); /* Inlined t::c() should not be instrumented */
+ a.d(); /* Inlined t::d() should not be instrumented */
+ return a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr49847.C b/gcc-4.9/gcc/testsuite/g++.dg/pr49847.C
new file mode 100644
index 000000000..b047713c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr49847.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions" } */
+int f (float g)
+{
+ try { return g >= 0; }
+ catch (...) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr50672.C b/gcc-4.9/gcc/testsuite/g++.dg/pr50672.C
new file mode 100644
index 000000000..fb310082e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr50672.C
@@ -0,0 +1,101 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-tail-merge" } */
+typedef int BoxCoordinate;
+typedef int BoxDimension;
+const BoxDimension X = 0;
+const BoxDimension Y = 1;
+const BoxDimension NDimensions = 2;
+class BoxPoint {
+ BoxCoordinate point[NDimensions];
+public:
+ bool isValid() const;
+ void operator += (const BoxPoint& p) {
+ if (isValid() && p.isValid()) {
+ point[X] += p.point[X];
+ }
+ }
+ const BoxCoordinate& operator [] (const BoxDimension& dimension) const {
+ return point[dimension];
+ }
+};
+class BoxRegion {
+public:
+ BoxCoordinate& origin(BoxDimension d) const;
+ BoxCoordinate& space(BoxDimension d) const;
+};
+inline bool operator <= (const BoxPoint& p, const BoxRegion& r) {
+ for (BoxDimension d = X;
+ d <= Y;
+ d++) if (p[d] < r.origin(d) || p[d] >= r.origin(d) + r.space(d))
+return false;
+ return true;
+}
+typedef struct _WidgetRec *Widget;
+struct GraphGC {
+ BoxPoint offsetIfSelected;
+};
+class GraphNode;
+class GraphEdge {
+public:
+ GraphNode *from() const;
+ GraphNode *to() const;
+};
+class LineGraphEdge: public GraphEdge {
+protected:
+ virtual void drawLine(Widget w, const GraphGC& gc) const;
+ void _print(const GraphGC &gc) const;
+};
+class ArcGraphEdge: public LineGraphEdge {
+ static bool center(const BoxPoint& p1, const BoxPoint& p2,
+ const BoxPoint& p3, double& x, double& y);
+ void makeLine(Widget w, const GraphGC& gc) const;
+};
+class GraphNode {
+public:
+ bool& selected();
+ GraphEdge *firstTo() const;
+ GraphEdge *nextTo(GraphEdge *ref) const;
+ virtual const BoxPoint& pos() const = 0;
+ virtual const BoxRegion& region(const GraphGC& gc) const = 0;
+ virtual bool isHint() const;
+};
+class PosGraphNode: public GraphNode { };
+class RegionGraphNode: public PosGraphNode { };
+class HintGraphNode: public RegionGraphNode { };
+void ArcGraphEdge::makeLine(Widget w, const GraphGC& gc) const {
+ HintGraphNode *arc_hint = 0;
+ RegionGraphNode *arc_from = 0;
+ RegionGraphNode *arc_to = 0;
+ bool make_arc = true;
+ if (from()->isHint() && to()->isHint()) {
+ make_arc = false;
+ }
+ else if (from()->isHint() && from()->firstTo() != 0) {
+ if (arc_hint == 0 || arc_from == 0 || arc_to == 0
+ || arc_hint->nextTo(arc_hint->firstTo()) != 0) {
+ make_arc = false;
+ }
+ }
+ if (!make_arc) {
+ if (w != 0) LineGraphEdge::drawLine(w, gc);
+ else LineGraphEdge::_print(gc);
+ return;
+ }
+ BoxPoint pos_from = arc_from->pos();
+ BoxRegion region_from = arc_from->region(gc);
+ BoxPoint pos_to = arc_to->pos();
+ BoxRegion region_to = arc_to->region(gc);
+ BoxPoint pos_hint = arc_hint->pos();
+ if (arc_hint->selected()) {
+ pos_hint += gc.offsetIfSelected;
+ }
+ if (pos_hint <= region_from || pos_hint <= region_to) {
+ return;
+ }
+ double cx, cy;
+ bool ok = center(pos_from, pos_hint, pos_to, cx, cy);
+ if (!ok) {
+ if (w != 0) LineGraphEdge::drawLine(w, gc);
+ else LineGraphEdge::_print(gc);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr50763-3.C b/gcc-4.9/gcc/testsuite/g++.dg/pr50763-3.C
new file mode 100644
index 000000000..b66be87b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr50763-3.C
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -ftree-tail-merge" } */
+
+class v2d {
+public:
+ double x;
+ double y;
+};
+
+class v3d {
+public:
+ double x;
+ v3d() {}
+ v3d(const v2d & cr2Dv) {}
+};
+
+class e2d {
+protected:
+ v2d _Min;
+ v2d _Max;
+public:
+ int cop2d(const v2d & rPnt) const;
+ v2d clp2d(const v2d & rPnt) const;
+};
+
+inline int e2d::cop2d(const v2d & rPnt) const {
+ int bRet = 1;
+ if (rPnt.x < _Min.x) bRet = 0;
+ else if (rPnt.x > _Max.x) bRet = 0;
+ else if (rPnt.y > _Max.y) bRet = 0;
+ return bRet;
+}
+
+inline v2d e2d::clp2d(const v2d & rPnt) const {
+ v2d sRet = rPnt;
+ if (rPnt.x < _Min.x) sRet.x = _Min.x;
+ if (rPnt.y < _Min.y) sRet.y = _Min.y;
+ if (rPnt.x > _Max.x) sRet.x = _Max.x;
+ if (rPnt.y > _Max.y) sRet.y = _Max.y;
+ return sRet;
+}
+
+class sExt {
+protected:
+ e2d _Dom;
+ long eval() const;
+ long evalPoint(const v2d & crUV, v3d & rPnt) const;
+};
+
+long sExt::evalPoint(const v2d & crUV, v3d & rPnt) const {
+ v3d sUV = crUV;
+ if (!_Dom.cop2d(crUV)) {
+ sUV = _Dom.clp2d(crUV);
+ }
+ eval();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr50763-4.C b/gcc-4.9/gcc/testsuite/g++.dg/pr50763-4.C
new file mode 100644
index 000000000..2605d8192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr50763-4.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-tail-merge" } */
+
+float
+clamp (const float x)
+{
+ return x <= 1 ? 1 : x;
+}
+
+template < class T > struct VECTOR
+{
+ float x;
+};
+template < class TV > class JOINT
+{
+ virtual void Constrain_Angles (VECTOR < float >&angles) const;
+};
+
+template < class TV > class ANGLE_JOINT:public JOINT < TV >
+{
+ virtual ~ ANGLE_JOINT ()
+ {
+ }
+ void Constrain_Angles (VECTOR < float >&angles) const
+ {
+ VECTOR < float >v;
+ if (v.x)
+ v.x = clamp (angles.x);
+ else
+ v.x = angles.x;
+ angles.x = v.x;
+ }
+};
+template ANGLE_JOINT < int >::~ANGLE_JOINT ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr51264-4.C b/gcc-4.9/gcc/testsuite/g++.dg/pr51264-4.C
new file mode 100644
index 000000000..58a1b14c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr51264-4.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O0 -Werror -Wreturn-type" } */
+
+/* Test-case from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25973#c4. */
+
+struct Block
+{
+ public:
+ Block ();
+ ~Block ();
+};
+
+bool func (bool bar)
+{
+ Block block;
+ bool foo = false;
+
+ if (!foo || bar)
+ do
+ {
+ return true;
+ }
+ while (0);
+ else
+ do
+ {
+ return false;
+ }
+ while (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr53055.C b/gcc-4.9/gcc/testsuite/g++.dg/pr53055.C
new file mode 100644
index 000000000..787af9d15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr53055.C
@@ -0,0 +1,5 @@
+// PR c++/53055
+// { dg-do compile }
+
+struct A A :: * p ;
+int i = p ->* p ; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr54655.C b/gcc-4.9/gcc/testsuite/g++.dg/pr54655.C
new file mode 100644
index 000000000..5fd5aee9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr54655.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+/* { dg-options "-O1" } */
+
+extern "C" class A
+{
+};
+
+template <typename T> class B:A
+{
+public:
+ B (int *, T);
+ ~B ()
+ {
+ }
+};
+
+bool a;
+
+inline void
+fn1 ()
+{
+ switch (0)
+ case 0:
+ {
+ B <int*> b (0, 0);
+ if (a)
+ break;
+ }
+}
+
+void
+fn2 ()
+{
+ fn1 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr55106.C b/gcc-4.9/gcc/testsuite/g++.dg/pr55106.C
new file mode 100644
index 000000000..4727822f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr55106.C
@@ -0,0 +1,67 @@
+/* { dg-do compile } */
+/* { dg-options "-c -O3" } */
+template<typename _Tp> struct A {
+ typedef _Tp *pointer;
+ typedef _Tp& reference;
+ typedef _Tp& const_reference;
+ template<typename>struct rebind
+ {
+ typedef A other;
+ };
+};
+
+template<typename _Alloc>struct __alloc_traits
+{
+ typedef typename _Alloc::pointer pointer;
+ typedef typename _Alloc::reference reference;
+ typedef typename _Alloc::const_reference const_reference;
+ template<typename _Tp>struct rebind
+ {
+ typedef typename _Alloc::template rebind<_Tp>::other other;
+ };
+};
+template<typename _Tp, typename _Alloc>struct B
+{
+ typedef typename __alloc_traits<_Alloc>::template rebind<
+ _Tp>::other _Tp_alloc_type;
+ typedef typename __alloc_traits<_Tp_alloc_type>::pointer pointer;
+ struct F
+ {
+ pointer _M_start;
+ };
+ F _M_impl;
+};
+template<typename _Tp, typename _Alloc = A<_Tp> >class vec : B<_Tp, _Alloc>{
+ typedef B<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ typedef __alloc_traits<_Tp_alloc_type> _Alloc_traits;
+
+public:
+ typedef _Tp value_type;
+ typedef typename _Alloc_traits::reference reference;
+ typedef typename _Alloc_traits::const_reference const_reference;
+ reference operator[](int p1)
+ {
+ return *(this->_M_impl._M_start + p1);
+ }
+
+ const_reference operator[](long) const;
+};
+
+int a[17];
+class C {
+ vec<int> m_value;
+ void opModDivGuts(const C&);
+ int mostSetBitP1() const;
+};
+void C::opModDivGuts(const C& p1)
+{
+ int b = p1.mostSetBitP1(), c = b + 1;
+ int d[16];
+
+ for (int i = c; i; i--)
+ a[i] = p1.m_value[i] << b;
+
+ for (int i = 0; i < c; i++)
+ m_value[i] = d[i] >> b << -b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr55263.C b/gcc-4.9/gcc/testsuite/g++.dg/pr55263.C
new file mode 100644
index 000000000..5ea863f1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr55263.C
@@ -0,0 +1,68 @@
+/* { dg-do compile } */
+/* { dg-options "-c -O -fgcse-after-reload -fnon-call-exceptions" } */
+template < typename _Tp > class new_allocator
+{
+public:
+ typedef _Tp pointer;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef new_allocator < _Tp1 > other;
+ };
+
+};
+
+template < typename > class allocator;
+
+template < typename _Alloc > struct __alloc_traits
+{
+ typedef typename _Alloc::pointer pointer;
+ template < typename _Tp > struct rebind
+ {
+ typedef typename _Alloc::template rebind < _Tp >::other other;
+ };
+
+};
+
+template < typename _Tp, typename _Alloc > struct _Vector_base
+{
+ typedef
+ typename
+ __alloc_traits < _Alloc >::template rebind < _Tp >::other _Tp_alloc_type;
+ typedef typename __alloc_traits < _Tp_alloc_type >::pointer pointer;
+ struct _Vector_impl
+ {
+ pointer _M_start;
+ pointer _M_end_of_storage;
+ };
+
+ ~_Vector_base ();
+ _Vector_impl _M_impl;
+};
+
+template < typename _Tp, typename _Alloc = allocator < _Tp > >class vector:
+_Vector_base < _Tp, _Alloc >
+{
+ typedef _Vector_base < _Tp, _Alloc > _Base;
+public:
+ typedef typename _Base::pointer pointer;
+vector ():
+ _Base ()
+ {
+ _M_erase_at_end (this->_M_impl._M_start);
+ }
+ void _M_erase_at_end (pointer)
+ {
+ }
+};
+
+template < typename T > class clear_alloc:
+public new_allocator < T >
+{
+};
+
+void
+foo ()
+{
+ new vector < int, clear_alloc < int > >;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr55513.C b/gcc-4.9/gcc/testsuite/g++.dg/pr55513.C
new file mode 100644
index 000000000..06eedee8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr55513.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-O0 -fdump-tree-gimple" }
+
+main ()
+{
+ char s[10];
+ const int t = (__builtin_memcpy (s, "Hello", 6), 777);
+ __builtin_printf ("%d %s\n", t, s);
+}
+
+// { dg-final { scan-tree-dump-times "memcpy" 1 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr55604.C b/gcc-4.9/gcc/testsuite/g++.dg/pr55604.C
new file mode 100644
index 000000000..135ae4d5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr55604.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-rtl-reload" } */
+
+main ()
+{
+ char s[10];
+ const int t = (__builtin_memcpy (s, "Hello", 6), 5);
+ __builtin_printf ("%d %s\n", t, s);
+}
+
+/* { dg-final { cleanup-rtl-dump "reload" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr57175.C b/gcc-4.9/gcc/testsuite/g++.dg/pr57175.C
new file mode 100644
index 000000000..d6801a735
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr57175.C
@@ -0,0 +1,18 @@
+/* { dg-do compile { target c++11 } } */
+
+extern "C" void do_not_remove ();
+
+struct A
+{
+ A () { }
+ A (A const&) { do_not_remove (); }
+};
+
+A
+f ()
+{
+ alignas (2 * alignof (A)) A x;
+ return x;
+}
+
+/* { dg-final { scan-assembler "do_not_remove" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr57662.C b/gcc-4.9/gcc/testsuite/g++.dg/pr57662.C
new file mode 100644
index 000000000..1354790e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr57662.C
@@ -0,0 +1,339 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling2 -fsel-sched-pipelining" } */
+
+extern "C" {
+ typedef struct _IO_FILE FILE;
+ extern int putc(int __c, FILE * __stream);
+ extern int strcmp(__const char *__s1, __const char *__s2) throw()
+ __attribute__ ((__pure__)) __attribute__ ((__nonnull__(1, 2)));
+} typedef union tree_node *tree;
+struct gcc_options {
+ int x_flag_openmp;
+};
+extern struct gcc_options global_options;
+struct ht_identifier {
+ const unsigned char *str;
+};
+enum cpp_ttype {
+ CPP_SEMICOLON, CPP_NAME
+};
+struct vl_embed {
+};
+struct va_heap {
+};
+struct va_gc {
+ typedef vl_embed default_layout;
+};
+template < typename T, typename A = va_heap, typename L =
+ typename A::default_layout > struct vec {
+};
+enum tree_code {
+ ERROR_MARK,
+ IDENTIFIER_NODE,
+ OMP_SIMD,
+ CILK_SIMD,
+ MAX_TREE_CODES
+};
+struct tree_identifier {
+ struct ht_identifier
+ id;
+};
+union tree_node {
+ struct tree_identifier
+ identifier;
+};
+inline tree
+tree_check(tree __t, const char *__f, int __l, const char *__g, tree_code __c)
+{
+}
+
+extern tree chainon(tree, tree);
+extern vec < tree, va_gc > *make_tree_vector(void);
+typedef unsigned long omp_clause_mask;
+enum c_omp_clause_split {
+ C_OMP_CLAUSE_SPLIT_TARGET = 0, C_OMP_CLAUSE_SPLIT_COUNT
+};
+typedef struct cxx_saved_binding {
+ tree attributes;
+} cp_decl_specifier_seq;
+typedef enum pragma_kind {
+ PRAGMA_NONE = 0, PRAGMA_OMP_DECLARE_REDUCTION, PRAGMA_OMP_TARGET
+} pragma_kind;
+typedef enum pragma_omp_clause {
+ PRAGMA_OMP_CLAUSE_NONE =
+ 0, PRAGMA_OMP_CLAUSE_DEVICE, PRAGMA_OMP_CLAUSE_IF,
+ PRAGMA_OMP_CLAUSE_MAP
+} pragma_omp_clause;
+typedef struct cp_token {
+ enum cpp_ttype type:8;
+ union cp_token_value {
+ tree value;
+ } u;
+} cp_token;
+typedef struct cp_token *cp_token_position;
+typedef struct cp_lexer {
+ cp_token_position next_token;
+ bool debugging_p;
+ cp_lexer *lexer;
+} cp_parser;
+static FILE *cp_lexer_debug_stream;
+static inline bool cp_lexer_debugging_p(cp_lexer * lexer)
+{
+ return lexer->debugging_p;
+}
+
+static inline cp_token *cp_lexer_peek_token(cp_lexer * lexer)
+{
+ if (cp_lexer_debugging_p(lexer)) {
+ putc('\n', cp_lexer_debug_stream);
+ }
+ return lexer->next_token;
+}
+
+static inline bool cp_lexer_next_token_is(cp_lexer * lexer, enum cpp_ttype type)
+{
+}
+
+enum {
+ CP_PARSER_FLAGS_NONE = 0x0, CP_PARSER_FLAGS_OPTIONAL =
+ 0x1, CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES =
+ 0x2, CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS =
+ 0x4, CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR = 0x8
+};
+typedef int cp_parser_flags;
+extern tree
+cp_parser_type_specifier(cp_parser *, cp_parser_flags,
+ cp_decl_specifier_seq *, bool, int *, bool *);
+static void
+cp_parser_type_specifier_seq(cp_parser *, bool, bool, cp_decl_specifier_seq *);
+extern bool cp_next_tokens_can_be_attribute_p(cp_parser *);
+extern tree cp_parser_attributes_opt(cp_parser *);
+enum pragma_context {
+ pragma_external,
+ pragma_member,
+ pragma_objc_icode,
+ pragma_stmt,
+ pragma_compound
+};
+static bool cp_parser_pragma(cp_parser *, enum pragma_context);
+static bool cp_parser_translation_unit(cp_parser * parser)
+{
+ while (true) {
+ cp_token *token;
+ if (token->type == CPP_SEMICOLON) {
+ cp_parser_pragma(parser, pragma_external);
+ }
+ }
+}
+
+static tree
+cp_parser_type_id_1(cp_parser * parser, bool is_template_arg,
+ bool is_trailing_return)
+{
+ cp_decl_specifier_seq type_specifier_seq;
+ cp_parser_type_specifier_seq(parser, false, is_trailing_return,
+ &type_specifier_seq);
+}
+
+static tree cp_parser_type_id(cp_parser * parser)
+{
+ return cp_parser_type_id_1(parser, false, false);
+}
+
+static void
+cp_parser_type_specifier_seq(cp_parser * parser, bool is_declaration,
+ bool is_trailing_return,
+ cp_decl_specifier_seq * type_specifier_seq)
+{
+ cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
+ cp_token *start_token = __null;
+ while (true) {
+ tree type_specifier;
+ bool is_cv_qualifier;
+ if (cp_next_tokens_can_be_attribute_p(parser)) {
+ type_specifier_seq->attributes =
+ chainon(type_specifier_seq->attributes,
+ cp_parser_attributes_opt(parser));
+ continue;
+ }
+ if (!start_token)
+ start_token = cp_lexer_peek_token(parser->lexer);
+ type_specifier =
+ cp_parser_type_specifier(parser, flags, type_specifier_seq,
+ false, __null, &is_cv_qualifier);
+ if (!type_specifier) {
+ break;
+ }
+ if (is_declaration && !is_cv_qualifier)
+ flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
+ }
+}
+
+static bool
+cp_parser_omp_for_loop_init(cp_parser * parser, bool parsing_openmp,
+ tree & this_pre_body, vec < tree,
+ va_gc > *for_block, tree & init, tree & decl,
+ tree & real_decl)
+{
+ cp_decl_specifier_seq type_specifiers;
+ cp_parser_type_specifier_seq(parser, true, false, &type_specifiers);
+}
+
+static tree
+cp_parser_omp_for_loop(cp_parser * parser, enum tree_code code, tree clauses,
+ tree * cclauses)
+{
+ tree init, cond, incr, body, decl, pre_body = (tree) __null, ret;
+ tree real_decl, initv, condv, incrv, declv;
+ tree this_pre_body, cl;
+ int i, collapse = 1, nbraces = 0;
+ vec < tree, va_gc > *for_block = make_tree_vector();
+ for (i = 0; i < collapse; i++) {
+ bool add_private_clause = false;
+ add_private_clause |=
+ cp_parser_omp_for_loop_init(parser, code != CILK_SIMD,
+ this_pre_body, for_block, init,
+ decl, real_decl);
+ }
+}
+
+static tree
+cp_parser_omp_simd(cp_parser * parser, cp_token * pragma_tok, char *p_name,
+ omp_clause_mask mask, tree * cclauses)
+{
+ tree clauses, sb, ret;
+ ret = cp_parser_omp_for_loop(parser, OMP_SIMD, clauses, cclauses);
+}
+
+static tree
+cp_parser_omp_distribute(cp_parser * parser, cp_token * pragma_tok,
+ char *p_name, omp_clause_mask mask, tree * cclauses)
+{
+ if (cp_lexer_next_token_is(parser->lexer, CPP_NAME)) {
+ tree id = cp_lexer_peek_token(parser->lexer)->u.value;
+ const char *p =
+ ((const char
+ *)(tree_check((id),
+ "/home/bonzo/develop/trunk/gcc/cp/parser.c",
+ 29966, __FUNCTION__,
+ (IDENTIFIER_NODE)))->identifier.id.str);
+ bool simd = false;
+ bool parallel = false;
+ if (strcmp(p, "simd") == 0)
+ simd = true;
+ if (parallel || simd) {
+ if (!global_options.x_flag_openmp) {
+ if (simd)
+ return cp_parser_omp_simd(parser,
+ pragma_tok,
+ p_name, mask,
+ cclauses);
+ }
+ }
+ }
+}
+
+static tree
+cp_parser_omp_teams(cp_parser * parser, cp_token * pragma_tok, char *p_name,
+ omp_clause_mask mask, tree * cclauses)
+{
+ if (cp_lexer_next_token_is(parser->lexer, CPP_NAME)) {
+ tree id = cp_lexer_peek_token(parser->lexer)->u.value;
+ const char *p =
+ ((const char
+ *)(tree_check((id),
+ "/home/bonzo/develop/trunk/gcc/cp/parser.c",
+ 30062, __FUNCTION__,
+ (IDENTIFIER_NODE)))->identifier.id.str);
+ if (strcmp(p, "distribute") == 0) {
+ if (!global_options.x_flag_openmp)
+ return cp_parser_omp_distribute(parser,
+ pragma_tok,
+ p_name, mask,
+ cclauses);
+ }
+ }
+}
+
+static bool
+cp_parser_omp_target(cp_parser * parser, cp_token * pragma_tok,
+ enum pragma_context context)
+{
+ if (context != pragma_stmt && context != pragma_compound) {
+ tree id = cp_lexer_peek_token(parser->lexer)->u.value;
+ const char *p =
+ ((const char
+ *)(tree_check((id),
+ "/home/bonzo/develop/trunk/gcc/cp/parser.c",
+ 30201, __FUNCTION__,
+ (IDENTIFIER_NODE)))->identifier.id.str);
+ if (strcmp(p, "teams") == 0) {
+ tree cclauses[C_OMP_CLAUSE_SPLIT_COUNT];
+ char p_name[sizeof
+ ("#pragma omp target teams distribute "
+ "parallel for simd")];
+ if (!global_options.x_flag_openmp)
+ return cp_parser_omp_teams(parser, pragma_tok,
+ p_name,
+ ((((omp_clause_mask)
+ 1) <<
+ PRAGMA_OMP_CLAUSE_DEVICE)
+ |
+ (((omp_clause_mask)
+ 1) <<
+ PRAGMA_OMP_CLAUSE_MAP)
+ |
+ (((omp_clause_mask)
+ 1) <<
+ PRAGMA_OMP_CLAUSE_IF)),
+ cclauses);
+ }
+ }
+}
+
+static void
+cp_parser_omp_declare_reduction(cp_parser * parser, cp_token * pragma_tok,
+ enum pragma_context)
+{
+ tree reduc_id = (tree) __null, orig_reduc_id = (tree) __null, type;
+ while (true) {
+ type = cp_parser_type_id(parser);
+ }
+}
+
+static void
+cp_parser_omp_declare(cp_parser * parser, cp_token * pragma_tok,
+ enum pragma_context context)
+{
+ if (cp_lexer_next_token_is(parser->lexer, CPP_NAME)) {
+ tree id = cp_lexer_peek_token(parser->lexer)->u.value;
+ const char *p =
+ ((const char
+ *)(tree_check((id),
+ "/home/bonzo/develop/trunk/gcc/cp/parser.c",
+ 30883, __FUNCTION__,
+ (IDENTIFIER_NODE)))->identifier.id.str);
+ if (strcmp(p, "simd") == 0) {
+ cp_parser_omp_declare_reduction(parser, pragma_tok,
+ context);
+ }
+ }
+}
+
+static cp_parser *the_parser;
+static bool cp_parser_pragma(cp_parser * parser, enum pragma_context context)
+{
+ cp_token *pragma_tok;
+ unsigned int id;
+ switch (id) {
+ case PRAGMA_OMP_DECLARE_REDUCTION:
+ cp_parser_omp_declare(parser, pragma_tok, context);
+ case PRAGMA_OMP_TARGET:
+ return cp_parser_omp_target(parser, pragma_tok, context);
+ }
+}
+
+void c_parse_file(void)
+{
+ cp_parser_translation_unit(the_parser);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr57878.C b/gcc-4.9/gcc/testsuite/g++.dg/pr57878.C
new file mode 100644
index 000000000..231f9e346
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr57878.C
@@ -0,0 +1,227 @@
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+// { dg-require-effective-target c++11 }
+/* { dg-options "-O2 -fno-omit-frame-pointer -fPIC" } */
+
+typedef int int32;
+typedef long long int64;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+namespace std {
+ typedef __SIZE_TYPE__ size_t;
+ template<class _CharT>
+ struct char_traits;
+ template<typename _Tp>
+ inline _Tp* __addressof(_Tp& __r) noexcept {
+ return reinterpret_cast<_Tp*> (&const_cast<char&>(reinterpret_cast<const volatile char&>(__r)));
+ }
+ template<typename _Tp>
+ struct remove_reference {
+ typedef _Tp type;
+ };
+ template<typename _Tp>
+ constexpr _Tp&& forward(typename std::remove_reference<_Tp>::type& __t) noexcept {
+ return static_cast<_Tp&&>(__t);
+ }
+}
+typedef __SIZE_TYPE__ size_t;
+extern "C++" {
+ inline void* operator new(std::size_t, void* __p) noexcept {
+ return __p;
+ }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class new_allocator {
+ public:
+ typedef size_t size_type;
+ typedef _Tp* pointer;
+ };
+}
+namespace std {
+ template<typename _Tp>
+ using __allocator_base = __gnu_cxx::new_allocator<_Tp>;
+ template<typename _Tp>
+ class allocator
+ : public __allocator_base<_Tp> {
+ public:
+ typedef size_t size_type;
+ template<typename _Tp1>
+ struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class __sso_string_base;
+ template<typename _CharT, typename _Traits = std::char_traits<_CharT>, typename _Alloc = std::allocator<_CharT>, template <typename, typename, typename> class _Base = __sso_string_base>
+ class __versa_string;
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ struct __vstring_utility {
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+ template<typename _Alloc1>
+ struct _Alloc_hider
+ : public _Alloc1 {
+ _Alloc_hider(const _Alloc1& __a, _CharT* __ptr)
+ : _Alloc1(__a), _M_p(__ptr) {
+ }
+ _CharT* _M_p;
+ };
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class __sso_string_base
+ : protected __vstring_utility<_CharT, _Traits, _Alloc> {
+ typedef __vstring_utility<_CharT, _Traits, _Alloc> _Util_Base;
+ typedef typename _Util_Base::_CharT_alloc_type _CharT_alloc_type;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ private:
+ typename _Util_Base::template _Alloc_hider<_CharT_alloc_type>
+ _M_dataplus;
+ size_type _M_string_length;
+ enum {
+ _S_local_capacity = 15 };
+ union {
+ _CharT _M_local_data[_S_local_capacity + 1];
+ };
+ template<typename _InIterator>
+ void _M_construct(_InIterator __beg, _InIterator __end);
+ public:
+ size_type _M_max_size() const;
+ _CharT* _M_data() const {
+ return _M_dataplus._M_p;
+ }
+ size_type _M_length() const {
+ return _M_string_length;
+ }
+ __sso_string_base(const __sso_string_base& __rcs);
+ const _CharT_alloc_type& _M_get_allocator() const {
+ }
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ __sso_string_base<_CharT, _Traits, _Alloc>:: __sso_string_base(const __sso_string_base& __rcs)
+ : _M_dataplus(__rcs._M_get_allocator(), _M_local_data) {
+ _M_construct(__rcs._M_data(), __rcs._M_data() + __rcs._M_length());
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc, template <typename, typename, typename> class _Base>
+ class __versa_string
+ : private _Base<_CharT, _Traits, _Alloc> {
+ };
+}
+template<typename _CharT, typename _Traits = std::char_traits<_CharT>, typename _Alloc = std::allocator<_CharT> >
+class basic_string
+ : public __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc> {
+};
+typedef basic_string<char> string;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Alloc, typename _Tp>
+ class __alloctr_rebind_helper {
+ public:
+ static const bool __value = true;
+ };
+ template<typename _Alloc, typename _Tp, bool = __alloctr_rebind_helper<_Alloc, _Tp>::__value>
+ struct __alloctr_rebind;
+ template<typename _Alloc, typename _Tp> struct __alloctr_rebind<_Alloc, _Tp, true>
+ {
+ typedef typename _Alloc::template rebind<_Tp>::other __type;
+ };
+ template<typename _Alloc>
+ struct allocator_traits {
+ private:
+ template<typename _Tp>
+ static typename _Tp::pointer _S_pointer_helper(_Tp*);
+ typedef decltype(_S_pointer_helper((_Alloc*)0)) __pointer;
+ public:
+ typedef __pointer pointer;
+ template<typename _Tp>
+ using rebind_alloc = typename __alloctr_rebind<_Alloc, _Tp>::__type;
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Alloc> struct __alloc_traits
+ : std::allocator_traits<_Alloc>
+ {
+ typedef std::allocator_traits<_Alloc> _Base_type;
+ template<typename _Tp>
+ struct rebind {
+ typedef typename _Base_type::template rebind_alloc<_Tp>
+ other;
+ };
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _T1, typename... _Args>
+ inline void _Construct(_T1* __p, _Args&&... __args) {
+ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...);
+ }
+ template<typename _Tp, typename _Alloc>
+ struct _Vector_base {
+ typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<_Tp>::other _Tp_alloc_type;
+ typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer pointer;
+ struct _Vector_impl
+ : public _Tp_alloc_type {
+ pointer _M_start;
+ pointer _M_finish;
+ };
+ public:
+ _Vector_impl _M_impl;
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
+ class vector
+ : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ public:
+ typedef _Tp value_type;
+ typedef typename _Base::pointer pointer;
+ typedef size_t size_type;
+ size_type size() const;
+ void push_back(const value_type& __x) {
+ _M_emplace_back_aux(__x);
+ }
+ template<typename... _Args>
+ void _M_emplace_back_aux(_Args&&... __args);
+ size_type _M_check_len();
+ };
+ template<typename _Tp, typename _Alloc> template<typename... _Args>
+ void vector<_Tp, _Alloc>:: _M_emplace_back_aux(_Args&&... __args) {
+ const size_type __len = _M_check_len();
+ pointer __new_start(static_cast<pointer>(::operator new(__len * sizeof(_Tp))));
+ pointer __new_temp(__new_start + size());
+ ::new((void *)__new_temp) _Tp(std::forward<_Args>(__args)...);
+ pointer __cur = __new_start;
+ pointer __first = this->_M_impl._M_start;
+ pointer __last = this->_M_impl._M_finish;
+ for (;
+ __first != __last;
+ ++__first, ++__cur) std::_Construct(std::__addressof(*__cur), *__first);
+ }
+}
+using std::vector;
+class DL {
+public:
+ struct ChunkId {
+ int64 disk_id;
+ uint64 handle;
+ uint64 version;
+ string capability;
+ ChunkId();
+ };
+ struct ChunkInfo {
+ ChunkId id;
+ uint64 mtime;
+ uint32 length;
+ int32 space_used;
+ };
+};
+class FDB {
+ void CollectChunk(const DL::ChunkInfo& chunk, const int& location);
+private:
+ struct ChunkData {
+ int location;
+ DL::ChunkInfo chunk_info;
+ };
+ vector<ChunkData> chunk_data_;
+};
+void FDB::CollectChunk(const DL::ChunkInfo& chunk, const int& location) {
+ ChunkData chunk_data;
+ chunk_data_.push_back( chunk_data);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr58389.C b/gcc-4.9/gcc/testsuite/g++.dg/pr58389.C
new file mode 100644
index 000000000..648c14545
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr58389.C
@@ -0,0 +1,54 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+template <typename _RandomAccessIterator, typename _Compare>
+void __insertion_sort(_RandomAccessIterator, _Compare);
+template <typename _RandomAccessIterator, typename _Compare>
+void __final_insertion_sort(_RandomAccessIterator p1, _Compare p2) {
+ _RandomAccessIterator a;
+ if (p1 - a)
+ ;
+ else
+ std:
+ __insertion_sort(0, p2);
+}
+template <typename _RandomAccessIterator, typename _Size, typename _Compare>
+void __introsort_loop(_RandomAccessIterator, _Size, _Compare);
+template <typename _RandomAccessIterator, typename _Compare>
+void sort(_RandomAccessIterator, _RandomAccessIterator p2, _Compare p3) {
+std:
+ __introsort_loop(0, 0, p3);
+ __final_insertion_sort(p2, p3);
+}
+class A {
+public:
+ int m_fn1();
+ void __lg();
+ class B {
+ public:
+ int i;
+ int operator-(B);
+ };
+};
+class C;
+class D {
+public:
+ C *operator->();
+};
+class F {
+ A m_fn1() const;
+ D d_ptr;
+};
+class C {
+ friend F;
+ void m_fn1();
+ A children;
+};
+void qt_notclosestLeaf();
+inline void C::m_fn1() {
+ A::B b, c;
+ if (children.m_fn1()) {
+ sort(c, b, qt_notclosestLeaf);
+ }
+}
+A F::m_fn1() const { const_cast<F *>(this)->d_ptr->m_fn1(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr58438.C b/gcc-4.9/gcc/testsuite/g++.dg/pr58438.C
new file mode 100644
index 000000000..4c62cb26c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr58438.C
@@ -0,0 +1,45 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-march=amdfam10 -O3 -fprofile-generate" } */
+enum gimple_code {};
+struct A {
+ gimple_code code;
+};
+struct B {
+ A gsbase;
+};
+int **a;
+int b, d, e, f, g, h, i, j, k, l, m, n, o;
+gimple_code c, p;
+class C {
+ virtual unsigned m_fn1();
+};
+B q;
+static int fn1() {
+ int r;
+ if (k)
+ i = 0;
+ for (; i; j++) {
+ b = c <= 0;
+ if (b)
+ n = *a[0];
+ b = p && c;
+ if (b)
+ r = *a[0];
+ b = q.gsbase.code && c;
+ if (b)
+ o = *a[0];
+ m = o;
+ if (e || 1 & r || d || l)
+ return 0;
+ }
+}
+
+class D : C {
+ unsigned m_fn1() {
+ fn1();
+ for (; h; g++)
+ for (;; f++)
+ ;
+ }
+};
+void fn2() { new D; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr58950.C b/gcc-4.9/gcc/testsuite/g++.dg/pr58950.C
new file mode 100644
index 000000000..10a203244
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr58950.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+void f(){
+ int i __attribute__((vector_size(2*sizeof(int)))) = { 2, 3 };
+ __builtin_shuffle (i, i); /* { dg-warning "value computed is not used" } */
+ ++i?1:0; /* { dg-warning "value computed is not used" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr59445.C b/gcc-4.9/gcc/testsuite/g++.dg/pr59445.C
new file mode 100644
index 000000000..99d6df251
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr59445.C
@@ -0,0 +1,81 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+template <typename _Iterator> struct A;
+template <typename _Tp> struct A<_Tp *> {
+ typedef _Tp value_type;
+ typedef int difference_type;
+};
+template <typename _Compare> struct B {};
+template <typename _Compare> struct C {
+ _Compare _M_comp;
+ template <typename _Value, typename _Iterator>
+ int operator()(_Value &p1, _Iterator p2) {
+ return _M_comp(p1, *p2);
+ }
+};
+template <typename _Compare> C<_Compare> __val_comp_iter(B<_Compare>);
+template <typename _RandomAccessIterator, typename _Compare>
+void __unguarded_linear_insert(_RandomAccessIterator p1, _Compare p2) {
+ typename A<_RandomAccessIterator>::value_type a;
+ _RandomAccessIterator b = p1;
+ --b;
+ while (p2(a, b)) {
+ *p1 = 0;
+ p1 = b;
+ --b;
+ }
+}
+template <typename _RandomAccessIterator, typename _Compare>
+void __insertion_sort(_RandomAccessIterator, _Compare p2) {
+ for (_RandomAccessIterator c;; ++c)
+ __unguarded_linear_insert(c, __val_comp_iter(p2));
+}
+template <typename _RandomAccessIterator, typename _Distance, typename _Compare>
+void __chunk_insertion_sort(_RandomAccessIterator, _Distance, _Compare p3) {
+ _RandomAccessIterator d;
+ __insertion_sort(d, p3);
+}
+template <typename _RandomAccessIterator, typename _Pointer, typename _Compare>
+void __merge_sort_with_buffer(_RandomAccessIterator p1, _Pointer, _Compare p3) {
+ __chunk_insertion_sort(p1, 0, p3);
+}
+template <typename _RandomAccessIterator, typename _Pointer, typename _Distance,
+ typename _Compare>
+void __stable_sort_adaptive(_RandomAccessIterator, _Pointer, _Distance,
+ _Compare p4) {
+ _RandomAccessIterator e;
+ __merge_sort_with_buffer(e, 0, p4);
+}
+template <typename _RandomAccessIterator, typename _Compare>
+void __stable_sort(_RandomAccessIterator p1, _Compare p2) {
+ __stable_sort_adaptive(
+ p1, 0, typename A<_RandomAccessIterator>::difference_type(), p2);
+}
+template <typename _RandomAccessIterator, typename _Compare>
+void stable_sort(_RandomAccessIterator, _RandomAccessIterator p2, _Compare) {
+ B<_Compare> f;
+ __stable_sort(p2, f);
+}
+class D {
+public:
+ void m_fn1();
+};
+class F {
+ struct G {
+ D MFI;
+ int operator()(int p1, int p2) {
+ if (p1)
+ return 0;
+ if (p2)
+ return 1;
+ MFI.m_fn1();
+ }
+ };
+ void m_fn1(int &p1) const;
+};
+void F::m_fn1(int &p1) const {
+ int *g, *h;
+ stable_sort(h, g, G());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr59477.C b/gcc-4.9/gcc/testsuite/g++.dg/pr59477.C
new file mode 100644
index 000000000..788c751e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr59477.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct A
+{
+ unsigned *a, b;
+ A (unsigned x) : a (), b (x) {}
+};
+
+struct B
+{
+ B (int);
+ B (const B &) {}
+};
+
+B bar (B, B, A);
+int v;
+
+void
+foo ()
+{
+ B c = 0;
+ bar (c, c, A (1ULL << v));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr59482.C b/gcc-4.9/gcc/testsuite/g++.dg/pr59482.C
new file mode 100644
index 000000000..bde832909
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr59482.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+class aa {
+ friend class cc;
+ class bb {};
+};
+
+class cc : aa::bb {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr59510.C b/gcc-4.9/gcc/testsuite/g++.dg/pr59510.C
new file mode 100644
index 000000000..dcdf860dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr59510.C
@@ -0,0 +1,82 @@
+// PR debug/59510
+// { dg-do compile }
+// { dg-options "-O2 -g --param=large-stack-frame-growth=1" }
+
+template <typename _Iterator>
+struct _Iter_base
+{
+ typedef _Iterator iterator_type;
+};
+template <typename _CharT>
+struct basic_ostream;
+template <typename _CharT>
+struct basic_ostringstream;
+template <typename _CharT>
+struct ostreambuf_iterator;
+typedef basic_ostringstream <char>ostringstream;
+template <typename _Iterator> struct _Miter_base : _Iter_base <_Iterator>
+{
+};
+template <typename _Iterator>
+typename _Miter_base <_Iterator>::iterator_type __miter_base (_Iterator);
+template <typename _CharT>
+ostreambuf_iterator <_CharT>
+__copy_move_a2 (ostreambuf_iterator <_CharT>);
+template <typename _II, typename _OI>
+_OI copy (_II __first, _II __last, _OI __result)
+{
+ __copy_move_a2 <false> (__first, __miter_base (__last), __result);
+}
+struct ios_base {
+ struct _Words {
+ int *_M_pword;
+ long _M_iword;
+ };
+ _Words _M_local_word[8];
+};
+template <typename _CharT>
+struct basic_streambuf
+{
+ typedef _CharT char_type;
+ int sputn (char_type *, int);
+};
+template <typename _CharT>
+struct ostreambuf_iterator
+{
+ typedef basic_streambuf <_CharT> streambuf_type;
+ typedef basic_ostream <_CharT> ostream_type;
+ streambuf_type *_M_sbuf;
+ bool _M_failed;
+ ostreambuf_iterator (ostream_type __s) : _M_sbuf (__s.rdbuf ()), _M_failed () {}
+ void _M_put (_CharT * __ws, int __len)
+ {
+ if (_M_failed && _M_sbuf->sputn (__ws, __len) != __len) _M_failed = true;
+ }
+};
+template <bool, typename _CharT>
+void __copy_move_a2 (_CharT * __first,_CharT * __last,ostreambuf_iterator <_CharT> __result)
+{
+ int __num = __last - __first;
+ __result._M_put (__first, __num);
+}
+template <typename _CharT>
+struct basic_ios : ios_base
+{
+ basic_streambuf <_CharT> *rdbuf ();
+};
+template <typename _CharT>
+struct basic_ostream : public basic_ios <_CharT>
+{
+};
+template <typename _CharT>
+struct basic_ostringstream : public basic_ostream <_CharT>
+{
+};
+void
+test01 () {
+ char data1[] = "foo";
+ char *beg1 = data1;
+ ostringstream oss1;
+ ostreambuf_iterator <char> out1 (oss1);
+ out1 = copy (beg1, beg1, out1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr59695.C b/gcc-4.9/gcc/testsuite/g++.dg/pr59695.C
new file mode 100644
index 000000000..ac636d06f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr59695.C
@@ -0,0 +1,125 @@
+
+/* PR target/59695 */
+/* { dg-do run } */
+/* { dg-options "-O0" } */
+
+#define DEFINE_VIRTUALS_FNS(i) virtual void xxx##i () {} \
+ virtual void foo1_##i () {}\
+ virtual void foo2_##i () {}\
+ virtual void foo3_##i () {}\
+ virtual void foo4_##i () {}\
+ virtual void foo5_##i () {}\
+ virtual void foo6_##i () {}\
+ virtual void foo7_##i () {}\
+ virtual void foo8_##i () {}\
+ virtual void foo9_##i () {}\
+ virtual void foo10_##i () {}\
+ virtual void foo11_##i () {}\
+ virtual void foo12_##i () {}\
+ virtual void foo13_##i () {}\
+ virtual void foo14_##i () {}\
+ virtual void foo15_##i () {}\
+ virtual void foo16_##i () {}\
+ virtual void foo17_##i () {}\
+ virtual void foo18_##i () {}\
+ virtual void foo19_##i () {}\
+ virtual void foo20_##i () {}\
+ virtual void foo21_##i () {}\
+ virtual void foo22_##i () {}\
+
+class base_class_2
+{
+
+public:
+ /* Define lots of virtual functions */
+ DEFINE_VIRTUALS_FNS (1)
+ DEFINE_VIRTUALS_FNS (2)
+ DEFINE_VIRTUALS_FNS (3)
+ DEFINE_VIRTUALS_FNS (4)
+ DEFINE_VIRTUALS_FNS (5)
+ DEFINE_VIRTUALS_FNS (6)
+ DEFINE_VIRTUALS_FNS (7)
+ DEFINE_VIRTUALS_FNS (8)
+ DEFINE_VIRTUALS_FNS (9)
+ DEFINE_VIRTUALS_FNS (10)
+ DEFINE_VIRTUALS_FNS (11)
+ DEFINE_VIRTUALS_FNS (12)
+ DEFINE_VIRTUALS_FNS (13)
+ DEFINE_VIRTUALS_FNS (14)
+ DEFINE_VIRTUALS_FNS (15)
+ DEFINE_VIRTUALS_FNS (16)
+ DEFINE_VIRTUALS_FNS (17)
+ DEFINE_VIRTUALS_FNS (18)
+ DEFINE_VIRTUALS_FNS (19)
+ DEFINE_VIRTUALS_FNS (20)
+
+ base_class_2();
+ virtual ~base_class_2 ();
+};
+
+base_class_2::base_class_2()
+{
+}
+
+base_class_2::~base_class_2 ()
+{
+}
+
+class base_class_1
+{
+public:
+ virtual ~base_class_1();
+ base_class_1();
+};
+
+base_class_1::base_class_1()
+{
+}
+
+base_class_1::~base_class_1()
+{
+}
+
+class base_Impl_class :
+ virtual public base_class_2, public base_class_1
+{
+public:
+ base_Impl_class ();
+ virtual ~base_Impl_class ();
+};
+
+base_Impl_class::base_Impl_class ()
+{
+}
+
+base_Impl_class::~base_Impl_class ()
+{
+}
+
+
+class test_cls : public base_Impl_class
+{
+public:
+ test_cls();
+ virtual ~test_cls();
+};
+
+test_cls::test_cls()
+{
+}
+
+test_cls::~test_cls()
+{
+}
+
+int main()
+{
+ test_cls *test = new test_cls;
+ base_class_2 *p1 = test;
+
+ /* PR59695 destructor thunk offsets are not setup
+ correctly resulting in crash. */
+ delete p1;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr60518.C b/gcc-4.9/gcc/testsuite/g++.dg/pr60518.C
new file mode 100644
index 000000000..e3da48a2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pr60518.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Os -fprofile-use" }
+
+int a;
+int fn1 () { return a == ',' || a == ';'; }
+
+void fn2 ()
+{
+ do
+ while (fn1 ())
+ ;
+ while (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-1.C b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-1.C
new file mode 100644
index 000000000..2289552b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-1.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+
+int g;
+int foo();
+void test() {
+ while (foo() && g < 10)
+ g++;
+ return;
+}
+
+/* { dg-final { scan-tree-dump-times "loop exit heuristics:" 3 "profile_estimate"} } */
+/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-2.C b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-2.C
new file mode 100644
index 000000000..1a5880bde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-2.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+
+int g;
+int foo();
+void test() {
+ while (foo() || g < 10)
+ g++;
+ return;
+}
+
+/* { dg-final { scan-tree-dump-times "loop exit heuristics:" 2 "profile_estimate"} } */
+/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-3.C b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-3.C
new file mode 100644
index 000000000..9afc78ef9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/predict-loop-exit-3.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+
+int g;
+int foo();
+void test() {
+ while (foo() && (g < 10 || g > 20))
+ g++;
+ return;
+}
+
+/* { dg-final { scan-tree-dump-times "loop exit heuristics:" 3 "profile_estimate"} } */
+/* { dg-final { cleanup-tree-dump "profile_estimate" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/prof-robust-1.C b/gcc-4.9/gcc/testsuite/g++.dg/prof-robust-1.C
new file mode 100644
index 000000000..a5d8cb3c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/prof-robust-1.C
@@ -0,0 +1,24 @@
+/* { dg-options "-O2 -fno-weak" } */
+
+#include <stdio.h>
+
+namespace {
+ namespace {
+
+ class MyClass {
+ public:
+ void foo() const;
+ ~MyClass() { foo(); }
+ };
+
+ void MyClass::foo() const { printf("Goodbye World\n"); }
+
+ }
+
+ static MyClass variable;
+
+}
+
+int main() {
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pubtypes.C b/gcc-4.9/gcc/testsuite/g++.dg/pubtypes.C
new file mode 100644
index 000000000..8f89c4b6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/pubtypes.C
@@ -0,0 +1,65 @@
+/* Radar 4535968 */
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-O0 -gdwarf-2 -dA -fno-eliminate-unused-debug-types" } */
+/* { dg-final { scan-assembler "__debug_pubtypes" } } */
+/* { dg-final { scan-assembler "long+\[ \t\]+\(0x\)?\[0-9a-f]+\[ \t\n\]+\[#;@]+\[ \t\]+Pub Info Length" } } */
+/* { dg-final { scan-assembler "\"empty\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */
+/* { dg-final { scan-assembler "\"A\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */
+/* { dg-final { scan-assembler "\"B\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */
+
+
+struct A
+{
+ virtual ~A ();
+ int a1;
+};
+
+A::~A()
+{
+ a1 = 800;
+}
+
+struct B : public A
+{
+ virtual ~B ();
+ int b1;
+ int b2;
+};
+
+B::~B()
+{
+ a1 = 900;
+ b1 = 901;
+ b2 = 902;
+}
+
+// Stop the compiler from optimizing away data.
+void refer (A *)
+{
+ ;
+}
+
+struct empty {};
+
+// Stop the compiler from optimizing away data.
+void refer (empty *)
+{
+ ;
+}
+
+int main (void)
+{
+ A alpha, *aap, *abp;
+ B beta, *bbp;
+ empty e;
+
+ alpha.a1 = 100;
+ beta.a1 = 200; beta.b1 = 201; beta.b2 = 202;
+
+ aap = &alpha; refer (aap);
+ abp = &beta; refer (abp);
+ bbp = &beta; refer (bbp);
+ refer (&e);
+
+ return 0; // marker return 0
+} // marker close brace
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/anon-ns1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/anon-ns1.C
new file mode 100644
index 000000000..e18be4300
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/anon-ns1.C
@@ -0,0 +1,15 @@
+// PR c++/49440
+// The typeinfo name for A should start with * so we compare
+// it by address rather than contents.
+
+// { dg-final { scan-assembler "\"\*N\[^\"\]+1AE" } }
+
+namespace
+{
+ class A { };
+}
+
+void f()
+{
+ throw A();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash1.C
new file mode 100644
index 000000000..eea6a3950
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7788. ICE
+
+class foo;
+extern const foo bar;
+class bar;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash2.C
new file mode 100644
index 000000000..9646dfdc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash2.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Jun 2005 <nathan@codesourcery.com>
+
+// Crash when compiler is optimized
+// Origin: Andrew Pinski pinskia@gcc.gnu.org
+
+struct facet { virtual ~facet(); };
+struct ctype_base {};
+struct ctype : facet, ctype_base {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash3.C
new file mode 100644
index 000000000..076e36002
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash3.C
@@ -0,0 +1,10 @@
+// PR c++/23947
+// { dg-do compile }
+
+class A {};
+class B {};
+class C : public A, public B {};
+class D : public C {};
+void f () throw (D)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash4.C
new file mode 100644
index 000000000..49807e99f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/crash4.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+class ios_base {
+public:
+ virtual ~ios_base();
+};
+template<typename _CharT>
+class basic_ostream : virtual public ios_base {
+public:
+ virtual ~basic_ostream() { }
+};
+extern template class basic_ostream<char>;
+template <typename _CharT>
+class basic_ostringstream : public basic_ostream<_CharT> { };
+template class basic_ostringstream<char>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/cv1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/cv1.C
new file mode 100644
index 000000000..59dd6592c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/cv1.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+
+#include <typeinfo>
+#include <string.h>
+
+struct S {};
+
+typedef S volatile T[4];
+
+T t[3];
+
+const std::type_info& ti = typeid (t);
+
+int main () {
+ if (strcmp (ti.name (), "A3_A4_1S") != 0)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C
new file mode 100644
index 000000000..6db161169
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C
@@ -0,0 +1,20 @@
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-final { scan-assembler-not "\\.weak_definition __ZTI" } } */
+
+/* Verify that none of the type_info structures for the fundamental
+ types are emitted as weak on Darwin. */
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1 {
+
+using namespace std;
+
+// This has special meaning to the compiler, and will cause it
+// to emit the type_info structures for the fundamental types which are
+// mandated to exist in the runtime.
+__fundamental_type_info::
+~__fundamental_type_info ()
+{}
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast1.C
new file mode 100644
index 000000000..ace1aef06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast1.C
@@ -0,0 +1,23 @@
+class JunkBase
+{
+public:
+ virtual void DoSomething( void ) = 0;
+protected:
+ virtual ~JunkBase( void ) {}
+ JunkBase( void ) {}
+};
+
+class Junk : protected JunkBase
+{
+public:
+ Junk( void ) : JunkBase() {}
+ virtual ~Junk( void ) {}
+protected:
+ inline JunkBase * AsBase( void )
+ { return dynamic_cast< JunkBase * >( this ); }
+ virtual void DoSomething( void ) { }
+};
+
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast2.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast2.C
new file mode 100644
index 000000000..2e4f61596
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast2.C
@@ -0,0 +1,31 @@
+// PR c++/34364
+// { dg-do run }
+
+struct A
+{
+ virtual ~A () {}
+};
+
+struct B : public A
+{
+ template <typename T> struct C
+ {
+ static void f (A &a)
+ {
+ dynamic_cast <B &>(a).g ();
+ }
+ };
+
+ B () : c (6) {}
+ void g () { c++; }
+ int c;
+};
+
+B b;
+
+int
+main (void)
+{
+ B::C<int>::f (b);
+ return b.c != 7;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast3.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast3.C
new file mode 100644
index 000000000..08352599b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast3.C
@@ -0,0 +1,81 @@
+// This testcase used to crash while looking in A for my_module. I'm still
+// not sure it's well-formed, but it works now because of the optimization
+// to look at the expected address first.
+
+// { dg-do run }
+
+extern "C" int puts (const char *);
+extern "C" void abort ();
+
+struct my_object
+{
+ my_object() { puts ("in my_object ctor");}
+ virtual ~my_object() { puts ("in my_object dtor"); }
+};
+
+my_object* my_module_ptr = 0;
+
+struct my_module : my_object
+{
+ my_module()
+ {
+ puts ("in my_module ctor, setting up ptr");
+ my_module_ptr = this;
+ }
+ ~my_module() { puts ("in my_module dtor");}
+};
+
+struct D
+{
+ D() { puts ("in D ctor"); }
+ virtual ~D();
+};
+
+D::~D()
+{
+ puts ("in D dtor");
+ puts ("before DCASTing to my_module*");
+ my_module* m = dynamic_cast<my_module*>(my_module_ptr);
+ if (m != my_module_ptr)
+ abort ();
+ puts ("after DCASTing to my_module*");
+}
+
+struct my_interface
+{
+ my_interface() { puts ("in my_interface ctor");}
+ ~my_interface() { puts ("in my_interface dtor");}
+};
+
+struct myif : virtual my_interface
+{
+ myif() { puts ("in myif ctor");}
+ ~myif() { puts ("in myif dtor");}
+};
+
+struct A: virtual myif
+{
+ A() { puts ("in A ctor"); }
+ ~A() { puts ("in A dtor"); }
+
+ D d;
+};
+
+struct B: virtual myif
+{
+ B() { puts ("in B ctor"); }
+ ~B() { puts ("in B dtor"); }
+
+ D d;
+};
+
+struct C : my_module, A, B
+{
+ C() { puts ("in C ctor");}
+ ~C() { puts ("in C dtor"); }
+};
+
+int main(int, char**)
+{
+ C t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast4.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast4.C
new file mode 100644
index 000000000..2a5fd2b3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast4.C
@@ -0,0 +1,26 @@
+// Test to make sure that we keep searching if we don't find the type we
+// want at the expected address.
+
+// { dg-do run }
+
+struct A
+{
+ virtual void f() {};
+};
+
+struct B: A { };
+
+struct C: A { };
+
+struct D: B, C { };
+
+int main()
+{
+ D d;
+ A* ap = static_cast<B*>(&d);
+ C* cp = dynamic_cast<C*>(ap);
+ if (cp == 0)
+ return 1;
+ else
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast5.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast5.C
new file mode 100644
index 000000000..d0d58d009
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast5.C
@@ -0,0 +1,9 @@
+// PR c++/29273
+
+struct A { virtual ~A () { } };
+struct B: A { } b [1];
+
+void foo ()
+{
+ dynamic_cast<B*>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast6.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast6.C
new file mode 100644
index 000000000..a6329e944
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/dyncast6.C
@@ -0,0 +1,59 @@
+// PR c++/57599
+
+class A { };
+
+class B : public A { };
+
+void p()
+{
+ B* b;
+
+ A* a1;
+ a1 = dynamic_cast<A*>(b);
+ a1 = dynamic_cast<const A*>(b); // { dg-error "invalid" }
+ a1 = dynamic_cast<volatile A*>(b); // { dg-error "invalid" }
+ a1 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
+
+ const A* a2;
+ a2 = dynamic_cast<A*>(b);
+ a2 = dynamic_cast<const A*>(b);
+ a2 = dynamic_cast<volatile A*>(b); // { dg-error "invalid" }
+ a2 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
+
+ volatile A* a3;
+ a3 = dynamic_cast<A*>(b);
+ a3 = dynamic_cast<const A*>(b); // { dg-error "invalid" }
+ a3 = dynamic_cast<volatile A*>(b);
+ a3 = dynamic_cast<const volatile A*>(b); // { dg-error "invalid" }
+
+ const volatile A* a4;
+ a4 = dynamic_cast<A*>(b);
+ a4 = dynamic_cast<const A*>(b);
+ a4 = dynamic_cast<volatile A*>(b);
+ a4 = dynamic_cast<const volatile A*>(b);
+}
+
+void r()
+{
+ B b;
+
+ A& a1 = dynamic_cast<A&>(b);
+ A& a2 = dynamic_cast<const A&>(b); // { dg-error "invalid" }
+ A& a3 = dynamic_cast<volatile A&>(b); // { dg-error "invalid" }
+ A& a4 = dynamic_cast<const volatile A&>(b); // { dg-error "invalid" }
+
+ const A& ca1 = dynamic_cast<A&>(b);
+ const A& ca2 = dynamic_cast<const A&>(b);
+ const A& ca3 = dynamic_cast<volatile A&>(b); // { dg-error "invalid" }
+ const A& ca4 = dynamic_cast<const volatile A&>(b); // { dg-error "invalid" }
+
+ volatile A& va1 = dynamic_cast<A&>(b);
+ volatile A& va2 = dynamic_cast<const A&>(b); // { dg-error "invalid" }
+ volatile A& va3 = dynamic_cast<volatile A&>(b);
+ volatile A& va4 = dynamic_cast<const volatile A&>(b);// { dg-error "invalid" }
+
+ const volatile A& cva1 = dynamic_cast<A&>(b);
+ const volatile A& cva2 = dynamic_cast<const A&>(b);
+ const volatile A& cva3 = dynamic_cast<volatile A&>(b);
+ const volatile A& cva4 = dynamic_cast<const volatile A&>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/fn-quals.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/fn-quals.C
new file mode 100644
index 000000000..75d24f8a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/fn-quals.C
@@ -0,0 +1,12 @@
+// PR c++/48665
+
+#include <typeinfo>
+extern "C" void abort();
+
+template<class A,class B> void f() {
+ if (typeid(A)==typeid(B)) abort(); // { dg-error "qualified function" }
+ if (typeid(A*)==typeid(B*)) abort(); // { dg-error "qualified function" }
+}
+int main() {
+ f<void()const,void()>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/incomplete1.C
new file mode 100644
index 000000000..2bf46e079
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/incomplete1.C
@@ -0,0 +1,12 @@
+// PR c++/28109
+// { dg-do compile }
+
+#include <typeinfo>
+
+struct A;
+
+void foo()
+{
+ A a; // { dg-error "incomplete type" }
+ typeid (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C
new file mode 100644
index 000000000..2b3915d17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "-fno-rtti" }
+
+// PR C++/28687
+
+struct A {
+ virtual ~A() { }
+};
+
+struct B : A {
+};
+
+A* f()
+{
+ return new B();
+}
+
+int main()
+{
+ void* b = dynamic_cast<void*>(f());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti.C
new file mode 100644
index 000000000..fdf2e6052
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/no-rtti.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fno-rtti" }
+
+// PR C++/10891
+
+struct A {
+ virtual ~A() { }
+};
+
+struct B : A {
+};
+
+A* f();
+
+int main()
+{
+ B* b = dynamic_cast<B*>(f()); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C
new file mode 100644
index 000000000..5c94bc1de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+struct A { virtual ~A() { }; };
+struct B : A { };
+
+void f(B* bp)
+{
+ bp =
+#ifdef __GXX_RTTI
+ dynamic_cast<B*>(static_cast<A*>(0));
+#endif
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C
new file mode 100644
index 000000000..284f2f64a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-fno-rtti" }
+
+struct B { };
+
+void f(B* bp)
+{
+ bp =
+#ifndef __GXX_RTTI
+ static_cast<B*>(0);
+#endif
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/repo1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/repo1.C
new file mode 100644
index 000000000..f72a9730a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/repo1.C
@@ -0,0 +1,19 @@
+// PR c++/22204
+// { dg-options "-frepo" }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+#include <typeinfo>
+template<int>
+struct function1
+{
+ function1()
+ {
+ typeid(int[100]);
+ }
+};
+function1<1> b;
+
+int main () {}
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/template1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/template1.C
new file mode 100644
index 000000000..e2a03766f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/template1.C
@@ -0,0 +1,23 @@
+// PR c++/49387
+
+#include <typeinfo>
+
+struct ResourceMonitorClient { };
+
+template <typename T> struct ResourcePool : public ResourceMonitorClient {
+ virtual ~ResourcePool() { }
+};
+
+template <typename T> struct BaseWriter {
+
+ BaseWriter() {
+ typeid(ResourcePool<int>*);
+ }
+
+ virtual void run() {
+ ResourcePool<int> pool;
+ }
+
+};
+
+BaseWriter<void> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/tinfo1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/tinfo1.C
new file mode 100644
index 000000000..bd379aace
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/tinfo1.C
@@ -0,0 +1,40 @@
+// Test if a local definition is in a linkonce/comdat section.
+// { dg-do compile }
+// { dg-final { scan-assembler "_ZTIP9CTemplateIhE\[: \t\n\]" } }
+// { dg-final { scan-assembler-not "(.globl|.global)\[ \]+_ZTIP9CTemplateIhE" } }
+// { dg-final { scan-assembler-not ".section\[^\n\r\]*_ZTIP9CTemplateIhE\[^\n\r\]*" } }
+
+
+namespace std
+{
+ class type_info
+ {
+ protected:
+ const char *__name;
+
+ protected:
+ explicit type_info(const char *__n): __name(__n) { }
+
+ public:
+ const char* name() const
+ { return __name; }
+ };
+}
+
+template<class TYPE>
+class CTemplate
+{
+};
+
+class CSecondModule {
+public:
+ CSecondModule();
+
+private:
+ const CTemplate<unsigned char> *m_variable; typedef CTemplate<unsigned char> m_variable_type;
+};
+
+CSecondModule::CSecondModule()
+{
+ typeid(const_cast<m_variable_type *>(m_variable)).name() != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid1.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid1.C
new file mode 100644
index 000000000..e26517576
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid1.C
@@ -0,0 +1,11 @@
+#include <typeinfo>
+
+struct A {
+ virtual ~A() {}
+};
+
+int main() {
+ A* a = new A;
+ typeid(*a).name();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid10.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid10.C
new file mode 100644
index 000000000..47b45b105
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid10.C
@@ -0,0 +1,36 @@
+// PR c++/25466
+// { dg-do run }
+
+#include <typeinfo>
+
+const std::type_info *a;
+
+template <class T>
+bool is_polymorphic() {
+ bool result(false);
+ const std::type_info &a1 = typeid( (result=true), *(T*)0);
+ a = &a1;
+ return result;
+}
+
+struct non_polymorphic {};
+struct polymorphic { virtual ~polymorphic() {} };
+
+
+int main() {
+ if (is_polymorphic<int>()) __builtin_abort();
+ if (is_polymorphic<non_polymorphic>()) __builtin_abort();
+ try
+ {
+ is_polymorphic<polymorphic>();
+ __builtin_abort(); // should have thrown bad_typeid
+ }
+ catch (std::bad_typeid&)
+ {
+ // OK
+ }
+ catch (...)
+ {
+ __builtin_abort();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid2.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid2.C
new file mode 100644
index 000000000..0dbcc598b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid2.C
@@ -0,0 +1,15 @@
+// { dg-do run }
+
+#include <typeinfo>
+
+template <typename T> const char *print_type (const T &) {
+ return typeid(T).name();
+}
+
+/* no template */ void pp1 (int) {}
+template <typename X> void pp2 (X) {}
+
+int main () {
+ if (print_type (&pp1) != print_type (&pp2<int>))
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid3.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid3.C
new file mode 100644
index 000000000..a07b39924
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid3.C
@@ -0,0 +1,11 @@
+#include <typeinfo>
+
+template <template <class> class T> struct A {
+ void error() {
+ typeid(T).name(); // { dg-error "missing" }
+ }
+};
+
+template <class T> struct B {};
+
+template void A<B>::error();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid4.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid4.C
new file mode 100644
index 000000000..e6a1dce16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid4.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <typeinfo>
+#include <iostream>
+
+struct A { virtual ~A () {} };
+
+struct APtr
+{
+ APtr (A* p) : p_ (p) { }
+ A& operator* () const { return *p_; }
+ A* p_;
+};
+
+int main ()
+{
+ APtr ap (new A);
+ std::type_info const* const exp = &typeid (*ap);
+ for (bool cont = true; cont; cont = false)
+ {
+ std::cout << "inner: cont " << cont << std::endl;
+ if (exp) ;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid5.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid5.C
new file mode 100644
index 000000000..ef769ce53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid5.C
@@ -0,0 +1,13 @@
+// PR c++/29928
+// { dg-do compile }
+
+#include <typeinfo>
+
+struct S;
+
+void f()
+{
+ const std::type_info& info1 = typeid(int []);
+ const std::type_info& info2 = typeid(S [3]);
+ const std::type_info& info3 = typeid(S []);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid6.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid6.C
new file mode 100644
index 000000000..d8879c59c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid6.C
@@ -0,0 +1,12 @@
+// PR c++/33463
+
+namespace std
+{
+ class type_info {};
+}
+
+template<int> void foo()
+{
+ !typeid(void); // { dg-error "!typeid\\(void\\)|candidate is" }
+ // { dg-message "" "match candidate text" { target *-*-* } 10 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid7.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid7.C
new file mode 100644
index 000000000..7391405fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid7.C
@@ -0,0 +1,61 @@
+// PR c++/32260
+// { dg-do compile }
+// { dg-options "-O2 -W -Wall" }
+
+#include <typeinfo>
+
+const std::type_info &
+f1 (int i)
+{
+ return typeid (i + 1);
+}
+
+const std::type_info &
+f2 ()
+{
+ return typeid (int);
+}
+
+struct A
+{
+ A ();
+ virtual ~A ();
+ void foo ();
+};
+
+const std::type_info &
+f3 ()
+{
+ return typeid (A);
+}
+
+const std::type_info &
+f4 (A *p)
+{
+ return typeid (*p);
+}
+
+const std::type_info &
+f5 ()
+{
+ return typeid (int *);
+}
+
+const std::type_info &
+f6 ()
+{
+ return typeid (int [26][12]);
+}
+
+const std::type_info &
+f7 ()
+{
+ return typeid (int [26][12]);
+}
+
+void (A::*pmr) ();
+const std::type_info &
+f8 ()
+{
+ return typeid (pmr);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid8.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid8.C
new file mode 100644
index 000000000..2b13be5ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid8.C
@@ -0,0 +1,26 @@
+// PR c++/36405
+// { dg-do compile }
+
+#include <typeinfo>
+
+struct A
+{
+ void foo ()
+ {
+ typeid (foo).name (); // { dg-error "invalid use of member" }
+ typeid (A::foo).name (); // { dg-error "invalid use of member" }
+ }
+ void bar ()
+ {
+ typeid (foo).name (); // { dg-error "invalid use of member" }
+ typeid (A::foo).name (); // { dg-error "invalid use of member" }
+ }
+ static void baz ()
+ {
+ typeid (baz).name ();
+ typeid (A::baz).name ();
+ }
+};
+
+const char *p1 = typeid (A::foo).name (); // { dg-error "invalid use of non-static member" }
+const char *p2 = typeid (A::baz).name ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid9.C b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid9.C
new file mode 100644
index 000000000..381252dc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/rtti/typeid9.C
@@ -0,0 +1,21 @@
+// Test that the typeid name for a local class is properly null-terminated.
+// { dg-do run }
+
+#include <string.h>
+#include <typeinfo>
+#include <stdio.h>
+
+int f()
+{
+ struct A {}; struct B {};
+ const std::type_info &ti = typeid(A);
+ const std::type_info &ti2 = typeid(B);
+ puts (ti.name());
+ puts (ti2.name());
+ return strcmp (ti.name(), "Z1fvE1A") || strcmp (ti2.name(), "Z1fvE1B");
+}
+
+int main()
+{
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-1.C b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-1.C
new file mode 100644
index 000000000..950caddb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-1.C
@@ -0,0 +1,74 @@
+/* { dg-do link { target c++11 } } */
+/* { dg-final { simulate-thread } } */
+/* { dg-require-effective-target sync_char_short } */
+/* { dg-require-effective-target sync_int_long } */
+
+/* Test that atomic int and atomic char work properly. */
+
+using namespace std;
+
+#include <atomic>
+#include <limits.h>
+#include <stdio.h>
+#include "simulate-thread.h"
+
+atomic<int> atomi;
+atomic<char> atomc;
+
+/* No need for parallel threads to do anything */
+void simulate_thread_other_threads()
+{
+}
+
+/* Verify after every instruction is executed, that the atmoic int and
+ char have one of the 2 legitimate values. */
+int simulate_thread_step_verify()
+{
+ if (atomi != 0 && atomi != INT_MAX)
+ {
+ printf ("FAIL: invalid intermediate result for atomi (%d).\n",
+ (int)atomi);
+ return 1;
+ }
+ if (atomc != 0 && atomc != CHAR_MAX)
+ {
+ printf ("FAIL: invalid intermediate result for atomc (%d).\n",
+ (int)atomc);
+ return 1;
+ }
+ return 0;
+}
+
+
+/* Verify that both atmoics have the corerct value. */
+int simulate_thread_final_verify()
+{
+ if (atomi != INT_MAX)
+ {
+ printf ("FAIL: invalid final result for atomi (%d).\n",
+ (int)atomi);
+ return 1;
+ }
+ if (atomc != CHAR_MAX)
+ {
+ printf ("FAIL: invalid final result for atomc (%d).\n",
+ (int)atomc);
+ return 1;
+ }
+ return 0;
+}
+
+/* Test a store to an atomic int and an atomic char. */
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ atomi = INT_MAX;
+ atomc = CHAR_MAX;
+}
+
+int main ()
+{
+ simulate_thread_main();
+ simulate_thread_done();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-2.C b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-2.C
new file mode 100644
index 000000000..ee11da55e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/atomics-2.C
@@ -0,0 +1,58 @@
+/* { dg-do link { target c++11 } } */
+/* { dg-final { simulate-thread } } */
+/* { dg-require-effective-target sync_int_long } */
+
+using namespace std;
+
+#include <atomic>
+#include <limits.h>
+#include <stdio.h>
+#include "simulate-thread.h"
+
+atomic_int atomi;
+
+/* Non-atomic. Use a type wide enough to possibly coerce GCC into
+ moving things around. */
+long double j;
+
+
+/* Test that an atomic store synchronizes with an atomic load.
+
+ In this case, test that the store to <j> happens-before the atomic
+ store to <atomi>. Make sure the compiler does not reorder the
+ stores. */
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ j = 13.0;
+ atomi.store(1);
+}
+
+int main ()
+{
+ simulate_thread_main();
+ simulate_thread_done();
+ return 0;
+}
+
+void simulate_thread_other_threads()
+{
+}
+
+/* Verify that side-effects before an atomic store are correctly
+ synchronized with the an atomic load to the same location. */
+int simulate_thread_step_verify()
+{
+ if (atomi.load() == 1 && j != 13.0)
+ {
+ printf ("FAIL: invalid synchronization for atomic load/store.\n");
+ return 1;
+ }
+ return 0;
+}
+
+
+int simulate_thread_final_verify()
+{
+ return simulate_thread_step_verify();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields-2.C b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields-2.C
new file mode 100644
index 000000000..077514a3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields-2.C
@@ -0,0 +1,77 @@
+/* { dg-do link } */
+/* { dg-options "--param allow-load-data-races=0 --param allow-store-data-races=0" } */
+/* { dg-final { simulate-thread } } */
+
+/* Test that setting <var.a> does not touch either <var.b> or <var.c>.
+ In the C++ memory model, non contiguous bitfields ("a" and "c"
+ here) should be considered as distinct memory locations, so we
+ can't use bit twiddling to set either one. */
+
+#include <stdio.h>
+#include "simulate-thread.h"
+
+#define CONSTA 12
+
+static int global;
+struct S
+{
+ unsigned int a : 4;
+ unsigned char b;
+ unsigned int c : 6;
+} var;
+
+__attribute__((noinline))
+void set_a()
+{
+ var.a = CONSTA;
+}
+
+void simulate_thread_other_threads()
+{
+ ++global;
+ var.b = global;
+ var.c = global;
+}
+
+int simulate_thread_step_verify()
+{
+ int ret = 0;
+ if (var.b != global)
+ {
+ printf ("FAIL: Unexpected value: var.b is %d, should be %d\n",
+ var.b, global);
+ ret = 1;
+ }
+ if (var.c != global)
+ {
+ printf ("FAIL: Unexpected value: var.c is %d, should be %d\n",
+ var.c, global);
+ ret = 1;
+ }
+ return ret;
+}
+
+int simulate_thread_final_verify()
+{
+ int ret = simulate_thread_step_verify();
+ if (var.a != CONSTA)
+ {
+ printf ("FAIL: Unexpected value: var.a is %d, should be %d\n",
+ var.a, CONSTA);
+ ret = 1;
+ }
+ return ret;
+}
+
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ set_a();
+}
+
+int main()
+{
+ simulate_thread_main();
+ simulate_thread_done();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields.C b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields.C
new file mode 100644
index 000000000..3acf21f87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/bitfields.C
@@ -0,0 +1,80 @@
+/* { dg-do link } */
+/* { dg-options "--param allow-load-data-races=0 --param allow-store-data-races=0" } */
+/* { dg-final { simulate-thread } } */
+
+/* Test that setting <var.a> does not touch either <var.b> or <var.c>.
+ In the C++ memory model, non contiguous bitfields ("a" and "c"
+ here) should be considered as distinct memory locations, so we
+ can't use bit twiddling to set either one. */
+
+#include <stdio.h>
+#include "simulate-thread.h"
+
+#define CONSTA 12
+
+static int global;
+struct S
+{
+ /* On x86-64, the volatile causes us to access <a> with a 32-bit
+ access, and thus trigger this test. */
+ volatile unsigned int a : 4;
+
+ unsigned char b;
+ unsigned int c : 6;
+} var;
+
+__attribute__((noinline))
+void set_a()
+{
+ var.a = CONSTA;
+}
+
+void simulate_thread_other_threads()
+{
+ ++global;
+ var.b = global;
+ var.c = global;
+}
+
+int simulate_thread_step_verify()
+{
+ int ret = 0;
+ if (var.b != global)
+ {
+ printf ("FAIL: Unexpected value: var.b is %d, should be %d\n",
+ var.b, global);
+ ret = 1;
+ }
+ if (var.c != global)
+ {
+ printf ("FAIL: Unexpected value: var.c is %d, should be %d\n",
+ var.c, global);
+ ret = 1;
+ }
+ return ret;
+}
+
+int simulate_thread_final_verify()
+{
+ int ret = simulate_thread_step_verify();
+ if (var.a != CONSTA)
+ {
+ printf ("FAIL: Unexpected value: var.a is %d, should be %d\n",
+ var.a, CONSTA);
+ ret = 1;
+ }
+ return ret;
+}
+
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ set_a();
+}
+
+int main ()
+{
+ simulate_thread_main();
+ simulate_thread_done();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.exp b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.exp
new file mode 100644
index 000000000..b07fbb08c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.exp
@@ -0,0 +1,39 @@
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+
+# Your run of the mill dg test, but verify that we have a working GDB first.
+
+load_lib g++-dg.exp
+load_lib gcc-simulate-thread.exp
+load_lib torture-options.exp
+
+dg-init
+torture-init
+set-torture-options [list \
+ { -O0 -g } \
+ { -O1 -g } \
+ { -O2 -g -std=c++98 } \
+ { -O3 -g -std=c++11 } \
+ { -Os -g } ]
+
+if [gdb-exists] {
+ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] ""
+ gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/simulate-thread/*.c]] ""
+}
+
+torture-finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.gdb b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.gdb
new file mode 100644
index 000000000..eb081cb22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.gdb
@@ -0,0 +1 @@
+source ../../gcc.dg/simulate-thread/simulate-thread.gdb
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.h b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.h
new file mode 100644
index 000000000..a07486beb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/simulate-thread/simulate-thread.h
@@ -0,0 +1 @@
+#include "../../gcc.dg/simulate-thread/simulate-thread.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-1.C b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-1.C
new file mode 100644
index 000000000..ef694dbe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-1.C
@@ -0,0 +1,20 @@
+/* { dg-do run { target init_priority } } */
+
+#include <stdlib.h>
+
+class foo_t {
+ int x;
+public:
+ foo_t(void) { x=1; }
+ int get(void) { return x; }
+};
+
+static foo_t foo __attribute__((init_priority(5000)));
+
+int main(void) {
+
+ if (foo.get())
+ exit(0);
+ else
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2.C b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2.C
new file mode 100644
index 000000000..ac826942a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2.C
@@ -0,0 +1,23 @@
+/* { dg-do run { target init_priority } } */
+/* { dg-additional-sources "conpr-2a.cc" } */
+
+#include <stdlib.h>
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+int foo_t::count;
+
+extern foo_t foo1, foo2;
+
+int main(void) {
+
+ if ( (foo1.get() != 2) || (foo2.get() != 1) )
+ abort();
+ exit(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2a.cc b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2a.cc
new file mode 100644
index 000000000..69fb7d648
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-2a.cc
@@ -0,0 +1,12 @@
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo1 __attribute__((init_priority(6000)));
+foo_t foo2 __attribute__((init_priority(5000)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3.C b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3.C
new file mode 100644
index 000000000..71fadcc64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3.C
@@ -0,0 +1,23 @@
+/* { dg-do run { target init_priority } } */
+/* { dg-additional-sources "conpr-3a.cc conpr-3b.cc" } */
+
+#include <stdlib.h>
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+int foo_t::count;
+
+extern foo_t foo1, foo2;
+
+int main(void) {
+
+ if ( (foo1.get() != 2) || (foo2.get() != 1) )
+ abort();
+ exit(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3a.cc b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3a.cc
new file mode 100644
index 000000000..b237bb57f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3a.cc
@@ -0,0 +1,11 @@
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo1 __attribute__((init_priority(6000)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3b.cc b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3b.cc
new file mode 100644
index 000000000..b5efa0c35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-3b.cc
@@ -0,0 +1,11 @@
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo2 __attribute__((init_priority(5000)));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-4.C b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-4.C
new file mode 100644
index 000000000..40ce21d98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/conpr-4.C
@@ -0,0 +1,23 @@
+/* { dg-do run { target init_priority } } */
+/* { dg-additional-sources "conpr-3b.cc conpr-3a.cc" } */
+
+#include <stdlib.h>
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+int foo_t::count;
+
+extern foo_t foo1, foo2;
+
+int main(void) {
+
+ if ( (foo1.get() != 2) || (foo2.get() != 1) )
+ abort();
+ exit(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/ecos.exp b/gcc-4.9/gcc/testsuite/g++.dg/special/ecos.exp
new file mode 100644
index 000000000..6b0f5d5ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/ecos.exp
@@ -0,0 +1,35 @@
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# jlarmour@cygnus.co.uk
+
+# This file was written by Jonathan Larmour (jlarmour@cygnus.co.uk).
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Initialize 'dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" ""
+
+# All done.
+dg-finish
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/initp1.C b/gcc-4.9/gcc/testsuite/g++.dg/special/initp1.C
new file mode 100644
index 000000000..4a539a5a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/initp1.C
@@ -0,0 +1,90 @@
+/* { dg-do run { target init_priority } } */
+#include <stdlib.h>
+
+class Two {
+private:
+ int i, j, k;
+public:
+ static int count;
+ Two( int ii, int jj ) { i = ii; j = jj; k = count++; };
+ Two( void ) { i = 0; j = 0; k = count++; };
+ int eye( void ) { return i; };
+ int jay( void ) { return j; };
+ int kay( void ) { return k; };
+};
+
+extern Two foo;
+extern Two goo;
+extern Two coo[];
+extern Two koo[];
+
+Two foo __attribute__((init_priority(1005))) ( 5, 6 );
+
+Two goo __attribute__((init_priority(1007))) = Two( 7, 8 );
+
+Two doo[ 3 ];
+
+Two hoo[ 3 ] = {
+ Two( 11, 12 ),
+ Two( 13, 14 ),
+ Two( 15, 16 )
+};
+
+Two coo[ 3 ] __attribute__((init_priority(1000)));
+
+Two koo[ 3 ] __attribute__((init_priority(1000))) = {
+ Two( 21, 22 ),
+ Two( 23, 24 ),
+ Two( 25, 26 )
+};
+
+Two xoo[ 3 ] __attribute__((init_priority(1100)));
+
+Two zoo[ 3 ] __attribute__((init_priority(1100))) = {
+ Two( 31, 32 ),
+ Two( 33, 34 ),
+ Two( 35, 36 )
+};
+
+int Two::count;
+
+long x = 0;
+
+#define X( n ) \
+ do { if ( x & (1L << (n)) ) return 1; else x |= (1L << (n)); } while (0)
+
+int main()
+{
+
+ X( coo[0].kay() );
+ X( coo[1].kay() );
+ X( coo[2].kay() );
+ X( koo[0].kay() );
+ X( koo[1].kay() );
+ X( koo[2].kay() );
+ if ( 0x3f != x ) abort ();
+
+ X( foo.kay() );
+ if ( 0x7f != x ) abort ();
+
+ X( goo.kay() );
+ if ( 0xff != x ) abort ();
+
+ X( xoo[0].kay() );
+ X( xoo[1].kay() );
+ X( xoo[2].kay() );
+ X( zoo[0].kay() );
+ X( zoo[1].kay() );
+ X( zoo[2].kay() );
+ if ( 0x3fff != x ) abort ();
+
+ X( doo[0].kay() );
+ X( doo[1].kay() );
+ X( doo[2].kay() );
+ X( hoo[0].kay() );
+ X( hoo[1].kay() );
+ X( hoo[2].kay() );
+ if ( 0xfffff != x ) abort ();
+
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/initpri1.C b/gcc-4.9/gcc/testsuite/g++.dg/special/initpri1.C
new file mode 100644
index 000000000..bd24961e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/initpri1.C
@@ -0,0 +1,62 @@
+/* { dg-do run { target init_priority } } */
+
+extern "C" void abort ();
+
+int i;
+int j;
+
+void c1() __attribute__((constructor (500)));
+void c2() __attribute__((constructor (700)));
+void c3() __attribute__((constructor (600)));
+
+void c1() {
+ if (i++ != 0)
+ abort ();
+}
+
+void c2() {
+ if (i++ != 2)
+ abort ();
+}
+
+void c3() {
+ if (i++ != 1)
+ abort ();
+}
+
+void d1() __attribute__((destructor (500)));
+void d2() __attribute__((destructor (700)));
+void d3() __attribute__((destructor (600)));
+
+void d1() {
+ if (--i != 0)
+ abort ();
+}
+
+void d2() {
+ if (--i != 2)
+ abort ();
+}
+
+void d3() {
+ if (j != 2)
+ abort ();
+ if (--i != 1)
+ abort ();
+}
+
+void cd4() __attribute__((constructor (800), destructor (800)));
+
+void cd4() {
+ if (i != 3)
+ abort ();
+ ++j;
+}
+
+int main () {
+ if (i != 3)
+ return 1;
+ if (j != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/special/initpri2.C b/gcc-4.9/gcc/testsuite/g++.dg/special/initpri2.C
new file mode 100644
index 000000000..fa9fda0d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/special/initpri2.C
@@ -0,0 +1,39 @@
+/* { dg-do compile { target init_priority } } */
+
+/* Priorities must be in the range [0, 65535]. */
+void c1()
+ __attribute__((constructor (-1))); /* { dg-error "priorities" } */
+void c2()
+ __attribute__((constructor (65536))); /* { dg-error "priorities" } */
+void d1()
+ __attribute__((destructor (-1))); /* { dg-error "priorities" } */
+void d2()
+ __attribute__((destructor (65536))); /* { dg-error "priorities" } */
+
+/* Priorities 0-100 are reserved for system libraries. */
+void c3()
+ __attribute__((constructor (50))); /* { dg-warning "reserved" } */
+void d3()
+ __attribute__((constructor (50))); /* { dg-warning "reserved" } */
+
+/* Priorities must be integral constants. */
+
+/* Pointers, even with constant values, are not allowed. */
+void c4()
+ __attribute__((constructor ((void*) 500))); /* { dg-error "priorities" } */
+void d4()
+ __attribute__((destructor ((void*) 500))); /* { dg-error "priorities" } */
+
+/* Integer variables are not allowed. */
+int i;
+void c5()
+ __attribute__((constructor ((i)))); /* { dg-error "priorities" } */
+void d5()
+ __attribute__((destructor ((i)))); /* { dg-error "priorities" } */
+
+/* Enumeration constants are allowed. */
+enum E { e = 500 };
+void c6()
+ __attribute__((constructor ((e))));
+void d6()
+ __attribute__((destructor ((e))));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.C b/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.C
new file mode 100644
index 000000000..fbf8bb2c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.C
@@ -0,0 +1,18 @@
+/*
+ Origin: Dodji Seketeli <dodji@redhat.com>
+ { dg-options "-std=c++98 -pedantic" }
+ { dg-do compile }
+ */
+
+#include "system-binary-constants-1.h"
+
+int
+foo (void)
+{
+#if BINARY_INT_CONSTANT_IN_SYSTEM_HEADER /* A binary constant defined
+ in system header. No
+ warning. */
+ return 23;
+#endif
+ return 0b1101; /* { dg-warning "binary constants are a C..1y feature or GCC extension" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.h b/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.h
new file mode 100644
index 000000000..85f291742
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/system-binary-constants-1.h
@@ -0,0 +1,3 @@
+#pragma GCC system_header
+
+#define BINARY_INT_CONSTANT_IN_SYSTEM_HEADER 0b1101
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr1.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr1.C
new file mode 100644
index 000000000..9196218f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR1: What if two using-declarations refer to the same function but the
+// declarations introduce different default-arguments?
+
+namespace A {
+ extern "C" void f(int = 5);
+}
+namespace B {
+ extern "C" void f(int = 5);
+}
+using A::f;
+using B::f;
+
+void use() {
+ f(3);
+ f(); // { dg-error "" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr101.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr101.C
new file mode 100644
index 000000000..0316aaaa7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr101.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR101: Redeclaration of extern "C" names via using-declarations
+
+namespace Test1 {
+
+ typedef unsigned int X;
+ extern "C" void f1();
+ namespace N {
+ typedef unsigned int X;
+ extern "C" void f1();
+ }
+ using N::f1; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
+ using N::X; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
+}
+
+
+namespace Test2 {
+
+ typedef unsigned int X; // { dg-bogus "X" "" }
+ extern "C" int f2();
+ namespace N {
+ typedef unsigned int X; // { dg-bogus "X" "" }
+ extern "C" int f2();
+ }
+ using namespace N;
+ int i = f2(); // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
+ X x; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr108.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr108.C
new file mode 100644
index 000000000..43bae15ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr108.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR108: Are classes nested in templates dependent?
+
+template <class T> struct S {
+ struct I1 {
+ typedef int X;
+ };
+ struct I2 : public I1 {
+ X x; // { dg-error "does not name a type" "name" }
+ // { dg-message "note" "note" { target *-*-* } 10 }
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr127.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr127.C
new file mode 100644
index 000000000..4dddc6d77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr127.C
@@ -0,0 +1,28 @@
+// { dg-do link }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR127: Ambiguity in description of matching deallocation function
+
+#include <cstddef>
+#include <new>
+
+struct A
+{
+ // placement new, but can be called through normal new syntax.
+ void* operator new(std::size_t size, float = 0.0f)
+ {
+ return ::operator new(size);
+ }
+
+ // The matching deallocation function must be called, which means
+ // the placemente delete.
+ void operator delete(void*);
+ void operator delete(void*, float) {}
+
+ A()
+ { throw 5; }
+};
+
+int main()
+{
+ (void)new A;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr128.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr128.C
new file mode 100644
index 000000000..4dd78d57f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr128.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR128: Casting between enum types
+
+extern "C" void abort(void);
+
+enum E1 { BLACK = 0, RED = 1 };
+enum E2 { WHITE = 0, YELLOW = 1};
+
+int main(void)
+{
+ E1 e1 = RED;
+ E2 e2 = static_cast<E2>(e1);
+ if (e2 != YELLOW)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr135.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr135.C
new file mode 100644
index 000000000..beed8cdfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr135.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR135: Class type in in-class member function definitions
+
+struct S {
+ S f() { return S(); } // { dg-bogus "" "incomplete class type is allowed as return type" }
+ void g(S) { } // { dg-bogus "" "incomplete class type is allowed as parameter type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr137.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr137.C
new file mode 100644
index 000000000..bc1beb021
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr137.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR137: static_cast of cv void*
+
+struct A;
+
+const void* v;
+
+void foo(void)
+{
+ (void)static_cast<const volatile A *>(v);
+ (void)static_cast<A *>(v); // { dg-error "" "static_cast cannot remove cv qualifiers" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr142.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr142.C
new file mode 100644
index 000000000..c49f4dd20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr142.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR142: Injection-related errors in access example
+
+class B { // { dg-error "inaccessible" }
+public:
+ int mi; // { dg-error "inaccessible" }
+ static int si; // { dg-error "inaccessible" }
+};
+
+class D: private B {
+};
+
+class DD: public D {
+ void f();
+};
+
+void DD::f() {
+ mi = 3; // { dg-error "within this context" "" }
+ si = 3; // { dg-error "within this context" "" }
+ ::B b;
+ b.mi = 3;
+ b.si = 3;
+ ::B::si = 3;
+ ::B* bp1 = this; // { dg-error "inaccessible base" "" }
+ ::B* bp2 = (::B*)this;
+ bp2->mi = 3;
+
+
+ B b2; // { dg-error "within this context" "" }
+ B::si = 3; // { dg-error "within this context" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr147.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr147.C
new file mode 100644
index 000000000..0fb97e8ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr147.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR147: Naming the constructor (PR 11764)
+
+namespace N1 {
+
+struct A { A(); void f(); };
+struct B: public A { B(); };
+
+A::A() { }
+B::B() { }
+
+B::A ba;
+A::A a; // { dg-error "constructor" "the injected-class-name can never be found through qualified lookup" }
+
+void A::f()
+{
+ A::A(); // { dg-message "::A" "c++/42415" }
+}
+
+void f()
+{
+ A::A a; // { dg-error "constructor" "constructor" }
+} // { dg-error "" "error cascade" { target *-*-* } 23 } error cascade
+}
+
+namespace N2 {
+
+// This is nasty: if we allowed the injected-class-name to be looked as a
+// qualified type, then the following code would be well-formed. Basically
+// the last line is defining the static member (with redundant parenthesis).
+// Instead, it should be rejected as a malformed constructor declaration.
+
+template <class T> struct A {
+ template <class T2> A(T2);
+ static A x;
+};
+template<> template <> A<char>::A<char>(char);
+template<> A<int>::A<int>(A<int>::x); // { dg-error "" "this is an invalid declaration of the constructor" }
+
+}
+
+// But DR 318 says that in situations where a type is syntactically
+// required, lookup finds it.
+
+struct C
+{
+ C();
+ typedef int T;
+};
+struct C::C c;
+C::C::T t;
+struct D: C::C
+{
+ D(): C::C() { }
+};
+
+// And if lookup doesn't find the injected-class-name, we aren't naming the
+// constructor (c++/44401).
+
+struct E
+{
+ int E;
+};
+
+int E::*p = &E::E;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr152.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr152.C
new file mode 100644
index 000000000..bf742ee9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr152.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR152: explicit copy constructors
+
+namespace N1 {
+ struct X {
+ X(); // { dg-message "note" }
+ explicit X(const X&);
+ };
+ void f(X); // { dg-error "initializing" }
+ int foo()
+ {
+ X x;
+ f(x); // { dg-error "matching" "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 14 }
+ }
+}
+
+namespace N2 {
+ template <class T>
+ struct X {
+ X(); // { dg-message "note" }
+ explicit X(const X&);
+ };
+
+ template <class T>
+ void f(T ) {} // { dg-error "initializing" }
+
+ template <class T>
+ int foo()
+ {
+ X<T> x;
+ N2::f(x); // { dg-error "matching" "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 33 }
+ }
+
+ template int foo<float>(); // { dg-message "required from here" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr159.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr159.C
new file mode 100644
index 000000000..74d23f1cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr159.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR159: Namespace qualification in declarators
+
+namespace N {
+ namespace M {
+ void f();
+ void g();
+ }
+ void M::f(){}
+ void N::M::g(){}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr161.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr161.C
new file mode 100644
index 000000000..49f679a0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr161.C
@@ -0,0 +1,50 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR161: Access to protected nested type
+
+namespace N1 {
+ struct A
+ {
+ protected:
+ typedef int type;
+ };
+
+ struct B : public A
+ {
+ void test(void)
+ {
+ A::type t;
+ }
+
+ friend void ftest(void)
+ {
+ A::type t;
+ }
+ };
+}
+
+
+namespace N2 {
+ template <class T>
+ struct A
+ {
+ protected:
+ typedef int type;
+ };
+
+ template <class T>
+ struct B : public A<T>
+ {
+ void test(B b)
+ {
+ typename A<T>::type t;
+ }
+
+ friend void ftest(B b)
+ {
+ typename A<T>::type t;
+ }
+ };
+
+ template struct B<void>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr164.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr164.C
new file mode 100644
index 000000000..026ec096f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr164.C
@@ -0,0 +1,17 @@
+// { dg-do link }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR164: Overlap between Koenig and normal lookup
+
+void f(int);
+
+template <class T> void g(T t) {
+ f(t);
+}
+
+enum E { e };
+
+void f(E) {}
+
+int main() {
+ g(e);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr166.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr166.C
new file mode 100644
index 000000000..7ca275ed9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr166.C
@@ -0,0 +1,60 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR166: Friend declarations of template-ids
+
+namespace N {
+ template <class T> void f(T);
+ void g();
+
+ namespace M {
+ class A {
+ friend void f<int>(int); // N::f
+ static int x; // { dg-error "private" }
+ };
+
+ class B {
+ template <class T> friend void f(T); // M::f
+ static int x; // { dg-error "private" }
+ };
+
+ class C {
+ friend void g(); // M::g
+ static int x; // { dg-error "private" }
+ };
+
+ template <class T> void f(T) // will be instantiated as f<long>
+ {
+ M::A::x = 0; // { dg-error "within this context" }
+ M::B::x = 0;
+ }
+ template <> void f<int>(int)
+ { M::A::x = 0; } // { dg-error "within this context" }
+ template <> void f<double>(double )
+ {
+ M::B::x = 0;
+ M::f<long>(0); // { dg-message "required" }
+ }
+
+ void g(void)
+ { M::C::x = 0; }
+ }
+
+ template <class T> void f(T) // will be instantiated as f<long>
+ {
+ M::A::x = 0; // { dg-error "within this context" }
+ M::B::x = 0; // { dg-error "within this context" }
+ }
+
+ template <> void f<int>(int )
+ {
+ N::f<long>(0); // { dg-message "required" }
+ M::A::x = 0;
+ M::B::x = 0; // { dg-error "within this context" }
+ }
+
+ template <> void f<char>(char )
+ { M::A::x = 0; } // { dg-error "within this context" }
+
+ void g(void)
+ { M::C::x = 0; } // { dg-error "within this context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr176.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr176.C
new file mode 100644
index 000000000..7f4d83050
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr176.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR176: Name injection and templates
+
+namespace N1 {
+ template <class T> struct Base {
+ Base* p;
+ Base<T*>* p2;
+ ::Base* p3; // { dg-error "" "" }
+ };
+
+ template <class T> struct Derived: public Base<T> {
+ Base* p; // { dg-error "" "unqualified name binds to N1::Base" }
+ Base<T*>* p2;
+ typename Derived::Base* p3; // { dg-bogus "" "injected class name in derived classes" }
+ };
+
+ template struct Derived<void>; // { dg-bogus "required from here" "everything should be looked up at parsing time (after DR224)" }
+}
+
+
+namespace N2 {
+ template <class T> struct Base {};
+ template <class T> struct Derived: public Base<T> {
+ typename Derived::template Base<double>* p1; // { dg-bogus "" "" }
+ };
+
+ template struct Derived<void>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr179.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr179.C
new file mode 100644
index 000000000..39e4164d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr179.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR179: Function pointers and subtraction
+
+void foo(void);
+typedef void (*fp)(void);
+
+int main()
+{
+ fp f1 = foo;
+ fp f2 = foo;
+ (void)f2-f1; // { dg-error "" "cannot subtract pointers to function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr185.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr185.C
new file mode 100644
index 000000000..2cd4e397f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr185.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR185: "Named" temporaries and copy elision
+
+extern "C" void abort(void);
+
+struct A {
+ mutable int value;
+ explicit A(int i) : value(i) {}
+ void mutate(int i) const { value = i; }
+};
+
+int foo() {
+ A const& t = A(1);
+ A n(t); // can this copy be elided? NO!
+ t.mutate(2);
+ return n.value; // can this return 2? NO!
+}
+
+int main()
+{
+ int x = foo();
+ if (x != 1)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr188.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr188.C
new file mode 100644
index 000000000..3a10fa476
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr188.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR188: Comma operator and rvalue conversion
+
+template <bool> struct StaticAssert;
+template <> struct StaticAssert<true> {};
+
+char arr[100];
+StaticAssert<(sizeof(0,arr) == 100)> check;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr193.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr193.C
new file mode 100644
index 000000000..40b065084
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr193.C
@@ -0,0 +1,72 @@
+// { dg-do run }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR193: Order of destruction of local automatics of destructor
+
+extern "C" void abort(void);
+
+namespace N1 {
+ bool a_done = false;
+ struct A
+ {
+ ~A()
+ {
+ a_done = true;
+ }
+ };
+
+ struct B
+ {
+ ~B()
+ {
+ if (!a_done)
+ abort();
+ }
+ };
+
+ struct C {
+ B x;
+ ~C() {
+ A y;
+ }
+ };
+}
+
+
+namespace N2 {
+ bool a_done = false;
+
+ template <class>
+ struct A
+ {
+ ~A()
+ {
+ a_done = true;
+ }
+ };
+
+ template <class>
+ struct B
+ {
+ ~B()
+ {
+ if (!a_done)
+ abort();
+ }
+ };
+
+ template <class T>
+ struct C {
+ B<T> x;
+ ~C() {
+ A<T> y;
+ }
+ };
+}
+
+
+int main(void)
+{
+ N1::C c1;
+ N2::C<void> c2;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr194.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr194.C
new file mode 100644
index 000000000..3ed130071
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr194.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR194: Identifying constructors
+
+struct A
+{
+ inline explicit A();
+};
+
+template <class>
+struct B
+{
+ inline explicit B();
+};
+
+template struct B<void>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr20.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr20.C
new file mode 100644
index 000000000..fe5862129
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr20.C
@@ -0,0 +1,34 @@
+// { dg-do run }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR20: Some clarifications needed for 12.8 para 15
+
+extern "C" void printf(const char*, ...);
+extern "C" void abort(void);
+
+int count = 0;
+
+class Thing {
+public:
+ Thing() {
+ }
+ ~Thing() {
+ }
+ Thing(const Thing&)
+ {
+ count += 1;
+ }
+};
+
+Thing f() {
+ Thing t;
+ return t;
+}
+
+int main(void)
+{
+ Thing t2 = f();
+ printf("%d %x\n", count, &t2);
+ if (count != 0)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr213.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr213.C
new file mode 100644
index 000000000..15438517b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr213.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR213: Lookup in dependent base classes
+
+// We should emit an error at *instantiation* time because g(t) can't be
+// resolved to any function.
+
+template <class T> struct A : T {
+ void h(T t) {
+ f(t);
+ g(t); // { dg-message "" }
+ }
+};
+
+struct B {
+ void f(B);
+ void g(B) {}
+};
+
+void f(B) {}
+
+int main()
+{
+ A<B> ab;
+ B b;
+ ab.h(b); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr217.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr217.C
new file mode 100644
index 000000000..099359b21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr217.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR217: Default arguments for non-template member functions of class
+// templates
+
+template <class T>
+struct S
+{
+ void foo (int);
+};
+
+template <class T>
+void S<T>::foo (int = 0) // { dg-error "" "default arguments for parameters of member functions of class templates can be specified in the initial declaration only" }
+{ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr48.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr48.C
new file mode 100644
index 000000000..19c173878
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr48.C
@@ -0,0 +1,13 @@
+// { dg-do link }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR48: Definitions of unused static members
+
+struct A {
+ static const int size = 10;
+ int array[size];
+};
+
+int main() {
+ A a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr49.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr49.C
new file mode 100644
index 000000000..753d96b69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr49.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR 49: Non-constant pointers are invalid template arguments.
+
+template<int *a> struct R { /* ... */ };
+template<int b[5]> struct S { /* ... */ };
+
+int p;
+template struct R<&p>; // OK
+template struct S<&p>; // OK due to parameter adjustment
+
+int *ptr;
+template struct R<ptr>; // { dg-error "argument" }
+template struct S<ptr>; // { dg-error "argument" }
+
+int v[5];
+template struct R<v>; // OK due to implicit argument conversion
+template struct S<v>; // OK due to both adjustment and conversion
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr52.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr52.C
new file mode 100644
index 000000000..4f4015dc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr52.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR52: Non-static members, member selection and access checking
+
+struct A
+{
+ void foo(void);
+};
+
+struct B
+{
+private:
+ void foo(void);
+};
+
+struct B1 : B {};
+struct B2 : B {};
+
+struct C
+{ // { dg-error "C" }
+ void foo(void);
+};
+
+struct D : private C {};
+
+struct X: A, B1, B2, D
+{
+public:
+ void bar(void)
+ {
+ this->B::foo(); // { dg-error "" }
+ this->C::foo(); // { dg-error "inaccessible|context" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr68.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr68.C
new file mode 100644
index 000000000..253f04943
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr68.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR68: Grammar does not allow "friend class A<int>;"
+
+namespace A{
+ class B{};
+}
+
+namespace B{
+ class A{};
+ class C{
+ friend class ::A::B;
+ };
+}
+
+
+template <typename> class K;
+class J {
+ friend class K<int>;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr74.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr74.C
new file mode 100644
index 000000000..155c7981b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr74.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR74: Enumeration value in direct-new-declarator
+
+struct A {};
+enum E1 { COUNT = 10 };
+
+A* a = new A[COUNT];
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr76.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr76.C
new file mode 100644
index 000000000..0859b0c73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr76.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR76: Are const volatile variables considered "constant expressions"?
+
+volatile const int a = 5;
+
+template <int> struct K;
+template struct K<a>; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr80.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr80.C
new file mode 100644
index 000000000..2327428a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr80.C
@@ -0,0 +1,53 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR80: Class members with same name as class
+
+struct A
+{
+ int A;
+};
+
+struct A2
+{
+ static int A2; // { dg-error "same name as" }
+};
+
+
+template <class>
+struct A3
+{
+ int A3;
+};
+
+template <class>
+struct A4
+{
+ static int A4; // { dg-error "same name as" }
+};
+
+
+struct B
+{
+ B();
+ int B; // { dg-error "same name as" }
+};
+
+struct B2
+{
+ B2();
+ static int B2; // { dg-error "same name as" }
+};
+
+template <class>
+struct B3
+{
+ B3();
+ int B3; // { dg-error "same name as" "this error should appear at parsing time" { xfail *-*-* } }
+};
+
+template <class>
+struct B4
+{
+ B4();
+ static int B4; // { dg-error "same name as" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr85.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr85.C
new file mode 100644
index 000000000..31dde8cbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr85.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR85: Redeclaration of member class
+
+struct Base {
+ struct Data {};
+ struct Data; // { dg-error "" "redeclaration of nested class is invalid" { xfail *-*-* } }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr90.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr90.C
new file mode 100644
index 000000000..b6ec24cc8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr90.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR90: Should the enclosing class be an "associated class" too?
+
+struct A {
+ union U {};
+ friend void f(U);
+};
+
+struct B {
+ struct S {};
+ friend void f(S);
+};
+
+int main() {
+ A::U u;
+ f(u);
+ B::S s;
+ f(s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr94.C b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr94.C
new file mode 100644
index 000000000..97cf0c256
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tc1/dr94.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR94: Inconsistencies in the descriptions of constant expressions
+
+struct S {
+ static const int c = 5;
+};
+int a[S::c];
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/abstract-dr337.C b/gcc-4.9/gcc/testsuite/g++.dg/template/abstract-dr337.C
new file mode 100644
index 000000000..4f66c1c11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/abstract-dr337.C
@@ -0,0 +1,13 @@
+// PR c++/17232 (DR 337)
+
+template<typename T>
+class A {
+ virtual void f() = 0;
+};
+
+template<typename T>
+void g(T (*a)[1]) {} // { dg-error "abstract" "" { xfail *-*-* } }
+
+int main() {
+ g<A<int> >(0); // { dg-error "no matching function" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/abstract1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/abstract1.C
new file mode 100644
index 000000000..20bbf5a91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/abstract1.C
@@ -0,0 +1,12 @@
+// PR c++/58022
+
+template <class T> struct A { };
+template <class T> A<T> & operator<< (A<T>&, T);
+template <class T> class foo;
+template <class T> A<char> & operator<<(A<char>& o, const foo<T>& l);
+template <class T> class foo {
+ friend A<char>& operator<< <T> (A<char>& o, const foo<T>& l);
+};
+class bar;
+foo<bar> fb;
+class bar { virtual void baz()=0; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access1.C
new file mode 100644
index 000000000..1622e087d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Jan 2002 <nathan@codesourcery.com>
+
+// It is legal to specialize a template with a different class-key.
+
+template<typename T> class X;
+
+template<typename T> struct X<T *>
+{
+ int i;
+};
+template<> struct X<int>
+{
+ int i;
+};
+
+void foo ()
+{
+ X<int *> xip;
+ X<int> xi;
+
+ xip.i;
+ xi.i;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access10.C
new file mode 100644
index 000000000..8b4883c25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access10.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/10849: Incorrect access checking on template specialization.
+
+class X {
+ private:
+ template <typename T> struct Y;
+};
+
+template <> struct X::Y<int> {};
+
+template <typename T> struct X::Y {};
+
+template struct X::Y<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access11.C
new file mode 100644
index 000000000..73e2caaf0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access11.C
@@ -0,0 +1,24 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Access checking during explicit instantiation.
+
+class A {
+ typedef int X; // { dg-error "private" }
+};
+
+class X {
+ private:
+ template <typename T> struct Y;
+};
+
+template <> struct X::Y<int> {
+ A::X x; // { dg-error "this context" }
+};
+
+template <typename T> struct X::Y {
+ typename T::X x; // { dg-error "this context" }
+};
+
+template struct X::Y<A>; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access12.C
new file mode 100644
index 000000000..9185d5125
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access12.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/10849: Incorrect access checking on class template partial
+// specialization.
+
+class X {
+ private:
+ template <typename T> struct Y;
+};
+
+template <typename T> struct X::Y<T*> {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access13.C
new file mode 100644
index 000000000..3a1442bb0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access13.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: Francesco Monica <fmonica@ce.unipr.it>
+
+// PR c++/13262: Access checking during instantiation of static data
+// member.
+
+template <typename T> class Aclass {
+ private:
+ Aclass() {}
+ static Aclass instance;
+};
+
+template <typename T> Aclass<T> Aclass<T>::instance;
+
+template class Aclass<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access14.C
new file mode 100644
index 000000000..047f9258f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access14.C
@@ -0,0 +1,16 @@
+// PR c++/14777
+
+template <typename T>
+struct B
+{
+protected:
+ typedef int M;
+};
+
+template <typename T>
+struct A : B<T> {
+ typedef typename B<T>::M N;
+ A (int = N ());
+};
+
+A<int> a = A<int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access15.C
new file mode 100644
index 000000000..e28716366
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access15.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Aug 2004 <nathan@codesourcery.com>
+// Origin: stefaandr@hotmail.com
+
+// Bug 17149: ICE with TEMPLATE_TYPE_PARM
+
+
+template <class super,
+ int (super::tdata::*member)() const = &super::tdata::operator()>
+struct x {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access16.C
new file mode 100644
index 000000000..bb7ebccb8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access16.C
@@ -0,0 +1,16 @@
+// PR c++/23842
+
+struct S;
+extern S *p;
+template <class T> int f(T*, int y = ((T*)p)->x) {
+ return y;
+}
+struct S {
+private:
+ int x;
+ template <class U> friend int f(U*, int);
+};
+int g() {
+ return f(p);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access17.C
new file mode 100644
index 000000000..0c4510005
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access17.C
@@ -0,0 +1,23 @@
+// PR c++/27339
+
+class A
+{
+private:
+ enum private_enum {a};
+
+ template<A::private_enum v> // OK
+ struct B
+ {
+ void bm();
+ };
+public:
+ void am()
+ {
+ B<a> instance; //OK
+ instance.bm();
+ }
+};
+
+template<A::private_enum v> // FAIL
+void
+A::B<v>::bm(){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access18.C
new file mode 100644
index 000000000..3338bc932
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access18.C
@@ -0,0 +1,19 @@
+// DR 401
+
+class X {
+ typedef int a; // { dg-error "private" }
+ static const int b = 5; // { dg-error "private" }
+ template <typename>
+ struct c; // { dg-error "private" }
+};
+
+template <typename = X::a> // { dg-error "context" }
+struct A;
+
+template <int = X::b> // { dg-error "context" }
+struct B;
+
+template <template <typename> class T = X::c> // { dg-error "context" }
+struct C;
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access19.C
new file mode 100644
index 000000000..6420b1cbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access19.C
@@ -0,0 +1,24 @@
+/* PR c++/29475 The error diagnostic contained "U = U" instead of "U = char" */
+/* { dg-do compile } */
+
+template< class T >
+class explicit_t
+{
+public:
+ explicit_t( const T& c ): value( c ) { }
+ operator T&() { return value; }
+private:
+ template< class U >
+ explicit_t( U t ); /* { dg-error "with U = char, T = int|is private" } */
+ T value;
+};
+
+int foo( int x, explicit_t< int > y )
+{
+ return x + y;
+}
+
+int main()
+{
+ return foo( 5, 'c' ); /* { dg-error "this context" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access2.C
new file mode 100644
index 000000000..0b4657d1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access2.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// PR c++/5387
+// Enforcing access of typename type.
+
+template <class T> struct A {
+ typename T::X x; // { dg-error "this context" }
+ int f() { return T::i; } // { dg-error "this context" }
+};
+
+class B {
+ typedef int X; // { dg-error "private" }
+ static int i; // { dg-error "private" }
+};
+
+int main()
+{
+ A<B> ab; // { dg-message "required" }
+ ab.f(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access20.C
new file mode 100644
index 000000000..ebf575e6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access20.C
@@ -0,0 +1,18 @@
+// PR c++/29470
+
+template <typename T> struct B
+{
+ protected:
+ T v; // { dg-error "protected" }
+};
+template <typename T> struct D : B<T>
+{
+ protected:
+ using B<T>::v;
+};
+int main()
+{
+ D<int> d;
+ d.v = 0; // { dg-error "context" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access21.C
new file mode 100644
index 000000000..8414c4371
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access21.C
@@ -0,0 +1,23 @@
+// PR c++/48884
+
+class X
+{
+ static const int I = 42;
+ friend struct Y;
+};
+
+template <int I> struct A { };
+
+struct Y
+{
+ template <typename T>
+ static A<T::I> f(T t)
+ {
+ return A<T::I>();
+ }
+};
+
+int main()
+{
+ Y::f(X());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access22.C
new file mode 100644
index 000000000..9ee28a2a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access22.C
@@ -0,0 +1,15 @@
+template <int I> struct B { };
+
+template <class T>
+B<T::I> f();
+
+class A
+{
+ static const int I = 42;
+ template <class T> friend B<T::I> f();
+};
+
+int main()
+{
+ f<A>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access23.C
new file mode 100644
index 000000000..054cf9201
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access23.C
@@ -0,0 +1,16 @@
+template <class T>
+class A
+{
+ typedef T I;
+};
+
+template <class T>
+void f(typename T::I);
+
+template <class T>
+void f(int);
+
+int main()
+{
+ f<A<float> > (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access24.C
new file mode 100644
index 000000000..9f192266e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access24.C
@@ -0,0 +1,8 @@
+// PR c++/54437
+
+template <void (*P)()> void f();
+class A {
+ template <class T> static void g();
+ template <class T> static void h () { f<g<T> >(); }
+ static void i() { h<int>(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access25.C
new file mode 100644
index 000000000..e882a7099
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access25.C
@@ -0,0 +1,20 @@
+// PR c++/56359
+
+typedef int (*InvocationCallback) (const int &);
+
+template < typename target_t >
+void SetPrototypeMethod (target_t, const char *, InvocationCallback);
+
+class A
+{
+ void Initialize ();
+protected:
+ static int Stop (const int &);
+ void Stop (); // comment out to make the bug disappear.
+};
+
+void
+A::Initialize ()
+{
+ SetPrototypeMethod (0, "stop", A::Stop);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access26.C
new file mode 100644
index 000000000..1c5de9a8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access26.C
@@ -0,0 +1,6 @@
+// PR c++/45917
+
+template < typename T >
+struct A { static int i; };
+class B { typedef int X; }; // { dg-error "private" }
+void f() { A<B::X>::i = 0; } // { dg-error "this context" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access27.C
new file mode 100644
index 000000000..967e10f6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access27.C
@@ -0,0 +1,17 @@
+// PR c++/57550
+
+template <bool (double)> bool Wrapper(double);
+template <class T> void MakeHandler(bool (T));
+
+class Handler
+{
+public:
+ template <typename T> static void SetPrimitiveHandlers()
+ {
+ MakeHandler(Wrapper<Append<T> >);
+ }
+private :
+ template <typename T> static bool Append(T);
+};
+
+template void Handler::SetPrimitiveHandlers<double>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access28.C
new file mode 100644
index 000000000..4dd53508d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access28.C
@@ -0,0 +1,61 @@
+// PR c++/49663
+
+struct Nosm
+{
+ int m_R;
+};
+
+namespace dx {
+
+ struct onc
+ {
+ typedef void(*Cb)();
+
+ onc(Cb cb);
+ };
+
+ struct grac
+ {
+ template<class Derived> static void once();
+ };
+
+ template<class Derived>
+ struct tonc : onc
+ {
+ tonc() : onc(&grac::once<Derived>) {}
+
+ static Derived& get();
+ };
+
+ template<class Derived> void grac::once()
+ {
+ tonc<Derived>::get().h();
+ }
+}
+
+namespace
+{
+ template<typename T, int = sizeof(&T::m_R)>
+ struct has_R { };
+
+ template<typename T>
+ inline void
+ setR(T* m, has_R<T>* = 0)
+ { }
+
+ inline void setR(...) { }
+}
+
+template<typename M>
+ struct Qmi
+ : dx::tonc<Qmi<M> >
+ {
+ void h()
+ {
+ setR(&msg);
+ }
+
+ M msg;
+ };
+
+Qmi<Nosm> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access3.C
new file mode 100644
index 000000000..ab5662077
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access3.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// PR c++/5387
+// Enforcing access of typename type.
+
+template <class T> struct A {
+ typename T::template X<int> x; // { dg-error "this context" }
+};
+
+class B {
+ template <class T> class X {}; // { dg-error "private" }
+};
+
+int main()
+{
+ A<B> ab; // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access4.C
new file mode 100644
index 000000000..9451ecc22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access4.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+
+// PR c++/7347
+// Access control for typename during instantiation
+
+template <int dim> class Base {
+ protected:
+ typedef int T;
+};
+
+template <int dim> class D : public Base<dim> {
+ public:
+ typedef typename Base<dim>::T T1;
+ D (T1 t);
+};
+
+D<2> d(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access5.C
new file mode 100644
index 000000000..b2da190ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access5.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+
+// PR c++/7348
+// Access control for typename in function return type
+
+class Outer {
+ template <int dim> struct Inner {
+ typedef int T;
+ T foo ();
+ };
+ public:
+ Outer();
+};
+
+template <int dim>
+typename Outer::Inner<dim>::T Outer::Inner<dim>::foo () {
+ return 1;
+}
+
+template struct Outer::Inner<2>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access6.C
new file mode 100644
index 000000000..cbc8000d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access6.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Origin: Detlef Vollmann <dv@vollmann.ch>
+
+// PR c++/8389
+// Access control ICE for typename during instantiation and name mangling
+
+template <class> class Base {
+ protected:
+ typedef int Type;
+};
+
+template <class T> struct Derived : public Base<T> {
+ typedef typename Base<T>::Type Type;
+ template <class Arg> void f(Type = Type()) {}
+};
+
+template void Derived<char>::f<int> (Type);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access7.C
new file mode 100644
index 000000000..7d1812732
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access7.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// PR c++/3663
+// Enforce access of nested type.
+
+template <typename A>
+class S {
+ class T {}; // { dg-error "private" }
+};
+
+template <typename A>
+typename A::T* f (A) { // { dg-error "this context" }
+ return 0;
+}
+
+void g () {
+ f (S<int> ()); // { dg-message "required|no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access8.C
new file mode 100644
index 000000000..4bdadae3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access8.C
@@ -0,0 +1,16 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Template instantiate during deferred access check
+
+template <class T> struct C {
+ typedef typename T::X Y;
+};
+
+class A {
+ typedef int X;
+ template <class T> friend struct C;
+};
+
+C<A>::Y f(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/access9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/access9.C
new file mode 100644
index 000000000..b24c93f8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/access9.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Template instantiate during deferred access check
+
+template <void (*)(int)> struct C {
+ typedef int Y;
+};
+
+template <class T> void f(typename T::X) {
+}
+
+class A {
+ typedef int X;
+ template <class T> friend void f(typename T::X);
+};
+
+C<&f<A> >::Y g(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/addr1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/addr1.C
new file mode 100644
index 000000000..dd5e3870f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/addr1.C
@@ -0,0 +1,12 @@
+// PR c++/15542
+
+template <typename> struct S_T {
+ const char** operator & ();
+};
+
+template <class T> void foo(T **) {}
+
+template <typename> void templateTest() {
+ S_T<const char> s_t;
+ foo(&s_t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/aggr-init1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/aggr-init1.C
new file mode 100644
index 000000000..a09c7a792
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/aggr-init1.C
@@ -0,0 +1,8 @@
+// PR c++/46903
+
+struct A {};
+struct B {
+ void *(*a)();
+};
+template <typename T> void *CreateA() {}
+B b = {CreateA<A>};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/alignof1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/alignof1.C
new file mode 100644
index 000000000..50a32183c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/alignof1.C
@@ -0,0 +1,13 @@
+template<typename T>
+int my_alignof()
+{
+ return __alignof__(T);
+}
+
+template<typename>
+struct X { };
+
+int main()
+{
+ return my_alignof<X<void> >();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/alignof2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/alignof2.C
new file mode 100644
index 000000000..f9898980d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/alignof2.C
@@ -0,0 +1,9 @@
+// PR c++/55337
+// { dg-do compile }
+
+template <int> struct A;
+template <typename T> struct B
+{
+ static A <__alignof__ (T)> b;
+};
+template <typename T> A<__alignof__ (T)> B<T>::b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anon1.C
new file mode 100644
index 000000000..ef73df6b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anon1.C
@@ -0,0 +1,21 @@
+struct x {
+ int foo () {}
+};
+
+template <class T>
+struct vector {
+ T& bar () {}
+};
+
+template <class T>
+struct y {
+ typedef struct {
+ x t;
+ } s;
+
+ vector<s> array;
+
+ int foo ()
+ { return array.bar().t.foo(); }
+};
+int i = y<x>().foo ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anon2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anon2.C
new file mode 100644
index 000000000..75285ade3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anon2.C
@@ -0,0 +1,15 @@
+// PR c++/28279
+// finish_static_data_member_decl was confused by the anonymous
+// namespace causing TREE_PUBLIC to be unset
+
+template<typename T>
+struct is_pointer_impl {
+ static const bool value = true;
+};
+
+namespace {
+ class prefix_name_mapper {};
+}
+
+static const bool val = is_pointer_impl<prefix_name_mapper>::value;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anon3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anon3.C
new file mode 100644
index 000000000..eee7acd82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anon3.C
@@ -0,0 +1,20 @@
+// PR c++/28370
+// { dg-do run }
+
+namespace
+{
+ template<typename T> struct A { static int *a; };
+ template<typename T> int *A<T>::a = 0;
+}
+
+int *
+foo ()
+{
+ return A<int>::a;
+}
+
+int
+main ()
+{
+ return foo() != 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anon4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anon4.C
new file mode 100644
index 000000000..59bfee1e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anon4.C
@@ -0,0 +1,10 @@
+// PR c++/28407
+// A declaration in the anonymous namespace still has external linkage.
+
+template <int *P> class A { };
+namespace
+{
+ int i;
+}
+
+A<&i> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anon5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anon5.C
new file mode 100644
index 000000000..34599c061
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anon5.C
@@ -0,0 +1,6 @@
+// PR c++/45651
+
+namespace { template <int T> struct A {}; }
+template <int T> struct B { void f(A<T>); };
+template struct B<1>;
+template<int T> void B<T>::f(A<T>) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion1.C
new file mode 100644
index 000000000..89a8c5bec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion1.C
@@ -0,0 +1,24 @@
+// PR c++/47303
+// { dg-do compile }
+// { dg-options "-fabi-version=1" }
+
+struct Z
+{
+ void foo (int);
+};
+
+struct F
+{
+ typedef void (Z::*zm) (int);
+ typedef void (F::*fm) (int);
+ template <zm>
+ void bar (int)
+ {
+ union
+ {
+ Z z;
+ };
+ }
+};
+
+F::fm m = &F::bar <&Z::foo>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion2.C
new file mode 100644
index 000000000..cb3c12dff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/anonunion2.C
@@ -0,0 +1,6 @@
+template <int i>
+struct S
+{
+ S () { union { int a; }; a = 0; }
+};
+S<0> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg1.C
new file mode 100644
index 000000000..f7a8b3150
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9978. We rejected a constant expression.
+
+enum { val = 1 };
+
+template <class T>
+struct Bar
+{
+ static const int A = val;
+ static const int B = A + 1;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg2.C
new file mode 100644
index 000000000..ef84cfdd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9708. We accepted a local class
+
+template <typename T> class X {};
+
+void fn ()
+{
+ class L {};
+ X<L> f; // { dg-error "uses local type|trying to instantiate|no type|invalid type" "" { target { ! c++11 } } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg3.C
new file mode 100644
index 000000000..050aa33bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg3.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10224. Rejected a valid constant argument.
+
+template <bool B> struct X {
+ struct I {};
+};
+
+template <typename T> struct Y {
+ static const bool selector = true;
+ typedef typename X<selector>::I helper;
+};
+
+Y<int> i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg4.C
new file mode 100644
index 000000000..9c9d9ea96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg4.C
@@ -0,0 +1,9 @@
+// PR c++/23437
+
+template <void (*p)()> struct S {
+ static const int i = 10;
+};
+
+void g();
+
+int a[S<g>::i];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg5.C
new file mode 100644
index 000000000..87cbd0268
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg5.C
@@ -0,0 +1,9 @@
+// PR c++/30534
+// { dg-do compile }
+
+template<bool> struct A;
+
+template<int> void foo()
+{
+ A<__builtin_constant_p(.)> a; // { dg-error "template argument|invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg6.C
new file mode 100644
index 000000000..ef05abaee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg6.C
@@ -0,0 +1,15 @@
+// PR c++/33744
+// { dg-do run }
+
+template <bool B> struct A { bool b; A() : b(B) {}; };
+A<bool(1)> a;
+A<bool(1<2)> b;
+A<(bool)(2>1)> c;
+A<bool((2>1))> d;
+A<bool(2>1)> e;
+
+int
+main ()
+{
+ return (a.b && b.b && c.b && d.b && e.b) ? 0 : 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg7.C
new file mode 100644
index 000000000..dfd26bd2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg7.C
@@ -0,0 +1,11 @@
+// PR c++/27425, 34274
+
+template<typename T> struct A
+{
+ template<template<T> class> struct B {}; // { dg-error "void|mismatch|expected" }
+ // { dg-bogus "not supported" "" { target *-*-* } 5 }
+ template<T> struct C; // { dg-error "void" }
+ B<C> b;
+};
+
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg8.C
new file mode 100644
index 000000000..adcd013e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg8.C
@@ -0,0 +1,7 @@
+template<typename T, void, typename U> // { dg-error "void" }
+void foo(T, U, int) {}
+
+void bar()
+{
+ foo(0, 0, 0); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arg9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arg9.C
new file mode 100644
index 000000000..41af11486
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arg9.C
@@ -0,0 +1,8 @@
+// PR c++/57771
+// { dg-do compile }
+
+template <int N>
+struct S {};
+
+S <static_cast <int> (4>>2)> s1;
+S <reinterpret_cast <int> (4>>2)> s2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array1-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array1-1.C
new file mode 100644
index 000000000..97fe7cde2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array1-1.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1" }
+
+// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com>
+// Origin: Roger Sayle <roger@eyesopen.com>
+
+// PR c++/12774 Array domains compared unequal
+
+void Foo(double r[3][3])
+{
+}
+
+void Baz()
+{
+ double m[3][3];
+ Foo(m);
+}
+
+template <class T>
+void Bar()
+{
+ double m[3][3];
+ Foo(m);
+}
+
+int main()
+{
+ Baz();
+ Bar<int>();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array1-2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array1-2.C
new file mode 100644
index 000000000..7214517b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array1-2.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2" }
+
+// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com>
+// Origin: Roger Sayle <roger@eyesopen.com>
+
+// PR c++/12774 Array domains compared unequal
+
+void Foo(double r[3][3])
+{
+}
+
+void Baz()
+{
+ double m[3][3];
+ Foo(m);
+}
+
+template <class T>
+void Bar()
+{
+ double m[3][3];
+ Foo(m);
+}
+
+int main()
+{
+ Baz();
+ Bar<int>();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array10.C
new file mode 100644
index 000000000..81aac84b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array10.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Jan 2005 <nathan@codesourcery.com>
+
+// PR 19270: ICE
+// Origin: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+template<class T> struct Vec {
+ T* data;
+ T& operator[](int i) const;
+};
+
+template<class T> inline T& Vec<T>::operator[](int i) const
+{
+ return (&data[0])[i];
+}
+
+inline double foo(Vec<double> v)
+{
+ return v[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array11.C
new file mode 100644
index 000000000..259c9fabc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array11.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// PR c++/19208: Fold dependent array domains
+
+template <class C> struct if_t { typedef int type; };
+template <class T> struct ffff { static const bool value = true; };
+template <class A>
+struct bound_member_action
+{
+ typedef char f[ffff<A>::value ? 1 : 2];
+ template <class CT>
+ bound_member_action(CT i, typename if_t<f>::type g) {}
+};
+bound_member_action<int> a(0, 1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array13.C
new file mode 100644
index 000000000..3bc152ce4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array13.C
@@ -0,0 +1,14 @@
+// PR c++/20208
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort();
+
+template <typename T>
+inline void *Foo (T arg) { return &arg[0]; }
+
+int main () {
+ int bry[2];
+ if (Foo<int[2]>(bry) != bry)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array14.C
new file mode 100644
index 000000000..71a03f3bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array14.C
@@ -0,0 +1,10 @@
+// PR c++/23993
+
+const int data[2][4] = {
+ { 0, 1, 2, 3 }
+};
+
+template <typename T>
+void t(int k) {
+ int candidate = data[1][k];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array15.C
new file mode 100644
index 000000000..b1e047d1d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array15.C
@@ -0,0 +1,13 @@
+// PR c++/28595
+
+template<int> struct A
+{
+ static const int i;
+};
+
+template<int N> struct B
+{
+ char c[A<N>::i], d; // { dg-error "constant" }
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array16.C
new file mode 100644
index 000000000..c51441041
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array16.C
@@ -0,0 +1,9 @@
+// PR c++/28886
+
+template<typename> struct A;
+
+template<typename T, int N> struct A<T[N]> {};
+
+template<typename T, int N> struct A<const T[N]> {};
+
+A<const int[1]> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array17.C
new file mode 100644
index 000000000..12a5c4720
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array17.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+template <typename T>
+struct V {
+ T& operator[](int);
+};
+
+struct S {
+ S operator +(int);
+ template <typename T> T value();
+};
+
+template <typename T>
+void R (T v)
+{
+ v[(S() + 0).template value<int>()][0] = 0;
+}
+
+int
+main ()
+{
+ R(V<V<int> >());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array18.C
new file mode 100644
index 000000000..b2b1e3502
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array18.C
@@ -0,0 +1,13 @@
+// PR c++/30924
+
+template<typename T>
+struct x {};
+
+template<typename T, unsigned N>
+struct x<T*[N]> {};
+
+int main() {
+ x<int> a;
+ x<int*[10]> b;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array19.C
new file mode 100644
index 000000000..79abf47c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array19.C
@@ -0,0 +1,22 @@
+// PR c++/33553
+// { dg-do compile }
+
+template <class T> struct S { static const int sz = 2; };
+template <class T> struct U { enum { sz = 2 }; };
+
+template <class R>
+struct P
+{
+ template <class T> void bar (int (&x)[S<T>::sz]);
+ template <class T> void baz (int (&x)[U<T>::sz]);
+};
+
+P<int> p;
+
+void
+foo (void)
+{
+ int x[2];
+ p.bar<int> (x);
+ p.baz<int> (x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array2-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array2-1.C
new file mode 100644
index 000000000..2980a1fd1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array2-1.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com>
+
+// PR c++/13494. ICE
+
+template<typename T>
+int foo(int d[][4])
+{
+ return d[0][0];
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array2-2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array2-2.C
new file mode 100644
index 000000000..dd3e7f0e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array2-2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com>
+
+// PR c++/13494. ICE
+
+template<typename T>
+int foo(int d[][4])
+{
+ return d[0][0];
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array20.C
new file mode 100644
index 000000000..2e5c1e33a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array20.C
@@ -0,0 +1,10 @@
+// PR c++/38950
+
+template <typename T, T N> void f(T(&)[N]);
+
+int main() {
+ int x[2];
+ unsigned int y[2];
+ f(x); // works
+ f(y); // ICE
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array21.C
new file mode 100644
index 000000000..5c5f2f65d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array21.C
@@ -0,0 +1,50 @@
+// PR c++/42447
+
+template<int>
+ void* get(int);
+
+template<typename>
+ struct unique_ptr;
+
+template<typename _Tp>
+ struct unique_ptr<_Tp[]>
+ {
+ typedef int __tuple_type;
+
+ void*
+ get() const
+ { return ::get<0>(_M_t); }
+
+ __tuple_type _M_t;
+ };
+
+template <typename T> class dynamic_dispatch;
+
+template <typename TC>
+ struct dynamic_dispatch<void (TC::*)(int&)>
+ {
+ struct entry { };
+ unique_ptr<entry[]> m_Start;
+
+ template <typename UC>
+ void attach_handler(void (UC::*m)(int&))
+ {
+ entry* p = 0;
+ do {
+ } while(--p != m_Start.get());
+ }
+ };
+
+template <typename TC>
+ class request_dispatcher
+ : private dynamic_dispatch<void (TC::*)(int&)>
+ { request_dispatcher(); };
+
+struct file_reader
+{
+ void execute_command(int&);
+};
+
+template <>
+ request_dispatcher<file_reader>::request_dispatcher()
+ { this->attach_handler(&file_reader::execute_command); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array22.C
new file mode 100644
index 000000000..e10158773
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array22.C
@@ -0,0 +1,14 @@
+// PR c++/48029
+
+template <class T> struct A { };
+template <class T, class U> struct B
+{
+ struct N { };
+ typedef U u;
+};
+
+typedef B<int, A<int>(*)[2]> btype;
+A<int> v1[2];
+btype v2;
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array23.C
new file mode 100644
index 000000000..6ede8b077
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array23.C
@@ -0,0 +1,12 @@
+// PR c++/53989
+
+struct Foo {
+ int value;
+ typedef Foo Foo2;
+ static Foo2 const foos[2];
+};
+
+template <class T> void g (T);
+void bar() {
+ g(&Foo::foos);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array24.C
new file mode 100644
index 000000000..07879d250
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array24.C
@@ -0,0 +1,22 @@
+// PR c++/55032
+
+template<typename T>
+struct vec3t {
+ T c[3];
+};
+
+typedef vec3t<float> vec3;
+
+class Bounds {
+ public:
+ Bounds(const vec3 bb[2]);
+ void foo(const vec3 & v) { v.c[0]; }
+};
+
+template<typename T>
+void work(T& value);
+
+void foo() {
+ vec3 bb[2];
+ work(bb);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array25.C
new file mode 100644
index 000000000..4f3ccbf70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array25.C
@@ -0,0 +1,18 @@
+// PR c++/55249
+
+template <typename _Tp> struct A
+{
+ _Tp _M_instance[1];
+};
+template <class> struct inner_type
+{
+ inner_type () {}
+ inner_type (inner_type &);
+ inner_type (const inner_type &) {}
+};
+
+int
+main ()
+{
+ A <inner_type <int> > a, b = a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array26.C
new file mode 100644
index 000000000..669207169
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array26.C
@@ -0,0 +1,40 @@
+// PR c++/57325
+
+class valarray { int _M_data; };
+template < typename > struct SimpleJet { valarray partials; };
+
+template < class C > struct scoped_ptr_impl
+{
+ scoped_ptr_impl (C *):data_ () { }
+ struct Data
+ {
+ C ptr;
+ };
+ Data data_;
+};
+
+template < class, class = int >struct scoped_ptr;
+template < class C, class D > struct scoped_ptr <C[], D >
+{
+ scoped_ptr ():impl_ (0) { }
+ scoped_ptr_impl < C > impl_;
+};
+
+template < typename JetsT > void
+TestJets (JetsT *)
+{
+ typedef typename JetsT::JetType JetT;
+ scoped_ptr < JetT[] > a;
+}
+
+template < typename T > struct SimpleJets
+{
+ typedef SimpleJet < T > JetType;
+ scoped_ptr < SimpleJet < T >[] > vars_;
+};
+
+void fn ()
+{
+ SimpleJets < double >b;
+ TestJets (&b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array27.C
new file mode 100644
index 000000000..95680dd15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array27.C
@@ -0,0 +1,16 @@
+// PR c++/47808
+// { dg-options "" }
+
+template <typename T>
+inline T abs (T const & x) { return x; }
+
+template <typename T>
+void f (T)
+{
+ typedef int ai[(abs(0.1) > 0) ? 1 : -1];
+}
+
+int main()
+{
+ f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array3.C
new file mode 100644
index 000000000..27d72f972
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array3.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Origin: Graeme Prentice <gprentice at paradise dot net dot nz>
+// PR c++/13474: An array domain which is value-dependent must be folded
+// in time for deduction.
+
+template< int X, int Y, int (*array_ptr)[Y] >
+class A;
+
+int array[5];
+
+template< int X >
+class A<X,5,&array> {};
+
+int main()
+{
+ A<6,5,&array> z1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array4.C
new file mode 100644
index 000000000..c72782b10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array4.C
@@ -0,0 +1,11 @@
+// PR c++/14122
+
+extern const char str[];
+
+template <const char* P>
+struct A
+{
+ template <const char* R> void foo();
+};
+
+template class A<str>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array5.C
new file mode 100644
index 000000000..a54358067
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array5.C
@@ -0,0 +1,14 @@
+// PR c++/15427
+
+template<class T>
+struct A
+{
+ T foo;
+};
+
+template<class T>
+struct B
+{
+ A<int> _squares[2];
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array6.C
new file mode 100644
index 000000000..0dc5161b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array6.C
@@ -0,0 +1,13 @@
+// PR c++/15287
+
+struct S {};
+
+struct Array {
+ S operator[](int);
+} array;
+
+void (S::*mem_fun_ptr)();
+
+template <int> void foo() {
+ (array[0].*mem_fun_ptr)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array7.C
new file mode 100644
index 000000000..1fb130f99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array7.C
@@ -0,0 +1,11 @@
+// PR c++/16246
+
+template <typename T> void foo (T, T);
+
+template <unsigned N, unsigned M>
+int bar( const char(&val)[M] )
+{
+ foo (N,M);
+}
+
+int i = bar<10>("1234");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array8.C
new file mode 100644
index 000000000..9fd33a4aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array8.C
@@ -0,0 +1,16 @@
+// PR c++/18121
+
+// We were trying to layout the array
+// type but since the type/value of A<N>::i
+// was not known at template declation type,
+// we were crashing
+
+template<int> struct A
+{
+ static int const i = 1;
+};
+
+template<int N> struct B
+{
+ typedef int (*p)[A<N>::i];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/array9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/array9.C
new file mode 100644
index 000000000..f3e8335c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/array9.C
@@ -0,0 +1,18 @@
+// PR c++/18429
+
+int subtrees = 4;
+template< class T >
+struct Tree {
+ Tree* L[subtrees]; // { dg-error "" }
+ Tree* R[subtrees]; // { dg-error "" }
+ ~Tree()
+ {
+ delete [] L[0]; // { dg-error "" }
+ delete [] R[0]; // { dg-error "" }
+ }
+};
+
+void f()
+{
+ Tree<int> t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arrow1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow1.C
new file mode 100644
index 000000000..c96141063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow1.C
@@ -0,0 +1,17 @@
+// PR c++/49118
+// { dg-do compile }
+
+template< int n >
+struct a {
+ a< n+1 >
+ operator->()
+ { return a< n+1 >(); }
+};
+
+int main() {
+ a<0>()->x; // { dg-error "instantiation depth exceeds maximum" }
+}
+
+// { dg-prune-output "incomplete type" }
+// { dg-prune-output "declaration of" }
+// { dg-prune-output "used but never defined" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arrow2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow2.C
new file mode 100644
index 000000000..8ec9e01d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow2.C
@@ -0,0 +1,12 @@
+// PR c++/56639
+
+struct A {
+ int i;
+ static A* f();
+};
+
+struct B {
+ void g() {
+ int (A::f()->i);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arrow3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow3.C
new file mode 100644
index 000000000..b2029ba48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow3.C
@@ -0,0 +1,38 @@
+// PR c++/56895
+// { dg-do compile }
+
+extern struct A { bool foo (); A bar (); } *a;
+
+template <int>
+int
+baz1 ()
+{
+ return 2 << (a->bar().foo() ? 1 : 0);
+}
+
+template <int>
+int
+baz2 ()
+{
+ return 2 >> (a->bar().foo() ? 1 : 0);
+}
+
+template <int>
+int
+baz3 ()
+{
+ return 10 / (a->bar().foo() ? 1 : 2);
+}
+
+template <int>
+int
+baz4 ()
+{
+ return 10 % (a->bar().foo() ? 1 : 0);
+}
+
+int
+test ()
+{
+ return baz1<0> () + baz2<0> () + baz3<0> () + baz4<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/arrow4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow4.C
new file mode 100644
index 000000000..89e782219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/arrow4.C
@@ -0,0 +1,19 @@
+// PR c++/56895
+// { dg-do compile }
+
+void fn (int *);
+void fn (int);
+extern struct A { bool foo (); A bar (); } *a;
+
+template <int>
+void
+baz ()
+{
+ fn (a->bar().foo() ? 1 : 0);
+}
+
+void
+test ()
+{
+ baz<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/asm1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/asm1.C
new file mode 100644
index 000000000..741759fd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/asm1.C
@@ -0,0 +1,14 @@
+// PR c++/24761
+// { dg-do compile }
+
+template <int>
+int f (int i)
+{
+ asm ("# %0 %1" : "+r" (i));
+ return i;
+}
+
+int main ()
+{
+ return f<0> (0) + f<1> (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/asmgoto1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/asmgoto1.C
new file mode 100644
index 000000000..6a3cbcef4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/asmgoto1.C
@@ -0,0 +1,18 @@
+// PR c++/52247
+// { dg-do compile }
+
+template <int N>
+bool
+bar ()
+{
+ __asm goto ("" : : : : lab);
+ return true;
+lab:
+ return false;
+}
+
+bool
+foo ()
+{
+ return bar<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/assign1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/assign1.C
new file mode 100644
index 000000000..d0e134a47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/assign1.C
@@ -0,0 +1,15 @@
+// PR c++/16623
+
+template <int N>
+struct C
+{
+ C& operator= (int);
+};
+
+template <int N>
+C<N>& C<N>::operator= (int)
+{
+ return *this;
+}
+
+C<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield1.C
new file mode 100644
index 000000000..9484cb784
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield1.C
@@ -0,0 +1,11 @@
+// PR c++/50280
+
+struct S { int bf : 3; };
+
+template<class _T1>
+void make_pair(_T1& __x) {}
+
+void foo() {
+ const S s = S();
+ make_pair(s.bf);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield2.C
new file mode 100644
index 000000000..e9a5320d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/bitfield2.C
@@ -0,0 +1,16 @@
+// PR c++/25503
+
+template<int N>
+struct Test
+{
+ Test()
+ {
+ typedef struct StaticAssert {unsigned condition : (N); } XXX; // { dg-error "zero width" }
+ }
+};
+
+int
+main()
+{
+ Test<0> T;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/builtin1.C
new file mode 100644
index 000000000..a5b7271cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/builtin1.C
@@ -0,0 +1,11 @@
+// PR c++/26559
+
+template<bool> struct cond;
+
+template<int> struct S {
+ void f(int i) {
+ cond<__builtin_constant_p(i)>();
+ }
+};
+
+S<1> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call1.C
new file mode 100644
index 000000000..3b6e367af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call1.C
@@ -0,0 +1,17 @@
+//Origin: harinath@cs.umn.edu
+//PR c++/10804
+// G++ was not emiting the function foo.
+
+// { dg-do run }
+
+
+template<class T>
+struct A
+{
+ A() { const void (*a)() = foo; }
+ static const void foo() {}
+};
+int main(int argc, char *argv[])
+{
+ A<int> a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call2.C
new file mode 100644
index 000000000..86d5c2e82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call2.C
@@ -0,0 +1,14 @@
+// PR c++/13592
+
+struct S {
+ void operator()(int);
+};
+
+struct A {
+ template <typename> void foo();
+ S s;
+};
+
+template <typename> void A::foo() {
+ s(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call3.C
new file mode 100644
index 000000000..bbb6c7b3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call3.C
@@ -0,0 +1,15 @@
+// PR c++/18436
+
+void foo(int);
+
+struct A
+{
+ static void foo(A);
+};
+
+template <typename T> struct B : T
+{
+ B() { foo(T()); } // { dg-error "cannot convert" }
+};
+
+B<A> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call4.C
new file mode 100644
index 000000000..1f7eb4c82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call4.C
@@ -0,0 +1,21 @@
+// PR c++/25364
+
+class OFX_PropertySuiteV1
+{
+ static int propGetDouble ();
+};
+template<int dimension,
+ class T,
+ int (*PROPGET)()
+ >
+struct OFX_AnimatedNumberParam
+{
+ virtual int paramSetValueAtTime()
+ {
+ return PROPGET();
+ }
+};
+void f()
+{
+ new OFX_AnimatedNumberParam<2,double,OFX_PropertySuiteV1::propGetDouble>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call5.C
new file mode 100644
index 000000000..55cf2ddac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call5.C
@@ -0,0 +1,17 @@
+// PR c++/36631
+// { dg-options "-O0" }
+
+template <typename T> struct B
+{
+ struct C
+ {
+ __attribute__ ((always_inline)) C (C const &c) {}
+ };
+ void __attribute__ ((always_inline)) g (C c) {}
+};
+
+void
+trigger (B <int> b, B <int>::C c)
+{
+ b.g (c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call6.C
new file mode 100644
index 000000000..b79d624a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call6.C
@@ -0,0 +1,24 @@
+// PR c++/38577
+// { dg-do compile }
+
+struct A
+{
+ static A *bar ();
+};
+
+struct B : public A
+{
+ static void baz ();
+};
+
+template <class T>
+void foo ()
+{
+ (static_cast<B *> (A::bar ()))->baz ();
+}
+
+void
+bar ()
+{
+ foo<int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/call7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/call7.C
new file mode 100644
index 000000000..0e9a4b7ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/call7.C
@@ -0,0 +1,19 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/17395
+// { dg-do compile }
+
+template<int> struct X { };
+
+void fu(int a, X<sizeof(a)>) { }
+
+template<class T>
+void bhar(T a, X<sizeof(a)>) { }
+
+int
+main()
+{
+ int x;
+ X<sizeof(int)> y;
+ fu(x, y);
+ bhar(x, y);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-1.C
new file mode 100644
index 000000000..b467dffef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-1.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+template < typename > struct A ;
+template < typename T , typename = A < T > > struct B { } ;
+template < class W , class > struct D
+{
+ typedef W X ;
+ A<X*> a ;
+};
+
+template < class Y > struct E
+{
+ B<Y*> b ;
+} ;
+E<int> e ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-10.C
new file mode 100644
index 000000000..0ff45e7af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-10.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-do compile }
+
+template<class T>
+struct C
+{
+};
+
+template<class T,
+ template<class TT_T0, template<class TT_T1> class TT_TT> class TT,
+ class U = TT<int, C> >
+struct S
+{
+ void foo(TT<T, C>);
+};
+
+template<class T,
+ template<class TT_T0, template<class TT_T1> class TT_TT> class TT,
+ class U>
+void
+S<T, TT, U>::foo(TT<T, C>)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-11.C
new file mode 100644
index 000000000..0fe99511e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-11.C
@@ -0,0 +1,39 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-do compile }
+
+template<class T>
+struct C
+{
+ void bar();
+};
+
+template<class T>
+void
+C<T>::bar()
+{
+}
+
+
+template<class U,
+ template<class TT0_T0> class TT0 = C,
+ template<class TT1_T0> class TT1 = TT0>
+struct S
+{
+ C<U> s;
+
+ void foo(TT1<U>);
+
+ void bar()
+ {
+ foo(s);
+ }
+};
+
+template<class T,
+ template<class TT0_T0> class TT0,
+ template<class TT1_T0> class TT1>
+void
+S<T, TT0, TT1>::foo(TT1<T>)
+{
+ C<T> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-12.C
new file mode 100644
index 000000000..f2467fa17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-12.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+
+template<class T, T t = (T)0>
+struct S
+{
+ void
+ foo(decltype(t) = t);
+};
+
+template<class T, T t>
+void
+S<T, t>::foo(decltype(t))
+{
+}
+
+void
+bar()
+{
+ S<int> s;
+ s.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-13.C
new file mode 100644
index 000000000..4f3702b84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-13.C
@@ -0,0 +1,27 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-do compile }
+
+template<class T>
+struct S0
+{
+};
+
+template<class T>
+struct S1
+{
+};
+
+template<class T, template<class T> class A, template<class T> class B = A>
+struct C
+{
+ B<T> m;
+};
+
+void
+foo()
+{
+ C<int, S0> s;
+ S0<int> s0;
+
+ s.m = s0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-2.C
new file mode 100644
index 000000000..a3f3f1b83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-2.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+template < typename > struct A ;
+template < typename T , typename = A < T > > struct B { } ;
+template < class W , class > struct D
+{
+ typedef W X ;
+ A< X()> a ;
+};
+
+template < class Y > struct E
+{
+ B< Y()> b ;
+};
+E<int> e ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-3.C
new file mode 100644
index 000000000..e47c7d350
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-3.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+template<typename> struct A ;
+template<typename T , typename = A<T> > struct B { } ;
+template<class W , class > struct D
+{
+ typedef W X ;
+ typedef X (FP) ();
+ A<FP&> a ;
+} ;
+
+template < class Y > struct E
+{
+ typedef Y (FP) ();
+ B<FP&> b ;
+} ;
+E < int > e ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-4.C
new file mode 100644
index 000000000..673121bd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-4.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+template<typename> struct A ;
+template<typename T ,typename = A<T> > struct B { } ;
+
+template<class W, class>
+struct D
+{
+ typedef W X;
+ A<X[2]> a;
+} ;
+
+template<class Y>
+struct E
+{
+ B<Y[2]> b;
+};
+
+E < int > e;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-5.C
new file mode 100644
index 000000000..5f783df9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-5.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+struct Foo {};
+template<typename> struct A ;
+template<typename T ,typename = A<T> > struct B { } ;
+
+template<class W, class>
+struct D
+{
+ typedef W X ;
+ A<X Foo::*> a ;
+} ;
+
+template<class Y>
+struct E
+{
+ B<Y Foo::*> b ;
+} ;
+E < int > e ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-6.C
new file mode 100644
index 000000000..951708747
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-6.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+struct Foo {};
+template<typename> struct A ;
+template<typename T ,typename = A<T> > struct B { } ;
+
+template<class W, class>
+struct D
+{
+ typedef W X;
+ A<void (Foo::*) (X)> a;
+} ;
+
+template<class Y>
+struct E
+{
+ B<void (Foo::*) (Y)> b;
+};
+E < int > e ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-7.C
new file mode 100644
index 000000000..51c15342c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-7.C
@@ -0,0 +1,21 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/39754
+// { dg-do compile }
+
+struct Foo {};
+template<typename> struct A ;
+template<typename T ,typename = A<T> > struct B { } ;
+
+template<class W, class>
+struct D
+{
+ typedef W X;
+ A<X (Foo::*) (X)> a ;
+};
+
+template<class Y>
+struct E
+{
+ B<Y (Foo::*) (Y)> b ;
+};
+E<int> e ;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-8.C
new file mode 100644
index 000000000..fd1fe3ce3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-8.C
@@ -0,0 +1,38 @@
+// PR c++/45984
+// We were getting different canonical types for matching types because
+// TYPE_ALIGN wasn't propagated to all the variants fast enough.
+// { dg-options "" }
+
+typedef __SIZE_TYPE__ size_t;
+enum { chunk_size = 16 };
+typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
+typedef float __v4sf __attribute__ ((__vector_size__ (16)));
+struct __attribute__((aligned((16)))) float4_t {
+ typedef float scalar_t;
+ typedef __m128 type_t;
+ typedef float4_t return_type_t;
+ type_t m;
+ inline __attribute__((artificial, gnu_inline, always_inline)) explicit
+ float4_t(scalar_t a) : m(((__m128) (__v4sf) { (a), (a), (a), (a) })) { }
+ inline __attribute__((artificial, gnu_inline, always_inline, pure)) friend
+ return_type_t operator+(float4_t lhs, float4_t rhs) { }
+};
+template<size_t NumChans> class __attribute__((aligned((16)))) chunk_array_t {
+public:
+ typedef float4_t value_type_t;
+ typedef value_type_t value_array_t[chunk_size/4];
+ enum { num_scalars = chunk_size, num_values = num_scalars/4 };
+ const value_array_t &chan(size_t c) const { }
+ value_type_t operator[](size_t i) const { }
+};
+typedef chunk_array_t<1> chunk_array_mono_t;
+typedef chunk_array_t<2> chunk_array_stereo_t;
+class freeverb_stereo_t {
+ void process(const chunk_array_stereo_t & __restrict__ src,
+ chunk_array_stereo_t & __restrict__ dst) {
+ enum { chunk_size = chunk_array_t<1>::num_values };
+ chunk_array_mono_t mix;
+ for (size_t i=0; i<chunk_size; ++i)
+ mix[i] = src.chan(0)[i] + src.chan(1)[i];
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-9.C
new file mode 100644
index 000000000..c15f93ad7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/canon-type-9.C
@@ -0,0 +1,17 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-do compile { target c++11 } }
+
+struct F { F(int) {}};
+
+template<class T, T* u>
+struct S
+{
+ decltype(u) foo(T);
+};
+
+template<class T, T *u>
+decltype(u) S<T, u>::foo(T)
+{
+ T t;
+ return t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cast1.C
new file mode 100644
index 000000000..fca3511e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cast1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18949. Forgot to convert from reference.
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A
+{
+ void foo();
+};
+
+template<int> void bar(A& a)
+{
+ const_cast<A&>(a).foo();
+ static_cast<A&>(a).foo();
+ reinterpret_cast<A&>(a).foo();
+ ((A&)a).foo();
+}
+
+template void bar<0>(A& a);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cast2.C
new file mode 100644
index 000000000..0ce55f035
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cast2.C
@@ -0,0 +1,13 @@
+// PR c++/56238
+
+class A
+{
+ template < typename T > T& get ();
+ template < typename T > class B
+ {
+ void RemovePoint (A& value)
+ {
+ static_cast < double >(value.get < T > ());
+ }
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cast3.C
new file mode 100644
index 000000000..b343ee427
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cast3.C
@@ -0,0 +1,22 @@
+// PR c++/56438
+
+struct A { };
+A& operator<<(A&, const char*);
+
+struct B {
+ int size();
+};
+
+struct C { };
+
+template <class S, class T>
+S bar(const S& s, const T& t) {
+ return s;
+}
+
+template<class S, class T>
+void foo() {
+ A a;
+ B b;
+ a << bar(b.size(), C()); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/char1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/char1.C
new file mode 100644
index 000000000..51e72e7ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/char1.C
@@ -0,0 +1,4 @@
+template <class CharType, CharType line_terminator = 0>
+class String {};
+
+String<signed char, 255> s; // { dg-warning "overflow" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/class1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/class1.C
new file mode 100644
index 000000000..96415fbc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/class1.C
@@ -0,0 +1,9 @@
+extern const int a;
+
+template <const int&> class X {};
+
+template <typename> struct Y {
+ X<a> x;
+};
+
+template struct Y<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/class2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/class2.C
new file mode 100644
index 000000000..4144997fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/class2.C
@@ -0,0 +1,7 @@
+// PR c++/13451
+
+template <class T>
+struct A {
+ struct B;
+ struct A::B { }; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/class3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/class3.C
new file mode 100644
index 000000000..44a02a60b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/class3.C
@@ -0,0 +1,2 @@
+// PR c++/25634
+template<int> template<int> struct A; // { dg-error "too many" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/complit1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/complit1.C
new file mode 100644
index 000000000..218a7c929
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/complit1.C
@@ -0,0 +1,11 @@
+// { dg-options "" }
+
+template <int D> struct C {
+ int d[3];
+ C();
+};
+
+template<int D>
+C<D>::C() : d((int[]){1,2,3}) {} // { dg-error "array" }
+
+template class C<1>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/complit2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/complit2.C
new file mode 100644
index 000000000..cf3856d47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/complit2.C
@@ -0,0 +1,17 @@
+// PR c++/31038
+// { dg-options "" }
+
+template<int> void foo()
+{
+ int i = (int) { 0 };
+}
+
+template void foo<0>();
+int f();
+
+template<int> void bar()
+{
+ int i = (int) { f() };
+}
+
+template void bar<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond.C
new file mode 100644
index 000000000..394a21c9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond.C
@@ -0,0 +1,23 @@
+// PR c++/8080
+
+// Bug: the transformation in finish_while_stmt_cond produced something
+// that tsubst_expr handled badly. Fixed by not doing the transformation
+// while parsing a template.
+
+class TObject {};
+
+struct TIter {
+ TObject *operator()();
+};
+
+
+template<class T>
+void get_root_object(TIter& iobj) {
+ while ( TObject* pnew_obj = iobj() )
+ ;
+}
+
+void foo(TIter& iobj)
+{
+ get_root_object<int>(iobj);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond2.C
new file mode 100644
index 000000000..e6bd19d40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond2.C
@@ -0,0 +1,10 @@
+// PR c++/11962
+// { dg-options "" }
+
+template<int X> class c;
+
+template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" }
+
+void test(c<2>*c2) {
+ test<0, 2>(*c2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond3.C
new file mode 100644
index 000000000..788b3754a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond3.C
@@ -0,0 +1,15 @@
+// PR c++/13833
+
+struct X {
+ template <typename T>
+ X & operator << (const T &t);
+ X & operator<< (int& (*p) (int&));
+};
+
+X x;
+
+template <int> void foo () {
+ x << (1 ? "ok" : "failed");
+}
+
+template void foo<1>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond4.C
new file mode 100644
index 000000000..35416ba79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond4.C
@@ -0,0 +1,20 @@
+// PR c++/14369
+
+struct A { };
+
+template<class T>
+struct X : A {
+ const A* bar() const
+ { return this; }
+
+ const A& foo() const;
+};
+
+template<class T>
+const A& X<T>::foo() const
+{
+ const A* t = bar();
+ return *(t ? t : throw 0);
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond5.C
new file mode 100644
index 000000000..bba31e6af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond5.C
@@ -0,0 +1,9 @@
+// PR c++/18464
+
+struct A
+{
+ A(int);
+ operator void*() const;
+};
+
+template<int> void foo(const A& x) { 0 ? x : (x ? x : 0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond6.C
new file mode 100644
index 000000000..e4cede35b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond6.C
@@ -0,0 +1,6 @@
+// PR c++/27801
+
+template<int> int foo(int i)
+{
+ return !( (1 && i) ? 0 : 1 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond7.C
new file mode 100644
index 000000000..ce1c77e59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond7.C
@@ -0,0 +1,15 @@
+// PR c++/34270
+// { dg-do compile }
+// { dg-options "" }
+
+void foo ()
+{
+ __typeof__ (0 ?: 0) x;
+ __decltype (0 ?: 0) y;
+}
+
+template<int> void bar ()
+{
+ __typeof__ (0 ?: 0) x;
+ __decltype (0 ?: 0) y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/cond8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/cond8.C
new file mode 100644
index 000000000..a3bad7e7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/cond8.C
@@ -0,0 +1,10 @@
+// PR c++/51318
+
+enum { e0, e1 };
+
+template<bool B, int = B ? e0 : e1> struct A {};
+
+template<typename T> struct B
+{
+ A<T::X> a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/condition1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/condition1.C
new file mode 100644
index 000000000..4151e9e56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/condition1.C
@@ -0,0 +1,79 @@
+// PR c++/47950
+
+template <typename T> struct empty
+{
+ // allow success case to build (not relevant to bug)
+ operator bool() { return true; }
+};
+
+template <typename T> struct from_int
+{
+ from_int(int) {}
+
+ // allow success case to build (not relevant to bug)
+ operator bool() { return true; }
+};
+
+template <typename T>
+from_int<T> via_function(T v)
+{
+ return from_int<T>(v);
+}
+
+template <typename T>
+void f()
+{
+ // ********* this section compiles ***********
+
+ // these plain initializers work fine
+ from_int<int> a = 7;
+ from_int<int> b = from_int<int>(7);
+ empty<int> c = empty<int>();
+ from_int<T> ta = 7;
+ from_int<T> tb = from_int<T>(7);
+ empty<T> tc = empty<T>();
+
+ // these dependent condition decls work fine
+ if (empty<T> x = empty<T>())
+ ;
+ if (from_int<T> x = 7)
+ ;
+ if (from_int<T> x = from_int<T>(7))
+ ;
+ if (from_int<T> x = via_function(T()))
+ ;
+
+ // this non-dependent condition decl using conversion works fine
+ if (from_int<int> x = 7)
+ ;
+
+ // these non-dependent condition decls using conversion or braced-
+ // initialization work fine (in c++0x mode only course)
+ #if __GXX_EXPERIMENTAL_CXX0X__
+ if (empty<int> x {})
+ ;
+ if (from_int<int> x {7})
+ ;
+ #endif
+
+ // ********** this section fails in C++0x ***********
+
+ // the following non-dependent condition decls cause an assertion
+ // failure in
+ //
+ // tsubst_copy_and_build, at cp/pt.c:13370
+ //
+ // in C++0x mode
+ //
+ if (empty<int> x = empty<int>())
+ ;
+ if (from_int<int> x = from_int<int>(7))
+ ;
+ if (from_int<int> x = via_function(7))
+ ;
+}
+
+int main()
+{
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const1.C
new file mode 100644
index 000000000..629c4d4a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const1.C
@@ -0,0 +1,30 @@
+// PR c++/28385
+// instantiating op() with void()() was making the compiler think that 'fcn'
+// was const, so it could eliminate the call.
+
+// { dg-do run }
+
+extern "C" void abort (void);
+
+int barcnt = 0;
+
+class Foo {
+ public:
+ template<typename T>
+ void operator()(const T& fcn) {
+ fcn();
+ }
+};
+
+void bar() {
+ barcnt++;
+}
+
+int main() {
+ Foo myFoo;
+ myFoo(bar);
+ myFoo(&bar);
+ if (barcnt != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const2.C
new file mode 100644
index 000000000..5188fe29d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const2.C
@@ -0,0 +1,16 @@
+// PR c++/39608
+// We were improperly considering dependent members of the current
+// instantiation to be non-constant (and therefore invalid template
+// non-type arguments).
+
+template <int I>
+struct C {};
+
+template <class T>
+struct A
+{
+ static const T x = 1;
+ C<A<T>::x> c; // { dg-bogus "invalid" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const3.C
new file mode 100644
index 000000000..998b6976e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const3.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42251
+// { dg-do compile }
+
+struct foo
+{
+ static const bool b = false;
+};
+
+template<bool x>
+struct S1
+{
+};
+
+template<bool x>
+struct S2
+ : S1<foo::b>
+{
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const4.C
new file mode 100644
index 000000000..6552ec6e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const4.C
@@ -0,0 +1,9 @@
+// PR c++/48657
+
+template<unsigned> struct A { typedef int T; };
+
+template<unsigned> void f()
+{
+ const unsigned D = 4;
+ A<D>::T t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const5.C
new file mode 100644
index 000000000..6de025816
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const5.C
@@ -0,0 +1,12 @@
+// PR c++/49176
+// { dg-do compile { target c++11 } }
+
+struct A { static int a(); };
+
+template<int>
+struct B { static int const b; };
+
+int f() { return B<0>::b; }
+
+template<int I>
+int const B<I>::b=A::a();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const6.C
new file mode 100644
index 000000000..3c40d2635
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const6.C
@@ -0,0 +1,7 @@
+// PR c++/56684
+
+template < int T > struct S
+{
+ static const int Ti = T;
+ S() { 1 << Ti; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const7.C
new file mode 100644
index 000000000..424ac6d6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const7.C
@@ -0,0 +1,8 @@
+// PR c++/47897
+
+template < typename T, T N >
+struct S
+{
+ static const T value = N;
+ typedef S< T, value + 1 > next;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/const8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/const8.C
new file mode 100644
index 000000000..5b1262953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/const8.C
@@ -0,0 +1,13 @@
+// PR c++/48707
+
+struct A {
+ static int a();
+};
+
+template<typename X>
+struct B: A {
+ static int const b;
+};
+
+template<typename X>
+int const B<X>::b=B<X>::a();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/constant1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/constant1.C
new file mode 100644
index 000000000..a2c5a08d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/constant1.C
@@ -0,0 +1,13 @@
+// PR c++/49855
+
+extern void foo(int);
+
+template <class Key, class Value> void Basic() {
+ const int kT = 1.5e6; // <--- causes ICE
+ int size = kT*2/3;
+ do {
+ foo(size);
+ size = size * 0.5 - 1;
+ } while (size >= 0 );
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/constant2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/constant2.C
new file mode 100644
index 000000000..f71e4f56a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/constant2.C
@@ -0,0 +1,22 @@
+// PR c++/49896
+
+template<class C>
+class test {
+ protected:
+ static const int versionConst = 0x80000000;
+ enum { versionEnum = versionConst };
+ public:
+ int getVersion();
+};
+
+template<class C>
+int test<C>::getVersion() {
+ return versionEnum;
+}
+
+class dummy_class {};
+
+int main() {
+ test<dummy_class> t;
+ return t.getVersion();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv1.C
new file mode 100644
index 000000000..e0c749203
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv1.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4361. Template conversion operators were not overloaded.
+
+template <class T> struct Second;
+
+template<class T> struct First
+{
+ int Foo ();
+
+ template <class U> operator Second<U>();
+ template <class U> operator First<U>();
+};
+
+template <class T> int First<T>::Foo ()
+{} // This is here to make sure we didn't smash Foo's decl in the
+ // method vector
+
+struct B { };
+struct D { };
+
+void Foo ()
+{
+ First<B> (First<D>::*pf)() = &First<D>::operator First<B>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv10.C
new file mode 100644
index 000000000..0a001be14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv10.C
@@ -0,0 +1,9 @@
+// PR c++/41994
+
+template<typename T> struct A
+{
+ operator T();
+ A() { T (A::*f)() = &A::operator T; }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv11.C
new file mode 100644
index 000000000..f08e756a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv11.C
@@ -0,0 +1,11 @@
+int i;
+struct A
+{
+ template <class T> operator T&() { return i; } // { dg-message "note" }
+};
+
+int main()
+{
+ A().operator int(); // { dg-error "operator int" }
+ // { dg-message "(candidate|mismatched types)" "candidate note" { target *-*-* } 9 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv12.C
new file mode 100644
index 000000000..e6af05481
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv12.C
@@ -0,0 +1,25 @@
+// PR c++/51079
+
+#if __cplusplus > 199711L
+struct C1
+{
+ template <class T>
+ operator T() = delete; // { dg-message "declared here" "" { target c++11 } }
+ operator bool() { return false; }
+} c1;
+
+int ic1 = c1; // { dg-error "deleted" "" { target c++11 } }
+int ac1 = c1 + c1; // { dg-error "deleted" "" { target c++11 } }
+#endif
+
+struct C2
+{
+private:
+ template <class T>
+ operator T(); // { dg-error "private" }
+public:
+ operator bool() { return false; }
+} c2;
+
+int ic2 = c2; // { dg-error "" }
+int ac2 = c2 + c2; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv13.C
new file mode 100644
index 000000000..717994bf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv13.C
@@ -0,0 +1,13 @@
+// PR c++/52088
+
+struct S
+{
+ template <typename T>
+ operator T *() { return 0; }
+};
+
+int main()
+{
+ S s;
+ delete s; // { dg-error "ambiguous|template|pointer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv2.C
new file mode 100644
index 000000000..a0d08df55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv2.C
@@ -0,0 +1,39 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4361. Template conversion operators were not overloaded.
+
+class C
+{
+public:
+
+ operator float () {return 2;}
+
+ operator int ()
+ {
+ return 0;
+ }
+
+ template<typename T>
+ operator int ()
+ { return 1;
+ }
+};
+
+int main ()
+{
+ C p;
+ int r;
+
+ r = p.operator int ();
+ if (r)
+ return r;
+ r = static_cast <int> (p);
+
+ if (r)
+ return r + 2;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv3.C
new file mode 100644
index 000000000..a6b0f639b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv3.C
@@ -0,0 +1,43 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4361. Template conversion operators were not overloaded.
+
+template <typename T> struct C
+{
+ operator T ()
+ {
+ return 0;
+ }
+ template <typename T2> operator T2 ()
+ {
+ return 1;
+ }
+ int Foo ()
+ {
+ return operator T ();
+ }
+ template <typename T2> int Baz ()
+ {
+ return static_cast <int> (operator T2 ());
+ }
+};
+
+int main ()
+{
+ int r;
+ C<int> c;
+
+ r = c.Foo ();
+ if (r)
+ return 1;
+ r = c.Baz<int> ();
+ if (r)
+ return 2;
+ r = c.Baz<float> ();
+ if (!r)
+ return 3;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv4.C
new file mode 100644
index 000000000..01f158aef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv4.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 4361. Template conversion operators were not overloaded.
+
+struct C
+{
+ template <typename T2> operator T2 ()
+ {
+ return 1;
+ }
+ int Foo ()
+ {
+ return operator int ();
+ }
+};
+
+struct D
+{
+ int Foo ()
+ {
+ return operator int (); // { dg-error "not defined" "" }
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv5.C
new file mode 100644
index 000000000..80835437a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv5.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com>
+
+// PR 764. Failed to find friend in overload resolution
+
+template <class T>
+struct S
+{
+ friend bool operator== (const S&, const S&) {
+ return true;
+ }
+};
+
+int main ()
+{
+ // S<int> s;
+
+ const S<int> *p = 0;
+ *p == *p; // error
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv6.C
new file mode 100644
index 000000000..2a4a29952
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv6.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com>
+
+// PR 9898, DR 322. Conversion to reference type.
+
+template <typename> struct Ref {};
+template <typename> struct Val {};
+
+struct Wrapper
+{
+ template <typename U> operator Ref<U> & ();
+ template <typename U> operator Val<U> ();
+};
+
+void Foo (Wrapper l)
+{
+ static_cast <Ref<int> &> (l);
+ static_cast <Ref<int> const &> (l);
+ static_cast <Ref<int> > (l);
+ static_cast <Val<int> const &> (l);
+ static_cast <Val<int> > (l);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv7.C
new file mode 100644
index 000000000..86758b362
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv7.C
@@ -0,0 +1,12 @@
+// { dg-options "-fabi-version=0" }
+
+template <typename T> struct S {
+ struct I{};
+ operator I* ();
+};
+
+template <typename T> struct S2 : S<T> {
+ operator typename S<T>::I* ();
+};
+
+template struct S2<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv8.C
new file mode 100644
index 000000000..01d415b3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv8.C
@@ -0,0 +1,12 @@
+// { dg-options "-fabi-version=1 -Wno-abi" }
+
+template <typename T> struct S {
+ struct I{};
+ operator I* ();
+};
+
+template <typename T> struct S2 : S<T> {
+ operator typename S<T>::I* ();
+};
+
+template struct S2<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/conv9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/conv9.C
new file mode 100644
index 000000000..269e338a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/conv9.C
@@ -0,0 +1,16 @@
+// PR c++/28557
+
+struct A
+{
+ template<typename T> operator T() { return T(); }
+};
+
+template<int> void foo()
+{
+ A().operator int();
+}
+
+void bar()
+{
+ foo<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/copy1.C
new file mode 100644
index 000000000..c6b3ff806
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/copy1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: hkluender@otg.com
+
+// PR 5189
+
+struct A
+{
+ A(A&); // { dg-message "note" }
+ template <class T> A(T); // { dg-message "note" }
+};
+
+A a = 0; // { dg-error "no matching function" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash1.C
new file mode 100644
index 000000000..a500da18b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5125. ICE
+
+class S
+{
+ public:
+ template <class I> void Foo(int (*f)(S& o) );
+};
+
+template <class I>
+void S::Foo(int (*f)(TYPO&o) ) // { dg-error "Foo|f|TYPO|o" }
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash10.C
new file mode 100644
index 000000000..62647ca72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash10.C
@@ -0,0 +1,27 @@
+//Origin: benko@sztaki.hu
+//PR c++/11432
+// The mainline ICE on this one between 2003-01-16 and 2003-07-29.
+
+// { dg-do compile }
+
+ extern "C" void abort();
+
+
+template <int A>
+struct a
+{
+ static int const value = A - 1;
+};
+
+
+template <int B>
+struct b
+{
+ static int foo()
+ {
+ return a<L>::value;
+ }
+
+
+ static int const L = a<B + 1>::value;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash100.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash100.C
new file mode 100644
index 000000000..c67ae2eca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash100.C
@@ -0,0 +1,24 @@
+// PR c++/44628
+
+template <typename T>
+class Temp
+{
+ int Val;
+ public:
+ operator T&(void) { return Val; }
+
+ virtual T& operator=(T a ) // { dg-error "overriding" }
+ {
+ Val = a;
+ return Val;
+ }
+};
+
+class Int : public Temp<int>
+{
+ public:
+ Int& operator=(int a) // { dg-error "conflicting return type" }
+ {
+ return (*this);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash101.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash101.C
new file mode 100644
index 000000000..c59737a89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash101.C
@@ -0,0 +1,12 @@
+// PR c++/44039
+
+struct locale { };
+
+template<class charT>
+ void
+ foo()
+ { locale::locale(); } // { dg-error "cannot call|function-style" }
+
+void
+bar()
+{ foo<char>(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash102.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash102.C
new file mode 100644
index 000000000..fd3c36eec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash102.C
@@ -0,0 +1,5 @@
+// PR c++/45043
+
+template < typename > class A;
+template < typename T > A < T >::B::~B () // { dg-error "type" }
+{}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash103.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash103.C
new file mode 100644
index 000000000..9f3e224e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash103.C
@@ -0,0 +1,4 @@
+// PR c++/45665
+
+template < typename > struct S;
+void (S <0>::*ptr) (); // { dg-error "type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash104.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash104.C
new file mode 100644
index 000000000..097c46982
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash104.C
@@ -0,0 +1,26 @@
+// PR c++/46046
+
+template <class T>
+ struct foo
+{
+ template <class U, class V = void>
+ struct type
+ {};
+
+ template <class V>
+ struct type<
+ typename T::template some_type<int>,
+ V
+ >
+ {};
+};
+
+template <class T>
+ class bar
+{};
+
+int main()
+{
+ typedef foo<bar<int> > cont;
+ cont::type<char> obj; // { dg-error "cannot be defined" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash105.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash105.C
new file mode 100644
index 000000000..8cfff6a36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash105.C
@@ -0,0 +1,17 @@
+// PR c++/44118
+
+template < typename > struct S;
+template < typename > struct S < int >; // { dg-error "template" }
+template < typename > struct S < int >
+{
+ void f ();
+};
+
+void
+f ()
+{
+ S < int >::f ();
+}
+
+// Don't be picky about error-recovery.
+// { dg-prune-output "." }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash106.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash106.C
new file mode 100644
index 000000000..ebd47bcff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash106.C
@@ -0,0 +1,14 @@
+// PR c++/47974
+
+typedef double T;
+
+struct A
+{
+ template<T> void foo(); // { dg-error "type" }
+};
+
+template<T N = 0, void (A::*)() = &A::foo<N> > struct B {}; // { dg-error "type|declared" }
+
+B<> b; // { dg-error "type|declaration" }
+
+// { dg-prune-output "could not convert" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash107.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash107.C
new file mode 100644
index 000000000..bb405ac7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash107.C
@@ -0,0 +1,20 @@
+// PR c++/44625
+// { dg-do compile }
+// { dg-options "" }
+
+template<typename FP_> struct Vec { // { dg-message "note" }
+ Vec& operator^=(Vec& rhs) {
+ union {
+ struct {FP_ x,y,z;};
+ }; // { dg-error "anonymous struct" }
+ X = y*rhs.z() - z*rhs.y(); // { dg-error "not declared|no member" }
+ }
+ Vec& operator^(Vec& rhs) {
+ return Vec(*this)^=rhs; // { dg-message "required" }
+ }
+};
+Vec<double> v(3,4,12); // { dg-error "no matching" }
+// { dg-message "note" "note" { target *-*-* } 16 }
+Vec<double> V(12,4,3); // { dg-error "no matching" }
+// { dg-message "note" "note" { target *-*-* } 18 }
+Vec<double> c = v^V; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash108.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash108.C
new file mode 100644
index 000000000..221d80ee5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash108.C
@@ -0,0 +1,5 @@
+// PR c++/50861
+
+template<class T> struct A {A(int b=k(0));}; // { dg-error "parameter|arguments" }
+void f(int k){A<int> a;} // // { dg-message "declared" }
+// { dg-message "note" "note" { target *-*-* } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash109.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash109.C
new file mode 100644
index 000000000..28d9198b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash109.C
@@ -0,0 +1,6 @@
+// PR c++/51328
+
+template<typename T> struct A
+{
+ void foo(A<T::~T>); // { dg-error "invalid use of destructor" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash11.C
new file mode 100644
index 000000000..3c69514e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash11.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Origin: kparz@iastate.edu
+
+// PR c++/7939: ICE for invalid function parameter after template
+// substitution.
+
+template <class T, class U> void foo(T, U) {}
+template <class T> void foo<T,void>(T, void) {} // { dg-error "incomplete|invalid|partial" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash110.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash110.C
new file mode 100644
index 000000000..d0a4b4ddc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash110.C
@@ -0,0 +1,7 @@
+// PR c++/51402
+
+template<void> struct A // { dg-error "not a valid type" }
+{
+ template<int,int> struct B {};
+ template<int N> struct B<N,N> {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash111.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash111.C
new file mode 100644
index 000000000..f711260ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash111.C
@@ -0,0 +1,6 @@
+// PR c++/51398
+
+template<void, int N> struct A // { dg-error "not a valid type" }
+{
+ static const int i = N;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash112.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash112.C
new file mode 100644
index 000000000..ff35764c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash112.C
@@ -0,0 +1,17 @@
+// PR c++/51370
+
+struct A
+{
+ template<typename> void foo() {}
+};
+
+template<void (A::*)()> struct B {};
+
+template<int> struct C
+{
+ B<&A::foo<int int> > b; // { dg-error "declaration|type" }
+};
+
+C<0> c;
+
+// { dg-prune-output "could not convert" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash113.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash113.C
new file mode 100644
index 000000000..3d3a562bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash113.C
@@ -0,0 +1,50 @@
+// PR c++/53581
+
+template<class A, int M, int N>
+class Child;
+
+template<class A, int M, int N>
+class Base
+{
+public:
+ Child<A, M, N> operator-(const Base<A, M, N> &m) const
+ {
+ Child<A, M, N> diff;
+ return diff;
+ }
+
+ A test() const
+ {
+ return 0;
+ }
+
+private:
+ A values[M * N];
+};
+
+template<class A, int N>
+class Ops
+{
+public:
+ virtual ~Ops() {}
+
+ bool bar() const
+ {
+ Child<A, N, N> mat;
+ return (*static_cast<const Child<A, N, N>*>(this) - mat).test();
+ }
+};
+
+
+template<class A, int N>
+class Child<A, N, N> : public Base<A, N, N>, public Ops<A, N> {};
+
+class ImageWarp
+{
+ bool bar() const
+ {
+ return foo.bar();
+ }
+
+ Child<float, 3, 3> foo;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash114.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash114.C
new file mode 100644
index 000000000..cf894ba69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash114.C
@@ -0,0 +1,5 @@
+// PR c++/34892
+
+template<int=..., int=0> struct A {}; // { dg-error "expected primary" }
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash115.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash115.C
new file mode 100644
index 000000000..5c9f525cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash115.C
@@ -0,0 +1,3 @@
+// PR c++/56534
+
+template < struct template rebind < > // { dg-error "expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash116.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash116.C
new file mode 100644
index 000000000..d26c591ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash116.C
@@ -0,0 +1,13 @@
+// PR c++/38634
+
+template<int> struct A
+{
+ A();
+};
+
+template<int N, char> A<N>::A() // { dg-error "template|required" }
+{
+ struct B {};
+}
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash117.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash117.C
new file mode 100644
index 000000000..5aaaf7344
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash117.C
@@ -0,0 +1,9 @@
+// PR c++/58649
+
+template<typename> void foo()
+{
+ E(); // { dg-error "declaration|declared" }
+ enum E {};
+}
+
+template void foo<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash118.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash118.C
new file mode 100644
index 000000000..e0de605f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash118.C
@@ -0,0 +1,11 @@
+// PR c++/60383
+
+template<int> struct A
+{
+ template<typename> struct B
+ {
+ template<typename T> struct B<T*> {}; // { dg-error "specialization" }
+ };
+};
+
+A<0>::B<char*> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash12.C
new file mode 100644
index 000000000..e2231e06b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash12.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: rmerkert@alphatech.com
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/12495: ICE looking up class template in local class.
+
+template <typename> struct A {};
+
+template <typename T> void foo()
+{
+ struct B
+ {
+ B (const A<T>&);
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash13.C
new file mode 100644
index 000000000..14bec68e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash13.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/11076: ICE for invalid access declaration containing typename.
+
+template<typename, typename T=void> struct A
+{
+ typedef A<T,T> B;
+};
+
+template <typename T> struct C
+{
+ typedef typename A<T>::B X;
+ X::Y; // { dg-error "not a base type" }
+// { dg-warning "deprecated" "" { target *-*-* } 15 }
+};
+
+C<void> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash14.C
new file mode 100644
index 000000000..cf6fffa1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash14.C
@@ -0,0 +1,5 @@
+// { dg-options -std=c++98 }
+
+template <int T> class foo { public: foo() { } class Z { };};
+template <int I[2]> void dep7(foo<I[0]> *) { } // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash15.C
new file mode 100644
index 000000000..e0aad73c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash15.C
@@ -0,0 +1,9 @@
+// PR c++/13310
+
+struct A {};
+
+template <typename> void foo()
+{
+ A a;
+ a.foo<int>(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash16.C
new file mode 100644
index 000000000..f80dd1064
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash16.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Alexander Stippler <stip@mathematik.uni-ulm.de>
+// PR c++/10079
+
+template <bool> struct A {};
+
+template <typename> struct B
+{
+ enum { e };
+};
+
+template <typename T> A<(B<T>::e && 0)> foo(T) {}
+
+template <typename T> void foo(B<T>) {}
+
+void bar()
+{
+ B<int> b;
+ foo(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash17.C
new file mode 100644
index 000000000..9fa826b99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash17.C
@@ -0,0 +1,19 @@
+template <int I>
+struct A {
+};
+
+template <typename T>
+struct B {
+ typedef typename T::type type;
+ static const type j = T::j;
+
+ A<j> b;
+};
+
+struct C {
+ typedef int type;
+ static const int j = 3;
+};
+
+int i = B<C>::j;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash18.C
new file mode 100644
index 000000000..5eb92929c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash18.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Contributed by: <leif dot lonnblad at thep dot lu dot se>
+// PR c++/15064: typeid does not form an integral constant expression
+
+#include <typeinfo>
+
+template <typename T>
+void dummy() {
+ const std::type_info& t = typeid(T);
+ const std::type_info& t2 = typeid(float);
+}
+
+template void dummy<int>(void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash19.C
new file mode 100644
index 000000000..a28827f31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash19.C
@@ -0,0 +1,17 @@
+// PR c++/15165
+
+struct S
+{
+ template <class T> S(const T &e);
+};
+int operator *(const double, const S &);
+template <class T>
+struct X {
+ enum { SIXTY_FOUR=64 };
+ struct node {
+ unsigned char *ptr[sizeof(T)*SIXTY_FOUR];
+ void d() {}
+ };
+ node *head;
+};
+template struct X<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash2.C
new file mode 100644
index 000000000..47c95ab06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash2.C
@@ -0,0 +1,31 @@
+// { dg-options "" }
+
+template <class EnumType>
+class A
+{
+public:
+ static const EnumType size = max; // { dg-error "" }
+ int table[size]; // { dg-error "constant" }
+};
+template <class EnumType>
+const EnumType A<EnumType>::size;
+
+
+namespace N
+{
+enum E { max = 5 };
+
+struct B
+{
+ A<E> a;
+};
+
+}
+
+int
+main()
+{
+ N::B b;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash20.C
new file mode 100644
index 000000000..0492b72e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash20.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2004 <nathan@codesourcery.com>
+
+// ICE with incompletable type.
+
+class INC;
+
+template <typename T> class B {};
+
+template<typename T> void Foo (B<T> &);
+
+void Foo (INC &);
+
+void Baz (INC *p)
+{
+ Foo (*p);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash21.C
new file mode 100644
index 000000000..8b674910e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash21.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org>
+// Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/16706: Dependent type calculation during access checking
+
+template <typename> struct B {
+ B() throw() {}
+ struct S { };
+ static int i;
+ typedef unsigned short int dummy;
+};
+
+template <typename _Tp>
+struct allocator: B<_Tp> {
+ template<typename _Tp1> struct rebind
+ { typedef allocator<_Tp1> other; };
+};
+
+template<typename T, typename>
+struct X {
+ typename allocator<T>::template rebind<int>::other i;
+ typedef int* dummy;
+};
+
+template <class T> class A {
+ typedef typename X<T,allocator<T> >::dummy dummy;
+ template <class TP> class XWrapper;
+};
+
+
+template <class T>
+template <class TP> struct A<T>::XWrapper<TP *>
+{
+ XWrapper() {}
+ X<int,allocator<int> > x;
+};
+
+template class A<int>::XWrapper<int *>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash22.C
new file mode 100644
index 000000000..4d0cfaa99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash22.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org>
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/16706: Dependent type calculation during access checking
+
+template<typename> struct A
+{
+ A();
+ template<typename> struct X {};
+};
+
+template<typename T> struct B
+{
+ typename A<T>::template X<int> x;
+ template<typename> struct C;
+};
+
+template<typename T> template<typename U> struct B<T>::C<U*>
+{
+ C() {}
+ A<int> a;
+};
+
+template struct B<int>::C<int*>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash23.C
new file mode 100644
index 000000000..0c3eac1ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash23.C
@@ -0,0 +1,9 @@
+// PR c++/17642
+
+template<int dim>
+int f(const int* const lsh, const int* const bbox, const int* const nghostzones, int d)
+{
+ for (int d=0; d<dim; ++d)
+ lsh[d] - (bbox[2*d+1] ? 0 : nghostzones[d]);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash24.C
new file mode 100644
index 000000000..49b8c7e71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash24.C
@@ -0,0 +1,14 @@
+// PR c++/17826
+
+struct A
+{
+ template<typename> static int foo();
+};
+
+template<int> struct B {};
+
+template<typename T> void bar()
+{
+ B<sizeof A::foo<T>()> b1;
+ B<sizeof A::foo<T>()> b2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash25.C
new file mode 100644
index 000000000..fa77f0d4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash25.C
@@ -0,0 +1,3 @@
+// PR c++/18124
+
+template <template <int> class class> class A {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash26.C
new file mode 100644
index 000000000..3be7ff97c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash26.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18471: ICE redeclaration of typedef as class template
+
+typedef int X; // { dg-message "previous" }
+template<X> struct X {}; // { dg-error "typedef-name" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash27.C
new file mode 100644
index 000000000..d2f6289d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash27.C
@@ -0,0 +1,4 @@
+// PR c++/18586
+template <int> struct A {
+ template <int N> int A<N>::i; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash28.C
new file mode 100644
index 000000000..e8b2bbb29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash28.C
@@ -0,0 +1,13 @@
+// PR c++/18445
+
+struct a
+{
+ int what();
+};
+void g(void*);
+template<class T>
+void f()
+{
+ a ex;
+ g(ex.what); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash29.C
new file mode 100644
index 000000000..55953ed80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash29.C
@@ -0,0 +1,8 @@
+// PR c++/18512
+
+template <int> struct A {};
+
+struct B : A<0>
+{
+ void foo() { this->A<0>; } // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash3.C
new file mode 100644
index 000000000..21aa57b1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash3.C
@@ -0,0 +1,12 @@
+struct S {
+};
+
+extern S i[];
+
+void g (S*);
+
+template <typename T>
+void f () {
+ g (&i[2]);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash30.C
new file mode 100644
index 000000000..145b07673
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash30.C
@@ -0,0 +1,16 @@
+// PR c++/19034
+
+template< bool C > struct B
+{
+};
+
+template<typename S> int foo();
+template<typename S> int foo1();
+
+template<typename T> struct bar : public B <(sizeof(foo<T>()) == 1)>
+{
+};
+
+template<typename T> struct bar1 : public B <(sizeof(foo1<T>()) == 1)>
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash31.C
new file mode 100644
index 000000000..2269f47ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash31.C
@@ -0,0 +1,3 @@
+// PR c++/19063
+
+template<operator< struct A {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash32.C
new file mode 100644
index 000000000..4c7af8a39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash32.C
@@ -0,0 +1,9 @@
+// PR c++/19667
+
+struct integral_constant { };
+
+template<typename _Tp>
+struct is_function : public integral_constant { };
+
+template<>
+struct is_function : public integral_constant { }; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash33.C
new file mode 100644
index 000000000..059e328f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash33.C
@@ -0,0 +1,8 @@
+// PR c++/19253
+
+namespace N {}
+
+template<typename> struct A
+{
+ A<typename N::X<int> > a; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash34.C
new file mode 100644
index 000000000..ef4d21b60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash34.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// PR c++/20028
+
+// We used to crash when referencing TYPE_SIZE_UNIT of the messed-up
+// type used for x, because it was not initialized.
+
+class Foo;
+
+template <typename T> class Foo { }; // { dg-error "not a template type" }
+
+Foo<int> x; // { dg-error "not a template|incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash35.C
new file mode 100644
index 000000000..348d91d0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash35.C
@@ -0,0 +1,9 @@
+// PR c++/20463
+// { dg-do compile }
+
+template <typename T> struct C; // { dg-error "declaration" }
+
+template <typename T> void C<T>::f() // { dg-error "invalid|template" }
+{
+ const foo bar;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash36.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash36.C
new file mode 100644
index 000000000..2f0ef921a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash36.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Andrew Pinski <pinskia@gcc.gnu.org>
+
+// PR c++/20333: ICE parsing typename without nested-name-specifier
+
+template<class> struct f {};
+f<int> f2[2] = {typename f<int>()}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash37.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash37.C
new file mode 100644
index 000000000..d5167c8d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash37.C
@@ -0,0 +1,26 @@
+// PR c++/21352
+
+struct coperator_stack
+{
+ template<class type>
+ void push3()
+ {
+ }
+};
+
+struct helper {};
+
+template<class F>
+void bla(F f)
+{
+}
+
+template <typename ScannerT>
+struct definition
+{
+ definition()
+ {
+ bla(coperator_stack::push3<helper>); // { dg-error "pointer to member" }
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash38.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash38.C
new file mode 100644
index 000000000..f4cf29985
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash38.C
@@ -0,0 +1,8 @@
+// PR c++/23307
+
+class A
+{
+ template<class R>
+ static void f(X&); // { dg-error "" }
+ inline void A::f<void>(X&); // { dg-error "f|expected|not been declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash39.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash39.C
new file mode 100644
index 000000000..840255cbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash39.C
@@ -0,0 +1,11 @@
+// PR c++/22405
+
+template <typename T> void foo(T &arg) { // { dg-message "declared" }
+ arg+=1;
+}
+
+template <typename T> void foo(T &arg) { // { dg-error "redefinition" }
+ arg+=2;
+}
+
+template void foo(float &arg);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash4.C
new file mode 100644
index 000000000..72b2bb18b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash4.C
@@ -0,0 +1,12 @@
+namespace NS {
+ struct C {};
+ void foo();
+}
+
+template <class T> struct X {};
+
+template <class T> struct A {
+ A() { foo (X<T>()); }
+ void foo(X<T>);
+};
+template struct A<NS::C>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash40.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash40.C
new file mode 100644
index 000000000..d720fe850
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash40.C
@@ -0,0 +1,10 @@
+// PR c++/22180
+
+struct A {};
+
+template<typename T> void foo()
+{
+ T::~T(); // { dg-error "member" }
+}
+
+template void foo<A>(); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash41.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash41.C
new file mode 100644
index 000000000..16e7028a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash41.C
@@ -0,0 +1,18 @@
+// PR c++/22464
+
+template<typename T>
+void do_something(const T* A) // { dg-message "declared" }
+{
+ struct helper_t{
+ helper_t() {
+ A[0]; // { dg-error "use" }
+ }
+ } helper;
+}
+
+void sub1() {
+ double A[7];
+ do_something (A);
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash42.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash42.C
new file mode 100644
index 000000000..d36ced473
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash42.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+// PR c++/22153
+
+template<int> void foo();
+
+template<int> struct A
+{
+ template<> friend void foo<0>(); // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash43.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash43.C
new file mode 100644
index 000000000..cbb1221b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash43.C
@@ -0,0 +1,8 @@
+// PR c++/24687
+
+extern "C" {
+ template<typename _Tp> // { dg-error "C" }
+ struct ___is_pod {
+ enum {
+ __value = (sizeof(__gnu_internal::__test_type<_Tp>(0)))}; // { dg-error "declared|expected" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash44.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash44.C
new file mode 100644
index 000000000..d5596c199
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash44.C
@@ -0,0 +1,7 @@
+// PR c++/25858
+
+namespace N {
+ template<int> struct A {};
+}
+
+struct B N::A<0> {}; // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash45.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash45.C
new file mode 100644
index 000000000..f67fd022f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash45.C
@@ -0,0 +1,13 @@
+// PR c++/26365
+
+struct A {};
+
+namespace N
+{
+ template<int> void foo();
+}
+
+void bar(A *p)
+{
+ p->N::foo<0>; // { dg-error "not a class member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash46.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash46.C
new file mode 100644
index 000000000..6fbda7c07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash46.C
@@ -0,0 +1,5 @@
+// PR c++/27102
+
+template <class T>
+void T::foo() {} // { dg-error "invalid" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash47.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash47.C
new file mode 100644
index 000000000..9c2163209
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash47.C
@@ -0,0 +1,3 @@
+// PR c++/27102
+
+template<typename T> void T::X::foo() {} // { dg-error "invalid|not a type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash48.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash48.C
new file mode 100644
index 000000000..6aa3aa3ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash48.C
@@ -0,0 +1,10 @@
+// PR c++/11471
+// Origin: <bagnara@cs.unipr.it>
+// { dg-do compile }
+
+template<typename T> struct A
+{
+ typedef typename T::X X;
+};
+
+template<typename T> A<T>::X::X() {} // { dg-error "no type|invalid use|not a type|dependent" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash49.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash49.C
new file mode 100644
index 000000000..41fc9be7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash49.C
@@ -0,0 +1,4 @@
+// PR c++/27102
+
+template <typename T>
+void T::foo; // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash50.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash50.C
new file mode 100644
index 000000000..286685ac8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash50.C
@@ -0,0 +1,7 @@
+// PR c++/27398
+// { dg-do compile }
+
+struct A
+{
+ template<int> void* foo(; // { dg-error "primary-expression|initialization|static|template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash51.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash51.C
new file mode 100644
index 000000000..8c2553d10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash51.C
@@ -0,0 +1,11 @@
+// PR c++/26496
+
+template< typename _Generator> int generate_n(_Generator __gen);
+struct Distribution { };
+typedef double (Distribution::* Pstd_mem)();
+int main(void)
+{
+ Distribution* rng;
+ Pstd_mem ptr;
+ generate_n(rng->*ptr); // { dg-error "non-static member" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash52.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash52.C
new file mode 100644
index 000000000..9fc3f6833
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash52.C
@@ -0,0 +1,19 @@
+// PR c++/27665
+
+template<int> struct A
+{
+ struct B
+ {
+ struct C {};
+ };
+};
+
+template<int N> void foo()
+{
+ class A<N>::B::C X;
+}
+
+void bar()
+{
+ foo<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash53.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash53.C
new file mode 100644
index 000000000..a8d7c1110
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash53.C
@@ -0,0 +1,11 @@
+// PR c++/28110
+// { dg-do compile }
+
+template<int> struct A {};
+
+template<typename T> struct B
+{
+ template<T I> B(A<I>); // { dg-error "template non-type parameter" }
+};
+
+B<double> a=A<0>(); // { dg-error "non-scalar type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash54.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash54.C
new file mode 100644
index 000000000..26b487571
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash54.C
@@ -0,0 +1,5 @@
+//PR c++/28269
+
+template<int> struct A;
+
+struct __attribute__((unused)) A<0<; // { dg-error "template argument|unqualified-id" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash55.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash55.C
new file mode 100644
index 000000000..7cf9f1eae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash55.C
@@ -0,0 +1,6 @@
+//PR c++/27668
+
+template<typename class T, T = T()> // { dg-error "nested-name-specifier|two or more|valid type" }
+struct A {};
+
+template<int> void foo(A<int>); // { dg-error "mismatch|constant|template argument" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash56.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash56.C
new file mode 100644
index 000000000..03bddf42a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash56.C
@@ -0,0 +1,16 @@
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/28705
+// DR 218 is debating whether this is well formed or not. We've never
+// accepted it (because we'd crash), so we continue to reject it, but
+// without crashing.
+
+namespace N
+{
+ struct A { A (A*); };
+}
+
+template<typename T> void g (N::A *p)
+{
+ (void) A (p); // { dg-message "" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash57.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash57.C
new file mode 100644
index 000000000..cf1c3c296
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash57.C
@@ -0,0 +1,10 @@
+//PR c++/27397
+
+template<int(> struct A; // { dg-error "token" }
+
+template<typename> struct B
+{
+ template<int(> struct C; // { dg-error "token" }
+};
+
+A<char> a; // { dg-error "type/value mismatch|constant|declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash58.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash58.C
new file mode 100644
index 000000000..5194ee263
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash58.C
@@ -0,0 +1,10 @@
+//PR 26938
+
+template<int, int = 0> struct A; // { dg-message "previous declaration" }
+
+template<int> struct A // { dg-error "template" }
+{
+ A();
+};
+
+A<0> a; // { dg-error "incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash59.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash59.C
new file mode 100644
index 000000000..61d2188fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash59.C
@@ -0,0 +1,19 @@
+//PR c++/27329
+
+template<int> struct A // { dg-error "forward declaration" }
+! // { dg-error "expected unqualified-id" }
+ ;
+
+template<int> struct A { int foo(); }; // { dg-error "not a template" }
+
+int i = A<0>().foo(); // { dg-error "not a template|invalid use" }
+
+
+template<int> struct B
+! // { dg-error "expected unqualified-id" }
+ ;
+
+template<int> struct B { static int bar(); }; // { dg-error "not a template" }
+
+int j = B<0>::bar(); // { dg-error "not a template|incomplete type" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash6.C
new file mode 100644
index 000000000..776e01ebb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash6.C
@@ -0,0 +1,8 @@
+template <class> struct A { static const int n = 1; } ;
+template <int> struct B;
+
+template <class S>
+struct restype_order {
+ static const int s = A<S>::n;
+ typedef typename B<(s > 0)>::t t;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash60.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash60.C
new file mode 100644
index 000000000..c57977591
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash60.C
@@ -0,0 +1,9 @@
+//PR c++/27961
+
+struct A
+{
+ template<int> void foo(X); // { dg-error "declared" }
+};
+
+template<int> void f()(0); // { dg-error "initialize" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash61.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash61.C
new file mode 100644
index 000000000..1f70bcb89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash61.C
@@ -0,0 +1,11 @@
+// PR c++/29733
+
+template<typename T> void foo()
+{
+ T t = 0; // { dg-error "function type" }
+}
+
+void bar()
+{
+ foo<int()>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash62.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash62.C
new file mode 100644
index 000000000..bd8a0f40e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash62.C
@@ -0,0 +1,6 @@
+// PR c++/29728
+
+template<int> void foo()
+{
+ int a[] = { X: 0 }; // { dg-error "designated initializer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash63.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash63.C
new file mode 100644
index 000000000..b7056e8d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash63.C
@@ -0,0 +1,12 @@
+// PR c++/29729
+
+template<typename T> void foo(T)
+{
+ struct A
+ {
+ template<int> struct B // { dg-error "local class" }
+ {
+ typedef B<0> C;
+ }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash64.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash64.C
new file mode 100644
index 000000000..1d8fd0098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash64.C
@@ -0,0 +1,6 @@
+// PR c++/29730
+
+struct A
+{
+ template<int> void foo()(0); // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash65.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash65.C
new file mode 100644
index 000000000..4d49ecf31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash65.C
@@ -0,0 +1,7 @@
+// PR c++/29732
+
+struct A
+{
+ template<int> template<typename T> friend void foo(T) {} // { dg-error "parameter" }
+ void bar() { foo(0); } // { dg-error "foo" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash66.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash66.C
new file mode 100644
index 000000000..3517311b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash66.C
@@ -0,0 +1,17 @@
+// PR c++/29535
+// { dg-do compile }
+
+template <class INDEX> struct SetRegion2D
+{
+ struct FloodFillControl
+ {
+ struct Allocator{};
+ };
+};
+template <int DIM, class PIXELINDEX>
+struct MotionSearcher
+{
+ typedef SetRegion2D<PIXELINDEX> Region_t;
+ MotionSearcher (typename Region_t::FloodFillControl::Allocator &a_rAllocator);
+};
+class MotionSearcherY : public MotionSearcher<1, int> {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash67.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash67.C
new file mode 100644
index 000000000..c80f4fb93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash67.C
@@ -0,0 +1,3 @@
+// PR c++/32561
+
+template<int N, int N> struct A; // { dg-error "redefinition|declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash68.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash68.C
new file mode 100644
index 000000000..9171f8c62
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash68.C
@@ -0,0 +1,16 @@
+// PR c++/33035
+
+template<class A>
+struct a {
+ template<class B>
+ struct b {
+ template<class C>
+ void f()
+ {
+ struct g
+ {
+ ~g() {}
+ };
+ }
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash69.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash69.C
new file mode 100644
index 000000000..957f1e19b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash69.C
@@ -0,0 +1,12 @@
+// PR c++/31132
+
+template<typename T> class A
+{
+ static int i; // { dg-error "is private" }
+ friend int T::foo(); // { dg-error "does not match" }
+};
+
+struct B
+{
+ void foo() { A<B>::i; } // { dg-error "within|candidate" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash7.C
new file mode 100644
index 000000000..5bd275e32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash7.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10108: ICE in tsubst_decl for error due to non-existence
+// nested type.
+
+template <typename> struct A
+{
+ template <typename> A(typename A::X) {} // { dg-error "no type" }
+};
+
+// We currently don't give the "no match" error because we don't add the
+// invalid constructor template to TYPE_METHODS.
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash70.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash70.C
new file mode 100644
index 000000000..742f77b22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash70.C
@@ -0,0 +1,7 @@
+// PR c++/32113
+
+template<int> struct A;
+
+template<typename T> void foo (A<&T::template i>); // { dg-error "not a template" }
+
+template void foo<A<0> > (A<0>); // { dg-error "does not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash71.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash71.C
new file mode 100644
index 000000000..86aa1521d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash71.C
@@ -0,0 +1,3 @@
+// PR c++/30659
+
+extern "C" template A<char> foo(); // { dg-error "forbids|static data|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash72.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash72.C
new file mode 100644
index 000000000..5ab536561
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash72.C
@@ -0,0 +1,25 @@
+// PR c++/29225
+// { dg-do compile }
+
+template <typename L, typename R> bool operator< (L x, R y);
+struct T { int t (); };
+class S {};
+
+struct U
+{
+ typedef int (T::* M) ();
+ M m;
+
+ bool operator() (S &x)
+ {
+ T a;
+ return (a.*m) < x; // { dg-error "invalid use of non-static member" }
+ }
+};
+
+void foo (S &x)
+{
+ U m;
+ m.m = &T::t;
+ m (x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash73.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash73.C
new file mode 100644
index 000000000..5c3c87dad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash73.C
@@ -0,0 +1,9 @@
+// PR c++/34100
+// { dg-do compile }
+
+template<typename T> struct A
+{
+ typedef typename T::X Y __attribute__((vector_size(8))); // { dg-error "is not a class, struct" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash74.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash74.C
new file mode 100644
index 000000000..d236947ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash74.C
@@ -0,0 +1,6 @@
+// PR c++/34089
+// { dg-do compile }
+// { dg-options "" }
+
+template<typename F> void foo () { } // { dg-prune-output "previous" }
+template<typename F> struct foo<F> { }; // { dg-error "template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash75.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash75.C
new file mode 100644
index 000000000..462be95b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash75.C
@@ -0,0 +1,8 @@
+// PR c++/34776
+
+template<typename T> struct A
+{
+ T::X<0> x; // { dg-error "non-template|T::template|base type" }
+};
+
+A<int*> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash76.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash76.C
new file mode 100644
index 000000000..851cdd8c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash76.C
@@ -0,0 +1,13 @@
+// PR c++/34486
+
+template<typename> struct A
+{
+ typedef A* X;
+};
+
+template<typename T> struct B
+{
+ using A<T>::X::Y; // { dg-error "not a base type" }
+};
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash77.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash77.C
new file mode 100644
index 000000000..b4d6e8f4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash77.C
@@ -0,0 +1,5 @@
+// PR c++/34603
+
+template<typename> struct A; // { dg-error "declaration" }
+
+template<typename T> A<T>::A( struct A; // { dg-error "definition|expected|incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash78.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash78.C
new file mode 100644
index 000000000..10c36ef8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash78.C
@@ -0,0 +1,3 @@
+// PR c++/35077
+
+template<typename=int struct A __attribute((aligned(4))); // { dg-error "declaration|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash79.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash79.C
new file mode 100644
index 000000000..a18eac336
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash79.C
@@ -0,0 +1,9 @@
+// PR c++/36404
+
+struct A
+{
+ A(int);
+ template<int> enum { e }; // { dg-error "template|expected" }
+};
+
+A a(A::e); // { dg-error "not a member" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash8.C
new file mode 100644
index 000000000..a6f26b306
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash8.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: David Robinson <drtr@dial.pipex.com>
+
+// PR c++/11513: ICE due to incorrect decision whether the tag is template.
+
+template <typename T>
+struct bar
+{
+ struct foo
+ {
+ int a;
+ };
+
+ template <typename U>
+ int wom(U c)
+ {
+ struct foo b;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash80.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash80.C
new file mode 100644
index 000000000..a12bd8bdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash80.C
@@ -0,0 +1,9 @@
+// PR c++/37087
+
+namespace a {
+ template <typename T> class Foo;
+}
+
+namespace b {
+ template <> class ::a::Foo<double> {}; // { dg-error "global qualification of class name is invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash81.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash81.C
new file mode 100644
index 000000000..849470a5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash81.C
@@ -0,0 +1,8 @@
+// PR c++/34485
+
+struct A
+{
+ template<T::X> struct X; // { dg-error "'T' has not been declared" "T" }
+ // { dg-error "declaration of 'template<int X> struct A::X'" "A::X" { target *-*-* } 5 }
+ // { dg-error "shadows template parm 'int X'" "shadow" { target *-*-* } 5 }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash82.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash82.C
new file mode 100644
index 000000000..41456918f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash82.C
@@ -0,0 +1,6 @@
+// PR c++/37649
+
+struct A
+{
+ template<int> struct {}; // { dg-error "template class without a name" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash83.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash83.C
new file mode 100644
index 000000000..b83dd2139
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash83.C
@@ -0,0 +1,5 @@
+// PR c++/37650
+
+template<int> struct A {};
+
+template<typename = class A<0>: > struct B {}; // { dg-error "explicit specialization|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash84.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash84.C
new file mode 100644
index 000000000..103e90a70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash84.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/35405
+// { dg-do compile }
+
+template<typename T> struct a
+{
+ template <template <typename> class C, typename X, C<X>* =0>
+ struct b
+ {
+ };
+};
+
+void
+foo ()
+{
+ a<int> a1; // OK
+ a<int>::b<a,int> b1; // { dg-error "template argument" }
+}
+
+// { dg-prune-output "invalid type in declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash85.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash85.C
new file mode 100644
index 000000000..e0b6ee198
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash85.C
@@ -0,0 +1,15 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/37142
+// { dg-do compile }
+
+template<typename T, const T a, template <typename U, U u> class W> struct A {};
+
+template<typename T, const T t> struct B {};
+
+int
+main ()
+{
+ A<long, 0, B> a;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash87.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash87.C
new file mode 100644
index 000000000..7b8bf4ada
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash87.C
@@ -0,0 +1,27 @@
+// Origin: PR c++/38357
+// { dg-do compile }
+
+class BUG
+{
+public:
+ bool name() { return true; }
+};
+
+template <bool T>
+struct BUG1_5
+{
+
+};
+
+template <bool name>
+class BUG2 : BUG
+{
+public:
+ typedef BUG1_5<name> ptr; // { dg-error "could not convert template argument" }
+};
+
+int main()
+{
+ BUG2<false> b;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash88.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash88.C
new file mode 100644
index 000000000..438ab90cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash88.C
@@ -0,0 +1,6 @@
+// PR c++/34397
+
+template<typename T, int = T()[0]> struct A
+{
+ typedef A<T> B;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash89.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash89.C
new file mode 100644
index 000000000..f4cdaf9d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash89.C
@@ -0,0 +1,10 @@
+// PR c++/34397
+
+template<typename T, int = T()[0]> struct A // { dg-error "subscripted" }
+{
+ typedef A<T> B;
+};
+
+A<int> a; // { dg-error "declaration" }
+
+// { dg-prune-output "template argument 2 is invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash9.C
new file mode 100644
index 000000000..7a568fe05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash9.C
@@ -0,0 +1,12 @@
+struct A { };
+struct B { };
+
+A f(const B & b) {
+ return A();
+}
+
+template<>
+B f(const A & a) { // { dg-error "" }
+ return B();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash90.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash90.C
new file mode 100644
index 000000000..4cfc40822
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash90.C
@@ -0,0 +1,7 @@
+// PR c++/39750
+
+template < unsigned >
+struct A ;
+template < typename >
+struct B ;
+template < typename T , A < B < T > {}// { dg-error "initializer|parse error|type|expected" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash91.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash91.C
new file mode 100644
index 000000000..39575cd9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash91.C
@@ -0,0 +1,8 @@
+// PR c++/28293
+
+template<int> void foo();
+
+struct A
+{
+ typedef void foo<0>(); // { dg-error "explicit template argument list not allowed" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash92.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash92.C
new file mode 100644
index 000000000..1153ef619
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash92.C
@@ -0,0 +1,7 @@
+// PR c++/42055
+
+template<typename T> void foo(T, T); // { dg-message "candidates|template" }
+
+template<typename T> void foo(T, int); // { dg-message "template" }
+
+template void foo(int, int); // { dg-error "ambiguous template specialization" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash93.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash93.C
new file mode 100644
index 000000000..696a04a07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash93.C
@@ -0,0 +1,12 @@
+// PR c++/40371
+
+struct A
+{
+ typedef void (&F)();
+ template<int> operator F();
+};
+
+void foo()
+{
+ A()(); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash94.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash94.C
new file mode 100644
index 000000000..810aed0a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash94.C
@@ -0,0 +1,28 @@
+// Origin: PR c++/42697
+// { dg-do compile }
+
+template<class Value_t>
+class fparser
+{
+ template<bool Option>
+ void eval2(Value_t r[2]);
+public:
+ void evaltest();
+};
+
+template<>
+template<bool Option>
+void fparser<int>::eval2(int r[2])
+{
+ struct ObjType {};
+}
+
+
+template<class Value_t>
+void fparser<Value_t>::evaltest
+ ()
+{
+ eval2<false>(0);
+}
+
+template class fparser<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash95.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash95.C
new file mode 100644
index 000000000..f60e635ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash95.C
@@ -0,0 +1,11 @@
+// PR c++/43705
+
+template < typename > struct S
+{
+ template < > struct S < int > // { dg-error "explicit|specialization|template|parameter" }
+ {
+ S(int);
+ };
+};
+
+S < int > s(0); // { dg-error "no matching" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash96.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash96.C
new file mode 100644
index 000000000..5c2aa9954
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash96.C
@@ -0,0 +1,6 @@
+// PR c++/40406
+
+template<int> struct A
+{
+ template<int> template<int> void A::foo() {} // { dg-error "extra qualification" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C
new file mode 100644
index 000000000..3d177f4e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C
@@ -0,0 +1,14 @@
+// PR c++/34272
+
+template<typename> struct A {};
+
+template<typename> struct A<int> // { dg-error "not used|template\\-parameter" }
+{
+ template<int> void foo();
+};
+
+void bar()
+{
+ A<int> a; // { dg-error "incomplete type" }
+ a.foo<0>(); // { dg-error "expected" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C
new file mode 100644
index 000000000..a79ab02f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C
@@ -0,0 +1,14 @@
+// PR c++/43630
+
+template < typename > struct A;
+
+template < typename > struct A < int > // { dg-error "not used|template\\-parameter|declaration" }
+{
+ int i;
+ int f ();
+};
+
+int A < int >::f () // { dg-error "incomplete type" }
+{
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash99.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash99.C
new file mode 100644
index 000000000..606d3e304
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash99.C
@@ -0,0 +1,10 @@
+// PR c++/34491
+
+template<typename> struct A;
+
+template<0> struct A<int> // { dg-error "expected|template|anonymous" }
+{
+ static const int i = 0;
+};
+
+int n = A<int>::i; // { dg-error "incomplete type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor1.C
new file mode 100644
index 000000000..81caa1fb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor1.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5132. ICE on struct constructors in templates.
+
+// snippets from bits/huge_val.h
+
+#define __HUGE_VAL_bytes { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }
+#define __huge_val_t union { unsigned char __c[8]; double __d; }
+#define HUGE_VAL (__extension__ \
+ ((__huge_val_t) { __c: __HUGE_VAL_bytes }).__d)
+
+void foo( const int&) {
+ HUGE_VAL; // no problem here
+}
+
+template <class F>
+void Tfoo( const F&) {
+ HUGE_VAL; // g++ fails here
+}
+
+template <typename T> struct M { T m; };
+
+void Foo ()
+{
+ Tfoo (1.2f);
+ (__extension__ ((M<int>) {m:3}));
+ (__extension__ ((M<short> []) {{m:3}}));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor2.C
new file mode 100644
index 000000000..1c8d8a65d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor2.C
@@ -0,0 +1,18 @@
+// { dg-do run }
+
+int i;
+
+template <class T>
+struct S
+{
+ S () { i = 1; }
+};
+
+static S<int> s[1];
+
+int main ()
+{
+ if (!i)
+ return 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor3.C
new file mode 100644
index 000000000..d3eb2c3f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor3.C
@@ -0,0 +1,19 @@
+struct A {};
+struct B;
+
+template <class TP> struct X: virtual A {
+ template <class TP2> X(TP2* ptr) {}
+ template <class TP2> X(const X<TP2>) {}
+};
+
+struct Y : X<B> {
+ Y(A* a) : X<B>(a) {}
+};
+
+void func1(X<B>);
+
+void func2() {
+ A a;
+ Y y(&a);
+ func1(X<A>(&a));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor4.C
new file mode 100644
index 000000000..18ed628ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor4.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Jun 2004 <nathan@codesourcery.com>
+
+// Origin Rani Sharoni via giovannibajo@libero.it
+// Bug 16174, SFINAE failure.
+
+template <class T> struct K
+{
+ K();
+
+ K(K<T> & rhs);
+ K(K<T> const& rhs);
+ template <class U> K(K<U> const& rhs);
+
+private:
+ template <class U> struct A;
+ template <class U> struct A< K<U> const>
+ { typedef typename K<U>::compile_time_error type; };
+
+ // This is used to reject calls to the copy constructor
+ // with objects which are top-level const. If they are
+ // const, the specialization of A is instantiated and
+ // causes a compile time error. Otherwise, the general
+ // template is picked up, it misses definition, so this
+ // ctor declaration is rejected by SFINAE and everybody
+ // is happy.
+ // GCC 3.4.1pre and 3.5.0 always matches A's specialization
+ // when instantiating from foo(), and this causes the error.
+ template <class U>
+ K(U& rhs, typename A<U>::type = 0);
+};
+
+
+K<int> foo(void)
+{
+ return K<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor5.C
new file mode 100644
index 000000000..047543cf8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor5.C
@@ -0,0 +1,8 @@
+// PR c++/24278
+
+template<typename T> struct A
+{
+ A() : T(0) {} // { dg-error "base" }
+};
+
+A<int*> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor6.C
new file mode 100644
index 000000000..4f21dc9eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor6.C
@@ -0,0 +1,11 @@
+// PR c++/25663
+
+template<int> struct A
+{
+ A(int);
+};
+
+void foo()
+{
+ A<0>(A<0>(0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor7.C
new file mode 100644
index 000000000..ee65172fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor7.C
@@ -0,0 +1,19 @@
+// PR c++/27640
+
+template < class T > struct refcounted :
+virtual T
+{
+ template < class A1 > refcounted (const A1 & a1) : T () { }
+};
+struct nfsserv {};
+template < class T >
+void
+sfsserver_cache_alloc (int *ns)
+{
+ new refcounted < nfsserv > (*ns);
+}
+void
+usage ()
+{
+ sfsserver_cache_alloc < int > ( 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor8.C
new file mode 100644
index 000000000..859bded41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor8.C
@@ -0,0 +1,11 @@
+// PR c++/28711
+// { dg-do compile }
+// { dg-options "" }
+
+template<int> struct A
+{
+ int x[1][1];
+ A() : x((int[1][]){{0}}) {} // { dg-error "except the first" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor9.C
new file mode 100644
index 000000000..819ca1c94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ctor9.C
@@ -0,0 +1,9 @@
+// PR c++/9050, DR 147, 318
+
+struct Y
+{
+ template <typename T> Y (T);
+ template <typename T> void foo (T);
+};
+
+template <> Y::Y<int> (int) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/current-inst1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/current-inst1.C
new file mode 100644
index 000000000..8f42ef844
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/current-inst1.C
@@ -0,0 +1,19 @@
+// PR c++/53549
+
+template<typename T>
+struct C2
+{
+ int operator()();
+
+ template<int> struct F2;
+};
+
+
+template<typename T>
+template<int I>
+struct C2<T>::F2 : C2<T>
+{
+ using C2<T>::operator();
+};
+
+C2<int>::F2<42> f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/debug1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/debug1.C
new file mode 100644
index 000000000..a2c157702
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/debug1.C
@@ -0,0 +1,18 @@
+// PR c++/40274
+// { dg-options "-g" }
+
+template <class T> struct valuelist_types
+{
+ struct null { };
+ template <T V, class next=null> struct list { };
+};
+
+template <unsigned D> void foo()
+{
+ typename valuelist_types<unsigned>::template list<D> v;
+}
+
+void bar()
+{
+ valuelist_types<unsigned>::list<2> v;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/decl1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/decl1.C
new file mode 100644
index 000000000..50eef0866
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/decl1.C
@@ -0,0 +1,16 @@
+// PR c++/3882
+// Verify that variable initialization can be
+// self-referencing inside a template function.
+
+int foo(int);
+
+template <typename T>
+void bar(const T&)
+{
+ int i = foo(i);
+}
+
+void quus()
+{
+ bar(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/decl2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/decl2.C
new file mode 100644
index 000000000..3a77777bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/decl2.C
@@ -0,0 +1,13 @@
+// PR c++/16162
+
+template <int N> struct O {
+ struct I {
+ template <typename T> struct II {
+ void f();
+ };
+ };
+};
+
+template <int N>
+template <typename T>
+void O<N>::I::II<T>::f () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/decl3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/decl3.C
new file mode 100644
index 000000000..7f9385076
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/decl3.C
@@ -0,0 +1,8 @@
+// c++/32560
+
+namespace N {}
+
+template<typename> struct A
+{
+ int A<typename N::X>; // { dg-error "namespace|argument|before" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/deduce1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce1.C
new file mode 100644
index 000000000..262c4fe86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce1.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Sep 2002 <nathan@codesourcery.com>
+
+template <typename T> int Foo (T const *)
+{
+ return 1;
+}
+template <typename T> int Foo (T const &)
+{
+ return 2;
+}
+template <typename T, __SIZE_TYPE__ I> int Foo (T const (&ref)[I])
+{
+ return 0;
+}
+
+int main ()
+{
+ static int array[4] = {};
+
+ return Foo (array);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce2.C
new file mode 100644
index 000000000..bcf77b30b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce2.C
@@ -0,0 +1,30 @@
+template <typename T0> struct tuple {
+ typedef tuple<int> tail;
+};
+
+template <> struct tuple<int> {
+};
+
+template <typename L>
+struct length {
+ static const int i = length<typename tuple<L>::tail>::i;
+};
+
+template<>
+struct length<tuple<int> > {
+ static const int i = 1;
+};
+
+template <int> struct M {};
+
+template <typename A>
+M<length<tuple<A> >::i > foo (A*);
+
+template <typename A>
+M<length<tuple<A> >::i> foo (const A*);
+
+const int i1 = 3;
+
+void bar() {
+ foo (&i1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/deduce3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce3.C
new file mode 100644
index 000000000..72c7e207a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/deduce3.C
@@ -0,0 +1,11 @@
+template <typename T>
+void f(int, T (*)() = 0); // { dg-message "note" "note" }
+
+void g() {
+ typedef int A[2];
+ f<A>(0); // { dg-error "" }
+ // { dg-error "returning an array" "returning an array" { target *-*-* } 2 }
+ typedef void F();
+ f<F>(0); // { dg-error "" }
+ // { dg-error "returning a function" "returning a function" { target *-*-* } 2 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg1.C
new file mode 100644
index 000000000..1b0e4a24a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg1.C
@@ -0,0 +1,7 @@
+struct Outer {
+ template <int I, int J=I> struct Inner {};
+};
+
+void f() {
+ Outer::Inner<2> i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg10.C
new file mode 100644
index 000000000..281b10868
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg10.C
@@ -0,0 +1,13 @@
+// PR c++/28363
+// { dg-do compile }
+
+template<typename T, template<int> class = T> // { dg-error "invalid use of type" }
+struct A;
+
+typedef int I;
+template<template<int> class = I> // { dg-error "invalid use of type" }
+struct B;
+
+struct S;
+template<template<int> class = S> // { dg-error "invalid use of type" }
+struct C;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg11.C
new file mode 100644
index 000000000..00c4e658d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg11.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// We used to reject this code as the extension
+// for default arguments being accepted as less the
+// needed template arguments.
+
+
+template<typename> struct match { };
+
+template<template<typename> class t,typename T>
+struct match<t<T> > { typedef int type; };
+
+template<template<typename,typename> class t,typename T0,typename T1>
+struct match<t<T0,T1> > { typedef int type; };
+
+template<typename,typename =void> struct other { };
+
+typedef match<other<void,void> >::type type;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg12.C
new file mode 100644
index 000000000..7131501e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg12.C
@@ -0,0 +1,10 @@
+// PR c++/35828
+// { dg-do compile { target c++11 } }
+
+template < typename > struct A ;
+template < template < typename > class = A >
+void test ()
+{
+ test ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg13.C
new file mode 100644
index 000000000..1d515343e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg13.C
@@ -0,0 +1,19 @@
+// PR c++/14912
+// Bug: We were instantiating A<B> in order to compare it to the matching
+// argument for C<B,B>, which fails.
+
+template <class T>
+struct A
+{
+ typedef typename T::F F;
+};
+
+struct B { };
+
+template <class T, class U = typename A<T>::F >
+struct C
+{
+ typename T::F f; // { dg-error "no type" }
+};
+
+C<B, B> c; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg14.C
new file mode 100644
index 000000000..352ccc415
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg14.C
@@ -0,0 +1,13 @@
+// PR c++/46129
+// The default argument for A<int>::B::operator() should not be required
+
+template <class T>
+struct A {
+ struct B {
+ void operator () (const T& d_ = f(T()) ) { }
+ };
+};
+
+int main() {
+ A<int>::B b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg15.C
new file mode 100644
index 000000000..fea3deee7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg15.C
@@ -0,0 +1,19 @@
+// PR c++/54198
+
+template <typename T> void
+refIfNotNull (T* p1)
+{
+ p1->ref;
+}
+template <typename T> struct A
+{
+ A (T* p1)
+ {
+ refIfNotNull (p1);
+ }
+};
+class B;
+class C
+{
+ void getParent (A <B> = 0);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg16.C
new file mode 100644
index 000000000..ba78bfbd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg16.C
@@ -0,0 +1,28 @@
+// PR c++/55127
+
+struct some_class
+{
+ static const bool is_valid_type = true;
+};
+
+template< typename Type
+ , bool Valid = Type::is_valid_type
+>
+struct wrapper;
+
+template< typename Type >
+struct wrapper< Type, true >
+{
+ typedef Type type;
+};
+
+template< typename T >
+void fun()
+{
+ wrapper<some_class>::type x;
+}
+
+int main()
+{
+ fun<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg17.C
new file mode 100644
index 000000000..38d68d456
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg17.C
@@ -0,0 +1,9 @@
+// PR c++/60185
+
+template<int> struct A
+{
+ int i; // { dg-message "" }
+ A() { void foo(int=i); } // { dg-error "" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg2.C
new file mode 100644
index 000000000..3670389c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg2.C
@@ -0,0 +1,10 @@
+struct X {
+ X ();
+};
+
+template <int> struct O {
+ struct I {
+ I (const X & = X());
+ };
+};
+template struct O<2>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg3.C
new file mode 100644
index 000000000..da91cb7b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg3.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 11596
+
+template <int V, bool F = V < 1> struct A { enum { value }; };
+template <int V> struct B { enum { value = A<1>::value }; };
+int ary[!B<1>::value ? 1 : -1];
+
+template <int V, bool F = V < 1> struct A1 { enum { value = 1}; };
+template <int V> struct A1<V,false> { enum { value}; };
+template <int V> struct B1 { enum { value = A1<1>::value }; };
+
+int ary1[!B1<1>::value ? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg4.C
new file mode 100644
index 000000000..293538adb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg4.C
@@ -0,0 +1,14 @@
+// PR c++/14763
+
+struct A {
+ int get() const {}
+ static A *foo();
+};
+
+template<bool> struct S {
+ S(unsigned int = A::foo()->get()) ;
+};
+
+void foo() throw() {
+ S<false> f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg5.C
new file mode 100644
index 000000000..b43637416
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg5.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/17344: Substitution failure is not an error
+// for default template argument
+
+template <class> struct intTraits;
+
+template<> struct intTraits<int> {
+ static const int i = 0;
+};
+
+template<typename E, E i = intTraits<E>::i> struct A {};
+
+struct S {
+ template <template <typename> class X> S(X<void>);
+};
+
+int bar(S);
+int bar(A<int,0>);
+
+A<int> bed;
+int i = bar(bed);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg6.C
new file mode 100644
index 000000000..15848a136
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg6.C
@@ -0,0 +1,27 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Oct 2005 <nathan@codesourcery.com>
+
+// PR 21353 missing error.
+// Origin:Andrew Pinski <pinskia@gcc.gnu.org>
+
+enum X{ a, b, c };
+
+struct C
+{
+ static void func (X &ref = a); // { dg-error "" }
+};
+
+template <typename T>
+struct D
+{
+ static void func (X &ref = a); // not an error at this point
+};
+
+void Foo (X & obj)
+{
+ D<int>::func (obj);
+
+ D<int>::func (); // { dg-error "" }
+}
+
+// { dg-prune-output "passing argument" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg7.C
new file mode 100644
index 000000000..77506d402
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg7.C
@@ -0,0 +1,7 @@
+// PR c++/25337
+
+template <typename T> T& MakeT();
+template <typename U, int N = sizeof (MakeT<U>().operator[](0))>
+struct helper{};
+template <typename U>
+static char is_here(helper<U>*);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg8.C
new file mode 100644
index 000000000..61d819c7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg8.C
@@ -0,0 +1,19 @@
+// PR c++/27094
+// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+
+struct A
+{
+ ~A();
+};
+
+struct B : A
+{
+ B();
+};
+
+template<int> struct C
+{
+ C(const B& = B());
+};
+
+C<0> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/defarg9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg9.C
new file mode 100644
index 000000000..de7528f61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/defarg9.C
@@ -0,0 +1,16 @@
+// PR c++/28048
+
+template<typename T> struct Boom;
+
+template<typename T, bool D = Boom<T>::Internal::Value> // <--ICE
+ struct Foo
+ {
+ };
+
+template<typename T> struct Boom
+{
+ struct Internal
+ {
+ static const bool Value = false;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/delete1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/delete1.C
new file mode 100644
index 000000000..fc5327074
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/delete1.C
@@ -0,0 +1,14 @@
+// PR c++/15890
+
+template < typename T >
+void operator delete ( void* raw ) { // { dg-error "" }
+ delete raw;
+}
+
+class A { };
+
+int main() {
+ A* a = new A;
+ delete a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/delete2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/delete2.C
new file mode 100644
index 000000000..b6ab380c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/delete2.C
@@ -0,0 +1,26 @@
+// PR c++/58119
+
+template <class T>
+struct A
+{
+ operator T*();
+ template <class U>
+ operator A<U>();
+};
+
+template <class T>
+struct B
+{
+ operator T*();
+ template <class U>
+ operator A<U>*();
+};
+
+int main()
+{
+ A<int> a;
+ delete a;
+
+ B<int> b;
+ delete b; // { dg-error "template|delete" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-args1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-args1.C
new file mode 100644
index 000000000..a540e55f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-args1.C
@@ -0,0 +1,13 @@
+// PR c++/27582
+// { dg-do compile }
+
+struct A
+{
+ template<int> void foo();
+};
+
+template<int N, void (A::*)() = &A::foo<N> > struct B {};
+
+B<int> b; // { dg-error "type/value mismatch|expected a constant|invalid type" }
+
+// { dg-prune-output "could not convert" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr1.C
new file mode 100644
index 000000000..79649861b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr1.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Jun 2003 <nathan@codesourcery.com>
+
+// PR c++ 9779. ICE
+
+struct I
+{
+};
+
+void Foo (int);
+namespace std
+{
+ template <typename X>
+ void Baz (I *x)
+ {
+ Foo (sizeof (I));
+ Foo (sizeof (x));
+ Foo (__alignof__ (I));
+ Foo (__alignof__ (x));
+ Foo (x->~I ()); // { dg-error "" }
+ // Foo (typeid (I));
+ Foo (delete x); // { dg-error "" }
+ Foo (delete[] x); // { dg-error "" }
+ Foo (throw x); // { dg-error "" }
+ }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr2.C
new file mode 100644
index 000000000..06f056b41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr2.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Aug 2003 <nathan@codesourcery.com>
+
+// PR 11704. ICE
+
+struct A
+{
+ int foo()
+ {
+ return 5;
+ }
+};
+
+template <class T> // If B is not template it works
+struct B
+{
+ bool bar(A& a)
+ {
+ return a.foo == 0; // { dg-error "" "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr3.C
new file mode 100644
index 000000000..bf14c49b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr3.C
@@ -0,0 +1,15 @@
+// { dg-options -std=c++98 }
+// { dg-do compile }
+// Origin: jbrandmeyer at users dot sourceforge dot net
+// PR c++/12573: COMPONENT_REFs must be inspected for dependness.
+
+template <bool> struct S;
+
+template <typename K> struct Y : K {
+ int x;
+};
+
+template <class T> struct Z {
+ S< (bool)(&static_cast<Y<T> *>(0)->x == 0) > // { dg-error "" }
+ s;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr4.C
new file mode 100644
index 000000000..b36c8729b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr4.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// Origin: jbrandmeyer at users dot sourceforge dot net
+// PR c++/12573: COMPONENT_REFs must be inspected for dependness.
+// Or, more specifically OFFSETOF.
+
+template <bool> struct S;
+
+template <typename K> struct Y {
+ int x;
+};
+
+template <class T> struct Z {
+ S< (bool)(__builtin_offsetof (Y<T>*, x) == 0) >
+ s;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr5.C
new file mode 100644
index 000000000..af0dfb912
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr5.C
@@ -0,0 +1,130 @@
+// { dg-do compile }
+
+// Copyright 2005 Free Software Foundation
+// contributed by Alexandre Oliva <aoliva@redhat.com>
+// inspired in the failure reported in Red Hat bugzilla #168260.
+
+template<class F> void bind(F f) {} // { dg-message "note" }
+
+template<class F> void bindm(F f) {} // { dg-message "note" }
+template<class F, class T> void bindm(F (T::*f)(void)) {} // { dg-message "note" }
+
+template<class F> void bindn(F f) {}
+template<class F, class T> void bindn(F (*f)(T)) {}
+
+template<class F> void bindb(F f) {}
+template<class F, class T> void bindb(F (*f)(T)) {} // { dg-message "note" }
+template<class F, class T> void bindb(F (T::*f)(void)) {} // { dg-message "note" }
+
+struct foo {
+ static int baist;
+ int bait; // { dg-error "non-static data member" }
+ void barf ();
+ static void barf (int);
+
+ struct bar {
+ static int baikst;
+ int baikt;
+ void bark ();
+ static void bark (int);
+
+ bar() {
+ bind (&baist);
+ bind (&foo::baist);
+ bind (&bait); // { dg-error "from this location" }
+ bind (&foo::bait);
+
+ bind (&baikst);
+ bind (&bar::baikst);
+ bind (&baikt); // ok, this->baikt
+ bind (&bar::baikt);
+
+ bind (&barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 42 }
+ bind (&foo::barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 44 }
+
+ bindm (&barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 47 }
+ bindm (&foo::barf);
+
+ bindn (&barf);
+ bindn (&foo::barf);
+
+ bindb (&barf);
+ bindb (&foo::barf); // { dg-error "ambiguous" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 55 }
+
+ bind (&bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 58 }
+ bind (&bar::bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 60 }
+
+ bindm (&bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 63 }
+ bindm (&bar::bark);
+
+ bindn (&bark);
+ bindn (&bar::bark);
+
+ bindb (&bark);
+ bindb (&bar::bark); // { dg-error "ambiguous" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 71 }
+ }
+ };
+
+ template <typename T>
+ struct barT {
+ static int baikst;
+ int baikt;
+ void bark ();
+ static void bark (int);
+
+ barT() {
+ bind (&baist);
+ bind (&foo::baist);
+ bind (&bait); // { dg-error "from this location" }
+ bind (&foo::bait);
+
+ bind (&baikst);
+ bind (&barT::baikst);
+ bind (&baikt); // ok, this->baikt
+ bind (&barT::baikt);
+
+ bind (&barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 94 }
+ bind (&foo::barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 96 }
+
+ bindm (&barf); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 99 }
+ bindm (&foo::barf);
+
+ bindn (&barf);
+ bindn (&foo::barf);
+
+ bindb (&barf);
+ bindb (&foo::barf); // { dg-error "ambiguous" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 107 }
+
+ bind (&bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 110 }
+ bind (&barT::bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 112 }
+
+ bindm (&bark); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 115 }
+ bindm (&barT::bark);
+
+ bindn (&bark);
+ bindn (&barT::bark);
+
+ bindb (&bark);
+ bindb (&barT::bark); // { dg-error "ambiguous" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 123 }
+ }
+ };
+
+ bar bard;
+ barT<void> bart;
+} bad;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr6.C
new file mode 100644
index 000000000..423f1aeec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr6.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright 2007 Free Software Foundation
+// Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+// PR C++ 34081 ICE
+
+class Foo;
+
+template < class Foo > class Bar
+{
+ enum Status
+ { OK, NO };
+
+ enum Status getStatus ()
+ {
+ return status;
+ }
+
+ Status status;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr7.C
new file mode 100644
index 000000000..b24682035
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr7.C
@@ -0,0 +1,22 @@
+// Origin PR c++/48574
+// { dg-do compile }
+
+struct A
+{
+ virtual void foo();
+};
+
+template <typename T>
+void
+bar(T x)
+{
+ A &b = *x;
+ b.foo ();
+}
+
+void
+foo()
+{
+ A a;
+ bar(&a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr8.C
new file mode 100644
index 000000000..33fb51deb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-expr8.C
@@ -0,0 +1,24 @@
+// Origin PR c++/48574
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ virtual int foo();
+};
+
+void baz (int);
+
+template <typename T>
+void
+bar(T x)
+{
+ A &b = *x;
+ baz (b.foo ());
+}
+
+void
+foo()
+{
+ A a;
+ bar(&a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name1.C
new file mode 100644
index 000000000..60ab34498
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/10347: Dependent type checking of array new expression
+
+void bar (int *);
+
+template <int> void foo() {
+ bar(new int[1]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name2.C
new file mode 100644
index 000000000..9e0cbcee1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name2.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Aug 2003 <nathan@codesourcery.com>
+
+// PR 10530. Thought a type was dependent.
+
+template <typename T>
+struct Foo {
+ struct Inner {
+ typedef int type;
+ };
+};
+
+template <typename A> struct Bar {
+ typedef typename Foo<int>::Inner::type type;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name3.C
new file mode 100644
index 000000000..bbe6fb662
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name3.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Dependent arrays of invalid size generate appropriate error messages
+
+template<int I> struct A
+{
+ static const int zero = 0;
+ static const int minus_one = -1;
+};
+
+template<int N> struct B
+{
+ int x[A<N>::zero]; // { dg-error "zero" }
+ int y[A<N>::minus_one]; // { dg-error "negative" }
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name4.C
new file mode 100644
index 000000000..b2b5814be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name4.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Dependent arrays of invalid size cause template instantiation failure.
+
+// We'll get an error message (duplicate matching templates) if the first
+// pattern is incorrectly allowed to match.
+
+template<int M> void foobar (int (*) [M] = 0 );
+template<int M> void foobar ( );
+
+void fn (void)
+{
+ foobar<0>();
+ foobar<-1>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name5.C
new file mode 100644
index 000000000..681060c70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name5.C
@@ -0,0 +1,45 @@
+// PR c++/9634, c++/29469, c++/29607
+// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR224: Make sure that a name is *truly* semantically dependent.
+
+struct D {
+ typedef int K;
+};
+
+template <typename T>
+struct A
+{
+ typedef int Bar;
+
+ template <typename>
+ struct N {};
+
+ typedef Bar type1;
+ typedef A::Bar type2;
+ typedef A<T>::Bar type3;
+ typedef A<T*>::Bar type4; // { dg-error "" }
+ typedef typename A<T*>::Bar type5;
+
+ typedef N<int> type6;
+ typedef A::N<int> type7;
+ typedef A<T>::N<int> type8;
+ typedef A<T*>::template N<int> type9; // { dg-error "" }
+ typedef typename A<T*>::template N<int> type10;
+
+ typedef D Bar2;
+ struct N2 { typedef int K; };
+
+ // Check that A::N2 is still considered dependent (because it
+ // could be specialized), while A::Bar2 (being just ::D) is not.
+ typedef A::Bar2 type11;
+ typedef type11::K k3;
+
+ typedef A::N2 type12;
+ typedef typename type12::K k2;
+ typedef type12::K k1; // { dg-error "" }
+
+ // Check that A::Bar2 is not considered dependent even if we use
+ // the typename keyword.
+ typedef typename A::Bar2 type13;
+ typedef type13::K k4;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name6.C
new file mode 100644
index 000000000..e08bbe1aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dependent-name6.C
@@ -0,0 +1,17 @@
+// PR c++/26261
+// { dg-final { scan-assembler "_ZN1YIiE1fIiEE1XILi1EEv" } }
+
+template <int dim> class X {};
+
+template <class T> struct Y {
+ static const unsigned int dim = 1;
+ template <class U> X<Y<T>::dim> f();
+};
+
+template <class T> template <class U>
+X<Y<T>::dim> Y<T>::f() { return X<dim>(); }
+
+int main()
+{
+ Y<int>().f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dr408.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dr408.C
new file mode 100644
index 000000000..d118ce45c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dr408.C
@@ -0,0 +1,45 @@
+// DR 408
+// { dg-do link }
+
+// Test that a size given in the out-of-class definition isn't used until
+// instantiation time.
+template<typename T>
+struct X
+{
+ static char s[];
+ int c;
+};
+
+template<typename T>
+char X<T>::s[sizeof(X<T>)];
+
+#define sassert(EXP) int ar[(EXP)?1:-1]
+sassert(sizeof (X<char>::s) == sizeof (int));
+
+// Test that a specialization can have a different size.
+
+template <int> void g();
+template <> void g<2>() { }
+
+template <typename T>
+struct S {
+ static int i[];
+ void f();
+};
+
+template <typename T>
+int S<T>::i[] = { 1 };
+
+template <typename T>
+void S<T>::f() {
+ g<sizeof (i) / sizeof (int)>();
+}
+
+template <>
+int S<int>::i[] = { 1, 2 };
+
+int main()
+{
+ S<int> s;
+ s.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor1.C
new file mode 100644
index 000000000..f5d9d6aad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor1.C
@@ -0,0 +1,8 @@
+struct A {};
+
+template <typename T> struct B
+{
+ B() { A().A::~A(); }
+};
+
+B<void> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor2.C
new file mode 100644
index 000000000..04bea9cb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor2.C
@@ -0,0 +1,10 @@
+struct Foo
+{
+ template <int i>
+ ~Foo() {} // { dg-error "" }
+};
+
+int main()
+{
+ Foo f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor3.C
new file mode 100644
index 000000000..98c2ef6c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor3.C
@@ -0,0 +1,4 @@
+// PR c++/19762
+
+template<int> struct A { ~A(){} }; // { dg-error "" }
+template A<>::~A(); // { dg-error "template|declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor4.C
new file mode 100644
index 000000000..4f277b248
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor4.C
@@ -0,0 +1,9 @@
+// PR c++/19440
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// { dg-do compile }
+
+template<int> struct A
+{
+ ~A<0>(); // { dg-error "parse error|declaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor5.C
new file mode 100644
index 000000000..8fa4eeb6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor5.C
@@ -0,0 +1,21 @@
+// PR c++/23287
+
+template <class T> struct A
+{
+ int i;
+ ~A();
+};
+
+template <class T> void f(A<T> *ap) {
+ ap->~A();
+}
+
+template <class T> void g(A<T> *ap) {
+ ap->~B(); // { dg-error "destructor name" }
+}
+
+int main()
+{
+ f(new A<int>);
+ g(new A<int>);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor6.C
new file mode 100644
index 000000000..c44b78029
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor6.C
@@ -0,0 +1,16 @@
+// PR c++/40139
+
+template<int> struct A
+{
+ static int i;
+};
+
+template<int N> int A<N>::i = { A::~A }; // { dg-error "non-static member function" }
+
+template class A<0>;
+
+struct X { };
+
+int i1 = X::~X; // { dg-error "non-static member function" }
+int i2 = &X::~X; // { dg-error "address of destructor" }
+int i3 = &A<0>::~A; // { dg-error "address of destructor" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor7.C
new file mode 100644
index 000000000..a96332047
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor7.C
@@ -0,0 +1,22 @@
+// PR c++/40373
+// { dg-do compile }
+
+struct A;
+namespace
+{
+ struct A;
+}
+
+struct B {};
+
+template <typename T> void
+foo (T t)
+{
+ t.~A (); // { dg-error "does not match destructor name" }
+}
+
+void
+bar ()
+{
+ foo (B ()); // { dg-bogus "required from here" "" { xfail *-*-* } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor8.C
new file mode 100644
index 000000000..a96b7982f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor8.C
@@ -0,0 +1,23 @@
+// PR c++/43648
+
+namespace dealii
+{
+ namespace FEValuesViews
+ {
+ template <int dim, int spacedim> struct Scalar {};
+ }
+
+ template <int dim, int spacedim>
+ struct X
+ {
+ FEValuesViews::Scalar<dim,spacedim> scalars[dim*spacedim];
+
+ void f()
+ {
+ typedef dealii::FEValuesViews::Scalar<dim,spacedim> ScalarView;
+ scalars[0].ScalarView::~ScalarView ();
+ }
+ };
+
+ template struct X<2,2>;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/dtor9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor9.C
new file mode 100644
index 000000000..fd71389b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/dtor9.C
@@ -0,0 +1,12 @@
+// PR c++/60347
+
+struct A;
+
+template <class T>
+struct B
+{
+ T* p;
+ virtual ~B() { p->~T(); }
+};
+
+struct C: B<A> { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/duplicate1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/duplicate1.C
new file mode 100644
index 000000000..c9cdab4b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/duplicate1.C
@@ -0,0 +1,7 @@
+//PR c++/19439
+
+template<int> struct A
+{
+ ~A() {} // { dg-error "with" }
+ ~A() {} // { dg-error "cannot be overloaded" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/eh1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/eh1.C
new file mode 100644
index 000000000..134a0e7a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/eh1.C
@@ -0,0 +1,6 @@
+template <class T>
+void foo()
+{
+ try {}
+ catch(T e) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/eh2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/eh2.C
new file mode 100644
index 000000000..9559b4ecc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/eh2.C
@@ -0,0 +1,10 @@
+// PR c++/23191
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> struct A
+{
+ void foo() throw(typename T::X); // { dg-error "not a class" }
+};
+
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/elab1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/elab1.C
new file mode 100644
index 000000000..778150f06
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/elab1.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Elaborate type specifier of class template
+
+template <class T> class A {
+ class B;
+};
+
+template <class T> class A<T>::B {
+ friend class A;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum1.C
new file mode 100644
index 000000000..eaeb12c9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum1.C
@@ -0,0 +1,5 @@
+// PR c++/15554
+
+template <int n> struct T1 { enum { N = 3 }; };
+template <int n> struct T2 { enum { N = 3, N1 = T1<N>::N }; };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum2.C
new file mode 100644
index 000000000..7a6c2072a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum2.C
@@ -0,0 +1,4 @@
+// PR c++/15877
+
+template <int n> struct T1 { enum { N = 3 }; };
+template <int n> struct T2 { enum { N = n, N1 = T1<N>::N }; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum3.C
new file mode 100644
index 000000000..b248d788c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum3.C
@@ -0,0 +1,8 @@
+// PR c++/17327
+
+enum E { E0, E1 };
+template <class T,class U> class A {};
+template <class T> void f(A<E,T>) {}
+// We used to issue a "sorry" message. By using an explicit error
+// message below, we make sure that we will not match "sorry".
+template void f(A<int,E>); // { dg-error "template-id" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum4.C
new file mode 100644
index 000000000..97e0b848d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum4.C
@@ -0,0 +1,9 @@
+// PR c++/18020
+
+template <typename> struct bar {
+ enum {
+ e1 = 1,
+ e2 = ~e1
+ };
+};
+template struct bar<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum5.C
new file mode 100644
index 000000000..b7a49f45d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum5.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: robertk@mathematik.uni-freiburg.de
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/14479: Template header check for enum
+
+template <int dim>
+struct X {
+ enum { dimension = dim };
+ template<int d> void bar ();
+};
+
+template <>
+template <>
+void X<0>::bar<0> () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum6.C
new file mode 100644
index 000000000..9df6d4106
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum6.C
@@ -0,0 +1,10 @@
+// PR c++/34774
+
+template<int shifts>
+struct shift {
+ enum {
+ n0 = (unsigned)shifts,
+ n = n0 ? 0 : n0,
+ n_comp = -n
+ } x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum7.C
new file mode 100644
index 000000000..8c464a795
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum7.C
@@ -0,0 +1,8 @@
+// PR c++/53524
+
+template <class T> struct A { enum EA { ea }; };
+template <class T, class U> struct B {
+ enum EB { eb1 = A<T>::ea, eb2 = A<U>::ea, eb3 = 0 ? eb1 : eb2 };
+};
+
+B<int,char> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/enum8.C
new file mode 100644
index 000000000..314100f61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/enum8.C
@@ -0,0 +1,7 @@
+// PR c++/47482
+
+template<class>
+struct K
+{
+ enum { A = sizeof"A", B = +A };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery1.C
new file mode 100644
index 000000000..ef9dc141b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery1.C
@@ -0,0 +1,9 @@
+// PR c++/43076
+
+struct S;
+template < typename > struct T
+{
+ template < typename >
+ template < bool > struct T < S > // { dg-error "" }
+ {
+ void f () { // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery2.C
new file mode 100644
index 000000000..d5ce12311
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery2.C
@@ -0,0 +1,7 @@
+// PR c++/43621
+
+template <typename T>
+class A {
+ template <typename>
+ A<T> A<T>::f(); // { dg-error "extra qualification" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery3.C
new file mode 100644
index 000000000..f8fd94b9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error-recovery3.C
@@ -0,0 +1,8 @@
+// PR c++/48212
+
+template < bool > void
+foo ()
+{
+ const bool b =; // { dg-error "" }
+ foo < b > (); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error1.C
new file mode 100644
index 000000000..03a832392
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Jun 2003 <nathan@codesourcery.com>
+
+// PR c++ 10219. ICE
+
+template <class T> void make_pair(T x);
+
+void foo(){
+ struct fps_chan_ID fps; // { dg-error "incomplete" "" }
+ make_pair(fps); // { dg-bogus "no matching function" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error10.C
new file mode 100644
index 000000000..02ea64b79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error10.C
@@ -0,0 +1,71 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+// Origin: <tilps at hotmail dot com>
+// c++/9154: poor error message for ">>" vs "> >" in template argument list
+
+
+/*
+ * Test that the error message is issued properly
+ */
+template <class T>
+class A {};
+
+A<A<int>> blah; // { dg-error "should be '> >' within" }
+A<int>> blah2; // { dg-error "spurious '>>'" }
+
+
+/*
+ * Test that a few valid constructs containing a ">>" token in a
+ * template argument list are handled correctly.
+ */
+template <int N>
+void B(void) {}
+
+int Btest()
+{
+ B<256 >> 4>();
+}
+
+template <int N = 123>>4>
+struct C {};
+
+template <int> struct D {};
+template <typename> struct E {};
+
+E<D< 1>>2 > > E1;
+
+const int x = 0;
+E<D< 1>>x > > E2;
+
+template <int> struct F {
+ typedef int I;
+};
+
+template <typename T = F< 1>>2 >::I>
+struct G {};
+
+/*
+ * In this special case, a valid type-id (H() is a function type) is followed
+ * by '>>', but the argument should still be parsed as an expression, which
+ * will then be rejected as non-constant expression.
+ */
+struct H
+{
+ int operator >>(int);
+};
+
+template <int V> struct L {};
+L<H() >> 5> l; // { dg-error "" "non-constant" }
+
+
+/*
+ * This case used to not emit the nice error message because of a typo
+ * in the code.
+ */
+template <void (*)(void)>
+struct K {};
+
+void KFunc(void);
+
+A<K<&KFunc>> k1; // { dg-error "" }
+K<&KFunc>> k2; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error11.C
new file mode 100644
index 000000000..3a469fd1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error11.C
@@ -0,0 +1,4 @@
+// PR c++/12132
+
+inline template <int> void foo () {} // { dg-error "<" }
+void abort (); // { dg-error ";" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error12.C
new file mode 100644
index 000000000..c15961fc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error12.C
@@ -0,0 +1,4 @@
+// PR c++/15044
+
+template class <num_t> class a { num_t n; } // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error13.C
new file mode 100644
index 000000000..13d8794d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error13.C
@@ -0,0 +1,5 @@
+// PR c++/15227
+
+template<typename> struct A {};
+
+template<typename T> void A<T>::B::foo() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error14.C
new file mode 100644
index 000000000..c5043cfb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error14.C
@@ -0,0 +1,8 @@
+// PR c++/16904
+
+template<typename T> struct X
+{
+ X() { this->T::i; } // { dg-error "" }
+};
+
+X<int> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error15.C
new file mode 100644
index 000000000..b7c7bc8ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error15.C
@@ -0,0 +1,24 @@
+// PR c++/16929
+
+template <class T>
+class A {
+ int x;
+};
+
+template <class T>
+class B {
+protected:
+
+ A<T> a; // { dg-error "" }
+
+ void f(const A<T> * a1 = &a); // { dg-error "this location" }
+
+ void g(void);
+};
+
+template <class T>
+void B<T>::g(void) {
+ f(); // { dg-error "default argument" }
+}
+
+template class B<long>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error16.C
new file mode 100644
index 000000000..0da024bc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error16.C
@@ -0,0 +1,16 @@
+// PR c++/18674
+
+template <typename I>
+static void g() {
+ enum I::t a; // { dg-error "" }
+ (void) a;
+}
+
+struct B {
+ typedef int t;
+};
+
+void h()
+{
+ g<B>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error17.C
new file mode 100644
index 000000000..10c8b824a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error17.C
@@ -0,0 +1,9 @@
+// PR c++/20153
+
+template <typename T>
+void
+foo()
+{
+ union { struct { }; }; // { dg-error "prohibits anonymous struct" "anon" }
+ // { dg-error "not inside" "not inside" { target *-*-* } 7 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error18.C
new file mode 100644
index 000000000..7b7151a3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error18.C
@@ -0,0 +1,11 @@
+// PR c++/20157
+
+template<typename AT>
+struct A{
+ template<typename T>
+ void function(T);
+};
+
+template<>
+template<typename ABC,typename DEF>
+void A<int>::function(ABC); // { dg-error "match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error19.C
new file mode 100644
index 000000000..d533e9a3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error19.C
@@ -0,0 +1,22 @@
+// PR c++/23293
+
+template < typename > struct P;
+struct S;
+
+void *unrelated_function()
+{
+ typedef S K;
+ P < K > * p;
+ return p;
+}
+
+template < typename U >
+void generate_warning()
+{
+ U::x(); // { dg-error "P<S>" }
+}
+
+int main()
+{
+ generate_warning< P < S > >();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error2.C
new file mode 100644
index 000000000..be5ab1d45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error2.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Aug 2003 <nathan@codesourcery.com>
+
+// required from did not indicate the nested class
+
+template<class T> struct X
+{
+ T m; // { dg-error "void" "void" }
+ // { dg-error "incomplete type" "incomplete" { target *-*-* } 10 }
+};
+
+template<class T >
+struct Derived
+{
+ class Nested : public X<T> // { dg-message "required" "" }
+ {
+ };
+
+ Nested m; // { dg-message "required" "" }
+
+ void Foo ();
+};
+
+void Foo (Derived<void> &x)
+{
+ x.Foo (); // { dg-message "required" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error20.C
new file mode 100644
index 000000000..f81378fdb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error20.C
@@ -0,0 +1,4 @@
+// PR c++/25439
+
+template<int> struct A;
+template<> int A<0>; // { dg-error "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error21.C
new file mode 100644
index 000000000..c5f04f03e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error21.C
@@ -0,0 +1,15 @@
+// PR c++/20173
+
+template<typename AT>
+struct A{
+ template<typename T>
+ void function(T){}
+};
+
+template<>
+template<typename T>
+void A<int>::function(T){}
+
+template<>
+template<typename T>
+void A<double>::function(T*){} // { dg-error "match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error22.C
new file mode 100644
index 000000000..d793fe4df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error22.C
@@ -0,0 +1,9 @@
+//PR c++/27821
+
+struct A
+{
+ template<void (A::*)()> struct B {};
+ void ::foo(); // { dg-error "invalid use" }
+ B<&A::foo> b; // { dg-error "incomplete type|template argument" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error23.C
new file mode 100644
index 000000000..f21d8d9d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error23.C
@@ -0,0 +1,17 @@
+// PR c++/29632
+
+struct nullptr_type {
+
+ nullptr_type ( void ) {}
+
+ template < typename T >
+ operator T* ( void ) const {
+ return ( 0 );
+ }
+} const nullptr_ob;
+
+int main ( void ) {
+ 0 == nullptr_ob; // { dg-error "match" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error24.C
new file mode 100644
index 000000000..9ce5cbbc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error24.C
@@ -0,0 +1,8 @@
+// PR c++/30863
+
+template <typename T>
+struct s {};
+
+void f() {
+ unsigned s<int> x; // { dg-error "invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error25.C
new file mode 100644
index 000000000..89011576e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error25.C
@@ -0,0 +1,16 @@
+// PR c++/31923
+
+template<class T>
+static void f1 ();
+
+template<>
+static void f1<void> (); // { dg-error "explicit template specialization cannot have a storage class" }
+
+template<class T>
+extern void f2 ();
+
+template<>
+extern void f2<void> (); // { dg-error "explicit template specialization cannot have a storage class" }
+
+export template<class T> // { dg-warning "keyword 'export' not implemented" }
+static void* f3 ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error26.C
new file mode 100644
index 000000000..cd8d46d1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error26.C
@@ -0,0 +1,5 @@
+// PR c++/32112
+
+template<typename> struct A;
+
+template<typename T> void foo (A<&T::template i>); // { dg-error "T:: ?template i|mismatch|& T::i" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error27.C
new file mode 100644
index 000000000..8d41d0248
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error27.C
@@ -0,0 +1,5 @@
+// PR c++/27211
+
+struct A {};
+
+template<int> void A::foo() {} // { dg-error "member function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error28.C
new file mode 100644
index 000000000..e87d542d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error28.C
@@ -0,0 +1,5 @@
+// PR c++/27211
+
+struct A {};
+
+template<int> void A::foo(); // { dg-error "member function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error29.C
new file mode 100644
index 000000000..2e2291d7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error29.C
@@ -0,0 +1,5 @@
+// PR c++/33209
+
+template<typename T> void foo(int, T::x); // { dg-error "T::x" }
+
+template<template<typename> class T> void foo2(int, T<int>::x); // { dg-error "T<int>::x" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error3.C
new file mode 100644
index 000000000..d3ee59908
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error3.C
@@ -0,0 +1,5 @@
+// PR 12762
+
+template <typename> struct A { A() {}};
+typedef A<int> Ac;
+Ac<double> a; // { dg-error "template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error30.C
new file mode 100644
index 000000000..e1138d052
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error30.C
@@ -0,0 +1,5 @@
+// PR c++/33210
+
+template<int> struct A;
+
+template<template<typename> class B> A<B<int>::x> operator() (); // { dg-error "A<B<int>::x>" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error31.C
new file mode 100644
index 000000000..4fd702623
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error31.C
@@ -0,0 +1,3 @@
+// PR c++/33493
+
+template<int> void foo() { delete 0 ? 1 : 0; } // { dg-error "delete 0" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error32.C
new file mode 100644
index 000000000..be3c3a084
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error32.C
@@ -0,0 +1,8 @@
+// PR c++/33843
+
+struct A {};
+
+void foo(A* p())
+{
+ p->A::~A(); // { dg-error "A::~A" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error33.C
new file mode 100644
index 000000000..b6a2a8ae8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error33.C
@@ -0,0 +1,12 @@
+// PR c++/24791
+
+template<int> struct A
+{
+ static int i;
+ A() { ++i; }
+};
+
+template<int> int A<0>::i(0); // { dg-error "template" "error" }
+// { dg-message "note" "note" { target *-*-* } 9 }
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error34.C
new file mode 100644
index 000000000..d0cbcaef2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error34.C
@@ -0,0 +1,29 @@
+// PR c++/33842
+// { dg-do compile }
+
+template<typename T> struct A
+{
+ A<__builtin_offsetof(T, x)>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\)" }
+};
+
+template<typename T> struct B
+{
+ B<__builtin_offsetof(T, x.y)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\)" }
+};
+
+template<typename T> struct C
+{
+ C<__builtin_offsetof(T, x[6])>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\\[6\\\]\\)" }
+};
+
+template<typename T> struct D
+{
+ D<__builtin_offsetof(T, x.y[6].z)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\\[6\\\].z\\)" }
+};
+
+struct E { int x; };
+
+template<typename T> struct F
+{
+ F<__builtin_offsetof(E, x)>(); // { dg-error "type/value mismatch|offsetof\\(E, x\\)" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error35.C
new file mode 100644
index 000000000..d52e59931
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error35.C
@@ -0,0 +1,3 @@
+// PR c++/33494
+
+template<int> void foo(int(*f=0)()); // { dg-error "declared void|scope|erroneous-expression" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error36.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error36.C
new file mode 100644
index 000000000..b16b976e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error36.C
@@ -0,0 +1,9 @@
+// PR c++/37719.C
+
+template <typename T>
+class foo {
+ void bar() throw(int); // { dg-error "throw \\(int\\)" }
+};
+
+template <>
+void foo<int>::bar() throw(float) {} // { dg-error "throw \\(float\\)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error37.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error37.C
new file mode 100644
index 000000000..7f1f9ed78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error37.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// PR C++/29388
+// We used to ICE in is_ancestor because we would use int as the context of foo
+// but that is invalid.
+
+template<int> struct A
+{
+ typedef int T;
+ void foo();
+};
+
+template<int N> void A<N>::T::foo() {} // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error38.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error38.C
new file mode 100644
index 000000000..14a213299
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error38.C
@@ -0,0 +1,43 @@
+// Testcase for printing typename/typedef bindings as well as template args
+// in diagnostics (PR c++/25185)
+
+template <class T>
+struct A {
+ typename T::type f(); // { dg-message "typename T::type = void*" }
+ void f(int i = 0); // { dg-message "" }
+
+ typedef typename T::type mytype;
+ mytype g(); // { dg-message "mytype = void*" }
+ void g(int i = 0); // { dg-message "" }
+};
+
+struct B
+{
+ typedef void* type;
+};
+
+// Also make sure that deduced template arguments get canonicalized.
+
+template <class T>
+void f (T &t); // { dg-message "T = int" }
+
+template <class T>
+void f (T &t, int = 0); // { dg-message "" }
+
+typedef int myint;
+myint i;
+myint *p;
+
+int main()
+{
+ A<B> a;
+ a.f(); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 34 }
+ a.g(); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 36 }
+
+ f(i); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 39 }
+ f(p); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 41 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error39.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error39.C
new file mode 100644
index 000000000..49faa3654
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error39.C
@@ -0,0 +1,11 @@
+// PR c++/14912
+
+template <class T, int N=0, int X=1>
+struct A
+{
+};
+
+void foo(void)
+{
+ A<void> a = 0; // { dg-error "A<void>" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error4.C
new file mode 100644
index 000000000..12942fcb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error4.C
@@ -0,0 +1,9 @@
+template<class T> struct C1
+{
+ template<class U> struct C2
+ { class Type { }; };
+};
+
+template<class T, class U>
+void foo(typename C1<T>::C2<U>::Type *) { } // { dg-error "template" "error " }
+// { dg-message "note" "note" { target *-*-* } 8 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error40.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error40.C
new file mode 100644
index 000000000..7746ed2ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error40.C
@@ -0,0 +1,32 @@
+// { dg-options "-fno-pretty-templates" }
+
+template <class T, int N=0, int X=1>
+struct A
+{
+ struct AN;
+};
+
+void foo(void)
+{
+ A<void> a = 0; // { dg-error "A<void, 0, 1>" }
+}
+
+template <class T> T f(T); // { dg-message "int f<int>.int." }
+template <class T> T f(T, int = 0); // { dg-message "" }
+
+template <class T>
+struct B
+{
+ typedef typename T::AN BN;
+
+ BN f(); // { dg-message "AN" }
+ BN f(int = 0); // { dg-message "" }
+};
+
+int main()
+{
+ f(1); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 28 }
+ B<A<int> >().f(); // { dg-error "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 30 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error41.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error41.C
new file mode 100644
index 000000000..c92b8497a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error41.C
@@ -0,0 +1,12 @@
+// PR c++/40370
+// { dg-do compile }
+
+struct A
+{
+ static int i;
+};
+
+template <int> struct B
+{
+ int x[A::i]; // { dg-error "array bound is not an integer constant" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error42.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error42.C
new file mode 100644
index 000000000..0d651e316
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error42.C
@@ -0,0 +1,20 @@
+// PR c++/40372
+// { dg-do compile }
+
+template <int> struct A
+{
+ int i; // { dg-error "invalid use of non-static data member" }
+ friend void foo ()
+ {
+ int x[i]; // { dg-error "from this location" }
+ }
+};
+
+struct B
+{
+ int j; // { dg-error "invalid use of non-static data member" }
+ friend int bar ()
+ {
+ return j; // { dg-error "from this location" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error43.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error43.C
new file mode 100644
index 000000000..03f29d1f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error43.C
@@ -0,0 +1,9 @@
+// PR c++/29363
+
+template<int> void foo()
+{
+ throw A(); // { dg-message "declar" }
+ struct A {} a;
+}
+
+template void foo<0>(); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error44.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error44.C
new file mode 100644
index 000000000..51053b2d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error44.C
@@ -0,0 +1,7 @@
+// PR c++/32056
+
+template <auto int T> struct A {}; // { dg-error "storage class specified|two or more" }
+template <extern int T> struct B {}; // { dg-error "storage class specified" }
+template <static int T> struct C {}; // { dg-error "storage class specified" }
+template <register int T> struct D {}; // { dg-error "storage class specified" }
+template <mutable int T> struct E {}; // { dg-error "storage class specified" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error45.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error45.C
new file mode 100644
index 000000000..064554dfe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error45.C
@@ -0,0 +1,22 @@
+// PR c++/47125
+
+template < bool, typename >
+struct enable_if {};
+
+template < typename T >
+struct enable_if< true, T >
+{
+ typedef T type;
+};
+
+template < typename T >
+struct enable_if< true, T >::type
+f( T x ); // { dg-error "not a class type" }
+
+void
+g( void )
+{
+ f< int >( 0 ); // { dg-error "no match" }
+}
+
+// { dg-prune-output "note" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error46.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error46.C
new file mode 100644
index 000000000..6cb085a18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error46.C
@@ -0,0 +1,11 @@
+// PR c++/51230
+
+template<int> struct A {};
+
+template<int N> void foo(A<N>, A<N>); // { dg-message "template" }
+
+void bar()
+{
+ foo(A<0>(), A<1>()); // { dg-error "no matching" }
+}
+// { dg-message "candidate|parameter 'N' ('0' and '1')" "" { target *-*-* } 9 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error47.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error47.C
new file mode 100644
index 000000000..74a598922
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error47.C
@@ -0,0 +1,9 @@
+// PR c++/51367
+
+template<typename T> void foo(T, T); // { dg-message "template" }
+
+void bar(void* p)
+{
+ foo(0, p); // { dg-error "no matching" }
+}
+// { dg-message "candidate|parameter 'T' ('int' and 'void*')" "" { target *-*-* } 7 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error48.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error48.C
new file mode 100644
index 000000000..483f7b54c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error48.C
@@ -0,0 +1,15 @@
+// PR c++/54416
+
+template < typename T > struct foo;
+template <> struct foo < int >;
+template < typename T > struct bar
+{
+ template <> struct foo < int > // { dg-error "non-namespace scope" }
+ {
+ void baz ();
+ };
+};
+void foo < int >::baz () { }
+
+// Don't be picky about error-recovery.
+// { dg-prune-output "." }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error49.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error49.C
new file mode 100644
index 000000000..57789a79a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error49.C
@@ -0,0 +1,10 @@
+// PR c++/40405
+
+template<int, int> struct A
+{
+ static int i;
+};
+
+template<int> int A<0,0>::i = 0; // { dg-error "" }
+
+int j = A<0,0>::i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error5.C
new file mode 100644
index 000000000..72d3c29b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error5.C
@@ -0,0 +1,6 @@
+template <typename T>
+struct X<T*> { // { dg-error "not a class template" }
+ typedef int Y;
+};
+
+extern struct Z<int> s; // { dg-error "not a class template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error50.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error50.C
new file mode 100644
index 000000000..d8702f888
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error50.C
@@ -0,0 +1,19 @@
+// PR c++/57327
+
+template<class T>
+struct A {};
+
+template<class T>
+void f(A<T>&) {}
+
+struct B : A<long> {};
+
+struct C : A<char> {};
+
+struct D : B, C {};
+
+int main()
+{
+ D d;
+ f(d); // { dg-error "no matching" }
+} // { dg-message "'A<T>' is an ambiguous base" "" { target *-*-* } 18 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error51.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error51.C
new file mode 100644
index 000000000..b3a6cfb3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error51.C
@@ -0,0 +1,9 @@
+// PR c++/26572
+
+template<int> void foo()
+{
+ struct A; // { dg-error "declaration" }
+ struct B : A {}; // { dg-error "invalid use of incomplete" }
+}
+
+template void foo<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error52.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error52.C
new file mode 100644
index 000000000..3350c8e6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error52.C
@@ -0,0 +1,19 @@
+// PR c++/16128
+
+template<typename T>
+struct A {
+ };
+
+namespace H {
+ template<typename T>
+ struct B {};
+ }
+
+A a; // { dg-error "template" }
+H::B b; // { dg-error "template" }
+
+int main() {
+ A a; // { dg-error "template" }
+ H::B b; // { dg-error "template" }
+ return 0;
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error53.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error53.C
new file mode 100644
index 000000000..5976c868d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error53.C
@@ -0,0 +1,13 @@
+// PR c++/57638
+
+template<int x>
+struct S {};
+
+template<long long i>
+void g(S<i>);
+
+void f()
+{
+ S<1000> t;
+ g(t); // { dg-error "no matching" }
+} // { dg-message "mismatched types 'long long int' and 'int'" "" { target *-*-* } 12 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error54.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error54.C
new file mode 100644
index 000000000..2933bb5ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error54.C
@@ -0,0 +1,10 @@
+// PR c++/56380
+
+template <typename T>
+struct X {
+ X();
+ mutable T x; // { dg-error "cannot be declared" }
+};
+
+X<const int> a; // { dg-message "required from here" }
+X<int&> b; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error6.C
new file mode 100644
index 000000000..7560dcfb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error6.C
@@ -0,0 +1,13 @@
+template<int n>
+struct tento {
+ enum {value = 10*tento<n-1>::value};
+};
+
+struct tento<0> { // { dg-error "" }
+ enum {value=1};
+};
+
+int main() {
+ if (tento<4>::value != 10000) return -1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error7.C
new file mode 100644
index 000000000..3c1a0e1f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error7.C
@@ -0,0 +1,6 @@
+// PR c++/13314
+// { dg-options "-O2" }
+
+struct A { template <int> struct B; };
+struct A::B {}; // { dg-error "" }
+A::B<0> b; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error8.C
new file mode 100644
index 000000000..30872a2e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error8.C
@@ -0,0 +1,7 @@
+// PR c++/11116
+
+template <typename T> struct S {};
+
+void f() {
+ throw S (); // { dg-error "template" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/error9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/error9.C
new file mode 100644
index 000000000..60f550a7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/error9.C
@@ -0,0 +1,7 @@
+// PR c++/10926
+
+struct Foo
+{
+ template <int i>
+ ~Foo(); // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args1.C
new file mode 100644
index 000000000..10d59e157
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args1.C
@@ -0,0 +1,21 @@
+// PR c++/34950
+
+template <class T = int> struct policy {
+ typedef int unnecessary;
+};
+
+template <class Policy> struct A {
+ typedef int type;
+ typedef typename Policy::unnecessary unused;
+};
+
+template <class T> struct S {
+ typedef int type;
+ typedef typename A<T>::type unused;
+};
+
+template <class, class T> typename S<T>::type foo();
+template <class> S<policy<> >::type foo();
+
+template <typename T> int def(T);
+const int i = def(foo<int>);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args2.C
new file mode 100644
index 000000000..3b5537bad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args2.C
@@ -0,0 +1,44 @@
+// PR c++/37177
+// { dg-do compile { target c++11 } }
+
+#include <typeinfo>
+
+namespace N1
+{
+ template<class T> bool foo();
+}
+
+struct S
+{
+ template <class T>
+ static bool foo();
+
+ template <class T>
+ bool bar();
+};
+
+template<class T> bool foo();
+
+int main()
+{
+ (void)(&S::bar<int>);
+ decltype(&S::bar<int>) a;
+ typeid(&S::bar<int>);
+
+ (void*)(&S::foo<int>);
+ (void)(&S::foo<int>);
+ decltype(&S::foo<int>) b;
+ typeid(&S::foo<int>);
+
+ (void*)(&N1::foo<int>);
+ (void)(&N1::foo<int>);
+ decltype(&N1::foo<int>) c;
+ typeid(&N1::foo<int>);
+
+ (void*)(&foo<int>);
+ (void)(&foo<int>);
+ decltype(&foo<int>) d;
+ typeid(&foo<int>);
+
+ &foo<int> == 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args3.C
new file mode 100644
index 000000000..c095e6688
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args3.C
@@ -0,0 +1,12 @@
+// PR c++/37177
+
+template <class T>
+struct A { };
+
+template <class T>
+void operator+(T, T); // { dg-error "class or enum" }
+
+int main()
+{
+ operator+<int>; // { dg-error "cannot resolve" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args4.C
new file mode 100644
index 000000000..c64a085ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args4.C
@@ -0,0 +1,14 @@
+// PR c++/48883
+// { dg-do link }
+
+template<typename T>
+T myMax(T a, T b) {
+ if(a < b) return a;
+ return b;
+}
+
+int main() {
+ bool even = true;
+ int (*fp)(int, int);
+ fp = even ? myMax<int> : myMax<int>; /* yields link error */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args5.C
new file mode 100644
index 000000000..d6c9a575f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-args5.C
@@ -0,0 +1,24 @@
+// PR c++/51613
+
+template<typename F, typename T>
+void apply(F f, T t)
+{
+ f(t);
+}
+
+template<typename T>
+void multi(T)
+{
+}
+
+template<typename T>
+void multi(T*)
+{
+}
+
+int main()
+{
+ apply(&multi<int>, 7); // { dg-error "no match" }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation.C
new file mode 100644
index 000000000..67e44c49f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation.C
@@ -0,0 +1,16 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Origin: Jens.Maurer@gmx.net
+// { dg-do compile }
+
+// Fixed: PR 3381
+
+namespace N
+{
+ template<class T>
+ class A { };
+}
+
+template class ::N::A<int>;
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation2.C
new file mode 100644
index 000000000..21109a765
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation2.C
@@ -0,0 +1,6 @@
+// Bug 10968: implicit instantiation overrides explicit instantiation
+// { dg-final { scan-assembler "_Z1fIiET_S0_" } }
+
+template <class T> T f (T t) { return t; }
+inline void g () { f (4); }
+template int f (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation3.C
new file mode 100644
index 000000000..fac092e6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit-instantiation3.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// Origin: <sebor at roguewave dot com>
+// c++/8266: Explicit instantiation of a template outside its namespace is
+// broken
+
+namespace N
+{
+ template <class T> T foo (T)
+ { return T (); }
+
+ struct A
+ {
+ template <int N>
+ struct B {};
+ };
+
+ template <int M>
+ struct C {};
+
+ template double foo(double);
+ template float foo<float>(float);
+ template struct A::B<0>;
+ template struct C<0>;
+}
+
+template int N::foo(int);
+template char N::foo<char>(char);
+template struct N::A::B<1>;
+template struct N::C<1>;
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit1.C
new file mode 100644
index 000000000..64f581e58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit1.C
@@ -0,0 +1,17 @@
+// { dg-do link }
+// { dg-options "-fno-implicit-templates" }
+
+template <class T> struct C {
+ ~C();
+};
+template <class T> C<T>::~C() {}
+
+struct X {
+ C<X> *p;
+ ~X() { delete p; }
+};
+
+template class C<X>;
+C<X> x;
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit2.C
new file mode 100644
index 000000000..79941cd8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit2.C
@@ -0,0 +1,10 @@
+struct X {
+ template <class B> void foo(B);
+};
+
+template <class D>
+void bar() {
+ X().foo<D>(1);
+}
+
+template void bar<int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit3.C
new file mode 100644
index 000000000..49d0689a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com>
+
+// Failed to spot specialization using a template-id expr
+
+template <int n> class A {};
+template <int m> class R {};
+
+template <int n, int x> struct Trait { enum {m = n}; };
+
+template <int n, int x> R<Trait<n,x>::m> f(A<x>);
+template <> R<Trait<1,1>::m> f<1>(A<1>) {return R<1>();}
+
+void Baz ()
+{
+ R<Trait<1,1>::m> (*ptr) (A<1>);
+
+ ptr = &f<1>;
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit4.C
new file mode 100644
index 000000000..3953f8fc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit4.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com>
+
+// Failed to spot specialization using a template-id expr
+
+template <typename n> class A {};
+template <int m> class R {};
+
+template <int n, int x> struct Trait { enum {m = n}; };
+
+template <typename n, typename x> R<Trait<1,1>::m> f(A<x>);
+template <> R<Trait<1,1>::m> f<int>(A<int>) {return R<1>();}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit5.C
new file mode 100644
index 000000000..a0e313354
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit5.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com>
+
+// Failed to spot specialization using a template-id expr
+
+template <typename n> class A {};
+template <int m> class R {};
+
+template <typename n, typename x> struct Trait { enum {m = sizeof (n)}; };
+
+template <typename n, typename x> R<Trait<n,x>::m> f(A<x>);
+template <> R<Trait<char,char>::m> f<char>(A<char>) {return R<1>();}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit6.C
new file mode 100644
index 000000000..f740269bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit6.C
@@ -0,0 +1,8 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 19895: ICE on invalid
+
+struct A;
+template A<>::A(); // { dg-error "(not a template)|(explicit qualification)" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit7.C
new file mode 100644
index 000000000..742467718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit7.C
@@ -0,0 +1,13 @@
+// PR c++/22263
+// { dg-do link }
+
+template <class T> struct S { T foo (); T bar (); };
+template <class T> T S<T>::foo () { return bar (); }
+template struct S<int>;
+template <class T> T S<T>::bar () { return T (); }
+
+#if !__GXX_WEAK__
+template int S<int>::bar ();
+#endif
+
+int main () { return S<int>().foo (); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/explicit8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit8.C
new file mode 100644
index 000000000..4b92dbe39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/explicit8.C
@@ -0,0 +1,13 @@
+namespace N {
+ template <typename T>
+ struct S {
+ void f() {}
+ };
+ namespace I {
+ template void S<double>::f(); // { dg-error "namespace" }
+ }
+}
+
+namespace K {
+ template void N::S<int>::f(); // { dg-error "namespace" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/expr1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/expr1.C
new file mode 100644
index 000000000..079865d4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/expr1.C
@@ -0,0 +1,8 @@
+// PR c++/18161
+// { dg-options "" }
+
+template <class T> struct Y;
+template <> struct Y<bool> {};
+
+template <typename T = typeof (1 == 1)> struct X { Y<T> a; };
+template struct X <>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/field1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/field1.C
new file mode 100644
index 000000000..c61437b28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/field1.C
@@ -0,0 +1,12 @@
+struct A {
+ void (*f)(void);
+};
+
+template< typename R >
+struct B : public A {
+ void g()
+ {
+ A::f();
+ }
+};
+template class B<bool>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr1.C
new file mode 100644
index 000000000..c0e7d9885
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr1.C
@@ -0,0 +1,5 @@
+// PR c++/48162
+
+struct A { };
+A (*f)();
+template <class T> void g() { f(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr2.C
new file mode 100644
index 000000000..742135a1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/fn-ptr2.C
@@ -0,0 +1,14 @@
+// PR c++/56095
+
+int *a(void) { return 0; }
+typedef void voidfn(void);
+template <voidfn* b> void z1(void) {}
+template <voidfn& b> void z2(void) {}
+
+int main()
+{
+ z1<(voidfn*)a>(); // { dg-error "" }
+ z1<reinterpret_cast<voidfn*>(a)>(); // { dg-error "" }
+ z2<(voidfn&)a>(); // { dg-error "" }
+ z2<reinterpret_cast<voidfn&>(a)>(); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/fnspec1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/fnspec1.C
new file mode 100644
index 000000000..5d5324475
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/fnspec1.C
@@ -0,0 +1,16 @@
+// PR c++/35146
+
+template <typename T> struct S {};
+
+template <typename R> struct ref;
+template <> struct ref<double> { typedef double result; };
+
+template <typename T>
+void foo(typename ref<T>::result, S<T>*);
+template <>
+void foo(S<double>, S<double>*); // { dg-error "does not match" }
+template <>
+void foo(double alpha, S<double>* x)
+{
+ alpha; x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/fntry1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/fntry1.C
new file mode 100644
index 000000000..494be5ab0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/fntry1.C
@@ -0,0 +1,43 @@
+// PR c++/26433
+// { dg-do link }
+
+int get_int()
+{
+ throw 1;
+
+ return 0;
+}
+
+template <class _T> class Test
+{
+public:
+ Test()
+ try
+ : i(get_int())
+ {
+ i++;
+ }
+ catch(...)
+ {
+ // Syntax error caused by undefined __FUNCTION__.
+ const char* ptr = __FUNCTION__;
+ }
+
+private:
+ int i;
+ _T t;
+};
+
+int main()
+{
+ try
+ {
+ Test<int> test;
+ }
+ catch(...)
+ {
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/fntype1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/fntype1.C
new file mode 100644
index 000000000..d7be273aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/fntype1.C
@@ -0,0 +1,26 @@
+bool f(int i) { return i != 5; }
+
+template <class X, class P = bool(X)>
+struct Traits
+{
+ typedef P type;
+};
+
+template <class X, class P = typename Traits<X>::type>
+struct S
+{
+ const P& p_;
+ S( const P& p ) : p_(p) {} // const reference
+};
+
+template <class X>
+S<X> make_s(const typename Traits<X>::type & p) // const reference
+{
+ return S<X>(p); // << HERE
+}
+
+
+int main()
+{
+ make_s<int>(f);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/for1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/for1.C
new file mode 100644
index 000000000..dc33afcda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/for1.C
@@ -0,0 +1,23 @@
+// PR c++/47388
+// { dg-do compile }
+// { dg-options "-fno-for-scope" }
+
+template <int>
+void
+foo ()
+{
+ int i;
+ for (i = 0; i < 16; i++)
+ ;
+ for (int j = 0; j < 16; j++)
+ ;
+ if (j != 16)
+ for (;;)
+ ;
+}
+
+void
+bar ()
+{
+ foo <0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend.C
new file mode 100644
index 000000000..e315a1a09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend.C
@@ -0,0 +1,30 @@
+// Contribued by Gabriel Dos Reis <gdr@codesourcery.com>
+// Origin: iskey@i100.ryd.student.liu.se
+
+class ostream;
+extern ostream& cout;
+
+template <class T> struct s;
+
+template <class T>
+ostream& operator<<(ostream &o, const typename s<T>::t &x) // { dg-message "note" }
+{
+ return o;
+}
+
+template <class T>
+struct s {
+ struct t
+ {
+ friend ostream&
+ operator<<<T>(ostream&, const typename s<T>::t &);
+ };
+ t x;
+};
+
+int main()
+{
+ s<int>::t y;
+ cout << y; // { dg-error "" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 28 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend10.C
new file mode 100644
index 000000000..cab5e346f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend10.C
@@ -0,0 +1,45 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com>
+
+// PR 5116. template instantiation can add a friend into a namespace,
+// and thus change overload resolution.
+
+#include <iostream>
+
+static int right;
+static int wrong;
+
+struct Buggy {};
+
+template <typename T>struct Handle
+{
+ Handle(T* p) {}
+
+ operator bool() const { wrong++; return true; }
+
+ friend std::ostream& operator<<(std::ostream& ostr, const Handle& r)
+ {
+ right++;
+
+ return ostr << "in operator<<(ostream&, const Handle&)";
+ }
+};
+
+typedef Handle<Buggy> Buggy_h;
+
+bool cmp (const Buggy_h& b1, const Buggy_h& b2)
+{
+ std::cout << b1 << " " << b2 << std::endl;
+ return false;
+}
+
+int main()
+{
+ Buggy o;
+
+ cmp (&o, &o);
+
+ return !(right == 2 && !wrong);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend11.C
new file mode 100644
index 000000000..343b52752
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend11.C
@@ -0,0 +1,18 @@
+/* PR c++/53 */
+/* { dg-do compile } */
+
+template <class T>
+struct A {
+ template <class U> class B;
+
+ // Did not compile with gcc-2.95.2 (linux i686) :-(
+ template <class S> template <class U> friend class A<S>::B;
+};
+
+template <class S> template <class U> class A<S>::B {
+};
+
+int main(){
+ A<double>::B<double> ab;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend12.C
new file mode 100644
index 000000000..0cd561b5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend12.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR 9030. Perform access checking to parameter and return type of
+// function template correctly when the template is friend.
+
+template <class T> class Outer {
+ private:
+ struct Inner {};
+
+ template <class T_>
+ friend typename Outer<T_>::Inner foo ();
+};
+
+template <class T>
+typename Outer<T>::Inner
+foo () {
+ return typename Outer<T>::Inner();
+}
+
+void f() {
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend13.C
new file mode 100644
index 000000000..6eebf6b95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend13.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Perform access checking to parameter and return type of
+// function template correctly when only specialization is friend.
+
+template <class T>
+typename T::Inner
+foo () {
+ return typename T::Inner();
+}
+
+class Outer {
+ private:
+ struct Inner {};
+
+ friend Outer::Inner foo<Outer> ();
+};
+
+void f() {
+ foo<Outer>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend14.C
new file mode 100644
index 000000000..6e07b9893
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend14.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// Perform access checking to parameter and return type of
+// function template correctly when the template is friend.
+
+template <class T> class O {
+ struct I { I (int); };
+
+ template <class T_>
+ friend typename O<T_>::I f ();
+};
+
+template <class T_>
+typename O<T_>::I f () { return 1; }
+
+struct X {
+ void g() { f<int>(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend15.C
new file mode 100644
index 000000000..4acbf2d1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend15.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9453
+// Access checking when template friend is defined in class.
+
+template <typename> class X {
+ private:
+ struct Inner;
+
+ template <typename R>
+ friend typename X<R>::Inner * foo () { return 0; }
+};
+template class X<void>;
+
+struct U {
+ void bar () { foo<void> (); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend16.C
new file mode 100644
index 000000000..3165ed2b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend16.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9602: Inline friend/pure virtual tree data sharing in
+// class template.
+
+template <typename T> struct X {
+ void foo (X);
+ friend void bar () {}
+};
+
+template <typename T>
+void X<T>::foo (X x) {}
+
+template struct X<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend17.C
new file mode 100644
index 000000000..50d602441
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend17.C
@@ -0,0 +1,12 @@
+template <class T>
+struct X {
+ template <class U> void operator+=(U);
+
+ template <class V>
+ template <class U>
+ friend void X<V>::operator+=(U);
+};
+
+int main() {
+ X<int>() += 1.0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend18.C
new file mode 100644
index 000000000..04ba26e98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend18.C
@@ -0,0 +1,19 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10158. implicit inline template friends ICE'd
+
+template <int N> struct X
+{
+ template <int M> friend int foo(X const &)
+ {
+ return N * 10000 + M;
+ }
+};
+X<1234> bring;
+
+int main() {
+ return foo<5678> (bring) != 12345678;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend19.C
new file mode 100644
index 000000000..73883b2a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend19.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Origin: Benjamin Li <benxbli@yahoo.com>
+
+// PR c++/11030: Template substitution of friend class that is
+// a specialization.
+
+template <int S>
+struct A
+{
+ void func(void);
+};
+
+template <class T>
+class C
+{
+ static void private_func(void) {}
+public:
+ friend class A<512>;
+};
+
+template <int S>
+void A<S>::func(void)
+{
+ C<void>::private_func();
+}
+
+template class A<512>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend20.C
new file mode 100644
index 000000000..496d52f5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend20.C
@@ -0,0 +1,15 @@
+template <class T>
+struct A
+{
+ friend void bar(A<T> a) {}
+};
+
+void bar(A<int>);
+
+int main()
+{
+ A<int> a;
+
+ bar(a);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend21.C
new file mode 100644
index 000000000..854ed67d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend21.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: ajl13@bellatlantic.net
+
+// PR c++/5421: ICE for specialization of member function template
+// as friend.
+
+struct B {
+ template <class T> void b();
+};
+
+template <class T> class A {
+ friend void B::b<T>();
+};
+
+static A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend22.C
new file mode 100644
index 000000000..41a73bbb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend22.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: Benoit Hudson <bh@techhouse.brown.edu>
+
+// PR c++/641: Duplicate friend diagnostics
+
+template <class T> class iterator { };
+template <class T> class item {
+ friend class iterator<T>;
+ friend class iterator<const T>;
+};
+
+class A { };
+
+item<const A> i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend23.C
new file mode 100644
index 000000000..96f8125b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend23.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+// Origin: Alexandre Tolmos <ktulu@free.fr>
+
+// PR c++/11876: Friend of its own class diagnostics
+
+template <typename T>
+class A
+{
+ friend class A<int>;
+ friend class A<float>;
+protected:
+ T _data;
+ inline A() : _data(0) {}
+ template <typename U>
+ inline A(const A<U>& r) : _data(r._data) {}
+};
+
+class B : public A<int>
+{
+public:
+ inline B() {}
+ inline B(const B& r) : A<int>(r) {}
+};
+
+class C : public A<float>
+{
+public:
+ inline C() {}
+ inline C(const B& r) : A<float>(r) {}
+};
+
+int main(int, char*[])
+{
+ B b1, b2(b1);
+ C c(b1);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend24.C
new file mode 100644
index 000000000..5db4d31e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend24.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/495: Fail to locate primary class template that is
+// injected by friend declaration.
+
+template <int N> struct X
+{
+ template <int dim> friend struct Y;
+};
+
+X<2> x;
+
+template <int dim> struct Y
+{
+ void f (Y);
+ void g (Y);
+};
+
+template <int dim> void Y<dim>::f (Y)
+{
+}
+
+template <int dim> void Y<dim>::g (Y<dim>)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend25.C
new file mode 100644
index 000000000..fa11defc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend25.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: Jiangbin Zhao <zhaojiangbin@yahoo.com>
+
+// PR c++/12369: ICE for specialization of member function template
+// as friend in ordinary class.
+
+struct A {
+ template<class T> T* make() { return new T(); }
+};
+
+struct B {
+ friend B* A::make< B >(); // (1)
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend26.C
new file mode 100644
index 000000000..3cf659df4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend26.C
@@ -0,0 +1,15 @@
+// PR c++/14359
+
+template<typename> struct A {};
+
+template<typename> struct B
+{
+ template<typename T> friend void foo(const A<T>& a, const B&) { a; }
+};
+
+void bar()
+{
+ A<void> a;
+ B<void> b;
+ foo(a,b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend27.C
new file mode 100644
index 000000000..6317da577
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend27.C
@@ -0,0 +1,22 @@
+// PR c++/15265
+
+enum Relation {equalOp};
+template<typename B>
+class A {
+public:
+ static
+ bool Relop(const A&, const A&, Relation);
+
+ friend
+ bool operator==(const A& a1, const A& a2) {
+ return Relop(a1, a2, equalOp);
+ }
+ B* b;
+};
+
+int main() {
+ A<int> a; a == a;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend28.C
new file mode 100644
index 000000000..a7d160d5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend28.C
@@ -0,0 +1,23 @@
+// PR c++/15629
+// { dg-do link }
+
+template<int a, int b> class T;
+
+template<int a, int b> void func(T<a, b> * t);
+template<int a> void func(T<a, 3> * t) {}
+template void func<2>(T<2, 3>*);
+
+template<int a, int b> struct T {
+ friend void func<a, b>(T<a, b> * t);
+ friend void func<a> (T<a, 3> * t);
+
+ void foo();
+};
+
+template<int a, int b> void T<a, b>::foo() {
+ func((T<2,3>*)0);
+}
+
+int main() {
+ T<2,3>().foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend29.C
new file mode 100644
index 000000000..1c0c6f0f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend29.C
@@ -0,0 +1,11 @@
+// PR c++/15701
+
+template<template<int> class T> struct A : T<0>
+{
+ void foo();
+ template<template<int> class U> friend void A<U>::foo();
+};
+
+template<int> struct B {};
+
+A<B> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend3.C
new file mode 100644
index 000000000..7400534ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend3.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com>
+
+// PR 775 friend classes with qualified names inside template classes.
+
+struct A
+{
+ struct B {
+ B () { }
+ };
+};
+
+template <class T>
+struct C: A {
+ friend A::B::B (); // 2.95.2 ICE
+ friend struct A;
+ friend struct A::B; // 2.97 error
+};
+
+template class C<char>;
+
+template <typename T> class TPL
+{
+ class nested;
+};
+
+template <typename T> class TPL<T>::nested
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend30.C
new file mode 100644
index 000000000..055fc8d89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend30.C
@@ -0,0 +1,15 @@
+// PR c++/14930
+
+template<typename T> class Point;
+
+template<> class Point<double> {
+ friend class Plane;
+ double v;
+};
+
+struct Plane {
+ double get(const Point<double>& p);
+};
+
+double Plane::get(const Point<double> &p) { return p.v; }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend31.C
new file mode 100644
index 000000000..5e60540b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend31.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+
+// PR c++/15410: Declaration of friend class template with wrong
+// template parameter.
+
+template <typename T, typename U> struct F; // { dg-message "previous declaration" }
+
+class W
+{
+ template<int i> friend class F; // { dg-error "template parameter" }
+ int x; // { dg-error "private" }
+};
+
+template <typename T, typename U> struct F
+{
+ void Look(W& w) { w.x = 3; } // { dg-error "within this context" }
+};
+
+int main()
+{
+ W w;
+ F<char, bool> f;
+ f.Look(w);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend32.C
new file mode 100644
index 000000000..d5b78e058
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend32.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Steven Bosscher <steven@gcc.gnu.org>
+// Serge Belyshev <belyshev@lubercy.com>
+
+// PR c++/18825: ICE member as friend
+
+template<class T> class A
+{
+ void f (); // { dg-error "private" }
+};
+
+template<class T> class B
+{
+ friend void A<T>::f (); // { dg-error "this context" }
+};
+
+int f ()
+{
+ B<int> b; // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend33.C
new file mode 100644
index 000000000..f1b5cb26a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend33.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// PR c++/18733: Validation of template headers in friends
+
+template<int> struct A
+{
+ void foo();
+};
+
+struct B
+{
+ friend void A<0>::foo();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend34.C
new file mode 100644
index 000000000..555cf358a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend34.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: mleone@pixar.com
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9783: Forward declaration of class in template.
+
+template <typename T>
+struct C {
+ void foo (struct X *);
+};
+
+struct X {};
+
+template <typename T>
+void C<T>::foo(struct X *) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend35.C
new file mode 100644
index 000000000..b150ccdab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend35.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/4403: Incorrect friend class chosen during instantiation.
+
+template <typename T>
+struct A
+{
+ struct F;
+};
+
+template <typename T>
+struct B : A<T>
+{
+ friend struct F;
+private:
+ int priv;
+};
+
+struct F
+{
+ void func(void)
+ {
+ B<int> b;
+ b.priv = 0;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend36.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend36.C
new file mode 100644
index 000000000..5f07db486
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend36.C
@@ -0,0 +1,10 @@
+// PR c++/22139
+// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+
+template <int rank, int dim> class Tensor;
+template <int rank, int dim> struct SymmetricTensor {
+ SymmetricTensor (const Tensor<2,dim> &t);
+ friend void foo();
+};
+template <> SymmetricTensor<2,2>::SymmetricTensor (const Tensor<2,2> &t) {}
+template <> SymmetricTensor<2,3>::SymmetricTensor (const Tensor<2,3> &t) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend37.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend37.C
new file mode 100644
index 000000000..7c8682906
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend37.C
@@ -0,0 +1,15 @@
+// PR c++/22147
+
+template<typename> struct A;
+
+template<typename T> void foo(A<T>* p) { *p; }
+
+template<typename> struct A
+{
+ friend void foo<class X>(A<X>*);
+};
+
+void bar()
+{
+ foo<int>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend38.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend38.C
new file mode 100644
index 000000000..41faf7911
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend38.C
@@ -0,0 +1,12 @@
+// PR c++/22352
+
+template <class A>
+class s
+{
+ typedef int d;
+ template <class s, typename s::d>
+ friend class t;
+};
+
+s<int> t1;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend39.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend39.C
new file mode 100644
index 000000000..9ebe226eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend39.C
@@ -0,0 +1,7 @@
+// PR c++/8355
+
+namespace Foo { template <typename T> void foo();}
+struct Bar
+{
+ friend void Foo::foo<int>();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend4.C
new file mode 100644
index 000000000..fabf3375b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend4.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@codesourcery.com>
+
+// PR 109, dependent member friends
+
+struct B
+{
+ static int foo ();
+ struct N
+ {
+ static int bar ();
+ };
+};
+
+
+template <class T>
+class A
+{
+ friend int T::foo ();
+ friend int T::N::bar ();
+
+ private:
+ static int m;
+};
+
+template <class T>
+class C
+{
+ friend struct T::N;
+
+ private:
+ static int m;
+};
+
+
+int B::foo ()
+{
+ return A<B>::m;
+}
+
+int B::N::bar ()
+{
+ return A<B>::m + C<B>::m;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend40.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend40.C
new file mode 100644
index 000000000..39dd994e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend40.C
@@ -0,0 +1,16 @@
+// PR c++/24173
+// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+
+template <int> struct A;
+
+void foo(A<0>);
+
+template<int> struct A
+{
+ friend void foo(A<0>);
+};
+
+void bar()
+{
+ foo(A<0>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend41.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend41.C
new file mode 100644
index 000000000..6d686019d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend41.C
@@ -0,0 +1,11 @@
+// PR c++/26912
+
+struct Foo {
+ template<class T> int func() const;
+};
+
+class Bar {
+ friend int Foo::func<int>() const;
+};
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend42.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend42.C
new file mode 100644
index 000000000..73d10df01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend42.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+template <class T> void foo (int);
+
+template <class T>
+class Q {
+ friend void foo<T> (int = 3); // { dg-error "default argument" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend43.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend43.C
new file mode 100644
index 000000000..edbed8420
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend43.C
@@ -0,0 +1,11 @@
+// PR c++/28111
+// { dg-do compile }
+
+template<typename> void foo();
+
+template<typename T> struct A
+{
+ friend void foo<>(typename T::X); // { dg-error "not a class" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend44.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend44.C
new file mode 100644
index 000000000..6ff4db3a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend44.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+//PR c++/28260
+
+template<int> struct A
+{
+ friend int foo(); // { dg-error "14:ambiguating new declaration" }
+};
+
+void foo() { A<0> a; } // { dg-message "6:old declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend45.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend45.C
new file mode 100644
index 000000000..61c365617
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend45.C
@@ -0,0 +1,17 @@
+// PR c++/28025
+
+class BaseSubmit
+{
+ template<class T> friend class PeriodicSubmit;
+};
+
+template<class ID>
+class ValuesSubmit
+{
+ template<class T> friend class PeriodicSubmit;
+};
+
+class A;
+class MultiSubmit : public ValuesSubmit<A>
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend46.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend46.C
new file mode 100644
index 000000000..17dc0db94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend46.C
@@ -0,0 +1,9 @@
+// PR c++/27714
+
+template<typename> struct A
+{
+ static void* operator new(__SIZE_TYPE__);
+ template <typename T> friend void* A<T>::operator new(__SIZE_TYPE__);
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend47.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend47.C
new file mode 100644
index 000000000..612173950
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend47.C
@@ -0,0 +1,11 @@
+// PR c++/19809
+
+template<int i>
+struct n{
+ friend void foo(){ } // { dg-error "defin" }
+};
+
+int main(){
+ n<1> n1;
+ n<2> n2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend48.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend48.C
new file mode 100644
index 000000000..604697dae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend48.C
@@ -0,0 +1,12 @@
+// PR c++/29020
+
+template<int> struct A
+{
+ void foo();
+};
+
+struct B
+{
+ template<int N> friend void A<N>::A::foo();
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend49.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend49.C
new file mode 100644
index 000000000..b4d717f57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend49.C
@@ -0,0 +1,18 @@
+// PR c++/29054
+// { dg-do compile }
+
+struct A
+{
+ template <typename T, typename U> static void create (U) {}
+};
+
+struct B
+{
+ friend void A::create <B, const char *> (const char *);
+};
+
+int
+main ()
+{
+ A::create<B>("test");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend5.C
new file mode 100644
index 000000000..1a63e71e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend5.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+namespace NS { template <typename number> class C; }
+
+template <typename T> class X {
+ template <typename N> friend class NS::C;
+};
+
+template class X<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend50.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend50.C
new file mode 100644
index 000000000..93c429ab1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend50.C
@@ -0,0 +1,9 @@
+// PR c++/34399
+template<int> struct X
+{
+ void foo();
+};
+
+struct Y {
+ template<long N> friend void X<N>::X::foo(); // { dg-error "declared as friend" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend51.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend51.C
new file mode 100644
index 000000000..d2d1ad799
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend51.C
@@ -0,0 +1,17 @@
+// PR c++/38392
+// { dg-do link }
+
+void Function();
+
+int main()
+{
+ Function();
+}
+
+template <typename T>
+struct Test
+{
+ friend void Function() { }
+};
+
+template class Test<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend52.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend52.C
new file mode 100644
index 000000000..d4fecd95e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend52.C
@@ -0,0 +1,17 @@
+// PR c++/50344
+// { dg-options "" }
+
+template <typename T> class C
+{
+ friend T;
+ int i;
+};
+
+struct S
+{
+ int f()
+ {
+ C<const S> c;
+ return c.i;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend53.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend53.C
new file mode 100644
index 000000000..6cbbb2b09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend53.C
@@ -0,0 +1,23 @@
+// PR c++/53403
+
+template <typename T>
+class Foo
+{
+ typedef void type;
+ template <typename U> friend void f();
+public:
+ Foo() {}
+};
+
+template class Foo<void>;
+
+template <typename T>
+void f()
+{
+ typedef Foo<void>::type type;
+}
+
+int main()
+{
+ f<void>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend54.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend54.C
new file mode 100644
index 000000000..ead7a72fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend54.C
@@ -0,0 +1,18 @@
+// PR c++/56642
+
+template <class T> struct A;
+
+template <class T>
+A<T> f(T*) { return A<T>(); }
+
+template <class T>
+struct A
+{
+ friend A f<T>(T*);
+};
+
+int main()
+{
+ int *p = 0;
+ f(p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend55.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend55.C
new file mode 100644
index 000000000..4abe6ce6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend55.C
@@ -0,0 +1,18 @@
+// PR c++/59956
+
+template <int I> struct A;
+template <int I> class B {
+ int i;
+ template <int A_S> friend void A<A_S>::impl();
+};
+
+B<0> b1;
+template<int I>struct A { void impl(); };
+B<1> b2;
+
+template<int I> void A<I>::impl() { ++b1.i; ++b2.i; }
+
+int main()
+{
+ A<0>().impl();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend6.C
new file mode 100644
index 000000000..e330d9818
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend6.C
@@ -0,0 +1,53 @@
+// { dg-do compile }
+
+namespace boost_no_member_template_friends{
+
+template <class T>
+class foobar;
+
+template <class T>
+class foo
+{
+private:
+ template<typename Y> friend class foobar;
+ template<typename Y> friend class foo;
+ template<typename Y> friend bool must_be_friend_proc(const foo<Y>& f);
+ int i;
+public:
+ foo(){ i = 0; }
+ template <class U>
+ foo(const foo<U>& f){ i = f.i; }
+};
+
+template <class T>
+class foo;
+
+template <class T>
+bool must_be_friend_proc(const foo<T>& f);
+
+template <class T>
+bool must_be_friend_proc(const foo<T>& f)
+{ return f.i != 0; }
+
+template <class T>
+class foobar
+{
+ int i;
+public:
+ template <class U>
+ foobar(const foo<U>& f)
+ { i = f.i; }
+};
+
+
+int test()
+{
+ foo<int> fi;
+ foo<double> fd(fi);
+ (void) &fd; // avoid "unused variable" warning
+ foobar<long> fb(fi);
+ (void) &fb; // avoid "unused variable" warning
+ return 0;
+}
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend7.C
new file mode 100644
index 000000000..a954f8990
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend7.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+template <typename V>
+struct b
+{
+ template <typename T>
+ class a
+ {
+ template <typename>
+ friend class a;
+
+ T t_;
+
+ public:
+ a() {}
+ a(a<T *> const &);
+ };
+};
+
+template <typename V>
+template <typename T>
+b<V>::a<T>::a(a<T *> const &rhs): t_(*rhs.t_)
+{}
+
+
+int
+f ()
+{
+ b<void *>::a<char *> q;
+ b<void *>::a<char> w(q);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend8.C
new file mode 100644
index 000000000..21fd242f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend8.C
@@ -0,0 +1,18 @@
+template <int N> struct ivector
+{
+ template <int r, int c> friend void
+ mult_mv ();
+};
+
+template struct ivector<3>;
+
+template <int r, int c> void
+mult_mv ()
+{
+ c;
+}
+
+void get_local_point_pos ()
+{
+ mult_mv<7, 3> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend9.C
new file mode 100644
index 000000000..add5fb0d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend9.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/8099
+// Partial specialization as friend class
+
+template <int N, typename T> struct X;
+template <typename T> struct X<1,T>;
+
+template <typename P> class Y {
+ static int i;
+ template <int N, typename T> friend struct X;
+ friend struct X<1,P>;
+};
+
+template <typename T> struct X<1,T> {
+ X () { Y<T>::i; } // access private field
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/func1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/func1.C
new file mode 100644
index 000000000..0d1677060
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/func1.C
@@ -0,0 +1,13 @@
+template <typename T1,typename T2>
+inline void f(const T1&,const T2&) { }
+
+template <typename T1,typename T2,void F(const T1&,const T2&)>
+struct A {
+ template <typename T> void g(T& i) { }
+};
+
+int main() {
+ int i;
+ A<int,int,f> a;
+ a.g(i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/func2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/func2.C
new file mode 100644
index 000000000..b0f691d24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/func2.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+typedef void (*fptr)();
+fptr zeroptr = 0;
+template<typename T, fptr F> struct foo { };
+template<typename T> struct foo<T,zeroptr> { };
+// { dg-error "not a valid template argument" "not valid" { target *-*-* } 6 }
+// { dg-error "must be the address" "must be the address " { target *-*-* } 6 }
+
+// The rest is needed to trigger the ICE in 4.0 to 4.3:
+void f() { }
+foo<int,&f> m_foo;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/function1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/function1.C
new file mode 100644
index 000000000..bceed9d68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/function1.C
@@ -0,0 +1,28 @@
+// PR c++/38647
+// { dg-do compile }
+// { dg-prune-output "note" }
+
+template<const char *, int> struct A {};
+const char func[] = "abc";
+template<int N> struct A<func, N> {}; // { dg-error "cannot appear|is invalid|not a valid|constant expression" }
+
+char a1[1];
+A<a1, 0> a;
+
+template<const char *, int> struct B {};
+template<int N> struct B<__FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" }
+
+char b1[1];
+B<b1, 0> b;
+
+template<const char *, int> struct C {};
+template<int N> struct C<__PRETTY_FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" }
+
+char c1[1];
+C<c1, 0> c;
+
+template<const char *, int> struct D {};
+template<int N> struct D<__func__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|function scope|constant expression" }
+
+char d1[1];
+D<d1, 0> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete1.C
new file mode 100644
index 000000000..e4997ef01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: Ivan Godard <igodard at pacbell dot net>
+// PR c++/17447: Detect parameters of dependent types even in templates
+
+struct B; // { dg-error "forward declaration" }
+template<typename T> struct A {
+
+ friend A& operator <<(A& a, B b) { return a; } // { dg-error "incomplete" }
+ friend A& operator <<(A& a, T b) { return a; }
+
+ void foo1(B b) {} // { dg-error "incomplete" }
+ void foo1a(T b) {}
+
+ B foo2(void) {} // { dg-error "incomplete" }
+ T foo2a(void) {}
+
+ void foo3(B b);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete2.C
new file mode 100644
index 000000000..b85556908
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete2.C
@@ -0,0 +1,14 @@
+// PR c++/27427
+// { dg-do compile }
+
+struct A;
+
+template<A&> void foo(); // { dg-message "note" }
+
+A a; // { dg-error "incomplete type" }
+
+void bar()
+{
+ foo<a>(); // { dg-error "(no matching function|could not convert)" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 12 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete3.C
new file mode 100644
index 000000000..8a20bba74
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete3.C
@@ -0,0 +1,5 @@
+// PR c++/27315
+// { dg-do compile }
+
+struct A; // { dg-error "forward declaration" }
+template void A::foo<0>(); // { dg-error "before|incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete4.C
new file mode 100644
index 000000000..f2832a73c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete4.C
@@ -0,0 +1,16 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A; // { dg-error "forward declaration" }
+
+template <typename T> struct X
+{
+ static int f (T); // { dg-error "initializing" }
+ static const T &make ();
+};
+
+int
+main ()
+{
+ return X<A>::f (X<A>::make ()); // { dg-error "invalid use of incomplete type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete5.C
new file mode 100644
index 000000000..f7802825f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete5.C
@@ -0,0 +1,17 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A; // { dg-error "forward declaration" }
+
+template <typename T> struct X
+{
+ static int f (T); // { dg-error "initializing" }
+ static const T &make ();
+ static const bool value = sizeof (f (make ())) == sizeof (int); // { dg-error "invalid use of incomplete type" }
+};
+
+int
+main ()
+{
+ return X <A>::value;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete6.C
new file mode 100644
index 000000000..7138b6a3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/incomplete6.C
@@ -0,0 +1,22 @@
+// PR c++/48115
+
+template<typename> struct templ { };
+
+template<typename T> T declval();
+
+typedef int (*F2)(...);
+
+template<int> struct Int { };
+
+template<typename F, typename T>
+struct S
+{
+ template<typename A>
+ Int<sizeof( declval<F>()(T()) )>
+ f(A);
+};
+
+int main()
+{
+ S<F2, templ<int> >().f(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit.C
new file mode 100644
index 000000000..43af3cfc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit.C
@@ -0,0 +1,13 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// { dg-do compile }
+
+template<typename T>
+struct X { void f() { } };
+
+struct Z : X<int> { };
+
+int main()
+{
+ Z z;
+ z.X::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit2.C
new file mode 100644
index 000000000..4fd7ec063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit2.C
@@ -0,0 +1,19 @@
+// PR c++/5658
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 11 Feb 2002 <Theodore.Papadopoulo@sophia.inria.fr>
+
+struct A {
+ typedef int iterator;
+};
+template <typename T>
+struct B: public A {
+ template <typename U>
+ struct iterator {
+ };
+ B() { }
+};
+int main()
+{
+ B<int> a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit3.C
new file mode 100644
index 000000000..97b9e5b3e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit3.C
@@ -0,0 +1,12 @@
+template <typename T>
+struct set {
+ void insert (const T&);
+ template <class X>
+ void insert (X, X);
+};
+
+struct C : public set<int> {
+ void f (const int i) {
+ insert (i);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit4.C
new file mode 100644
index 000000000..511c9e605
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit4.C
@@ -0,0 +1,14 @@
+// PR c++/21008, DR 515
+
+struct A {
+ int foo_;
+};
+template <typename T> struct B: public A { };
+template <typename T> struct C: B<T> {
+ int foo() {
+ return A::foo_; // #1
+ }
+};
+int f(C<int>* p) {
+ return p->foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit5.C
new file mode 100644
index 000000000..cd22f5b10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit5.C
@@ -0,0 +1,11 @@
+struct A
+{
+ template<int> void foo();
+};
+
+template<int N> struct B : A
+{
+ B() { foo<N>(); }
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit6.C
new file mode 100644
index 000000000..4f070984e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit6.C
@@ -0,0 +1,22 @@
+// Origin PR c++/47172
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int f() const;
+};
+
+template <class T>
+struct B : A { };
+
+template <class T>
+struct C : B<T>
+{
+ void g();
+};
+
+template <class T>
+void C<T>::g()
+{
+ A::f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit7.C
new file mode 100644
index 000000000..b3abc26b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit7.C
@@ -0,0 +1,20 @@
+// Origin: PR c++/48656
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int f();
+ int f(int);
+};
+
+template <typename> struct B : A
+{
+};
+
+template <typename T> struct C : B<T>
+{
+ void
+ g()
+ {
+ A::f();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit8.C
new file mode 100644
index 000000000..3176dc06d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit8.C
@@ -0,0 +1,13 @@
+// PR c++/52685
+
+template <typename T>
+struct A
+{
+ template <typename U>
+ struct B : public A <B<U> > // { dg-error "declaration" }
+ {
+ struct C : public B<U> // { dg-error "incomplete" }
+ {
+ };
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inherit9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit9.C
new file mode 100644
index 000000000..926343b4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inherit9.C
@@ -0,0 +1,15 @@
+// PR c++/58273
+
+class A {};
+class B
+{
+ int goo(A);
+};
+template<typename E>
+class D : public B
+{
+ void foo(A t)
+ {
+ int const i(B::goo(t));
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init-list.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init-list.C
new file mode 100644
index 000000000..6a868b25e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init-list.C
@@ -0,0 +1,17 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// { dg-do compile }
+
+template<typename T>
+struct Base {
+ Base(int) { }
+};
+
+template<typename T>
+struct Derived : Base<T> {
+ Derived();
+};
+
+template<typename T>
+Derived<T>::Derived() : Base(4) { } // { dg-error "have any field" "" }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init1.C
new file mode 100644
index 000000000..fdbff8d3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/9457: ICE tsubst'ing initializers in templates.
+
+template <typename> void foo (int count) {
+ int i = {count};
+}
+template void foo<int> (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init10.C
new file mode 100644
index 000000000..1480622d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init10.C
@@ -0,0 +1,15 @@
+template <int N>
+struct A { };
+
+template <int Q>
+void g()
+{
+ const int M ( Q );
+
+ A<M> a;
+}
+
+void h()
+{
+ g<3>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init2.C
new file mode 100644
index 000000000..b81e4be94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init2.C
@@ -0,0 +1,10 @@
+// PR c++/9820
+
+template <typename T> struct X {
+ template<typename> static int test(...);
+ template<typename> static int test(int *);
+
+ static const int i = sizeof(X<T>::template test<int>(0));
+};
+
+template class X<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init3.C
new file mode 100644
index 000000000..9799a206d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init3.C
@@ -0,0 +1,11 @@
+// PR c++/11027
+
+template <class T>
+struct X {
+ typedef void (X::*pfun)();
+ static pfun p[];
+};
+
+template <class T>
+typename X<T>::pfun X<T>::p[] = {};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init4.C
new file mode 100644
index 000000000..78c7c3088
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init4.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18905. bogus error
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+int f1(char);
+template <int t>
+void f(void)
+{
+ const char* const suffixes = "plpv";
+ f1(suffixes[t]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init5.C
new file mode 100644
index 000000000..ab529beb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init5.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 May 2005 <nathan@codesourcery.com>
+
+// PR 21165. ICE on valid
+// Origin:Volker Reichelt reichelt@gcc.gnu.org
+
+template<typename T> bool foo()
+{
+ const int i = T();
+ return i > 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init6.C
new file mode 100644
index 000000000..143746642
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init6.C
@@ -0,0 +1,31 @@
+// PR c++/25836
+
+template <class T>
+class Iter {};
+
+template <class T>
+class SubIter : public Iter<T> {
+ void insert(T);
+};
+
+class GraphBase {
+public:
+ class Node;
+};
+
+template<class T>
+class Graph : public GraphBase {
+ class Inner {
+ Iter<typename Graph<T>::Node*> *get();
+ };
+};
+
+template<class T>
+Iter<typename Graph<T>::Node*> *Graph<T>::Inner::get() {
+ SubIter<typename Graph<T>::Node*> *iter;
+ iter->insert(0);
+}
+
+int main() {
+ Iter<Graph<int>::Node*> *n2_iter = new SubIter<Graph<int>::Node*>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init7.C
new file mode 100644
index 000000000..bb26c8f92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init7.C
@@ -0,0 +1,9 @@
+/* PR c++/31517. This used to ICE. */
+/* { dg-do compile } */
+
+template<typename> struct A
+{
+ static const int i=0;
+};
+
+template<typename T> const int A<T>::i = 0=0; /* { dg-error "duplicate initialization" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init8.C
new file mode 100644
index 000000000..1bcda1253
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init8.C
@@ -0,0 +1,68 @@
+// PR c++/36089
+// { dg-do run }
+
+extern "C" void abort ();
+
+int f ()
+{
+ const int c(2);
+ int d[c] = { 0, 0 };
+ return d[0] + sizeof d;
+}
+
+struct A
+{
+ static int f ()
+ {
+ const int c(2);
+ int d[c] = { 0, 0 };
+ return d[0] + sizeof d;
+ }
+};
+
+template <int> struct B
+{
+ static int f ()
+ {
+ const int c = 2;
+ int d[c] = { 0, 0 };
+ return d[0] + sizeof d;
+ }
+};
+
+template <int> struct C
+{
+ static int f ()
+ {
+ const int c(2);
+ int d[c] = { 0, 0 };
+ return d[0] + sizeof d;
+ }
+};
+
+template <int> struct D
+{
+ static int f ()
+ {
+ const int e(2);
+ const int c(e);
+ int d[c] = { 0, 0 };
+ return d[0] + sizeof d;
+ }
+};
+
+int
+main (void)
+{
+ int v = f ();
+ if (v != 2 * sizeof (int))
+ abort ();
+ if (v != A::f ())
+ abort ();
+ if (v != B<6>::f ())
+ abort ();
+ if (v != C<0>::f ())
+ abort ();
+ if (v != D<1>::f ())
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/init9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/init9.C
new file mode 100644
index 000000000..d33c7da17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/init9.C
@@ -0,0 +1,12 @@
+// PR c++/20140
+
+template<typename T> void foo()
+{
+ unsigned char s[] = "";
+}
+
+int main()
+{
+ foo<char>();
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/injected1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/injected1.C
new file mode 100644
index 000000000..58ec3cba6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/injected1.C
@@ -0,0 +1,33 @@
+// PR c++/13950, DR 176
+
+template <class T> struct Base { }; // { dg-message "" } candidate
+
+struct D1: Base<void>
+{
+ D1::Base* p1;
+ D1::Base<double>* p2;
+ Base *p3;
+ Base<double>* p4;
+};
+
+struct D2: Base<void>, Base<void*>
+{
+ D2::Base* p1; // { dg-error "" }
+ D2::Base<double>* p2;
+ Base *p3; // { dg-error "" }
+ Base<double>* p4;
+};
+
+template <class T>
+struct D3: Base<T> {
+ typename D3::Base* p1;
+ typename D3::template Base<double>* p2;
+};
+template struct D3<void>;
+
+template <class T>
+struct D4: Base<T>, Base<T*> {
+ typename D4::Base* p1; // { dg-error "" }
+ typename D4::template Base<double>* p2;
+};
+template struct D4<void>; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/injected2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/injected2.C
new file mode 100644
index 000000000..bd09ccc35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/injected2.C
@@ -0,0 +1,9 @@
+// DR 1004
+
+template <class T, template<class>class U = T::template B> struct A { };
+
+template <class T> struct B {
+ template <class U> friend struct B;
+};
+
+A<B<int> > a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/inline1.C
new file mode 100644
index 000000000..c7ae1f5ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/inline1.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-fno-default-inline -O0" }
+// { dg-final { scan-assembler-not "\n_?_ZN1X3FooIiEEvT_\[: \t\n\]" } }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10047. bogus warning.
+
+struct X
+{
+ template <typename T> static void Foo (T) {}
+};
+
+extern template void X::Foo<int> (int); // extern, so don't emit it
+
+int main () {
+ X::Foo (1); // ok, we've seen the defn
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate1.C
new file mode 100644
index 000000000..dd501684e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// Origin:
+
+// PR c++/6716
+// ICE in complex class structure when components are incomplete
+
+template <class T> struct X {
+ T t; // { dg-error "incomplete" }
+};
+
+template <class T> struct Y {
+ X<T> x; // { dg-message "required" }
+};
+
+template <class T> struct Z { // { dg-error "declaration" }
+ Y<Z<T> > y; // { dg-message "required" }
+};
+
+struct ZZ : Z<int>
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate10.C
new file mode 100644
index 000000000..678e0194a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate10.C
@@ -0,0 +1,37 @@
+/* PR c++/39242, xplicit instantiation declaration prohibits implicit
+ instantiation of non-inline functions. */
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+class Rep {
+public:
+ void unref() const { }
+ static void unref (const Rep * obj_r) { obj_r->unref(); }
+};
+template<typename _Tp, typename _Bt = _Tp>
+class RepPtrStore {
+ _Tp * _obj;
+ void _assign( _Tp * new_r );
+public:
+ ~RepPtrStore() { _assign( 0 ); }
+};
+template<typename _Tp,typename _Bt>
+void RepPtrStore<_Tp,_Bt>::_assign( _Tp * new_r )
+{
+ Rep::unref( _obj );
+}
+class RepPtrBase { };
+template<typename _Bt> class PtrBase : public RepPtrBase { };
+template<typename _Tp, typename _Bt = _Tp>
+class Ptr : public PtrBase<_Bt> {
+ RepPtrStore<_Tp,_Bt> _ptr;
+};
+class YCode;
+class YStatement;
+typedef Ptr<YStatement,YCode> YStatementPtr;
+extern template class RepPtrStore<YStatement,YCode>;
+class ExecutionEnvironment {
+ YStatementPtr m_statement;
+ ~ExecutionEnvironment() { };
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate11.C
new file mode 100644
index 000000000..3598d5890
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate11.C
@@ -0,0 +1,25 @@
+// PR c++/42608
+// { dg-do compile }
+
+template <class U, class V>
+struct A;
+
+template <class V>
+struct A<int, V>
+{
+ void f ();
+};
+
+template struct A<int, int>;
+
+int
+main ()
+{
+ A<int, int> a;
+ a.f ();
+ return 0;
+}
+
+// Make sure we get undefined reference error if
+// A<int, int>::f () isn't instantiated elsewhere.
+// { dg-final { scan-assembler-not "weak\[\n\t\]*_ZN1AIiiE1fEv" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate2.C
new file mode 100644
index 000000000..a6faf17ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate2.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+
+// PR c++/2862
+// Default function argument and template instantiation.
+
+template <int dim> void f (int=0) {}
+template void f<1> (); // { dg-error "not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate3.C
new file mode 100644
index 000000000..c0754da92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate3.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Origin: Scott Snyder <snyder@fnal.gov>
+
+// PR c++/7639
+// ICE when accessing member with incomplete type.
+
+class ACE_Null_Mutex; // { dg-error "forward declaration" }
+
+template <class TYPE>
+struct ACE_Cleanup_Adapter
+{
+ TYPE &object ()
+ { return object_; }
+ TYPE object_; // { dg-error "incomplete type" }
+};
+
+template class ACE_Cleanup_Adapter<ACE_Null_Mutex>; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate4.C
new file mode 100644
index 000000000..732b8529d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/10682: Typedef to enum template instantiation logic.
+
+template <typename T>
+struct Foo {
+ enum E {a,b,c};
+ typedef E EE;
+};
+
+void Baz(Foo<int>::EE x);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate5.C
new file mode 100644
index 000000000..2198087ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate5.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/11616: Incorrect line number in diagnostics
+
+template <int> struct A
+{
+ static const int i=0;
+};
+
+int baz() { return A<0>::i; }
+
+struct B
+{
+ static void foo (int); // { dg-message "B::foo|candidate expects" }
+};
+
+template <typename T> struct C
+{
+ virtual void bar() const { T::foo(); } // { dg-error "no matching function" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 21 }
+};
+
+C<B> c; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate6.C
new file mode 100644
index 000000000..d5d712ee0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate6.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Origin: gianni@mariani.ws
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/13289: ICE recursively instantiate static member data.
+
+template <int N> struct S {
+ static const int C;
+};
+
+template <int N>
+const int S<N>::C = S<(N+1)%2>::C;
+
+template struct S<1>;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate7.C
new file mode 100644
index 000000000..8ddbdb19a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate7.C
@@ -0,0 +1,10 @@
+// PR c++/19498
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> struct A
+{
+ template<T&> struct B; // { dg-error "reference to void" }
+};
+
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate8.C
new file mode 100644
index 000000000..9004a86d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate8.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Aug 2005 <nathan@codesourcery.com>
+
+// PR 22044: ICE
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+struct no_context {
+ template< class Event > void no_function( const Event & );
+};
+template< class Event, class TransitionContext = no_context,
+void ( TransitionContext::*pTransitionAction )( const Event & ) = &no_context::no_function< Event > >
+struct transition
+{
+ struct EvFlipBit {};
+ typedef transition<EvFlipBit> type;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate9.C
new file mode 100644
index 000000000..33f1d6018
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/instantiate9.C
@@ -0,0 +1,15 @@
+/* PR c++/14622. The invalid explicit instantiation was not reported. */
+/* { dg-do compile } */
+template<class T>
+class A
+{
+ static T a;
+};
+
+template<class T>
+T A<T>::a;
+
+struct B {};
+
+template B A<int>::a; /* { dg-error "does not match declared type" } */
+template float A<float>::a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/invalid1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/invalid1.C
new file mode 100644
index 000000000..d2fcca6d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/invalid1.C
@@ -0,0 +1,8 @@
+// PR c++/14883
+// { dg-options "-std=gnu++98" }
+
+template < class T > struct DomainTraits {};
+template < int Dim > class Interval;
+template < class DT > class Domain {};
+template <> class Interval < 1 >:public Domain < DomainTraits < Interval < 1 >
+>> {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig1.C
new file mode 100644
index 000000000..850d38828
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig1.C
@@ -0,0 +1,8 @@
+namespace NS {
+ struct C {};
+ void foo(C);
+}
+
+template <class T> void bar() { T t; foo (t); }
+
+template void bar<NS::C> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig10.C
new file mode 100644
index 000000000..6a1b9b55b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig10.C
@@ -0,0 +1,12 @@
+// PR c++/47511
+
+namespace N {
+ template <typename T> bool g( T ) {
+ return true;
+ }
+ struct A { };
+}
+template <class T> void f(const T&) {
+ N::A x;
+ g(x) ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig2.C
new file mode 100644
index 000000000..be072a4a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig2.C
@@ -0,0 +1,25 @@
+namespace nsp_foo {
+
+ struct A {};
+
+ struct foo {};
+
+}
+
+namespace nsp_bar {
+
+ void foo(nsp_foo::A) {}
+
+ template <class T>
+ void bar(T t)
+ {
+ nsp_bar::foo(t); // line 16
+ }
+
+}
+
+int main()
+{
+ nsp_bar::bar(nsp_foo::A());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig3.C
new file mode 100644
index 000000000..f90059d65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig3.C
@@ -0,0 +1,28 @@
+// PR c++/13157
+
+namespace aa
+{
+ double abs(double);
+ long double abs(long double);
+}
+
+namespace fu
+{
+ template <class T>
+ struct X
+ {};
+
+ template <class T>
+ X<T> test(X<T> x)
+ {
+ using ::aa::abs;
+ return abs(x);
+ }
+
+ template <class T>
+ X<T> abs(X<T>);
+
+ X<int> x;
+ X<int> z = test(x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig4.C
new file mode 100644
index 000000000..31e41fcf9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig4.C
@@ -0,0 +1,12 @@
+// PR c++/13978
+
+namespace ns {
+ template <class TP> void func1(TP* t);
+ struct A {};
+}
+
+template < class TP >
+void func2() {
+ func1( new ns::A() );
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig5.C
new file mode 100644
index 000000000..d54bb7543
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig5.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// Contributed by David Abrahams <dave at boost-consulting dot com>
+// PR c++/14143: Koenig lookup should only look into template arguments only
+// if the argument is a template-id.
+
+namespace fu
+{
+ template <class T>
+ struct bar
+ {
+ struct baz {};
+ };
+}
+
+namespace axe
+{
+ struct handle {};
+
+ template <class T>
+ char* f(T&);
+}
+
+namespace test
+{
+ template <class T>
+ int f(T const&);
+
+ template <class T>
+ int g(T x) { return f(x); }
+
+ int x = g(fu::bar<axe::handle>::baz());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig6.C
new file mode 100644
index 000000000..8f93a653a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig6.C
@@ -0,0 +1,29 @@
+// PR c++/38850
+
+template <typename VType>
+class Vector2 {
+ private:
+ VType c_[2];
+ public:
+ typedef Vector2<VType> Self;
+
+ Vector2(const VType x, const VType y) {
+ c_[0] = x;
+ c_[1] = y;
+ }
+
+ friend inline Self Max(const Self &v1, const Self &v2) {
+ return Self(v1.c_[0], v1.c_[1]);
+ }
+};
+
+template <class T>
+Vector2<float> foo(T x) {
+ Vector2<float> y(0,0);
+ return Max(y, y);
+}
+
+int main() {
+ foo(3);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig7.C
new file mode 100644
index 000000000..07f2fcad3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig7.C
@@ -0,0 +1,11 @@
+// PR c++/13549
+// We need to do arg-dep lookup for g<T>(j) at instantiation time because
+// g<T> is dependent, even though (j) is not; at that point we can find
+// g(h).
+
+template <typename T> int g(int);
+class h{};
+template <typename T> int l(){h j; return g<T>(j);}
+template <typename T> int g(const h&);
+class j{};
+int jj(){return l<j>();}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig8.C
new file mode 100644
index 000000000..5a49a7066
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig8.C
@@ -0,0 +1,20 @@
+// PR c++/40740
+
+template<class T>
+T addsome(T v) {
+ return v+1;
+}
+
+int addsome(int v) {
+ return v+2;
+}
+
+int main() {
+ int i = 0;
+ if (addsome(i) != 2)
+ return 1;
+ if (addsome<>(i) != 1)
+ return 2;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/koenig9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig9.C
new file mode 100644
index 000000000..f2cf9ed99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/koenig9.C
@@ -0,0 +1,33 @@
+// PR c++/29131
+// int has no associated namespaces, so arg-dep lookup doesn't find g(int).
+
+template <class T> int f() { return g(T()); } // { dg-error "argument-dependent" }
+int g(int); // { dg-message "declared here" }
+int i = f<int>();
+
+// PR c++/24163
+// Unqualified lookup doesn't find names from dependent bases.
+
+template <class T>
+struct A
+{
+ static void h(T);
+};
+
+template <class T> struct B: A<T>
+{
+ void f() { h(T()); } // { dg-error "argument-dependent" "arg-dep" }
+ static void g() { h(T()); } // { dg-error "argument-dependent" "arg-dep" }
+};
+
+int main()
+{
+ B<int> b;
+ b.f();
+ b.g();
+}
+
+// { dg-message "dependent base .A.int" "base" { target *-*-* } 19 }
+// { dg-message "this->h" "this->h" { target *-*-* } 19 }
+// { dg-message "dependent base .A.int" "base" { target *-*-* } 20 }
+// { dg-message "B::h" "B::h" { target *-*-* } 20 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/linkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/linkage1.C
new file mode 100644
index 000000000..02aa96729
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/linkage1.C
@@ -0,0 +1,18 @@
+// PR c++/50372
+// Test that a template instantiation has the same linkage as its argument.
+// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z3fooIXadL_Z13external_funcvEEEvv" } }
+// { dg-final { scan-assembler-not "(weak|glob)\[^\n\]*_Z3fooIXadL_ZL11static_funcvEEEvv" } }
+
+template<void (*fptr)(void)>
+void foo() { }
+
+static void static_func() {}
+void external_func() { }
+
+void test()
+{
+#if __cplusplus > 199711L
+ foo<&static_func>();
+#endif
+ foo<&external_func>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local1.C
new file mode 100644
index 000000000..4293aca24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local1.C
@@ -0,0 +1,25 @@
+// PR c++/4286: We were crashing when trying to set up the class bindings in
+// g(), because xref wanted the mangled name, which breaks inside a template.
+
+// Of course, the offending code is actually ill-formed anyway, so check
+// for the error. Also check that it's formatted properly.
+
+struct A
+{
+ template<class T> void f();
+};
+
+template<class T> void A::f()
+{
+ struct B
+ {
+ void g() {}
+ static int x; // { dg-error "static.*int A::f\\(\\)::B::x" "" }
+ };
+}
+
+int main ()
+{
+ A a;
+ a.f<int> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local2.C
new file mode 100644
index 000000000..51c946a5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local2.C
@@ -0,0 +1,61 @@
+template<typename T>
+struct X {
+ double & f (const unsigned int i,
+ const unsigned int j);
+ void g (X &M);
+};
+
+template <typename T>
+void X<T>::g (X &x) {
+ double t14 = x.f(0,0)*x.f(1,1);
+ double t15 = x.f(2,2)*x.f(3,3);
+ double t17 = x.f(2,3)*x.f(3,2);
+ double t19 = x.f(0,0)*x.f(2,1);
+ double t20 = x.f(1,2)*x.f(3,3);
+ double t22 = x.f(1,3)*x.f(3,2);
+ double t24 = x.f(0,0)*x.f(3,1);
+ double t25 = x.f(1,2)*x.f(2,3);
+ double t27 = x.f(1,3)*x.f(2,2);
+ double t29 = x.f(1,0)*x.f(0,1);
+ double t32 = x.f(1,0)*x.f(2,1);
+ double t33 = x.f(0,2)*x.f(3,3);
+ double t35 = x.f(0,3)*x.f(3,2);
+ double t37 = x.f(1,0)*x.f(3,1);
+ double t38 = x.f(0,2)*x.f(2,3);
+ double t40 = x.f(0,3)*x.f(2,2);
+ double t42 = t14*t15-t14*t17-t19*t20+t19*t22+
+ t24*t25-t24*t27-t29*t15+t29*t17+
+ t32*t33-t32*t35-t37*t38+t37*t40;
+ double t43 = x.f(2,0)*x.f(0,1);
+ double t46 = x.f(2,0)*x.f(1,1);
+ double t49 = x.f(2,0)*x.f(3,1);
+ double t50 = x.f(0,2)*x.f(1,3);
+ double t52 = x.f(0,3)*x.f(1,2);
+ double t54 = x.f(3,0)*x.f(0,1);
+ double t57 = x.f(3,0)*x.f(1,1);
+ double t60 = x.f(3,0)*x.f(2,1);
+ double t63 = t43*t20-t43*t22-t46*t33+t46*t35+
+ t49*t50-t49*t52-t54*t25+t54*t27+
+ t57*t38-t57*t40-t60*t50+t60*t52;
+ double t65 = 1/(t42+t63);
+ double t71 = x.f(0,2)*x.f(2,1);
+ double t73 = x.f(0,3)*x.f(2,1);
+ double t75 = x.f(0,2)*x.f(3,1);
+ double t77 = x.f(0,3)*x.f(3,1);
+ double t81 = x.f(0,1)*x.f(1,2);
+ double t83 = x.f(0,1)*x.f(1,3);
+ double t85 = x.f(0,2)*x.f(1,1);
+ double t87 = x.f(0,3)*x.f(1,1);
+ double t101 = x.f(1,0)*x.f(2,2);
+ double t103 = x.f(1,0)*x.f(2,3);
+ double t105 = x.f(2,0)*x.f(1,2);
+ double t107 = x.f(2,0)*x.f(1,3);
+ double t109 = x.f(3,0)*x.f(1,2);
+ double t111 = x.f(3,0)*x.f(1,3);
+ double t115 = x.f(0,0)*x.f(2,2);
+ double t117 = x.f(0,0)*x.f(2,3);
+ double t119 = x.f(2,0)*x.f(0,2);
+ double t121 = x.f(2,0)*x.f(0,3);
+}
+
+template void X<double>::g (X<double>&);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local3.C
new file mode 100644
index 000000000..5a01a4495
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local3.C
@@ -0,0 +1,14 @@
+ template<class T>
+ void f(const T&)
+ {
+ struct B {
+
+ void g (T);
+ };
+ B b;
+ }
+ void g()
+ {
+ f(42);
+ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local4.C
new file mode 100644
index 000000000..d842076bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local4.C
@@ -0,0 +1,10 @@
+// PR c++/17413
+// { dg-options -std=c++98 }
+
+template <typename T> void foo() {} // { dg-message "note" }
+
+int main () {
+ struct S {};
+ foo<S> (); // { dg-error "(match|template argument for|trying to instantiate)" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local5.C
new file mode 100644
index 000000000..705dca39e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local5.C
@@ -0,0 +1,12 @@
+struct Attribute { };
+
+template <class T> bool operator == (const Attribute &attr, const T &value);
+
+enum {
+ anon = 123
+};
+
+void test(int foo)
+{
+ if (foo == anon) ; /* { dg-bogus "anonymous type" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local6.C
new file mode 100644
index 000000000..3eb828fd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local6.C
@@ -0,0 +1,20 @@
+template <class T> struct PCVector2 // { dg-message "note" }
+{
+ template <class T2> PCVector2(const PCVector2<T> &cv) ; // { dg-message "note" }
+
+ PCVector2<T> operator- (const PCVector2<T> &ov) const
+ {
+ return PCVector2<T>(ov.xFIELD, ov.yFIELD); // { dg-error "matching" }
+ // { dg-message "(candidate|expects 1 argument, 2 provided|cannot convert)" "candidate note" { target *-*-* } 7 }
+ }
+
+ T xFIELD, yFIELD;
+};
+
+void findIntersection( PCVector2<double>& p0, PCVector2<double>& p1);
+
+
+void findIntersection( PCVector2<double>& p0, PCVector2<double>& p1)
+{
+ PCVector2<double> e = p1 - p0; // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/local7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/local7.C
new file mode 100644
index 000000000..3045534ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/local7.C
@@ -0,0 +1,15 @@
+// PR c++/53599
+
+template <typename T>
+int foo ()
+{
+ struct F;
+ struct G
+ {
+ static int F::* bar();
+ };
+
+ return sizeof(G);
+}
+
+int z = foo <int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup1.C
new file mode 100644
index 000000000..0df77bac1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup1.C
@@ -0,0 +1,17 @@
+template <class T0>
+class A {
+public:
+ class B;
+};
+
+template <class T0>
+class A<T0>::B {
+public:
+ class C;
+};
+
+template <class T0>
+class A<T0>::B::C {
+public:
+ A<T0> &a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup2.C
new file mode 100644
index 000000000..de4e1d989
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup2.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com>
+
+// PR 11617: Failed to diagnose missing function.
+
+struct B {};
+
+template <typename T> void Bar ()
+{
+ T::foo (); // { dg-error "is not a member of" "" }
+}
+
+void Foo ()
+{
+ Bar<B> (); // { dg-message "required" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup3.C
new file mode 100644
index 000000000..c96a0b0b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup3.C
@@ -0,0 +1,16 @@
+// PR c++/12397
+
+struct foo { };
+
+template <typename T> struct bar
+{
+ bar(){}
+ int i;
+ bar (const bar<T>& foo) : i (foo.i) {}
+};
+
+int main()
+{
+ bar<int> b1;
+ bar<int> b2(b1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup4.C
new file mode 100644
index 000000000..3bd73a34e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup4.C
@@ -0,0 +1,6 @@
+// PR c++/13950
+
+template <class T> struct Base {};
+template <class T> struct Derived: public Base<T> {
+ typename Derived::template Base<double>* p1;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup5.C
new file mode 100644
index 000000000..022202a71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup5.C
@@ -0,0 +1,17 @@
+// PR c++/13925
+
+namespace N {
+ template <class T> void f(T);
+
+ namespace M {
+ class A {
+ friend void f<int>(int);
+ };
+ }
+
+ template <class T> void f(T) {}
+ template <> void f<int>(int )
+ {
+ f<long>(0);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup6.C
new file mode 100644
index 000000000..2ca6dcc75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup6.C
@@ -0,0 +1,11 @@
+struct S
+{
+ template<typename T> static void g();
+};
+
+template<typename T>
+void f() { return S::template g<T>(); }
+
+void g() {
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup7.C
new file mode 100644
index 000000000..0e05c5f75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup7.C
@@ -0,0 +1,9 @@
+class S;
+
+template<class T>
+int f(T, S);
+
+class S {
+ template<class T>
+ friend int f(T t, S) { t; return 0; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup8.C
new file mode 100644
index 000000000..981c283e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup8.C
@@ -0,0 +1,19 @@
+// PR c++/38030
+// The call to f should be resolved at template definition time.
+// { dg-do link }
+
+struct B { };
+struct D : public B { };
+D d;
+void f (B &) { }
+template < class T >
+void g ()
+{
+ return f (d);
+}
+void f (D &);
+int main ()
+{
+ g<int> ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lookup9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup9.C
new file mode 100644
index 000000000..4a1dc79ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lookup9.C
@@ -0,0 +1,10 @@
+// PR c++/50848
+// { dg-options "-fpermissive" }
+
+template<class T> class A {T& foo;};
+template<class T> class B: public A<T> {
+ void f(){
+ foo(1); // { dg-message "foo" }
+ }
+};
+template class B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/loop1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/loop1.C
new file mode 100644
index 000000000..aa6d177d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/loop1.C
@@ -0,0 +1,9 @@
+// PR c++/60379
+
+template <int> struct A {
+ void m_fn1(int p1) {
+ int *a;
+ while (p1 && *static_cast<int *>(static_cast<void *>(a)))
+ ;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue1.C
new file mode 100644
index 000000000..9def2a18c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue1.C
@@ -0,0 +1,31 @@
+// PR c++/38877
+
+template<class _T1, class _T2>
+struct pair
+{
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair () : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+};
+
+template<class _T1, class _T2>
+inline pair<_T1, _T2>
+make_pair(_T1 __x, _T2 __y)
+{
+ return pair<_T1, _T2>(__x, __y);
+}
+
+template <int dim> class bar;
+
+template <int dim>
+pair<bar<dim> *, unsigned int>
+foo (unsigned int position)
+{
+ const pair<int,unsigned int> tmp;
+ return make_pair (new bar<dim>(tmp.first),
+ position);
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue2.C
new file mode 100644
index 000000000..e9074aa6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/lvalue2.C
@@ -0,0 +1,18 @@
+// PR c++/50835
+
+struct A {};
+
+struct B
+{
+ explicit B(A &);
+ operator A&() const;
+};
+
+void should_be_lvalue(A&);
+
+template <typename>
+void f()
+{
+ A v;
+ should_be_lvalue(true ? B(v) : v);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/mangle1.C
new file mode 100644
index 000000000..96d064723
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/mangle1.C
@@ -0,0 +1,16 @@
+// PR c++/17324
+// { dg-do assemble }
+
+template<int, typename T> struct A
+{
+ template<int I> void foo(const A<I,T>&) {}
+};
+
+template<typename> struct B
+{
+ template<int J> void bar(const A<J,B>&);
+ void baz() { A<0,B>().foo(A<0,B>()); }
+};
+
+template struct B<void>;
+template struct B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial1.C
new file mode 100644
index 000000000..60cb36aea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial1.C
@@ -0,0 +1,15 @@
+// PR c++/14032
+
+template <typename T> struct outer {
+ template <typename T2, typename U>
+ struct inner {
+ static int f() { return inner<T,int>::N; };
+ };
+
+ template <typename U>
+ struct inner<T,U> {
+ static const int N = 1;
+ };
+};
+
+int i = outer<int>::inner<double,int>::f();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial2.C
new file mode 100644
index 000000000..fba325519
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial2.C
@@ -0,0 +1,29 @@
+// PR c++/14032
+// { dg-do run }
+
+template <bool compare>
+struct outer
+{
+ template <bool compare_with,bool second>
+ struct inner // unspecialized compare != compare_with
+ {
+ static inline bool test()
+ {
+ return false;
+ }
+ };
+ template <bool second> // specialization compare == compare_with
+ struct inner<compare,second>
+ {
+ static inline bool test()
+ {
+ return true;
+ }
+ };
+};
+int main ()
+{
+ bool b = outer<true>::inner<true,false>::test();
+
+ return b != true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial3.C
new file mode 100644
index 000000000..bea6cd396
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/mem-partial3.C
@@ -0,0 +1,29 @@
+// PR c++/33342
+
+template <bool B, class T = void>
+struct enable_if_c {
+ typedef T type;
+};
+
+template <class T>
+struct A
+{
+ template <class U, class V>
+ struct B;
+
+ template <class U>
+ struct B<U, typename enable_if_c<U::sub::value==0>::type>
+ { };
+};
+
+struct C
+{
+ struct sub
+ {
+ static const int value = 0;
+ };
+};
+
+
+A<int> a;
+A<int>::B<C, void> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/mem_func_ptr.C b/gcc-4.9/gcc/testsuite/g++.dg/template/mem_func_ptr.C
new file mode 100644
index 000000000..7d912e2ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/mem_func_ptr.C
@@ -0,0 +1,57 @@
+// { dg-do compile }
+template<typename T> struct takes_member_ptr;
+template<typename T, typename Klasse> struct takes_member_ptr<T Klasse::*> {};
+
+template<typename T, typename Klasse>
+void fun_takes_member_ptr(T Klasse::*) {}
+
+
+template<typename T> struct order_member_ptrs;
+template<typename T, typename Klasse> struct order_member_ptrs<T Klasse::*> {};
+template<typename R, typename T1, typename Klasse>
+ struct order_member_ptrs<R (Klasse::*)(T1)>
+ {
+ typedef int type;
+ };
+
+template<typename R, typename T1, typename Klasse>
+ struct order_member_ptrs<R (Klasse::*)(T1) const>
+ {
+ typedef int c_type;
+ };
+
+template<typename R, typename T1, typename Klasse>
+ struct order_member_ptrs<R (Klasse::*)(T1) volatile>
+ {
+ typedef int v_type;
+ };
+
+template<typename R, typename T1, typename Klasse>
+ struct order_member_ptrs<R (Klasse::*)(T1) const volatile>
+ {
+ typedef int cv_type;
+ };
+
+
+struct X {
+ void bar(float) {}
+ void bar_c(float) const {}
+ void bar_v(float) volatile {}
+ void bar_cv(float) const volatile {}
+};
+
+void foo()
+{
+ sizeof(takes_member_ptr<void (X::*)(float)>);
+ sizeof(takes_member_ptr<void (X::*)(float) const>);
+ sizeof(takes_member_ptr<void (X::*)(float) volatile>);
+ sizeof(takes_member_ptr<void (X::*)(float) const volatile>);
+ sizeof(order_member_ptrs<void (X::*)(float)>::type);
+ sizeof(order_member_ptrs<void (X::*)(float) const>::c_type);
+ sizeof(order_member_ptrs<void (X::*)(float) volatile>::v_type);
+ sizeof(order_member_ptrs<void (X::*)(float) const volatile>::cv_type);
+ fun_takes_member_ptr(&X::bar);
+ fun_takes_member_ptr(&X::bar_c);
+ fun_takes_member_ptr(&X::bar_v);
+ fun_takes_member_ptr(&X::bar_cv);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member.C
new file mode 100644
index 000000000..69228334f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+
+class BIXSet{
+int z[4];
+public:
+void f(BIXSet &other){
+z[0]=other.z[0];
+}
+
+};
+
+class TestCase2{
+public:
+BIXSet a,b;
+
+public:
+void run(void){
+BIXSet x,y;
+process(0,x,y);
+}
+
+protected:
+template<class BS> void process(const int d,BS &en,BS &lb){
+a.f(en);b.f(lb);
+}
+
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member2.C
new file mode 100644
index 000000000..372c778a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member2.C
@@ -0,0 +1,13 @@
+// PR c++/8660
+// Bug: we were treating the definition of the non-template as a definition
+// of the template, which broke.
+
+struct BadgerBuf
+{
+ void ReadPod();
+ template<class B>
+ void ReadPod();
+};
+
+void BadgerBuf::ReadPod ()
+ { ReadPod<int> (); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member3.C
new file mode 100644
index 000000000..4f87e57bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member3.C
@@ -0,0 +1,19 @@
+template<typename T>
+struct A {
+ template<typename L> struct SubA { };
+
+ template<typename T1,typename L> void f(T1 & t1, SubA<L> & t2) { }
+ template<typename U> void g(SubA<U> & suba) { }
+ template<typename U> void h(SubA<U> & suba) { }
+};
+
+int main(void) {
+ int i;
+ A<int> a;
+ A<int>::SubA<int> suba;
+
+ a.f(i,suba);
+ a.g(suba);
+ a.h(suba);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member4.C
new file mode 100644
index 000000000..290fbb566
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member4.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Contributed by Matty T. <mattyt-bugzilla at tpg dot com dot au>
+// PR c++/13813 [DR206]: Check semantic constraints of members of
+// non-dependent type at instantiation time.
+
+
+// DR206 explains that this is ill-formed, no diagnostic required. We emit
+// a diagnostic instead.
+class E;
+template < class A > class Z {
+ A a;
+ E e; // { dg-error "incomplete type" }
+};
+
+
+// Nested classes are always dependent names.
+template < class A > class Y {
+ class F;
+ F e; // { dg-bogus "" "nested classes are always dependent, see DR108 and DR224" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member5.C
new file mode 100644
index 000000000..0cdd52aea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member5.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+// Contributed by: <fasbjx at free dot fr>
+// PR c++/14389: Disambiguate overloaded member templates which differ only
+// in the template argument list.
+
+namespace N1 {
+
+struct S {
+ template< typename B, typename A > void foo();
+ template< typename A > void foo();
+};
+
+template< typename A > void S::foo() {}
+template< typename B, typename A > void S::foo() {}
+
+template void S::foo<void> ();
+template void S::foo<void,void> ();
+
+}
+
+namespace N2 {
+
+struct S {
+ template< typename _A > void foo();
+ template< int _i > void foo();
+};
+
+template< typename _A > void S::foo() {}
+
+template void S::foo< 0 >(); // { dg-error "no definition available" "no def" }
+ // { dg-message "required" "instantiated" { target *-*-* } 30 }
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member6.C
new file mode 100644
index 000000000..7d66e7bda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member6.C
@@ -0,0 +1,16 @@
+// PR c++/29105
+
+struct Observer
+{
+ template < typename T > void observeComponent ();
+};
+
+template < typename T >
+struct TagFilter : Observer
+{
+ TagFilter ()
+ {
+ observeComponent < int > ();
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member7.C
new file mode 100644
index 000000000..1c75e4956
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member7.C
@@ -0,0 +1,15 @@
+// PR c++/29080
+
+struct Base {
+ template<class C> void method() { }
+};
+
+struct Left : public Base { };
+struct Right : public Base { };
+struct Join : public Left, public Right { };
+
+void function()
+{
+ Join join;
+ join.Left::method<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member8.C
new file mode 100644
index 000000000..074c65543
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member8.C
@@ -0,0 +1,25 @@
+// PR c++/35138
+// { dg-do compile }
+
+namespace N1 { struct A { }; }
+namespace N2 { struct A { }; }
+using namespace N1;
+using namespace N2;
+
+template <typename T> int
+foo (T const &t)
+{
+ return t.A;
+}
+
+struct B
+{
+ int A;
+};
+
+int
+main ()
+{
+ B b;
+ foo (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/member9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/member9.C
new file mode 100644
index 000000000..f15272db7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/member9.C
@@ -0,0 +1,21 @@
+// Origin PR c++/48838
+// { dg-do compile }
+
+class DUChainItemSystem
+{
+public:
+
+ template<class T>
+ void registerTypeClass();
+
+ static DUChainItemSystem& self();
+};
+
+template<class T>
+struct DUChainItemRegistrator
+{
+ DUChainItemRegistrator()
+ {
+ DUChainItemSystem::self().registerTypeClass<T>();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memclass1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass1.C
new file mode 100644
index 000000000..c49ed724d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10555: ICE for member class template when one of the
+// template argument levels contains errors.
+
+template <typename> struct A
+{
+ template <typename> struct B;
+};
+
+template <typename T> struct C
+{
+ typedef typename A<T>::template B<U> X; // { dg-error "declared|invalid" }
+};
+
+C<void> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memclass2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass2.C
new file mode 100644
index 000000000..da79d6afe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass2.C
@@ -0,0 +1,20 @@
+namespace ns {
+ template<typename T>
+ struct Foo {
+ template<typename U> struct Bar;
+ };
+
+ template<typename T>
+ template<typename U>
+ struct Foo<T>::Bar {
+ template<typename V> struct Baz;
+ };
+
+ template<typename T>
+ template<typename U>
+ template<typename V>
+ struct Foo<T>::Bar<U>::Baz {
+ Foo<T> chokes;
+ ns::Foo<T> works;
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memclass3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass3.C
new file mode 100644
index 000000000..8230b94e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass3.C
@@ -0,0 +1,39 @@
+// PR c++/17132
+
+template <typename T>
+struct has_deref
+{
+ struct impl
+ {
+ template <
+ typename Type,
+ typename Type::reference (Type::*Func)(void) const>
+ struct func_tag;
+
+ template <typename Type>
+ static char (& test(
+ Type *,
+ func_tag<Type, &Type::operator*> * = 0
+ ))[2];
+ static char test(void *);
+ };
+
+ static const bool value = (sizeof(impl::test((T *) 0)) == 2);
+};
+
+template <typename T>
+struct container
+{
+ struct iterator
+ {
+ typedef T & reference;
+ reference operator*() const;
+ };
+};
+
+int main()
+{
+ typedef container<int>::iterator iter;
+ int result = has_deref<iter>::value;
+ return result;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memclass4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass4.C
new file mode 100644
index 000000000..65a42a4c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass4.C
@@ -0,0 +1,70 @@
+// Origin: PR c++/42824
+// { dg-do compile }
+
+template<int T>
+class int_ {
+};
+
+template<int T, int T2>
+class Unit {
+public:
+ Unit(const Unit<T, T2>& other) {}
+};
+
+template<int T>
+class Quan {
+public:
+ Quan(void) {}
+
+ template<int T2>
+ Quan(double value, Unit<T, T2> unit) {}
+};
+typedef Quan<0> Scalar;
+
+template<int T>
+class hlp {
+public:
+ typedef Quan<T> type;
+};
+
+class Mtrl {
+public:
+ template<int T>
+ struct AssoType {
+ typedef typename hlp<T>::type type;
+ };
+};
+
+template<class T>
+class Eval {
+public:
+ Eval(const T& object){}
+
+ template<int V>
+ void eval() {
+ eval<V> (int_<0>());
+ }
+private:
+ template<typename U> struct Wrap {};
+
+ template<int V, int V2>
+ void value(Wrap<Quan<V2> >) {}
+
+ template<int V>
+ void value(Wrap<Scalar>) {}
+
+ template<int V>
+ void eval(int_<0>) {
+ typedef typename T::template AssoType<V>::type Type;
+ value<V>(Wrap<Type>());
+ }
+};
+
+class Foo {
+public:
+ static void eval(const Mtrl& mtrl) {
+ Eval<Mtrl> h(mtrl);
+ h.eval<0> ();
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memclass5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass5.C
new file mode 100644
index 000000000..eb32f13c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memclass5.C
@@ -0,0 +1,26 @@
+// PR c++/60241
+
+template <typename T>
+struct x
+{
+ template <typename U>
+ struct y
+ {
+ typedef T result2;
+ };
+
+ typedef y<int> zy;
+};
+
+template<>
+template<class T>
+struct x<int>::y
+{
+ typedef double result2;
+};
+
+int main()
+{
+ x<int>::zy::result2 xxx;
+ x<int>::y<int>::result2 xxx2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend1.C
new file mode 100644
index 000000000..f4541279c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend1.C
@@ -0,0 +1,54 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function of class template as friend
+
+template<class T> struct A
+{
+ void f();
+};
+
+class C {
+ int i;
+ template<class T> friend void A<T>::f();
+};
+
+template<class T> struct A<T*>
+{
+ void f();
+};
+
+template<> struct A<char>
+{
+ void f();
+};
+
+template<class T> void A<T>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template<class T> void A<T*>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+void A<char>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int> a1;
+ a1.f();
+ A<int *> a2;
+ a2.f();
+ A<char> a3;
+ a3.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend10.C
new file mode 100644
index 000000000..4fe760af2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend10.C
@@ -0,0 +1,71 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class template of class template as friend
+
+template <class T> struct A
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+class C {
+ int i;
+ template <class T> template <class U> friend struct A<T>::B;
+};
+
+template <class T> struct A<T*>
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+template <> struct A<char>
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+template <class T> template <class U> void A<T>::B<U>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <class T> template <class U> void A<T*>::B<U>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <class U> void A<char>::B<U>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <> void A<char>::B<int>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int>::B<int> b1;
+ b1.f();
+ A<int *>::B<int> b2;
+ b2.f();
+ A<char>::B<char> b3;
+ b3.f();
+ A<char>::B<int> b4;
+ b4.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend11.C
new file mode 100644
index 000000000..e33e99bdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend11.C
@@ -0,0 +1,73 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class template of class template as friend
+
+template<class T> struct A
+{
+ template <T t> struct B
+ {
+ void f();
+ };
+};
+
+class C {
+ int i;
+ template<class T> template <T t> friend struct A<T>::B;
+};
+
+template<class T> struct A<T*>
+{
+ template <T* t> struct B
+ {
+ void f();
+ };
+};
+
+template<> struct A<char>
+{
+ template <char t> struct B
+ {
+ void f();
+ };
+};
+
+template<class T> template <T t> void A<T>::B<t>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template<class T> template <T* t> void A<T*>::B<t>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <char t> void A<char>::B<t>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <> void A<char>::B<'b'>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+int d2 = 0;
+
+int main()
+{
+ A<int>::B<0> b1;
+ b1.f();
+ A<int *>::B<&d2> b2;
+ b2.f();
+ A<char>::B<'a'> b3;
+ b3.f();
+ A<char>::B<'b'> b4;
+ b4.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend12.C
new file mode 100644
index 000000000..77f821400
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend12.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class of class template as friend
+
+template<class T> struct A
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+template <class U> class C {
+ int i;
+ template<class T> friend struct A<T>::B;
+};
+
+template<class T> struct A<T*>
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+template<> struct A<char>
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+template<class T> void A<T>::B::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template<class T> void A<T*>::B::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+void A<char>::B::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int>::B b1;
+ b1.f();
+ A<int *>::B b2;
+ b2.f();
+ A<char>::B b3;
+ b3.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend13.C
new file mode 100644
index 000000000..7faed22a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend13.C
@@ -0,0 +1,71 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class template of class template as friend
+
+template <class T> struct A
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+template <class V> class C {
+ int i;
+ template <class T> template <class U> friend struct A<T>::B;
+};
+
+template <class T> struct A<T*>
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+template <> struct A<char>
+{
+ template <class U> struct B
+ {
+ void f();
+ };
+};
+
+template <class T> template <class U> void A<T>::B<U>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template <class T> template <class U> void A<T*>::B<U>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template <class U> void A<char>::B<U>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template <> void A<char>::B<int>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int>::B<int> b1;
+ b1.f();
+ A<int *>::B<int> b2;
+ b2.f();
+ A<char>::B<char> b3;
+ b3.f();
+ A<char>::B<int> b4;
+ b4.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend14.C
new file mode 100644
index 000000000..298c55811
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend14.C
@@ -0,0 +1,73 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class template of class template as friend
+
+template<class T> struct A
+{
+ template <T t> struct B
+ {
+ void f();
+ };
+};
+
+template <class U> class C {
+ int i;
+ template<class T> template <T t> friend struct A<T>::B;
+};
+
+template<class T> struct A<T*>
+{
+ template <T* t> struct B
+ {
+ void f();
+ };
+};
+
+template<> struct A<char>
+{
+ template <char t> struct B
+ {
+ void f();
+ };
+};
+
+template<class T> template <T t> void A<T>::B<t>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template<class T> template <T* t> void A<T*>::B<t>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template <char t> void A<char>::B<t>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+template <> void A<char>::B<'b'>::f()
+{
+ C<int> c;
+ c.i = 0;
+}
+
+int d2 = 0;
+
+int main()
+{
+ A<int>::B<0> b1;
+ b1.f();
+ A<int *>::B<&d2> b2;
+ b2.f();
+ A<char>::B<'a'> b3;
+ b3.f();
+ A<char>::B<'b'> b4;
+ b4.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend15.C
new file mode 100644
index 000000000..a620c3b15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend15.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class of class template as friend
+
+template<class T> struct A
+{
+ struct B1
+ {
+ };
+ struct B2
+ {
+ void f();
+ };
+};
+
+class C {
+ int i; // { dg-error "private" }
+ template<class T> friend struct A<T>::B1;
+};
+
+template<class T> void A<T>::B2::f()
+{
+ C c;
+ c.i = 0; // { dg-error "context" }
+}
+
+int main()
+{
+ A<int>::B2 b1;
+ b1.f(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend16.C
new file mode 100644
index 000000000..1276970e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend16.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class of class template as friend
+
+template<class T> struct A
+{
+ template <class U> struct B1
+ {
+ };
+ template <class U> struct B2
+ {
+ void f();
+ };
+};
+
+class C {
+ int i; // { dg-error "private" }
+ template<class T> template <class U> friend struct A<T>::B1;
+};
+
+template<class T> template <class U> void A<T>::B2<U>::f()
+{
+ C c;
+ c.i = 0; // { dg-error "context" }
+}
+
+int main()
+{
+ A<int>::B2<int> b1;
+ b1.f(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend17.C
new file mode 100644
index 000000000..5f4b8e7b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend17.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/13495: Nested class as template friend.
+
+template<typename T>
+class A{
+public:
+ class B
+ {
+ void func1(void);
+ void func2(void);
+ };
+};
+
+template<typename Q>
+class F1
+{
+ friend class A<Q>::B;
+ enum { foo = 0 }; // { dg-error "private" }
+};
+
+template<typename Q>
+class F2
+{
+ template<typename T>
+ friend class A<T>::B;
+ enum { foo = 0 };
+};
+
+template <typename T>
+void A<T>::B::func1(void)
+{
+ (void)F1<T>::foo;
+ (void)F2<T>::foo;
+}
+
+template <typename T>
+void A<T>::B::func2(void)
+{
+ (void)F1<T*>::foo; // { dg-error "context" }
+ (void)F2<T*>::foo;
+}
+
+template class A<int>; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend2.C
new file mode 100644
index 000000000..364ad7d78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend2.C
@@ -0,0 +1,61 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function template of class template as friend
+
+template <class T> struct A
+{
+ template <class U> void f();
+};
+
+class C {
+ int i;
+ template <class T> template <class U> friend void A<T>::f();
+};
+
+template <class T> struct A<T*>
+{
+ template <class U> void f();
+};
+
+template <> struct A<char>
+{
+ template <class U> void f();
+};
+
+template <class T> template <class U> void A<T>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <class T> template <class U> void A<T*>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <class U> void A<char>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <> void A<char>::f<int>()
+{
+ C c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int> a1;
+ a1.f<char>();
+ A<int *> a2;
+ a2.f<char>();
+ A<char> a3;
+ a3.f<char>();
+ a3.f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend3.C
new file mode 100644
index 000000000..3ea8c84cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend3.C
@@ -0,0 +1,55 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function of class template as friend
+
+template<class T> struct A
+{
+ void f(T);
+};
+
+class C {
+ int i;
+ template<class T> friend void A<T>::f(T);
+};
+
+template<class T> struct A<T*>
+{
+ void f(T*);
+};
+
+template<> struct A<char>
+{
+ void f(char);
+};
+
+template<class T> void A<T>::f(T)
+{
+ C c;
+ c.i = 0;
+}
+
+template<class T> void A<T*>::f(T*)
+{
+ C c;
+ c.i = 0;
+}
+
+void A<char>::f(char)
+{
+ C c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int> a1;
+ a1.f(0);
+ A<int *> a2;
+ int *p = 0;
+ a2.f(p);
+ A<char> a3;
+ a3.f('a');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend4.C
new file mode 100644
index 000000000..5c006fe84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend4.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function of class template as friend
+
+template<class T> struct A
+{
+ template <T t> void f();
+};
+
+class C {
+ int i;
+ template<class T> template <T t> friend void A<T>::f();
+};
+
+template<class T> struct A<T*>
+{
+ template <T* t> void f();
+};
+
+template<> struct A<char>
+{
+ template <char t> void f();
+};
+
+template<class T> template <T t> void A<T>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template<class T> template <T* t> void A<T*>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <char t> void A<char>::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template <> void A<char>::f<'b'>()
+{
+ C c;
+ c.i = 0;
+}
+
+int d2 = 0;
+
+int main()
+{
+ A<int> a1;
+ a1.f<0>();
+ A<int *> a2;
+ a2.f<&d2>();
+ A<char> a3;
+ a3.f<'a'>();
+ a3.f<'b'>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend5.C
new file mode 100644
index 000000000..38c2fb93f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend5.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member template function of member class template as friend
+
+template <class T> struct A {
+ template <class U> struct B {
+ template <class V> void f(V);
+ };
+};
+
+class X {
+ int i;
+ template <class T> template <class U> template <class V>
+ friend void A<T>::B<U>::f(V);
+};
+
+template <class T> template <class U> template <class V>
+ void A<T>::B<U>::f(V)
+{
+ X x;
+ x.i = 0;
+}
+
+int main()
+{
+ A<char>::B<char> a1;
+ a1.f(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend6.C
new file mode 100644
index 000000000..5f82339af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend6.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function of class template as friend
+// Erroneous case: mismatch during declaration
+
+template <class T> struct A {
+ template <class U> void f(U); // { dg-error "candidate" }
+ void g(); // { dg-error "candidate|with" }
+ void h(); // { dg-error "candidate|with" }
+ void i(int); // { dg-error "candidate" }
+};
+
+class C {
+ int ii;
+ template <class U> friend void A<U>::f(U); // { dg-error "not match" }
+ template <class U> template <class V>
+ friend void A<U>::g(); // { dg-error "not match|cannot be overloaded" }
+ template <class U> friend int A<U>::h(); // { dg-error "not match|cannot be overloaded" }
+ template <class U> friend void A<U>::i(char); // { dg-error "not match" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend7.C
new file mode 100644
index 000000000..26ca6d8e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend7.C
@@ -0,0 +1,133 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Member function of class template as friend
+// Erroneous case: mismatch during specialization
+
+template <class T> struct A {
+ template <class U> void f(U);
+ void g();
+ void h();
+ void i(int);
+ template <T t> void j();
+};
+
+class C {
+ int ii; // { dg-error "private" }
+ template <class U> template <class V>
+ friend void A<U>::f(V);
+ template <class U> friend void A<U>::g();
+ template <class U> friend void A<U>::h();
+ template <class U> friend void A<U>::i(int);
+ template <class U> template <U t>
+ friend void A<U>::j();
+};
+
+template <class T> struct A<T*> {
+ void f(int);
+ template <class U> void g();
+ int h();
+ void i(char);
+ template <int> void j();
+};
+
+template <class T> void A<T*>::f(int)
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <class T> template <class U> void A<T*>::g()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <class T> int A<T*>::h()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <class T> void A<T*>::i(char)
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <class T> template <int> void A<T*>::j()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <> struct A<char> {
+ void f(int);
+ template <class U> void g();
+ int h();
+ void i(char);
+ template <int> void j();
+};
+
+void A<char>::f(int)
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <class U> void A<char>::g()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <> void A<char>::g<int>()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+int A<char>::h()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+void A<char>::i(char)
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <int> void A<char>::j()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+template <> void A<char>::j<0>()
+{
+ C c;
+ c.ii = 0; // { dg-error "context" }
+}
+
+int main()
+{
+ A<int *> a1;
+ a1.f(0); // { dg-message "required" }
+ a1.g<char>(); // { dg-message "required" }
+ a1.g<int>(); // { dg-message "required" }
+ a1.h(); // { dg-message "required" }
+ a1.i('a'); // { dg-message "required" }
+ a1.j<1>(); // { dg-message "required" }
+ A<char> a2;
+ a2.f(0);
+ a2.g<char>(); // { dg-message "required" }
+ a2.g<int>();
+ a2.h();
+ a2.i('a');
+ a2.j<1>(); // { dg-message "required" }
+ a2.j<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend8.C
new file mode 100644
index 000000000..886096b9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend8.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Origin: Martin Sebor <sebor@roguewave.com>
+
+// PR c++/5369: Member function of class template as friend
+
+template <class T>
+struct S
+{
+ int foo () {
+ return S<int>::bar ();
+ }
+
+private:
+
+ template <class U>
+ friend int S<U>::foo ();
+
+ static int bar () { return 0; }
+};
+
+int main ()
+{
+ S<char>().foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend9.C
new file mode 100644
index 000000000..9c926013b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memfriend9.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Nested class of class template as friend
+
+template<class T> struct A
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+class C {
+ int i;
+ template<class T> friend struct A<T>::B;
+};
+
+template<class T> struct A<T*>
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+template<> struct A<char>
+{
+ struct B
+ {
+ void f();
+ };
+};
+
+template<class T> void A<T>::B::f()
+{
+ C c;
+ c.i = 0;
+}
+
+template<class T> void A<T*>::B::f()
+{
+ C c;
+ c.i = 0;
+}
+
+void A<char>::B::f()
+{
+ C c;
+ c.i = 0;
+}
+
+int main()
+{
+ A<int>::B b1;
+ b1.f();
+ A<int *>::B b2;
+ b2.f();
+ A<char>::B b3;
+ b3.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/meminit1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit1.C
new file mode 100644
index 000000000..1dc96c472
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit1.C
@@ -0,0 +1,8 @@
+// { dg-options "-std=gnu++98" }
+template <class T >
+struct S
+{
+ S() : S() {} // { dg-message "delegating constructors" }
+}; // { dg-error "delegates to itself" "" { target *-*-* } 5 }
+
+S<int> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/meminit2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit2.C
new file mode 100644
index 000000000..f6afa0151
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit2.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// Origin: Mark Anders <mark dot a dot anders at intel dot com>
+// PR c++/15503: disambiguators in base classes and mem-initializers
+
+template <typename K1> struct O {
+ template <typename K2> struct I {};
+};
+
+template <typename T>
+struct A : typename O<T>::template I<int> { // { dg-error "keyword 'typename' not allowed" }
+ A() : typename O<T>::template I<int>() // { dg-error "keyword 'typename' not allowed" }
+ {}
+};
+
+template <typename T>
+struct B : O<T>::template I<int> {
+ B() : O<T>::I<int>() // { dg-error "used as template|it is a template" "" }
+ {}
+};
+
+// { dg-bogus "end of input" "bogus token skipping in the parser" { xfail *-*-* } 17 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/meminit3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit3.C
new file mode 100644
index 000000000..b6824491f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/meminit3.C
@@ -0,0 +1,12 @@
+// PR c++/54744
+
+template <typename T>
+struct base {
+ typedef base base_type;
+};
+
+template <typename T>
+struct derived : base<T> {
+ typedef typename derived::base_type::base_type base_type;
+ derived() : base_type() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl1.C
new file mode 100644
index 000000000..260dbf8dc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl1.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com>
+
+// PR 11347. ICE in tsubst
+
+template <class T> struct T1 {
+ enum {N};
+};
+
+template<class T> struct T2 {
+ template <class S, bool Z = T1<S>::N + 1> struct B {};
+ struct C {};
+};
+
+T2<int> t;
+
+T2<int>::B<int> s;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl2.C
new file mode 100644
index 000000000..0c9dad647
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl2.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Sep 2003 <nathan@codesourcery.com>
+
+// PR c++/12332. ICE
+
+template <unsigned D> class TPL;
+
+template <typename T> struct X {
+ template <template <typename> class V>
+ V<TPL<V<int>::d> > operator () ();
+};
+
+void Foo (X<int> x) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl3.C
new file mode 100644
index 000000000..583155ea7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl3.C
@@ -0,0 +1,24 @@
+// PR c++/33239
+
+struct null_type;
+
+template<typename T1, typename T2>
+struct tuple_impl
+{
+ template<typename U>
+ struct append
+ {
+ typedef tuple_impl<U, null_type> type;
+ };
+
+ int data;
+};
+
+template<typename T1>
+class tuple
+: public tuple_impl<T1, null_type>::template append<T1>::type
+{
+ using tuple_impl<T1, null_type>::template append<T1>::type::data;
+};
+
+tuple<int> my_tuple;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl4.C
new file mode 100644
index 000000000..54558b980
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/memtmpl4.C
@@ -0,0 +1,10 @@
+// PR c++/53492
+
+template<typename T> struct A
+{
+ template<typename U> struct B;
+};
+
+template <> template<class T> struct A<T>::B { }; // { dg-error "expected 2 levels" }
+
+A<int>::B<int> b; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nested1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nested1.C
new file mode 100644
index 000000000..ed2028b3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nested1.C
@@ -0,0 +1,15 @@
+/* PR c++/4633 */
+/* { dg-do compile } */
+
+// The 'class X' inside the template used to escape (somehow),
+// so that the typedef claimed that it was redefining X.
+
+template <typename T> struct S ;
+
+template <> struct S<float>
+{
+ template <class, class> struct R;
+ template <class X> struct R<X, X> { };
+
+ typedef int X;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nested2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nested2.C
new file mode 100644
index 000000000..be4f95f71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nested2.C
@@ -0,0 +1,9 @@
+template <class T> class CO {
+ class CI1 {
+ class CI2;
+ };
+};
+
+template <class T>
+class CO<T>::CI1::CI2 {};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nested3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nested3.C
new file mode 100644
index 000000000..5dcbf1961
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nested3.C
@@ -0,0 +1,30 @@
+template <class T1, class T2>
+class A {
+ template <class S>
+ class SubA {
+ int _k;
+ };
+ T1 _t1;
+ T2 _t2;
+};
+
+template <class U>
+class B {
+ class SubB1 {
+ B _i;
+ };
+
+ class SubB2 {
+ int _j;
+ };
+ A<U,SubB1>::SubA<SubB2> _a; // { dg-error "not a base type" "not base" }
+ // { dg-message "note" "note" { target *-*-* } 20 }
+ // { dg-error "non-template" "non-template" { target *-*-* } 20 }
+};
+
+
+int main() {
+ B<char> objB;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nested4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nested4.C
new file mode 100644
index 000000000..6e5b99b46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nested4.C
@@ -0,0 +1,10 @@
+template <typename T> struct A {
+ template<typename S> struct B { typedef A<S> X; };
+
+};
+
+template<typename> void f() {
+ typedef A<int>::B<double>::X X;
+}
+
+template void f<int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nested5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nested5.C
new file mode 100644
index 000000000..3850fdace
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nested5.C
@@ -0,0 +1,19 @@
+// PR c++/33959
+
+template <typename T> struct A
+{
+ struct C
+ {
+ template <typename U> struct D {};
+ };
+ template <typename S> static C::D<S> bar (S const &);
+};
+
+struct E {};
+
+int
+main ()
+{
+ E e;
+ A<E>::bar (e);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new1.C
new file mode 100644
index 000000000..63ee2f924
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new1.C
@@ -0,0 +1,45 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18318. ICE with template new[]
+// Origin:Elliot Hughes <enh@jessies.org>
+// Andrew Pinski <pinskia@gcc.gnu.org>
+
+struct Aint
+{
+ ~Aint ();
+ Aint ();
+};
+
+Aint::Aint () {}
+Aint::~Aint () {}
+
+static int count;
+
+template <class T>
+struct A
+{
+ unsigned Blksize() const;
+
+ void f()
+ {
+ new T[Blksize()];
+ }
+};
+
+template <class T> unsigned A<T>::Blksize () const
+{
+ count++;
+ return 1;
+}
+
+int main ()
+{
+ A<Aint> a;
+ a.f();
+
+ return count != 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new10.C
new file mode 100644
index 000000000..98293ba5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new10.C
@@ -0,0 +1,23 @@
+// PR c++/46658
+
+typedef unsigned short int uint16_t;
+typedef unsigned int uint32_t;
+template<class T> class scoped_array {
+ void reset(T * p = 0) { }
+};
+typedef uint16_t SequenceIndex;
+typedef uint32_t SequenceMapIndex;
+class Analyzer {
+ template <typename READER>
+ bool ReadDictionary( READER& reader );
+ scoped_array<SequenceIndex> map_from_2_hints_to_composite_sequence;
+ SequenceMapIndex number_of_composite_sequences;
+};
+template <typename READER>
+bool Analyzer::ReadDictionary( READER &reader )
+{
+ const SequenceMapIndex ntt
+ = ( number_of_composite_sequences + SequenceMapIndex( 1 ) )
+ * ( number_of_composite_sequences + 1 );
+ map_from_2_hints_to_composite_sequence.reset(new SequenceIndex[ntt]());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new11.C
new file mode 100644
index 000000000..76f6c6699
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new11.C
@@ -0,0 +1,28 @@
+// PR c++/54984
+// { dg-do run }
+
+int n = 1;
+
+void* operator new(__SIZE_TYPE__)
+{
+ n = -1;
+ return &n;
+}
+
+template <class T>
+struct Foo
+{
+ Foo()
+ : x(new int)
+ {
+ if (*x != -1)
+ __builtin_abort();
+ }
+
+ int* x;
+};
+
+int main()
+{
+ Foo<float> foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new12.C
new file mode 100644
index 000000000..84eedf8ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new12.C
@@ -0,0 +1,12 @@
+// PR c++/48500
+
+struct linked_ptr {
+};
+template <typename T> linked_ptr make_linked_ptr(T* ptr);
+struct Concrete;
+struct NewedClass {
+ NewedClass(const Concrete& req){}
+};
+template<typename ArgT> void AddObjToChange(const ArgT& req) {
+ linked_ptr p = make_linked_ptr(new NewedClass(req));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new2.C
new file mode 100644
index 000000000..682ca6e18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new2.C
@@ -0,0 +1,14 @@
+// PR c++/21336
+
+typedef __SIZE_TYPE__ size_t;
+template<class _T> void* operator new( size_t Size, _T&);
+struct B {
+ int a;
+ int* m() {
+ return new(a) int;
+ }
+};
+B* n() {
+ return new B();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new3.C
new file mode 100644
index 000000000..230330ec6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new3.C
@@ -0,0 +1,18 @@
+extern void *operator new(__SIZE_TYPE__); // { dg-message "note" }
+
+template <class T >
+struct C
+{
+ void f() {
+ int* node;
+ new (&node) int(0); // { dg-error "new" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+ }
+};
+
+void* operator new(__SIZE_TYPE__, void* __p);
+
+void g() {
+ C<int> c;
+ c.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new4.C
new file mode 100644
index 000000000..bf6f06100
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new4.C
@@ -0,0 +1,8 @@
+// PR c++/27559
+// { dg-do compile }
+
+struct A
+{
+ template<typename T>
+ static void* operator new(T) {} // { dg-error "first parameter|invalid template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new5.C
new file mode 100644
index 000000000..a2c560181
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new5.C
@@ -0,0 +1,9 @@
+// PR c++/27210
+
+template <class foo> class junk {
+ void bar(int a)
+ {
+ unsigned char *c = new unsigned char[a*sizeof(foo)];
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new6.C
new file mode 100644
index 000000000..4db068512
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new6.C
@@ -0,0 +1,7 @@
+// PR c++/27713
+// { dg-do compile }
+
+struct A
+{
+ template<int> friend void* operator new(__SIZE_TYPE__); // { dg-error "invalid template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new7.C
new file mode 100644
index 000000000..dcf8a8e59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new7.C
@@ -0,0 +1,9 @@
+// PR c++/27714
+
+template<typename> struct A
+{
+ static void* operator new(__SIZE_TYPE__);
+ template<typename T> friend void* A<T>::operator new(__SIZE_TYPE__);
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new8.C
new file mode 100644
index 000000000..b8f3f97e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new8.C
@@ -0,0 +1,29 @@
+// PR c++/34336
+// { dg-do compile }
+
+struct A;
+
+template <class T>
+struct S
+{
+ T *m;
+ T &operator* () { return *m; }
+};
+
+struct B
+{
+ B (const A &);
+};
+
+template <class T>
+struct C
+{
+ C ();
+ S<A> c;
+};
+
+template <class T>
+C<T>::C ()
+{
+ B *b = new B (*c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/new9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/new9.C
new file mode 100644
index 000000000..24e40ee23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/new9.C
@@ -0,0 +1,16 @@
+// PR c++/46277
+
+class ggRGBE {
+public:
+ ggRGBE();
+};
+template <class T> class ggIO
+{
+ void readbody(int);
+ ggRGBE *scanline;
+};
+template <class T> void
+ggIO<T>::readbody(int width)
+{
+ scanline = new ggRGBE[width];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-const1.C
new file mode 100644
index 000000000..16a385188
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-const1.C
@@ -0,0 +1,8 @@
+// PR c++/48015
+
+template <typename T> T f(T);
+template <typename T> void g()
+{
+ int const c = f (1);
+ int i = c - 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-deducible1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-deducible1.C
new file mode 100644
index 000000000..421352489
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-deducible1.C
@@ -0,0 +1,8 @@
+// PR c++/23055
+
+template <class> struct S { typedef int type; };
+
+template <class T>
+int foo(T, typename S<T>::type * ret);
+
+int j = foo(1, 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent1.C
new file mode 100644
index 000000000..3fe5c33d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent1.C
@@ -0,0 +1,21 @@
+//PR c++/8222
+// Origin: giovannibajo@libero.it and setzersn@gmx.de
+
+// { dg-do run }
+
+struct Foo
+{
+ template <class>
+ void func() {}
+};
+template <class>
+void Bar(Foo* p)
+{
+ p->func<int>();
+}
+
+int main()
+{
+ Foo c;
+ Bar<int>(&c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent10.C
new file mode 100644
index 000000000..1891cad30
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent10.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Detecting overloading function error during parsing
+
+struct S
+{
+ int f(char);
+ int f(int);
+};
+
+template<int (S::*p)()>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::f> x; // { dg-error "convert|no matches" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent11.C
new file mode 100644
index 000000000..dff5b909d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent11.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: Jakub Jelinek <jakub@gcc.gnu.org>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/19311: Non-dependent address to member as function argument.
+
+template <class R, class T> void foo (R (T::*x) ());
+template <class R, class T, class C> void foo (R (T::*x) (C));
+
+template<int> struct I {
+ int o ();
+ int o () const;
+};
+
+template <int> void bar (void) {
+ foo <int, I<1> > (&I<1>::o);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent12.C
new file mode 100644
index 000000000..73d7e9497
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent12.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Mar 2005 <nathan@codesourcery.com>
+
+// PR 20186: ICE
+// Origin: Jan Dvorak <jan.dvorak@kraxnet.cz>
+
+template<typename T> void foo(T &t)
+{
+ int i = static_cast<int>(t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent13.C
new file mode 100644
index 000000000..9e69948ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent13.C
@@ -0,0 +1,11 @@
+// PR c++/26266
+
+template <int I>
+struct S;
+
+template <int I>
+void f() {
+ if (const int i = 3) {
+ S<i>::j; // { dg-error "incomplete" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent2.C
new file mode 100644
index 000000000..3b073b47a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent2.C
@@ -0,0 +1,16 @@
+//PR c++/11070
+// Used to ICE
+// Origin: bangerth@dealii.org and rwgk@yahoo.com
+
+template <bool b> struct X {
+ template <typename T>
+ static int* execute(int* x) { return x; }
+};
+
+template <typename T> void foo() {
+ static bool const same = true;
+ X<same>::execute<int> (0);
+}
+
+template void foo<int> ();
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent3.C
new file mode 100644
index 000000000..ce18bf243
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent3.C
@@ -0,0 +1,15 @@
+//PR c++/11071
+// Used to ICE
+// Origin: bangerth@dealii.org and rwgk@yahoo.com
+
+template <bool b> struct X {
+ template <typename T>
+ static int* execute(T* x) { return x; }
+};
+
+template <typename T> void foo() {
+ static bool const same = true;
+ X<same>::execute ((int*)0);
+}
+
+template void foo<int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent4.C
new file mode 100644
index 000000000..ff3a6eb2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent4.C
@@ -0,0 +1,4 @@
+int temp(const char *temp);
+
+template <int> int g() { return temp("Hi"); }
+int g1() { return temp("Hi"); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent5.C
new file mode 100644
index 000000000..bd6ce6b47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent5.C
@@ -0,0 +1,8 @@
+// PR c++/15299
+
+template <class T> void fun_ptr(T (*)());
+template <class T> T bar();
+
+template <class> void foo () {
+ fun_ptr(bar<int>);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent6.C
new file mode 100644
index 000000000..0959a3de9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent6.C
@@ -0,0 +1,13 @@
+// PR c++/15285
+
+void foo(void (*func)()) {}
+
+template<typename T>
+void bar()
+{}
+
+template<typename T>
+void baz()
+{
+ foo(&bar<long>);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent7.C
new file mode 100644
index 000000000..ee34327ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent7.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/13092: ICE taking address of member which is non-dependent
+
+struct S
+{
+ int i;
+};
+
+template<int S::*p>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::i> x;
+};
+
+template struct Foo<void>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent8.C
new file mode 100644
index 000000000..369e13731
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent8.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Detecting error during parsing
+
+struct S
+{
+ char i;
+};
+
+template<int S::*p>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::i> x; // { dg-error "convert|no type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent9.C
new file mode 100644
index 000000000..c046312d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent9.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Overloading function
+
+struct S
+{
+ int f();
+ int f(int);
+};
+
+template<int (S::*p)()>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::f> x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C
new file mode 100644
index 000000000..99b00ccb8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C
@@ -0,0 +1,12 @@
+struct A { static const bool b=false; };
+
+struct B { typedef A X; };
+
+template <bool> struct C {};
+
+template <typename T> struct D
+{
+ C<T::X> c; // { dg-error "parsed as a non-type|if a type is meant" }
+};
+
+D<B> d; // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-type1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-type1.C
new file mode 100644
index 000000000..70e81d362
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-type1.C
@@ -0,0 +1,49 @@
+// PR c++/4377
+
+template < int I1, int I2 >
+class unit
+{
+public:
+ typedef unit<I1,I2> my_type;
+
+ unit() {}
+ unit( const unit<I1,I2>& ) {}
+
+ template< int Q1, int Q2 >
+ unit< I1 + Q1, I2 + Q2 > operator * ( const unit< Q1, Q2 >& rhs ) const {
+ return unit< I1 + Q1, I2 + Q2 >();
+ }
+
+ template< int Q1, int Q2 >
+ unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const {
+ return unit< I1 - Q1, I2 - Q2 >();
+ }
+};
+
+// specialization added to first test
+//
+template <>
+class unit<0,0> {
+public:
+ typedef unit<0,0> my_type;
+
+ unit() {}
+
+ friend unit<0,0> operator*( const unit<0,0>& lhs, const unit<0,0>& rhs ) {
+ return unit<0,0>();
+ }
+ friend unit<0,0> operator/( const unit<0,0>& lhs, const unit<0,0>& rhs ) {
+ return unit<0,0>();
+ }
+
+};
+
+
+int main()
+{
+ const unit<1,0> u1;
+ const unit<2,0> u2;
+
+ unit<-1,0> u3( u1 / u2 );
+ unit< 3,0> u4( u1 * u2 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype1.C
new file mode 100644
index 000000000..834a36a26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype1.C
@@ -0,0 +1,5 @@
+// PR c++/4934
+// dump_expr didn't know how to deal with a CONVERT_EXPR with no type.
+
+template<unsigned> struct A {};
+template<typename T> struct B { A<sizeof(+int())> a; };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype10.C
new file mode 100644
index 000000000..83ac8e302
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype10.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+#include <cstddef>
+
+template <int T> struct A {};
+template <void* T> struct B {};
+
+A<NULL> a; // { dg-warning "NULL" }
+B<NULL> b; // { dg-error "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype11.C
new file mode 100644
index 000000000..d52eb9a38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype11.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// Origin: <fsm at robots dot ox dot ac dot uk>
+// PR c++/18354: Unary plus should not be wrapped in NON_LVALUE_EXPR
+
+template <int N>
+struct X { };
+
+const int n = 1;
+
+void f()
+{
+ X< 1> a;
+ X<-1> b;
+ X<+1> c;
+}
+
+void g()
+{
+ X< n> a;
+ X<-n> b;
+ X<+n> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype12.C
new file mode 100644
index 000000000..b4bb41d10
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype12.C
@@ -0,0 +1,35 @@
+// PR c++/20172
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+template<typename T> struct A
+{
+ template<T> int foo(); // { dg-error "double" }
+ template<template<T> class> int bar(); // { dg-error "double" }
+ template<T> struct X; // { dg-error "double" }
+};
+
+A<char> a1;
+A<double> a2; // { dg-message "required" }
+
+template<typename T> struct B
+{
+ template<double> int foo(); // { dg-error "double" }
+ template<template<double> class> int bar(); // { dg-error "double" }
+ template<double> struct X; // { dg-error "double" }
+};
+
+template<void> int foo(); // { dg-error "void" }
+template<template<void> class> int bar(); // { dg-error "void" }
+template<void> struct X; // { dg-error "void" }
+
+template<typename T> struct C
+{
+ template<T> int foo(); // { dg-error "double" }
+};
+
+template<typename T> int baz(T) { C<T> c; } // { dg-message "required" }
+
+void foobar()
+{
+ baz(1.2); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype13.C
new file mode 100644
index 000000000..d604da944
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype13.C
@@ -0,0 +1,29 @@
+// PR c++/19004
+
+template<typename T>
+struct Dummy
+{
+ void evil()
+ {
+ this->template tester<true>();
+ }
+
+ template<bool B>
+ void tester()
+ {
+ bar<evil>()(); // { dg-error "constant|template" }
+ }
+ template<bool B>
+ struct bar
+ {
+ void operator()()
+ { }
+ };
+};
+
+int main()
+{
+ Dummy<int> d;
+ d.tester<true> (); // { dg-message "required" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype14.C
new file mode 100644
index 000000000..93338512b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype14.C
@@ -0,0 +1,13 @@
+// PR c++/23789
+
+template <int W> struct X {
+ template <int W2>
+ X< (W+(W&&W) > 1 ? W+(W&&W) : 1)+1>
+ operator + (const X<W2>&) const;
+};
+
+template <int dummy> void foo()
+{
+ X<6> A,B;
+ A + B;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype15.C
new file mode 100644
index 000000000..dd5f4e78a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype15.C
@@ -0,0 +1,20 @@
+struct foo {
+ typedef int (*fun)(int);
+
+ static int f(int); // overload between static & non-static
+ int f();
+
+ static int g(int); // non-overloaded static
+};
+
+template<foo::fun>
+struct f_obj {
+ // something ..
+};
+
+int foo::f() {
+ f_obj<f> f1;
+ f_obj<g> f2;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype16.C
new file mode 100644
index 000000000..36d1e9564
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype16.C
@@ -0,0 +1,9 @@
+//PR c++/27962
+
+template<int> struct A
+{
+ template<typename> void foo();
+};
+
+template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype17.C
new file mode 100644
index 000000000..f3a4480c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype17.C
@@ -0,0 +1,8 @@
+// PR c++/35282
+
+template<int> struct A
+{
+ template<int> void foo();
+};
+
+template<> template<int> void A<0>::foo() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype18.C
new file mode 100644
index 000000000..cbe0a1b5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype18.C
@@ -0,0 +1,8 @@
+// PR c++/28743
+
+template<int I> struct A
+{
+ template<typename T> void foo();
+};
+
+template<int I> template<typename T> void A<0>::foo() {} // { dg-error "template parameter" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype19.C
new file mode 100644
index 000000000..1df78b3b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype19.C
@@ -0,0 +1,19 @@
+// PR c++/42466
+
+template<class IntT, IntT X>
+struct A
+{
+ A();
+
+ template<IntT X2>
+ A(const A<IntT, X2>& other);
+};
+
+int main(int argc, char** argv)
+{
+ A<int, 42> a;
+ A<int, 100> b = a;
+
+ A<unsigned, 42u> c;
+ A<unsigned, 100u> d = c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype2.C
new file mode 100644
index 000000000..fe7e71537
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype2.C
@@ -0,0 +1,11 @@
+template <bool> struct A {};
+
+template <bool> struct B
+{
+ void foo()
+ {
+ const int i=0;
+ typedef A< i<=1 > C;
+ typedef A< i<=2 > C;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype20.C
new file mode 100644
index 000000000..e4aba3227
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype20.C
@@ -0,0 +1,11 @@
+// PR c++/48003
+// { dg-options "-fpermissive -w" }
+// Test that we allow integer overflow in constant exprs with -fpermissive
+
+template<int N>
+struct test
+{
+ typedef test<N - 1> prior;
+};
+
+test<-2147483647-1> f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype21.C
new file mode 100644
index 000000000..69cab54f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype21.C
@@ -0,0 +1,7 @@
+// PR c++/47705
+
+template<char const * const x> class Something { };
+
+extern char const xyz;
+
+class SomethingElse:public Something<xyz> { }; // { dg-error "xyz. is a variable" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype22.C
new file mode 100644
index 000000000..44d8479af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype22.C
@@ -0,0 +1,11 @@
+// PR c++/44629
+// The proper mangling is unclear.
+
+template<typename T> int cmp1(T a, T b);
+template<typename T, int (*cmp)(T, T) = cmp1> struct A { };
+template <typename T> void f (A<T> &);
+void g()
+{
+ A<char> a;
+ f(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype23.C
new file mode 100644
index 000000000..dfda4fe2e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype23.C
@@ -0,0 +1,9 @@
+// PR c++/48936
+
+template <bool C> int foo (void);
+template <class T> struct S
+{
+ static const unsigned int a = sizeof (T);
+ enum { c = sizeof (foo <(a == 0)> ()) };
+};
+S<int> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype24.C
new file mode 100644
index 000000000..57fbe430e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype24.C
@@ -0,0 +1,16 @@
+// PR c++/49808
+
+template <class X, X g>
+struct A
+{
+ A() { float r = g(0); }
+};
+
+struct f_t
+{
+ float operator() (float) const { return 1; }
+};
+
+f_t f;
+
+A<f_t&, f> x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype25.C
new file mode 100644
index 000000000..85393c1c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype25.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+class A {};
+class B : public A {};
+
+template<const A* a> class C {};
+template<const B* b> class D {};
+template<B* b> class E {};
+
+template<const B* b> void f(D<b> &, C<static_cast<const A*>(b)> &) {} // { dg-error "" "" }
+template<const B* b> void g(D<b> &, E<const_cast<B*>(b)> &) {} // { dg-error "" "" { target { ! c++11 } } }
+
+B b;
+
+int main()
+{
+ C<static_cast<const A*>(&b)> c; // { dg-error "" }
+ D<&b> d;
+ E<const_cast<B*>(&b)> e; // { dg-error "" "" { target { ! c++11 } } }
+ f(d, c); // { dg-error "" "" { target c++11 } }
+ g(d, e);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype26.C
new file mode 100644
index 000000000..763d987dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype26.C
@@ -0,0 +1,20 @@
+// PR c++/31671
+
+template<int& i> void doit() {
+ i = 0;
+}
+
+template<const int& i> class X {
+public:
+ void foo() {
+ doit<i>(); // { dg-error "cv-qualification|no matching" }
+ }
+};
+
+int i = 0;
+
+X<i> x;
+
+int main() {
+ x.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype3.C
new file mode 100644
index 000000000..d0c6b72a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype3.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options -std=c++98 }
+// Origin: <drow at gcc dot gnu dot org>,
+// <giovannibajo at gcc dot gnu dot org>
+// c++/13243: Template parameters of non integral or enumeration type can't be
+// used for integral constant expressions. ADDR_EXPR and INDIRECT_REF are
+// invalid too.
+
+template <int T> class foo {};
+template <int *T> class bar {};
+
+template <int *PI>
+void dep5(bar<PI> *);
+
+template <int *PI>
+void dep6(bar<PI+1> *); // { dg-error "" "integral or enumeration" }
+
+template <int I>
+void dep7(bar<I+1> *);
+
+template <int *PI>
+void dep8(foo< *PI > *); // { dg-error "" "integral or enumeration" }
+
+template <int PI[1]>
+void dep9(foo< *PI > *); // { dg-error "" "integral or enumeration" }
+
+template <int PI[1]>
+void dep9a(foo< sizeof(*PI) > *);
+
+template <int PI[1]>
+void dep10(foo< PI[0] > *); // { dg-error "" "integral or enumeration" }
+
+template <int I>
+void dep11(foo< *&I > *); // { dg-error "" "constant-expression" }
+
+template <int I>
+void dep12(foo< (&I)[4] > *); // { dg-error "" "constant-expression" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype4.C
new file mode 100644
index 000000000..41e3e22c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype4.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/13797: ICE invalid nontype template parameter
+
+template <int> struct A
+{
+ typedef A<0> B; // { dg-message "previous declaration" }
+ template <B> struct B {}; // { dg-error "not a valid type|typedef" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype5.C
new file mode 100644
index 000000000..f7b76259b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype5.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/13797: ICE invalid nontype template parameter
+
+template <int> struct A
+{
+ typedef A<0> B;
+ template <B> struct C {}; // { dg-error "not a valid type" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype6.C
new file mode 100644
index 000000000..b51474f83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype6.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// Origin: <v dot haisman at sh dot cvut dot cz>
+// PR c++/13957: Improved error message for type in template (when non-type
+// is expected).
+
+template <class T>
+struct A
+{
+ typedef int type;
+};
+
+template <class T>
+void func(void)
+{
+ (void)A<T>::type(); // { dg-error "non-type" "non-type" }
+// { dg-message "if a type" "note" { target *-*-* } 15 }
+}
+
+template void func<float>(void); // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype7.C
new file mode 100644
index 000000000..5eac558e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype7.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// Origin: C++ standard, [temp.arg.nontype]/2
+
+template<class T, char* p> struct X {
+ X();
+ X(const char* q) { /* ... */ }
+};
+
+char p[] = "Vivisectionist";
+
+X<int,"Studebaker"> x1; // { dg-error "string literal" }
+X<int, p> x2;
+
+// { dg-bogus "" "additional errors" { xfail *-*-* } 11 }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype8.C
new file mode 100644
index 000000000..d2976dfc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype8.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: C++ standard, [temp.arg.nontype]/3
+
+template<int* p> class X { };
+
+int a[10];
+struct S { int m; static int s; } s;
+
+X<&a[2]> x3; // { dg-error "" } address of array element
+X<&s.m> x4; // { dg-error "" } address of non-static member
+X<&s.s> x5; // { dg-error "" } &S::s must be used
+X<&S::s> x6; // OK: address of static member
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/nontype9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype9.C
new file mode 100644
index 000000000..e16eef601
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/nontype9.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-prune-output "mangled name" }
+// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+int i;
+
+template <void (&FN)()>
+struct g {
+ void foo(void) {
+ FN ();
+ }
+};
+
+void h ()
+{
+ i = 7;
+}
+
+template struct g<h>;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ntp1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ntp1.C
new file mode 100644
index 000000000..98698e932
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ntp1.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@codesourcery.com>
+
+// PR 35. We were default promoting template PARM_DECLs
+
+template <short B> class R {};
+
+template <class T> class A
+{
+ public:
+ template <short B>
+ void operator() (R<B> const &);
+};
+
+int main() {
+ A<int> a;
+ R<1> r;
+
+ a (r);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ntp2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ntp2.C
new file mode 100644
index 000000000..42219e0fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ntp2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com>
+
+// PR 3784: We were confusing non-type template parms.
+
+template <unsigned N> class X { };
+
+template <short N> void foo1(X<N>);
+template <unsigned N> void foo2(X<N>);
+
+int main() {
+ X<2> x;
+ foo2(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof1.C
new file mode 100644
index 000000000..1ee9be1e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof1.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// PR c++/17221
+
+#include <cstddef>
+
+template <int N> struct Bar;
+template <> struct Bar<3> {};
+
+template <class T>
+struct Foo {
+ Bar<offsetof(T, a) + 3> k;
+};
+
+struct A { int a; };
+
+template struct Foo<A>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof2.C
new file mode 100644
index 000000000..da888f7a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof2.C
@@ -0,0 +1,10 @@
+// PR c++/49085
+
+template <class T>
+struct A // { dg-error "declaration" }
+{
+ int i, j;
+ int ar[__builtin_offsetof(A,j)]; // { dg-error "incomplete type" }
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/op1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/op1.C
new file mode 100644
index 000000000..7cc9c9e91
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/op1.C
@@ -0,0 +1,12 @@
+template <class T> struct X {
+ typedef int type;
+};
+
+template <class T> struct O {
+ struct I {
+ operator typename X<T>::type ();
+ };
+};
+
+template <class T>
+O<T>::I::operator typename X<T>::type () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator1.C
new file mode 100644
index 000000000..402e607d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator1.C
@@ -0,0 +1,49 @@
+class test
+{
+public:
+ float operator[]( int index )
+ {
+ return testFloat[index];
+ }
+private:
+ float testFloat[3];
+};
+
+template < class typeA > float
+operator*(
+ typeA a,
+ float b
+)
+{
+ return a[0] * b;
+}
+
+template < class typeB > float
+operator*(
+ float a,
+ typeB b
+)
+{
+ return a * b[0];
+}
+
+template < class typeA, class typeB > float
+operator*(
+ typeA a,
+ typeB b
+)
+{
+ return a[0] * b[0];
+}
+
+int main( void )
+{
+ test aTest;
+ float bTest;
+ float result;
+
+ result = aTest * bTest;
+ result = bTest * aTest;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator10.C
new file mode 100644
index 000000000..448b02290
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator10.C
@@ -0,0 +1,8 @@
+// PR c++/30535
+// { dg-prune-output "note" }
+
+struct A {};
+
+template<A, typename T> int operator-(A, T); // { dg-error "not a valid type" }
+
+int i = A() - 0; // { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator11.C
new file mode 100644
index 000000000..8d6b77ab4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator11.C
@@ -0,0 +1,25 @@
+// PR c++/48594
+// Test for uses of (X->*Y)() that don't actually involve a
+// pointer to member function.
+
+struct A { } a;
+struct B { } b;
+struct C * cp;
+
+struct Func { void operator()(); };
+Func operator->* (A, int);
+
+typedef void (*pfn)();
+pfn operator->* (B, int);
+
+pfn C::*cpfn;
+Func C::*cfunc;
+
+template <class T>
+void f()
+{
+ (a->*1)();
+ (b->*1)();
+ (cp->*cpfn)();
+ (cp->*cfunc)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator12.C
new file mode 100644
index 000000000..bc8e91de4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator12.C
@@ -0,0 +1,9 @@
+// PR c++/59707
+
+struct T {
+ template<class D> operator D*() const;
+};
+
+void f(T x) {
+ x < x; // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator2.C
new file mode 100644
index 000000000..89f428d5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator2.C
@@ -0,0 +1,8 @@
+template <typename T> struct A {};
+
+struct B {
+ operator A<B>();
+};
+
+template <typename T>
+void f() { B::operator A<T>; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator3.C
new file mode 100644
index 000000000..45292cd95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator3.C
@@ -0,0 +1,10 @@
+// PR c++/15640
+
+struct A {
+ void foo(void);
+};
+
+template <int> void bar() {
+ A a;
+ a + a.foo; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator4.C
new file mode 100644
index 000000000..972d52fc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator4.C
@@ -0,0 +1,11 @@
+// PR c++/17068
+
+struct A
+{
+ template<int> void operator()() {}
+};
+
+template<typename> void foo()
+{
+ A().template operator()<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator5.C
new file mode 100644
index 000000000..1c0c29231
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator5.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18803: reject legal
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+struct A {
+ int operator() ();
+};
+
+template <int> void foo () {
+ A &a = *new A();
+ const int i = a();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator6.C
new file mode 100644
index 000000000..94a869bcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator6.C
@@ -0,0 +1,4 @@
+// PR c++/27315
+// { dg-do compile }
+
+template void operator+; // { dg-error "non-function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator7.C
new file mode 100644
index 000000000..59c8b356c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator7.C
@@ -0,0 +1,7 @@
+//PR c++/27493
+// { dg-options "-std=gnu++98" }
+
+template<operator T> void foo() // { dg-error "before|template" }
+{
+ struct A {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator8.C
new file mode 100644
index 000000000..29d17b84b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator8.C
@@ -0,0 +1,6 @@
+//PR c++/27494
+
+struct A
+{
+ template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/operator9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/operator9.C
new file mode 100644
index 000000000..46eef0a9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/operator9.C
@@ -0,0 +1,10 @@
+//PR c++/27670
+
+template<operator+> void foo(); // { dg-error "before|non-function|template" }
+
+void bar()
+{
+ foo(); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 7 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload1.C
new file mode 100644
index 000000000..2225fecf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload1.C
@@ -0,0 +1,24 @@
+// { dg-options "-w" }
+// PR c++/9420
+// Bug: We were instantiating B<int> during overload resolution for E<0.
+// This is wrong; the contents of B<int> are not relevant, since we can't
+// use its constructors (because we'd already be using a constructor for
+// C).
+
+enum { E };
+
+template <typename T> struct A {
+ static const int a = (E < 0);
+};
+
+template <typename T> class B {
+ A<int> b;
+};
+
+struct C {
+ C(B<int>);
+};
+
+int operator<(C, C);
+
+A<int> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload10.C
new file mode 100644
index 000000000..84078bd87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload10.C
@@ -0,0 +1,6 @@
+// PR c++40342
+
+template <typename T1, typename T2> int f(T1 *, const T2 *); // { dg-message "" }
+template <typename T1, typename T2> int f(const T1 *, T2 *); // { dg-message "" }
+
+int (*p)(const int *, const int *) = f; // { dg-error "ambiguous" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload11.C
new file mode 100644
index 000000000..d7b0a7c9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload11.C
@@ -0,0 +1,27 @@
+// PR c++/39413
+// We don't need to instantiate Wrapper<int> to check the
+// foo(const Thingy&) overload.
+
+template <class T> struct Incomplete;
+
+template <typename T> class Wrapper
+{
+ Incomplete<T> i;
+};
+
+template <typename T> struct Thingy
+{
+ Thingy();
+ Thingy(const Wrapper<T>& v);
+
+ template <typename X> void foo(const Thingy<X>&);
+ void foo(const Thingy&);
+};
+
+int main()
+{
+ Thingy<int> ap1;
+ Thingy<float> bp1;
+
+ ap1.foo(bp1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload12.C
new file mode 100644
index 000000000..656dcaefe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload12.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+struct S {int x; int y;};
+template<typename T>
+int foo(T a, T b) {return a + b;} // { dg-message "template" }
+template<typename T, typename T2>
+int foo(T a, T2& b, T2 c) {return a + b;} // { dg-message "template" }
+int foo(char*, S&); // { dg-message "foo" }
+// { dg-message "candidate expects 2 arguments, 3 provided" "arity" { target *-*-* } 8 }
+
+int foo2(int x)
+{
+ S s={1,2};
+ char c;
+ foo(c, 2, c); // { dg-error "no matching function" }
+ // { dg-message "(candidate|deduced conflicting types for)" "candidate note" { target *-*-* } 15 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload13.C
new file mode 100644
index 000000000..d41ccd01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload13.C
@@ -0,0 +1,16 @@
+// PR c++/56998
+
+class Secret;
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];
+
+struct C
+{
+ int val() { return 42; }
+};
+
+template <typename T>
+unsigned f()
+{
+ return sizeof(IsNullLiteralHelper(C().val()));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload2.C
new file mode 100644
index 000000000..253d055cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload2.C
@@ -0,0 +1,15 @@
+template <class T, int (T::*)> struct foo;
+
+template <class T>
+int f(foo<T,&T::ob_type>*);
+
+template <class T>
+char* f(...);
+
+struct X { int ob_type; };
+struct Y { char* ob_type; };
+ int x = f<X>(0);
+char* y = f<Y>(0);
+char* z = f<int>(0);
+
+int main() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload3.C
new file mode 100644
index 000000000..ec48fbb90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload3.C
@@ -0,0 +1,14 @@
+// PR c++/16870
+
+struct A
+{
+ int operator[](int) const;
+};
+
+template<int> A foo();
+
+A bar(A(*)());
+
+template<int> int baz() { return (bar(&foo<0>))[0]; }
+
+template int baz<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload4.C
new file mode 100644
index 000000000..1a294eb3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload4.C
@@ -0,0 +1,20 @@
+// PR c++/20679
+
+template <class T>
+struct foo
+{
+ struct bar
+ {
+ int m;
+ };
+
+ void m() const {}
+ void m() {}
+
+ bool n() const { return b->m < 42; }
+
+ bar *b;
+};
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload5.C
new file mode 100644
index 000000000..8e520e929
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload5.C
@@ -0,0 +1,28 @@
+// PR c++/22621
+
+struct foo {
+ typedef int (*fun)(int);
+
+ static int f(int); // overload between static & non-static
+ int f();
+
+ static int g(int); // non-overloaded static
+};
+
+template<foo::fun>
+struct f_obj {
+ // something ..
+};
+
+f_obj<&foo::f> a; // OK
+f_obj<foo::f> b; // OK (note: a and b are of the same type)
+
+int foo::f()
+{
+ f_obj<&foo::f> a; // OK
+ f_obj<foo::f> b; // ERROR: foo::f cannot be a constant expression
+
+ f_obj<&foo::g> c; // OK
+ f_obj<foo::g> d; // OK
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload6.C
new file mode 100644
index 000000000..8d574e730
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload6.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com>
+
+// PR 21592:ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<typename T> void unique(T,T);
+
+struct A
+{
+ int begin();
+};
+
+template<int> void foo()
+{
+ unique(A().begin); // { dg-error "invalid use of non-static member function" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload7.C
new file mode 100644
index 000000000..28bd16c4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload7.C
@@ -0,0 +1,31 @@
+// { dg-do run }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Oct 2005 <nathan@codesourcery.com>
+
+// PR 24386:Wrong virtual function called
+// Origin: Scott Snyder snyder@fnal.gov
+
+struct A
+{
+ virtual int Foo () { return 1; }
+};
+struct B : public A
+{
+ virtual int Foo () { return 2; }
+};
+
+template <class T>
+int Bar (T *a)
+{
+ if (static_cast<A*>(a)->A::Foo () != 1)
+ return 1;
+ if (static_cast<A*>(a)->Foo () != 2)
+ return 2;
+ return 0;
+}
+
+int main ()
+{
+ return Bar (new B);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload8.C
new file mode 100644
index 000000000..cc6a05b70
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload8.C
@@ -0,0 +1,7 @@
+// PR c++/24915
+
+struct A
+{
+ template<int> void foo() {}
+ template<int> int foo() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/overload9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/overload9.C
new file mode 100644
index 000000000..8aeab9eaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/overload9.C
@@ -0,0 +1,18 @@
+// PR c++/32232
+
+template <typename T> struct A;
+template <typename T> struct B {};
+template <typename T> A<T>& operator<<(A<T>&, const B<T>&);
+
+template <typename T>
+struct A
+{
+ A<T>& operator<<(A<T>& (*)(A<T>&));
+};
+
+template <typename T> A<T>& foo(A<T>&);
+extern A<char> c;
+
+int main () {
+ c << (1, foo); // { dg-error "no context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/param1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/param1.C
new file mode 100644
index 000000000..e3784736f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/param1.C
@@ -0,0 +1,12 @@
+// PR c++/22233
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<int> struct A
+{
+ A();
+};
+
+template<int N, char> A<N>::A() {} // { dg-error "got 2 template parameters|1 required" }
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/param2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/param2.C
new file mode 100644
index 000000000..d25b85565
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/param2.C
@@ -0,0 +1,8 @@
+// Origin PR c++/47311
+// { dg-do compile }
+
+template < typename > class A0;
+template <class Key, class T, template < typename TF = T> class TC = A0> class B0;
+
+template <int> class A1;
+template <class Key, class T, template <T p> class TC = A1> class B1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/param3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/param3.C
new file mode 100644
index 000000000..0c1e70326
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/param3.C
@@ -0,0 +1,12 @@
+// PR c++/49418
+
+template <class T>
+void f (const T t)
+{
+ t = 1; // { dg-error "" }
+}
+
+int main()
+{
+ f(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization.C
new file mode 100644
index 000000000..feaeb2fbf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization.C
@@ -0,0 +1,22 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Origin: philippeb@videotron.ca
+// { dg-do compile }
+
+struct B
+{
+ int i;
+};
+
+template <class _T, class _M, _M _T::* _V>
+ struct A;
+
+template <class _T, int _T::* _V>
+ struct A<_T, int, _V>
+ {
+ };
+
+int main()
+{
+ A<B, int, & B::i> a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization2.C
new file mode 100644
index 000000000..c22d73989
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial-specialization2.C
@@ -0,0 +1,8 @@
+// PR c++/54653
+
+template <class T> struct A;
+template <class T> struct A<T*> {
+ template <class U> struct B;
+};
+
+template <class T> struct A<T*>::B<T*> { }; // { dg-error "too few template-parameter-lists" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial1.C
new file mode 100644
index 000000000..41ea53039
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial1.C
@@ -0,0 +1,36 @@
+// { dg-do run }
+// Origin: Jo Totland <jototland@hotmail.com>
+
+// PR c++/6620
+// Partial specialization involving expression of non-type template
+// parameter causes ICE.
+
+extern "C" void abort();
+
+template <int N> struct HoldInt
+{
+};
+
+template <class A, class B> struct Add
+{
+};
+
+template <int N> struct Add<HoldInt<N>, HoldInt<-N> >
+{
+ typedef int type;
+ int f() { return 0; }
+};
+
+template <int N, int M>
+struct Add<HoldInt<N>, HoldInt<M> >
+{
+ typedef HoldInt<N+M> type;
+ int f() { return 1; }
+};
+
+int main() {
+ Add<HoldInt<1>, HoldInt<-1> > a;
+ Add<HoldInt<1>, HoldInt<-2> > b;
+ if (a.f() != 0 || b.f() != 1)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial10.C
new file mode 100644
index 000000000..53a48fbac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial10.C
@@ -0,0 +1,18 @@
+// PR c++/35255, DR 115
+// { dg-do link }
+
+// 14.8.1: In contexts where deduction is done and fails, or in contexts
+// where deduction is not done, if a template argument list is specified
+// and it, along with any default template arguments, identifies a single
+// function template specialization, then the template-id is an lvalue for
+// the function template specialization.
+
+template <class Fn> void def(Fn fn) {}
+
+template <class T1, class T2> T2 fn(T1, T2);
+template <class T1> int fn(T1) { }
+
+int main()
+{
+ def(fn<int>);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial11.C
new file mode 100644
index 000000000..b5ceaa883
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial11.C
@@ -0,0 +1,24 @@
+// DR 115
+
+// 14.8.1: In contexts where deduction is done and fails, or in contexts
+// where deduction is not done, if a template argument list is specified
+// and it, along with any default template arguments, identifies a single
+// function template specialization, then the template-id is an lvalue for
+// the function template specialization.
+
+// Here, deduction is not done to resolve fn<int> because the target type
+// is a template parameter, so we resolve to the second template, and then
+// the call to def fails because we deduce different values of Fn for the
+// two function arguments.
+
+template <class Fn> void def(Fn fn, Fn fn2);
+
+template <class T1, class T2> T2 fn(T1, T2);
+template <class T1> int fn(T1);
+
+int f(int,int);
+
+int main()
+{
+ def(fn<int>,f); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial12.C
new file mode 100644
index 000000000..05a3eca97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial12.C
@@ -0,0 +1,27 @@
+// PR c++/46105
+
+template< typename T >
+struct empty { // support class is like stripped-down enable_if
+ typedef void type;
+};
+
+template< class T, typename v = void > // v is always void!
+struct element {
+ typedef typename T::value_type type;
+};
+
+template< class T > // T in deduced context, T::element_type is SFINAE:
+struct element< T, typename empty< typename T::element_type >::type > {
+ typedef typename T::element_type type;
+};
+
+template< class T >
+struct element< T const, typename empty< typename T::element_type >::type > {
+ typedef typename T::element_type const type;
+};
+
+struct has_et {
+ typedef int element_type;
+};
+
+element<has_et const>::type ip = 0;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial13.C
new file mode 100644
index 000000000..bfbe2e028
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial13.C
@@ -0,0 +1,25 @@
+// PR c++/45012
+
+template <bool B, class T=void> struct enable_if;
+
+template <class T>
+struct enable_if<true,T>
+{
+ typedef T type;
+};
+
+enum { RUNTIME = 0 };
+// it compiles with the previous line commented out and the next commented in
+// static const int RUNTIME=0;
+
+template <class T, class U, class EN=void> struct foo;
+
+template <template<int> class V, int M>
+struct foo<V<M>,V<M>, typename enable_if<M==RUNTIME||M==2>::type> {};
+
+template <template<int> class V1, template<int> class V2, int M>
+struct foo<V1<M>,V2<M>, typename enable_if<M==RUNTIME||M==2>::type> {};
+
+template <int M> struct bar {};
+
+foo<bar<2>,bar<2> > x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial14.C
new file mode 100644
index 000000000..3870164f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial14.C
@@ -0,0 +1,16 @@
+// PR c++/59044
+
+template <class T>
+class C {
+private:
+ template <T a, T b>
+ struct Implementation {};
+public:
+ typedef typename Implementation<0, 0>::Typedef Type;
+};
+
+template <class T>
+template <T b>
+struct C<T>::Implementation<0, b> { typedef void Typedef; };
+
+template class C<unsigned>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial15.C
new file mode 100644
index 000000000..357bb05fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial15.C
@@ -0,0 +1,19 @@
+// PR c++/57043
+// { dg-do link }
+
+template<typename D> struct complex { };
+
+template<typename Tp>
+complex<Tp>
+pow(const complex<Tp>& x, const complex<Tp>& y) { return complex<Tp>(); }
+
+template<typename T, typename U>
+struct promote_2 { typedef T type; };
+
+template<typename Tp, typename Up>
+complex<typename promote_2<Tp, Up>::type>
+pow(const complex<Tp>& x, const complex<Up>& y);
+
+complex<double> (*powcc)(const complex<double>&, const complex<double>&) = pow;
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial2.C
new file mode 100644
index 000000000..ebfdce278
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: lorgon1@yahoo.com
+
+// PR c++/11154: Multi-level template argument in partial ordering of
+// class template
+
+template <class A> struct Outer {
+ template <class T, class U = void, class V = void> struct Foo {};
+ template <class T, class U> struct Foo<T,U,void> {};
+ template <class T> struct Foo<T,void,void> {};
+};
+
+Outer<int>::Foo<int,void,void> f;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial3.C
new file mode 100644
index 000000000..986267514
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial3.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// Origin: John Maddock <john at johnmaddock dot co dot uk>
+// PR c++/13997: Error while matching partial specialization of array type
+
+template <typename T>
+struct is_array;
+
+template <typename T, unsigned int N>
+struct is_array<T[N]>;
+
+template <typename T, unsigned int N>
+struct is_array<const T[N]> {};
+
+template struct is_array<int const[2]>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial4.C
new file mode 100644
index 000000000..8ea202cdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial4.C
@@ -0,0 +1,16 @@
+// PR c++/25342
+
+template < typename eval >
+struct tpl_seq_search {
+ typedef typename eval::enum_type Enum;
+ template < Enum first, Enum last >
+ struct range {
+ };
+ template < Enum val >
+ struct range<val,val> {
+ };
+};
+struct xxx {
+ typedef int enum_type;
+ tpl_seq_search<xxx>::range<0, 1> a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C
new file mode 100644
index 000000000..aa32e3b8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C
@@ -0,0 +1,24 @@
+// PR c++/33964
+
+template<typename T>
+struct X { };
+
+template<typename T>
+struct X<typename T::foo> { }; // { dg-error "not used|T" }
+
+template<int N>
+struct X<int[N]> {}; // okay
+
+
+template<typename T, typename T::foo V>
+struct Y { };
+
+template<typename T, typename U, U v>
+struct Y<T, v> { }; // { dg-error "not used|U" }
+
+
+template<typename T, T V>
+struct Z { };
+
+template<typename T>
+struct Z<T, (T)0> { }; // { dg-error "involves template parameter" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial6.C
new file mode 100644
index 000000000..80bbfe3c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial6.C
@@ -0,0 +1,31 @@
+// PR c++/41703
+// The second GetAllSize template is more specialized because even though
+// deduction on each parameter type succeeds, we never get a template
+// argument for its X to make it match the first template.
+
+template <typename T, int (T::*)() const>
+struct TSizeEnabler
+{
+ typedef T TClass;
+};
+
+template <typename X>
+int
+GetAllSize(const X &Var)
+{ return sizeof(Var); }
+
+template <typename X>
+int
+GetAllSize(const typename TSizeEnabler<X, &X::func>::TClass &Var)
+{ return Var.func(); }
+
+struct H
+{
+ int func() const;
+};
+
+int main()
+{
+ H b;
+ return GetAllSize< H >(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial7.C
new file mode 100644
index 000000000..0fd157fdc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial7.C
@@ -0,0 +1,10 @@
+// PR c++/43559
+
+template<typename T, typename U> void f(U&) { }
+template<typename T, typename U> void f(T const&) { }
+
+int main()
+{
+ int a;
+ f<int, int const>(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial8.C
new file mode 100644
index 000000000..4db7e1868
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial8.C
@@ -0,0 +1,4 @@
+// PR c++/32505
+template <class T> struct A { };
+A<int*> a;
+template <class T> struct A<T*> { }; // { dg-error "A<int\\*>" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial9.C
new file mode 100644
index 000000000..4c340fc93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial9.C
@@ -0,0 +1,6 @@
+// PR c++/36435
+
+template <class T> T f();
+template <class T> T* f() { }
+
+template int* f();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr17410.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr17410.C
new file mode 100644
index 000000000..8be958863
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr17410.C
@@ -0,0 +1,17 @@
+// PR c++/17410
+
+template <class>
+struct Outer {
+ template <class> struct Inner {};
+};
+
+template <class T>
+struct A;
+
+template <template <class> class Q, class P>
+struct A <Q<P> > {};
+
+template <class T> struct UNRELATED;
+template <class T> struct UNRELATED<Outer<void>::Inner<T*> >;
+
+template struct A<Outer<void>::Inner<int*> >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr23510.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr23510.C
new file mode 100644
index 000000000..7163e30ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr23510.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-ftemplate-depth-15" }
+template<unsigned int nFactor>
+struct Factorial
+{
+ enum { nValue = nFactor * Factorial<nFactor - 1>::nValue }; // { dg-error "depth exceeds maximum" "exceeds" }
+ // { dg-message "recursively required" "recurse" { target *-*-* } 6 }
+ // { dg-error "incomplete type" "incomplete" { target *-*-* } 6 }
+} // { dg-error "expected ';' after" }
+
+ template<>
+ struct Factorial<0>
+ {
+ enum { nValue = 1 };
+ };
+
+ static const unsigned int FACTOR = 20;
+
+int main()
+{
+ Factorial<FACTOR>::nValue;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr28284.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr28284.C
new file mode 100644
index 000000000..7ef9aa12b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr28284.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+template<int> struct A
+{
+ static const int i=x; /* { dg-error "was not declared in this scope" } */
+ static const int j, k;
+};
+
+template<int N> const int A<N>::j = i;
+template<int N> const int A<N>::k = j;
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr28301.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr28301.C
new file mode 100644
index 000000000..a7a008478
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr28301.C
@@ -0,0 +1,18 @@
+// PR c++/28301
+// { dg-do compile }
+
+template<typename> struct A
+{
+ template<int> void foo()
+}; // { dg-error "initializer" }
+
+template<> struct A<void>
+{
+ template<int> void foo();
+};
+
+void bar()
+{
+ A<void> a;
+ a.foo<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr29633.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr29633.C
new file mode 100644
index 000000000..3e0254a46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr29633.C
@@ -0,0 +1,29 @@
+// PR c++/29633
+
+template <typename T>
+struct Class1
+{
+ void testfn1(void);
+};
+
+template <typename T>
+class Class2
+{
+public:
+ void testfn2(void)
+ {
+ Class1<T> * tc_a;
+ do
+ {
+ int x = 0;
+ }
+ while (tc_a && tc_a->testfn1); // { dg-error "invalid use of member" }
+ }
+};
+
+int main(void)
+{
+ Class2<int> tc2;
+ tc2.testfn2();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr32519.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr32519.C
new file mode 100644
index 000000000..e93c7b476
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr32519.C
@@ -0,0 +1,16 @@
+// PR 32519
+// { dg-do compile }
+
+struct B
+{
+protected:
+ template <class T> void f (); // { dg-error "protected" }
+};
+
+struct D : public B
+{
+ void g (B* b)
+ {
+ b->f<int> (); // { dg-error "context" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr35240.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr35240.C
new file mode 100644
index 000000000..5b9455117
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr35240.C
@@ -0,0 +1,11 @@
+// PR c++/35240
+// { dg-do compile }
+
+template<int> struct A {};
+
+template<int N> A<sizeof(new int[N][N])> foo();
+
+void bar()
+{
+ foo<1>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr39425.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr39425.C
new file mode 100644
index 000000000..d55f547e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr39425.C
@@ -0,0 +1,18 @@
+// PR c++/39425
+// { dg-do compile }
+
+class a {
+
+ template<unsigned int s>
+ struct _rec {
+ static const char size = _rec< (s >> 1) >::size;
+ };
+
+ template<> // { dg-error "explicit" }
+ struct _rec <0> {
+ static const char size = 0;
+ };
+
+ static const unsigned int value = _rec < 1 >::size;
+
+} // { dg-error "after class definition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr4926-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr4926-1.C
new file mode 100644
index 000000000..ec2b226fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr4926-1.C
@@ -0,0 +1,18 @@
+// PR c++/4926
+// { dg-do compile }
+
+template <unsigned> struct X { typedef int Type; };
+template <typename T> struct Y { char array[1]; };
+
+template<typename T> Y<T> P(T); // acts as "Y<typeof(T)>"
+
+struct F { int operator()() const; };
+
+template <typename T>
+typename X<sizeof(P( T()() ).array)>::Type foo();
+
+void
+bar ()
+{
+ foo<F>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr54858.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr54858.C
new file mode 100644
index 000000000..51610ad68
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr54858.C
@@ -0,0 +1,21 @@
+// PR c++/54858
+// { dg-do compile }
+
+template <int> struct A {};
+template <typename T, T *> struct B {};
+template <typename D> struct C
+{
+ A<0> c0; B<A<0>, &C::c0> d0; // { dg-error "could not convert template argument" }
+ A<0> c1; B<A<0>, &C::c1> d1; // { dg-error "could not convert template argument" }
+ A<0> c2; B<A<0>, &C::c2> d2; // { dg-error "could not convert template argument" }
+ A<0> c3; B<A<0>, &C::c3> d3; // { dg-error "could not convert template argument" }
+ A<0> c4; B<A<0>, &C::c4> d4; // { dg-error "could not convert template argument" }
+ A<0> c5; B<A<0>, &C::c5> d5; // { dg-error "could not convert template argument" }
+ A<0> c6; B<A<0>, &C::c6> d6; // { dg-error "could not convert template argument" }
+ A<0> c7; B<A<0>, &C::c7> d7; // { dg-error "could not convert template argument" }
+ A<0> c8; B<A<0>, &C::c8> d8; // { dg-error "could not convert template argument" }
+ A<0> c9; B<A<0>, &C::c9> d9; // { dg-error "could not convert template argument" }
+ A<0> ca; B<A<0>, &C::ca> da; // { dg-error "could not convert template argument" }
+ A<0> cb; B<A<0>, &C::cb> db; // { dg-error "could not convert template argument" }
+};
+C<int> e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pr58878.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pr58878.C
new file mode 100644
index 000000000..adad9fe5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pr58878.C
@@ -0,0 +1,61 @@
+// PR c++/58878
+
+// Template-members of non-template class
+struct A
+{
+ template <typename t> // { dg-error "shadows" }
+ void f()
+ {
+ int t = 1; // { dg-error "declaration" }
+ }
+
+ template <typename t>
+ void g();
+};
+
+template <typename t> // { dg-error "shadows" }
+void A::g()
+{
+ int t = 2; // { dg-error "declaration" }
+}
+
+// (Non-template) Members of template class
+template <typename t> // { dg-error "shadows" }
+struct B
+{
+ void f()
+ {
+ int t = 3; // { dg-error "declaration" }
+ }
+
+ void g();
+};
+
+template <typename t> // { dg-error "shadows" }
+void B<t>::g()
+{
+ int t = 4; // { dg-error "declaration" }
+}
+
+// Template members of template class
+template <typename t> // { dg-error "shadows" }
+struct C
+{
+ template <typename s> // { dg-error "shadows" }
+ void f()
+ {
+ int t = 5; // { dg-error "declaration" }
+ int s = 6; // { dg-error "declaration" }
+ }
+
+ template <typename s>
+ void g();
+};
+
+template <typename t> // { dg-error "shadows" }
+template <typename s> // { dg-error "shadows" }
+void C<t>::g()
+{
+ int t = 7; // { dg-error "declaration" }
+ int s = 8; // { dg-error "declaration" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pretty1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pretty1.C
new file mode 100644
index 000000000..99cbcd64a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pretty1.C
@@ -0,0 +1,43 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7768 template dtor pretty function wrong
+
+#include <string.h>
+
+static size_t current = 0;
+static bool error = false;
+
+static char const *names[] =
+{
+ "X<T>::X() [with T = void]",
+ "X<T>::~X() [with T = void]",
+ 0
+};
+
+void Verify (char const *ptr)
+{
+ error = strcmp (ptr, names[current++]);
+}
+
+template <typename T>
+struct X
+{
+ X() { Verify (__PRETTY_FUNCTION__); }
+ ~X() { Verify (__PRETTY_FUNCTION__); }
+};
+
+int main()
+{
+ {
+ X<void> x;
+
+ if (error)
+ return current;
+ }
+ if (error)
+ return current;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor1.C
new file mode 100644
index 000000000..cf7c254d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor1.C
@@ -0,0 +1,44 @@
+// PR c++/32384
+// { dg-do compile }
+
+struct A
+{
+ typedef int T;
+ T foo ();
+
+ A () { foo ().~T (); }
+};
+
+template<typename> struct B
+{
+ typedef int T;
+ T foo ();
+
+ B () { foo ().~T (); }
+};
+
+template<typename T> struct C
+{
+ T t;
+ C () { t.~T (); }
+};
+
+template<typename S> struct D
+{
+ typedef int T;
+ S foo ();
+
+ D () { foo ().~T(); }
+};
+
+struct Z
+{
+ Z () {}
+ ~Z () {}
+};
+
+A a;
+B<int> b;
+C<int> c1;
+C<Z> c2;
+D<int> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor2.C
new file mode 100644
index 000000000..d4a9ac1cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor2.C
@@ -0,0 +1,18 @@
+// PR c++/32384
+// { dg-do compile }
+
+template<typename S> struct D
+{
+ typedef int T;
+ S foo ();
+
+ D () { foo ().~T(); } // { dg-error "10:is not of type" }
+};
+
+struct Z
+{
+ Z () {}
+ ~Z () {}
+};
+
+D<Z> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor3.C
new file mode 100644
index 000000000..202182f53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor3.C
@@ -0,0 +1,43 @@
+// PR c++/32241
+// { dg-do compile }
+
+struct A
+{
+ typedef int T;
+ T &foo ();
+ A () { foo.~T (); } // { dg-error "10:does not have class type|expected" }
+};
+
+template <typename T> struct B
+{
+ T &foo ();
+ B () { foo.~T (); } // { dg-error "10:invalid use of member" }
+};
+
+B<int> b;
+
+template <typename T, typename S> struct C
+{
+ T t;
+ C () { t.~S (); } // { dg-error "10:is not of type" }
+};
+
+C<int, long int> c;
+
+template <typename T> struct D
+{
+ T t;
+ typedef long int U;
+ D () { t.~U (); } // { dg-error "10:is not of type" }
+};
+
+D<int> d;
+
+template <typename T> struct E
+{
+ T &foo ();
+ typedef long int U;
+ E () { foo.~U (); } // { dg-error "10:is not of type" }
+};
+
+E<int> e;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor4.C
new file mode 100644
index 000000000..40178bf48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor4.C
@@ -0,0 +1,10 @@
+// PR c++/34068
+// { dg-do compile }
+
+template <typename> struct A
+{
+ typedef int X;
+ A () { T (). ~X (); } // { dg-error "there are no arguments to|fpermissive|was not declared in this scope" }
+};
+
+A <int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor5.C
new file mode 100644
index 000000000..751e662ad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor5.C
@@ -0,0 +1,23 @@
+// PR c++/37563
+
+struct A {};
+
+template<int> struct Traits
+{
+ typedef void X;
+};
+
+template<> struct Traits<0>
+{
+ typedef A X;
+};
+
+template<int N> struct B
+{
+ typedef typename Traits<N>::X Y;
+
+ void foo(Y y)
+ {
+ y.Y::A::~A();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor6.C
new file mode 100644
index 000000000..4438b6ffb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pseudodtor6.C
@@ -0,0 +1,9 @@
+// PR c++/47971
+
+template <typename> struct S
+{
+ typedef double T;
+ S () { T ().~T (); }
+};
+
+S<double> s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem1.C
new file mode 100644
index 000000000..ebd6a201a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// PR 3716 tsubsting a pointer to member function did not create a
+// pointer to member function.
+
+template <class C, class T, T C::*M>
+struct Closure
+{
+ T operator() (C & c) const { return (c.*M); }
+};
+
+template <class C, class T, T (C::* M)()>
+struct Closure<C, T (), M>
+{
+ T operator()(C & c) const { return (c.*M)(); }
+};
+
+struct A
+{
+ int get();
+};
+
+static Closure<A, int (), & A::get> get_closure;
+
+
+void Foo ()
+{
+ A a;
+ get_closure (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem10.C
new file mode 100644
index 000000000..b76d5e80a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem10.C
@@ -0,0 +1,21 @@
+// PR c++/15096
+
+template <typename T_>
+class C1
+{
+public:
+ C1 ();
+ ~C1 ();
+ const int C1<T_>::* getPtr () const;
+
+private:
+ int x;
+ T_ y;
+};
+
+
+template <typename T_>
+const int C1<T_>::* C1<T_>::getPtr () const
+{ return &C1<T_>::x; }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem11.C
new file mode 100644
index 000000000..a88b70660
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem11.C
@@ -0,0 +1,19 @@
+// PR c++/18407
+
+template <typename Klasse>
+struct the_base{
+ template <void (Klasse::*Fn)()> void foo() { }
+};
+
+template <typename T>
+struct derivedT: the_base<derivedT<T> > {
+ typedef the_base<derivedT<T> > parent;
+ void ice(){
+ this->parent::template foo< &derivedT<T>::ice>();
+ }
+};
+
+int main() {
+ derivedT<int> dT;
+ dT.ice();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem12.C
new file mode 100644
index 000000000..717b86988
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem12.C
@@ -0,0 +1,29 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Mar 2005 <nathan@codesourcery.com>
+
+// PR 20465
+// Origin: Matthias Klose <doko@debian.org>
+// Andrew Pinski <pinskia@gcc.gnu.org>
+
+template <class _Ret, class _Tp>
+void mem_fun_ref(_Ret (_Tp::*__f)());
+
+struct A {
+ double f();
+};
+
+void h ()
+{
+ mem_fun_ref(&A::f);
+}
+
+template <class T>
+void f()
+{
+ mem_fun_ref(&A::f);
+}
+
+void g()
+{
+ f<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem13.C
new file mode 100644
index 000000000..84374ea05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem13.C
@@ -0,0 +1,11 @@
+// PR c++/20734
+
+struct A;
+void blah(int A::*);
+struct A{
+ int a;
+};
+template<typename T>
+void hoho(){
+ blah(&A::a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem14.C
new file mode 100644
index 000000000..30eb1ebcc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem14.C
@@ -0,0 +1,12 @@
+// PR c++/15875
+
+struct A
+{
+ void foo();
+};
+
+template<int> void bar()
+{
+ typedef void (A::*fptr)();
+ fptr ptr = &A::foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem15.C
new file mode 100644
index 000000000..30556414f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem15.C
@@ -0,0 +1,9 @@
+// PR c++/19894
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+template<typename T> struct A
+{
+ T A::* p; // { dg-error "void" }
+};
+
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem16.C
new file mode 100644
index 000000000..770581db8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem16.C
@@ -0,0 +1,20 @@
+// PR c++/25369
+// { dg-do link }
+
+template <typename> struct A
+{
+ void foo() {}
+};
+
+void bar(void (A<int>::*)()) {}
+
+template <int> void baz()
+{
+ bar(&A<int>::foo);
+}
+
+int main()
+{
+ baz<0>();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem17.C
new file mode 100644
index 000000000..5c5ee3fc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem17.C
@@ -0,0 +1,10 @@
+// PR c++/28346
+
+template<int> struct A
+{
+ int& i;
+ A();
+ ~A() { &A::i; } // { dg-error "reference" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem18.C
new file mode 100644
index 000000000..c3124cd81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem18.C
@@ -0,0 +1,49 @@
+// PR c++/33616
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+struct S {
+ int c;
+ S () : c (0) {}
+ virtual void f1 () { c += 1; }
+ virtual void f2 () { c += 16; }
+};
+
+struct T {
+ S s;
+};
+
+typedef void (S::*Q) ();
+
+template <Q P>
+void test1 (T *t)
+{
+ (t->s.*P)();
+}
+
+template <Q P>
+void test2 (T *t)
+{
+ S &s = t->s;
+ (s.*P)();
+}
+
+int
+main ()
+{
+ T t;
+ test1 <&S::f1> (&t);
+ if (t.s.c != 1)
+ abort ();
+ test1 <&S::f2> (&t);
+ if (t.s.c != 17)
+ abort ();
+ test2 <&S::f1> (&t);
+ if (t.s.c != 18)
+ abort ();
+ test2 <&S::f2> (&t);
+ if (t.s.c != 34)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem19.C
new file mode 100644
index 000000000..52711c6cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem19.C
@@ -0,0 +1,19 @@
+// PR c++/40780
+// { dg-do compile }
+
+template <class T1, typename T2, typename T3>
+struct A
+{
+ typedef T2 (T1::*m) (T3);
+ A (m) {}
+};
+struct B;
+struct C
+{
+ void foo (B *);
+};
+typedef A <C, void, B *> D;
+typedef void (C::*E) (B *);
+struct F;
+typedef void (C::*G) (F);
+D d ((E) (G) & C::foo);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem2.C
new file mode 100644
index 000000000..5f03580c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com>
+
+// We'd tsubst a pointer to member reference
+
+struct A {};
+
+template <typename T> T A::* Foo (); // { dg-error "reference" }
+
+void Baz ()
+{
+ Foo <int &> (); // { dg-error "no matching function" "" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 14 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem20.C
new file mode 100644
index 000000000..dee3c629a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem20.C
@@ -0,0 +1,17 @@
+// PR c++/43079
+
+struct A {};
+
+struct B
+{
+ void foo() const;
+ void foo();
+};
+
+template<void (A::*)()> void bar(); // { dg-message "note" }
+
+void baz()
+{
+ bar<&B::foo>(); // { dg-error "not a valid template argument|no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 15 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem21.C
new file mode 100644
index 000000000..c30fa38fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem21.C
@@ -0,0 +1,37 @@
+// PR c++/43868
+// { dg-options "-g" }
+
+struct Foo
+{
+ virtual void do_something() = 0;
+};
+
+template <typename T>
+struct Foo_impl;
+
+template <typename R, typename O>
+struct Foo_impl<R (O::*)() const> : public Foo
+{
+ struct Helper
+ {
+ typedef int Some_type;
+ operator Some_type () const { return 0; }
+ Helper( R (O::*)() const) {}
+ };
+
+ void do_something() { Helper( 0); };
+};
+
+void register_foo_internal( Foo*) {};
+
+template <typename TT>
+void register_foo( TT) { register_foo_internal( new Foo_impl<TT>()); }
+
+struct Bar
+{
+};
+
+void setup()
+{
+ register_foo( (int (Bar::*) () const) 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem22.C
new file mode 100644
index 000000000..762f377f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem22.C
@@ -0,0 +1,29 @@
+// PR c++/44778
+
+enum Healpix_Ordering_Scheme { RING, NEST };
+
+class Healpix_Base
+ {
+ protected:
+ Healpix_Ordering_Scheme scheme_;
+ int nest2ring (int pix) const;
+ int ring2nest (int pix) const;
+
+ typedef int (Healpix_Base::*swapfunc)(int pix) const;
+ };
+
+template<typename T> class Healpix_Map: public Healpix_Base
+ {
+ public:
+ void Import_nograde (const Healpix_Map<T> &orig)
+ {
+ swapfunc swapper = (scheme_ == NEST) ?
+ &Healpix_Map::ring2nest : &Healpix_Map::nest2ring;
+ }
+ };
+
+int main()
+ {
+ Healpix_Map<double> a,b;
+ a.Import_nograde(b);
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem23.C
new file mode 100644
index 000000000..28c0a63e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem23.C
@@ -0,0 +1,22 @@
+// PR c++/56247
+
+struct Base {
+ void method() {}
+};
+
+typedef void (Base::*MemPtr)();
+
+// Template with a member function pointer "non-type parameter".
+template<MemPtr func>
+struct Wrapper {};
+
+template<class C>
+struct Child : public Base {
+ // Templated derived class instantiates the Wrapper with the same parameter
+ // in two different virtual methods.
+ void foo() { typedef Wrapper<&Base::method> W; }
+ void bar() { typedef Wrapper<&Base::method> W; }
+};
+
+// Instantiate Child with some type.
+template class Child<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem24.C
new file mode 100644
index 000000000..a4194109e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem24.C
@@ -0,0 +1,20 @@
+// PR c++/59818
+
+template <class T>
+struct Identity {
+ typedef T type;
+};
+
+struct Foo {
+ template <typename T>
+ Foo(T*, void (Identity<T>::type::*m)(void));
+};
+
+struct Bar {
+ void Method(void) const;
+};
+
+void Bar::Method(void) const
+{
+ Foo foo(this, &Bar::Method); // { dg-error "no match" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem25.C
new file mode 100644
index 000000000..381d055bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem25.C
@@ -0,0 +1,8 @@
+// PR c++/49298
+
+template <class T, int T::*> struct B { };
+template <class T> struct A
+{
+ int i;
+ B<A,&A::i> b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem26.C
new file mode 100644
index 000000000..ba3eab10f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem26.C
@@ -0,0 +1,12 @@
+// PR c++/46552
+
+struct S
+{
+ int x;
+};
+
+template < typename >
+void f( void )
+{
+ &S::x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem3.C
new file mode 100644
index 000000000..fda7bf10a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem3.C
@@ -0,0 +1,22 @@
+// Origin: Theo Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+template <typename T,double (T::*fun)() const>
+struct I {
+};
+
+struct R {
+ R() { }
+};
+
+class H: public R {
+public:
+ H(): R() { }
+ double& f() { return a; }
+ double f() const { return 1.0; }
+ double a;
+};
+
+struct A {
+ typedef I<H,&H::f> F;
+ A() { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem4.C
new file mode 100644
index 000000000..076503202
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem4.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Scott Snyder <snyder@fnal.gov>
+
+// PR c++/8849
+// Pointer to member function template argument deduction ICE.
+
+
+template <class CONT> void queryAliases(CONT& fill_me);
+
+struct SpyExample
+{
+ void ready();
+ void inputs();
+};
+
+void SpyExample::ready()
+{
+ queryAliases(inputs); // { dg-error "invalid" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem5.C
new file mode 100644
index 000000000..50a7e77f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem5.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com>
+
+// PR 10119 (part). We failed to tsubst the args of a template-id-expr
+
+template <class T, void (T::* const U)()> struct Good
+{
+ static int const value = 0;
+};
+
+struct A
+{
+ template <typename U> void good ()
+ {
+ int s_id = Good<A, &A::good<U> >::value;
+ }
+};
+
+
+int main()
+{
+ A().good<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem6.C
new file mode 100644
index 000000000..21475c639
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem6.C
@@ -0,0 +1,10 @@
+struct S {};
+
+void g(int S::**);
+
+template <typename T>
+void f (int T::* volatile *p) {
+ g(p); // { dg-error "conversion" }
+}
+
+template void f(int S::* volatile *); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem7.C
new file mode 100644
index 000000000..cd907f212
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem7.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// Origin: <togawa at acm dot arg>
+// c++/2094: unsupported 'ptrmem_cst' in type unification
+
+struct R
+{
+ int i;
+};
+
+struct S
+{
+ int i;
+ int j;
+};
+
+struct S2 : S
+{};
+
+template<int S::*p, typename>
+struct X
+{
+ X ();
+ template<typename U> X(const X<p,U> &);
+};
+
+X<&S::i,S> x = X<&S::i,S>();
+X<&S::i,S> x2 = X<&S2::i,S>();
+X<&S::i,S> y = X<&S::j,S>(); // { dg-error "" }
+X<&S::i,S> z = X<&R::i,S>(); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem8.C
new file mode 100644
index 000000000..d0473f5cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem8.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// Origin: <marco dot franzen at bigfoot dot com>
+// PR c++/10126: Handle ptmf default conversions while matching a template
+// argument
+
+struct B
+{
+ int I () const;
+ int I ();
+};
+
+struct D : B {};
+
+template <int (D::*fun)() const> int Get(); // { dg-message "note" }
+
+int main ()
+{
+ Get<&B::I>(); // { dg-error "not a valid template argument" "not valid" }
+ // { dg-error "no match" "no match" { target *-*-* } 18 }
+ // { dg-message "note" "note" { target *-*-* } 18 }
+ Get<&D::I>(); // { dg-error "not a valid template argument" "not valid" }
+ // { dg-error "no match" "no match" { target *-*-* } 21 }
+ // { dg-message "note" "note" { target *-*-* } 21 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem9.C
new file mode 100644
index 000000000..55e881599
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem9.C
@@ -0,0 +1,9 @@
+// PR c++/15329
+
+struct S {};
+
+template <typename> struct X {
+ S s;
+ void foo (void (S::*p)())
+ { (s.*p)(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/pure1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/pure1.C
new file mode 100644
index 000000000..68dbe6bf0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/pure1.C
@@ -0,0 +1,6 @@
+// PR c++/26122
+
+struct A
+{
+ template<int> void foo() = 1; // { dg-error "pure|non-virtual" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qual1.C
new file mode 100644
index 000000000..8fa79b3d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qual1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+template<class T>
+class Link_array
+{
+public:
+ void sort (int (*compare) (T *const&,T *const&));
+};
+
+int shift_compare (int *const &, int *const &) {}
+
+template<class T> void
+Link_array<T>::sort (int (*compare) (T *const&,T *const&))
+{
+}
+
+void f ()
+{
+ Link_array<int> clashes;
+ clashes.sort (shift_compare);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qual2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qual2.C
new file mode 100644
index 000000000..aa6b10ea4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qual2.C
@@ -0,0 +1,29 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Jan 2003 <nathan@codesourcery.com>
+
+// PR9415. Forgot a lookup was scoped
+
+int here;
+int there;
+
+struct B
+{
+ virtual int activate() {return !here++;}
+};
+
+template <class K>
+struct TPL : public B
+{
+ int activate()
+ {
+ return !there++ && B::activate();
+ }
+};
+
+int main ()
+{
+ TPL<int> i;
+ return !i.activate ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id1.C
new file mode 100644
index 000000000..c46a6a4de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Sep 2003 <nathan@codesourcery.com>
+// Origin Volker Reichelt reichelt@igpm.rwth-aachen.de
+
+// PR 11922
+
+struct A
+{
+ template <bool> struct B;
+ struct C;
+};
+
+template <> struct A::B<false> {};
+
+template <typename T> void foo()
+{
+ T::C (); // { dg-error "parsed as a non-type|if a type is meant" }
+ T::template B<false>(); // { dg-error "parsed as a non-type" "non-type" }
+ // { dg-message "if a type" "if a type" { target *-*-* } 20 }
+}
+
+void bar()
+{
+ foo<A>(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id2.C
new file mode 100644
index 000000000..e88e85474
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id2.C
@@ -0,0 +1,27 @@
+// PR c++/44587
+// { dg-do run }
+
+template <const char *N> struct A { static const char *p; };
+template <const char *N> const char *A<N>::p = N;
+template <class T> struct B { static const char c[1]; typedef A<B<T>::c> C; };
+template <class T> const char B<T>::c[1] = "";
+template <class T> struct D { static const char c[1]; typedef A<c> C; };
+template <class T> const char D<T>::c[1] = "";
+
+template <int& I> struct E { static int *ip; };
+template <int& I> int* E<I>::ip = &I;
+template <class T> struct F { static int i; typedef E<F<T>::i> C; };
+template <class T> int F<T>::i;
+template <class T> struct G { static int i; typedef E<i> C; };
+template <class T> int G<T>::i;
+
+#define AS(X) if (!(X)) return 1;
+int main()
+{
+ AS(B<int>::C::p == B<int>::c);
+ AS(B<float>::C::p == B<float>::c);
+ AS(B<float>::C::p != B<int>::c);
+ AS(D<int>::C::p == D<int>::c);
+ AS(D<float>::C::p == D<float>::c);
+ AS(D<float>::C::p != D<int>::c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id3.C
new file mode 100644
index 000000000..c769a529c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id3.C
@@ -0,0 +1,14 @@
+// PR c++/44587
+
+template <const int N> struct A { };
+template <class T> struct B {
+ static const int c; // { dg-message "not initialized with a constant expression" }
+ typedef A<B<T>::c> C; // { dg-error "constant expression|template argument" }
+};
+template <class T> const int B<T>::c = sizeof (T);
+
+template <const int N> struct D { };
+template <class T> struct E {
+ static const int c = sizeof (T);
+ typedef D<E<T>::c> F; // OK
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id4.C
new file mode 100644
index 000000000..0d97cb868
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id4.C
@@ -0,0 +1,20 @@
+// PR c++/48593
+
+template <typename T> struct foo
+{
+ T data;
+};
+
+template<typename T> struct bar: public foo<T>
+{
+ void some_func()
+ {
+ T* ptr = &(foo<T>::data);
+ }
+};
+
+int main()
+{
+ bar<int>().some_func();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id5.C
new file mode 100644
index 000000000..3126d332d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id5.C
@@ -0,0 +1,17 @@
+// PR c++/52596
+
+struct msgpack_zone_finalizer_array {
+ int* tail;
+};
+struct msgpack_zone {
+ msgpack_zone_finalizer_array finalizer_array;
+};
+struct zone : public msgpack_zone {
+ template <typename T> T* allocate();
+
+};
+template <typename T>
+T* zone::allocate()
+{
+ --msgpack_zone::finalizer_array.tail;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id6.C
new file mode 100644
index 000000000..83be874dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualified-id6.C
@@ -0,0 +1,14 @@
+// PR c++/54913
+
+struct E
+{
+ static const int& e;
+};
+
+template<typename>
+struct R
+{
+ R() { E::e; }
+};
+
+R<int> r;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp1.C
new file mode 100644
index 000000000..b97ef4275
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp1.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <class T> struct X
+{
+};
+
+template <class T> struct C
+{
+ X<T::template B> x; // { dg-error "type" }
+};
+
+int main()
+{
+ C<A> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp10.C
new file mode 100644
index 000000000..8734ddc67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp10.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <template <class> class TT> class C {
+};
+
+template <class T> struct D {
+ template <class U> class B {};
+ C<D<T>::template B> c;
+};
+
+D<int> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp11.C
new file mode 100644
index 000000000..fa5c860c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp11.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do link }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT> struct X
+{
+ TT<int> y;
+};
+
+template <class T> struct C
+{
+ X<T::template B> x;
+};
+
+int main()
+{
+ C<A> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp12.C
new file mode 100644
index 000000000..ebd4b645c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp12.C
@@ -0,0 +1,24 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do link }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT> void f()
+{
+ TT<int> y;
+}
+
+template <class T> struct C
+{
+ void g() { f<T::template B>(); }
+};
+
+int main()
+{
+ C<A> c;
+ c.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp13.C
new file mode 100644
index 000000000..eefc60493
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp13.C
@@ -0,0 +1,27 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+template <class U> struct A
+{
+ template <class V> struct AA {
+ template <class T> struct B {
+ int i;
+ B() : i(1) {}
+ };
+ };
+};
+
+template <template <class> class TT> struct X
+{
+ TT<int> y;
+};
+
+template <class T, class U> struct C
+{
+ X<T::template AA<U>::template B> x;
+};
+
+int main()
+{
+ C<A<char>, int> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp14.C
new file mode 100644
index 000000000..055855759
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp14.C
@@ -0,0 +1,30 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do link }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT, class T> struct X
+{
+ TT<int> y;
+ T z;
+};
+
+template <class T> struct X<T::template B, T>
+{
+ typename T::template B<int> y;
+ T z;
+};
+
+template <class T> struct C
+{
+ X<T::template B, A> x;
+};
+
+int main()
+{
+ C<A> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp15.C
new file mode 100644
index 000000000..b1c61195d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp15.C
@@ -0,0 +1,33 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT> struct X
+{
+ TT<int> y;
+};
+
+template <class T> struct X<T::template B> // { dg-error "previous" }
+{
+ T z;
+};
+
+template <class T> struct X<T::template B> // { dg-error "redefinition" }
+{
+ T z;
+};
+
+template <class T> struct C
+{
+ X<T::template B> x;
+};
+
+int main()
+{
+ C<A> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp16.C
new file mode 100644
index 000000000..1fd0e1f35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp16.C
@@ -0,0 +1,40 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do run }
+
+extern "C" void abort();
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT, class T> struct X
+{
+ TT<int> y;
+ T z;
+ int f() { return 0; }
+};
+
+template <class T> struct X<T::template B, T>
+{
+ typename T::template B<int> y;
+ T z;
+ int f() { return 1; }
+};
+
+template <class T> struct C
+{
+ X<T::template B, A> x;
+};
+
+int main()
+{
+ C<A> c;
+ X<A::B, A> x1;
+ X<A::B, int> x2;
+ if (x1.f() != 1)
+ abort();
+ if (x2.f() != 0)
+ abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp17.C
new file mode 100644
index 000000000..f492ced8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp17.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+// { dg-options "-fno-inline -fabi-version=1 -Wno-abi" }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT> struct X
+{
+};
+
+template <class T> void f(X<T::template B>)
+{
+}
+
+int main()
+{
+ X<A::B> x;
+ f<A>(x);
+}
+
+// { dg-final { scan-assembler "\n_?_Z1fI1AEv1XIN1T1BEE\[: \t\n\]" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp18.C
new file mode 100644
index 000000000..0a980f463
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp18.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2001, 2002 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <template <class> class TT> struct X
+{
+ TT<int> y;
+};
+
+struct C
+{
+ X<A::template B> x; // { dg-error "template" "" { target { ! c++11 } } }
+};
+
+int main()
+{
+ C c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp19.C
new file mode 100644
index 000000000..be6676cc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp19.C
@@ -0,0 +1,41 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+
+// PR 2645
+
+template <typename T>
+struct call_traits
+{
+ public:
+ typedef T type_less_spec;
+};
+
+template <typename T>
+struct call_traits<T&>
+{
+ typedef T type_more_spec;
+};
+
+
+int main()
+{
+ int num;
+
+ // Two typedefs lead to the instant. of the less spec. ("wrong") template
+ typedef int& r_type;
+ typedef const r_type cr_type;
+ call_traits<cr_type>::type_less_spec var = num; // { dg-error "" "" }
+
+ // The explicit type leads to the instantiation of the "correct" one
+ call_traits<const int&>::type_more_spec var2 = num;
+
+ // As happen with a single typedef!
+ typedef const int& std_cr_type;
+ call_traits<std_cr_type>::type_more_spec var3 = num;
+
+
+ // As happen, indeed, without the cv-qualifier
+ call_traits<r_type>::type_more_spec var4;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp2.C
new file mode 100644
index 000000000..b25e15f5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp2.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T> class B {};
+};
+
+template <int i> struct X
+{
+};
+
+template <class T> struct C
+{
+ X<T::template B> x; // { dg-error "type" }
+};
+
+int main()
+{
+ C<A> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp20.C
new file mode 100644
index 000000000..8073fe382
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp20.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-options "-pedantic -pedantic-errors" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+
+// PR 2645
+
+struct AS
+{
+ typedef void (myT) ();
+ struct L {};
+
+};
+
+
+template <typename T> struct B1 : T
+{
+ typedef typename T::L __restrict__ r;// { dg-error "'__restrict__' qualifiers cannot" "" }
+ typedef typename T::myT __restrict__ p;
+
+ // The following are DR 295 dependent
+ typedef typename T::myT volatile *myvolatile;
+ typename T::myT volatile *a;
+ myvolatile b;
+};
+template <typename T> struct B2 : T
+{
+ // The following are DR 295 dependent
+ typedef typename T::myT const *myconst;
+ typename T::myT const *a;
+ myconst b;
+};
+
+B1<AS> b1; // { dg-message "required" "" }
+B2<AS> b2;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp21.C
new file mode 100644
index 000000000..00fcf40c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp21.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Roger Sayle <roger@eyesopen.com>
+// { dg-do compile }
+
+template <class A>
+class foo {
+ int _foo;
+public:
+ foo() {}
+protected:
+ ~foo() {} // { dg-error "~foo" }
+};
+
+int main()
+{
+ foo<int> a; // { dg-error "context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp22.C
new file mode 100644
index 000000000..21aa7568d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp22.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Origin: Philippe Van Deyck <hetadres@email.com>
+
+// PR c++/13520: Default template template argument that is a qualified id
+// with dependent scope.
+
+template<typename regular_type> class Policy {};
+
+template <typename regular_type, template<typename> class OriginalPolicy>
+class ChangedPolicy_impl {};
+
+template <template<typename> class OriginalPolicy > class ChangedPolicy {
+public:
+ template<typename regular_type> class Type : public
+ ChangedPolicy_impl<regular_type,OriginalPolicy> { };
+};
+
+template <typename regular_type, template<typename> class Policy1,
+ template<typename> class Policy2
+ = ChangedPolicy<Policy1>::template Type>
+class Host : public Policy1<regular_type>, public Policy2<regular_type> { };
+
+int main()
+{
+ Host<void, Policy> h;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp3.C
new file mode 100644
index 000000000..61141b399
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp3.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T, class U> class B {};
+};
+
+template <template <class> class TT> struct X
+{
+ TT<int> y;
+};
+
+template <class T> struct C
+{
+ X<T::template B> x; // { dg-error "type" }
+};
+
+int main()
+{
+ C<A> c; // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp4.C
new file mode 100644
index 000000000..0f45c8c83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp4.C
@@ -0,0 +1,24 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+struct A
+{
+ template <class T> struct B {};
+};
+
+template <template <class, class> class TT> // { dg-error "provided" }
+struct X
+{
+ TT<int> y; // { dg-error "number" }
+};
+
+template <class T> struct C
+{
+ X<T::template B> x; // { dg-error "type" }
+};
+
+int main()
+{
+ C<A> c; // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp5.C
new file mode 100644
index 000000000..8ac1952f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp5.C
@@ -0,0 +1,26 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <class U> struct A
+{
+ template <class T> class B {}; // { dg-message "operator=|no known conversion" }
+};
+
+template <template <class> class TT> void f()
+{
+ TT<int> y;
+ y = 0; // { dg-error "no match" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+}
+
+template <class T> struct C
+{
+ void g() { f<A<T>::template B>(); } // { dg-message "required" }
+};
+
+int main()
+{
+ C<int> c;
+ c.g(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp6.C
new file mode 100644
index 000000000..7bd3c24f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp6.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <template <class> class TT> class C {
+};
+
+template <class T> struct D {
+ C<T::template B> c; // { dg-error "no class template" }
+};
+
+struct E {
+};
+
+D<E> d; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp7.C
new file mode 100644
index 000000000..e922f1d81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp7.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <template <class> class TT> class C {
+};
+
+template <class T> struct D {
+ C<T::template B> c; // { dg-error "no class template" }
+};
+
+D<int> d; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp8.C
new file mode 100644
index 000000000..c1396dbad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp8.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <template <class> class TT> class C {
+};
+
+template <class T> struct D {
+ C<T::template B> c; // { dg-error "context" }
+};
+
+struct E {
+ private:
+ template <class T> class B {}; // { dg-error "private" }
+};
+
+D<E> d; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp9.C
new file mode 100644
index 000000000..8d90dabde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/qualttp9.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <template <class> class TT> class C {
+};
+
+template <class T> struct D : T {
+ C<T::template B> c;
+};
+
+struct E {
+ protected:
+ template <class T> class B {};
+};
+
+D<E> d;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/recurse.C b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse.C
new file mode 100644
index 000000000..94b56f67e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse.C
@@ -0,0 +1,27 @@
+// Test for handling of excessive template recursion.
+// { dg-options "-ftemplate-depth-50 -O" }
+
+template <int I> struct F
+{
+ int operator()()
+ {
+ F<I+1> f; // { dg-error "incomplete type" "incomplete" }
+ // { dg-bogus "exceeds maximum.*exceeds maximum" "exceeds" { xfail *-*-* } 8 }
+ // { dg-error "exceeds maximum" "exceeds" { xfail *-*-* } 8 }
+ return f()*I; // { dg-message "recursively" "recurse" }
+ }
+};
+
+template <> struct F<52>
+{
+ int operator()() { return 0; }
+};
+
+int main ()
+{
+ F<1> f;
+ return f(); // { dg-message "from here" "excessive recursion" }
+}
+
+// Ignore excess messages from recursion.
+// { dg-prune-output "from 'int" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/recurse1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse1.C
new file mode 100644
index 000000000..4789983af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse1.C
@@ -0,0 +1,16 @@
+// PR c++/5050
+// Origin: georg.wild@gmx.de
+// Reduced by: tbagot@bluearc.com and Nathanael C. Nerode <neroden@twcny.rr.com>
+// Test for that excessive template recursion does not occur
+// because of optimization.
+// { dg-options "-ftemplate-depth-1 -O" }
+
+ struct ostream {
+ template<class T> ostream& foo( const T & )
+ { return *this; }
+ };
+
+ void foo() {
+ ostream os;
+ (os.foo(1)).foo(2);
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/recurse2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse2.C
new file mode 100644
index 000000000..eae411b5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse2.C
@@ -0,0 +1,8 @@
+// PR c++/9335
+// We should not see an error about non-constant initialization.
+
+template <int N> struct X {
+ static const int value = X<N-1>::value; // { dg-error "instantiation|incomplete" }
+ // { dg-message "recursively required" "" { target *-*-* } 5 }
+};
+template struct X<1000>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/recurse3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse3.C
new file mode 100644
index 000000000..f1db7c5cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/recurse3.C
@@ -0,0 +1,14 @@
+// PR c++/44609
+// { dg-options -ftemplate-depth=10 }
+
+template<int N>
+void f()
+{
+ 0 = 0; // { dg-error "lvalue required" }
+ f<N+1>(); // { dg-bogus "instantiation depth" }
+}
+
+int main()
+{
+ f<0>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/redecl1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl1.C
new file mode 100644
index 000000000..1bbf20ec7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl1.C
@@ -0,0 +1,4 @@
+// PR c++/15025
+
+template <int> struct X;
+struct X {}; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/redecl2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl2.C
new file mode 100644
index 000000000..4dd432e6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Origin: heinlein@informatik.uni-ulm.de
+
+// PR c++/14428: Redeclaration of class template with wrong
+// non-type template parameter.
+
+template <int i> struct X; // { dg-error "template parameter" }
+template <int* p> struct X; // { dg-error "redeclared here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/redecl3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl3.C
new file mode 100644
index 000000000..faa29bf45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl3.C
@@ -0,0 +1,7 @@
+// PR c++/19980
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// { dg-do compile }
+
+int foo; // { dg-message "previous declaration" }
+template<int> void foo() {} // { dg-error "redeclared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/redecl4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl4.C
new file mode 100644
index 000000000..9a4a9f366
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/redecl4.C
@@ -0,0 +1,5 @@
+// PR c++/28710
+// { dg-do compile }
+
+template<int> union A; // { dg-error "previous" }
+struct A; // { dg-error "non-template" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref1.C
new file mode 100644
index 000000000..5ac4329d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref1.C
@@ -0,0 +1,4 @@
+// { dg-prune-output "mangled name" }
+class a {} a1;
+template <a & p> class b { public: b() { static_cast <a &> (p); } };
+int main() { b <a1> b1; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref2.C
new file mode 100644
index 000000000..9feb19d2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref2.C
@@ -0,0 +1,27 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jan 2005 <nathan@codesourcery.com>
+
+// PR 19298: Rejects legal
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+struct t
+{
+ void f() const;
+};
+
+template <typename _Tp>
+struct A
+{
+ static t const& c;
+};
+
+template <typename _Tp>
+void g(void)
+{
+ A<_Tp>::c.f();
+}
+
+void h(void)
+{
+ g<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref3.C
new file mode 100644
index 000000000..976c093a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref3.C
@@ -0,0 +1,11 @@
+// PR c++/28341
+
+template<const int&> struct A {};
+
+template<typename T> struct B
+{
+ A<(T)0> b; // { dg-error "constant|not a valid" }
+ A<T(0)> a; // { dg-error "constant|not a valid" }
+};
+
+B<const int&> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref4.C
new file mode 100644
index 000000000..6d89fa80a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref4.C
@@ -0,0 +1,12 @@
+// PR c++/41972
+
+struct X {
+ static const double x;
+};
+template <const double& _test_>
+ class Foo { };
+template <typename _ignore_>
+struct Y {
+ typedef Foo<X::x> type;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref5.C
new file mode 100644
index 000000000..69c2d6989
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref5.C
@@ -0,0 +1,11 @@
+// PR c++/35075
+
+template<int&> struct A {};
+
+template<typename T> struct B
+{
+ static const T t;
+ A<t> a; // { dg-error "reference variable" }
+};
+
+B<int&> b; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref6.C
new file mode 100644
index 000000000..2e1254ae3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref6.C
@@ -0,0 +1,15 @@
+// PR c++/53816
+
+template <typename T>
+struct S { int v () const; };
+template <typename T>
+struct V : public S<T> {};
+struct U
+{
+ V<int> v;
+ template<typename T>
+ struct W
+ {
+ W (U const &x) { V<int> const &v = x.v; v.v(); }
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref7.C
new file mode 100644
index 000000000..f6395e2c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref7.C
@@ -0,0 +1,10 @@
+// PR c++/60167
+
+template <int& F>
+struct Foo {
+ typedef int Bar;
+
+ static Bar cache;
+};
+
+template <int& F> typename Foo<F>::Bar Foo<F>::cache;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref8.C
new file mode 100644
index 000000000..a2fc84719
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref8.C
@@ -0,0 +1,8 @@
+// PR c++/60222
+
+template<int&> struct A
+{
+ template<typename> struct B;
+
+ template<typename T> struct B<T*> {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo1.C
new file mode 100644
index 000000000..342993eca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo1.C
@@ -0,0 +1,20 @@
+// { dg-options "-frepo" }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+struct A {
+ A();
+};
+
+A::A() {}
+
+template <typename T>
+struct B : public A {
+ B() {} // { dg-bogus "" }
+};
+
+B<int> b;
+
+int main () {}
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo10.C
new file mode 100644
index 000000000..c92f7a52b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo10.C
@@ -0,0 +1,16 @@
+// PR c++/51910
+// { dg-options -frepo }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+// { dg-final cleanup-repo-files }
+
+template<typename T>
+struct Foo
+{
+ virtual ~Foo() { }
+};
+
+int main( int, char*[] )
+{
+ Foo<int> test;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo2.C
new file mode 100644
index 000000000..e3224155e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo2.C
@@ -0,0 +1,18 @@
+// PR c++/17163
+// { dg-options "-frepo" }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+template <int __inst>
+struct __Atomicity_lock
+{
+ static unsigned char _S_atomicity_lock;
+};
+template <int __inst>
+unsigned char __Atomicity_lock<__inst>::_S_atomicity_lock = 0;
+template unsigned char __Atomicity_lock<0>::_S_atomicity_lock;
+
+int main () {
+}
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo3.C
new file mode 100644
index 000000000..cfa38a9e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo3.C
@@ -0,0 +1,11 @@
+// { dg-options "-frepo -DF='a'" }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+template <typename A, typename B> void f () {}
+template <typename A, typename B> void g () { f<int,int>(); }
+int main () { g<int,int>(); }
+
+char c = F;
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo4.C
new file mode 100644
index 000000000..64882a8c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo4.C
@@ -0,0 +1,18 @@
+// PR c++/17775
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+namespace {
+ struct Foo {};
+}
+
+template <typename Tp>
+void foo(Tp) {}
+
+int
+main()
+{
+ foo(Foo());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo5.C
new file mode 100644
index 000000000..e45ade7df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo5.C
@@ -0,0 +1,14 @@
+// PR c++/25625
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+template< typename T, T N > struct integral_c {
+ static const T value = N;
+ typedef integral_c< T, value + 1 > next;
+};
+template< typename T, T N > T const integral_c< T, N >::value;
+integral_c<int,0> a;
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo6.C
new file mode 100644
index 000000000..4b7178e2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo6.C
@@ -0,0 +1,26 @@
+// PR c++/34178
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+template<typename T>
+class A
+{
+private:
+ static const int x;
+ static int y;
+
+public:
+ int getX () { return x + y; }
+};
+
+template<typename T> const int A<T>::x = 0;
+template<typename T> int A<T>::y = 0;
+
+int
+main ()
+{
+ A<int> a;
+ return a.getX();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo7.C
new file mode 100644
index 000000000..dafb3f559
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo7.C
@@ -0,0 +1,25 @@
+// PR c++/34340
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+struct A
+{
+ int a;
+};
+
+template <typename T> struct D
+{
+ static const A b;
+};
+
+template<typename T> const A D<T>::b = { 2 };
+template class D<A>;
+
+const A *x = &D<A>::b;
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo8.C
new file mode 100644
index 000000000..c51592c93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo8.C
@@ -0,0 +1,24 @@
+// PR c++/34340
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+struct A
+{
+ int a;
+};
+
+template <typename T> struct D
+{
+ static const A b;
+};
+
+template<typename T> const A D<T>::b = { 2 };
+
+const A *x = &D<A>::b;
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/repo9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/repo9.C
new file mode 100644
index 000000000..7ddc6bf56
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/repo9.C
@@ -0,0 +1,49 @@
+// PR c++/36364
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+// { dg-require-host-local "" }
+// { dg-skip-if "dkms are not final links" { vxworks_kernel } }
+
+template <typename C> struct A
+{
+ static void assign (C &c1, const C &c2) { c1 = c2; }
+};
+
+template <typename C, typename T> struct B
+{
+ struct D
+ {
+ static const C terminal;
+ static unsigned long stor[];
+ static D &empty_rep ()
+ {
+ void *p = reinterpret_cast <void *>(&stor);
+ return *reinterpret_cast <D *>(p);
+ }
+ void test (unsigned long n)
+ {
+ T::assign (this->refdata ()[n], terminal);
+ }
+ C *refdata () throw ()
+ {
+ return reinterpret_cast <C *>(this + 1);
+ }
+ };
+ C *dataplus;
+ C *data () const { return dataplus; }
+ D *rep () const { return &((reinterpret_cast < D * >(data ()))[-1]); }
+ static D & empty_rep () { return D::empty_rep (); }
+ B () : dataplus (empty_rep ().refdata ()) { }
+ ~B () { }
+ void push_back (C c) { rep ()->test (10); }
+};
+
+template <typename C, typename T> const C B <C, T>::D::terminal = C ();
+template <typename C, typename T> unsigned long B <C, T>::D::stor[64];
+
+int
+main ()
+{
+ B <char, A <char> > s;
+ s.push_back ('a');
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/restrict1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/restrict1.C
new file mode 100644
index 000000000..4452298eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/restrict1.C
@@ -0,0 +1,8 @@
+// PR c++/6392
+// Bug: We tried to make the array restricted, which doesn't make sense.
+
+template <class T>
+class bob
+{
+ T * __restrict a[50];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/scope1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/scope1.C
new file mode 100644
index 000000000..b017b0bdb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/scope1.C
@@ -0,0 +1,12 @@
+// PR 8327
+
+template <class T>
+class X
+{
+ static const int a = 5;
+
+ static T b[a];
+};
+
+template <class T> T X<T>::b[X::a];
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/scope2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/scope2.C
new file mode 100644
index 000000000..ad9bf8e9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/scope2.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Aug 2003 <nathan@codesourcery.com>
+
+// checked required bases in wrong scope.
+
+class Helper {};
+
+template<class T> struct X { };
+
+template<class T> class Base
+{
+ protected:
+ typedef Helper H;
+};
+
+template<class T >
+struct Derived : Base<T>
+{
+ typedef Base<T> Parent;
+ typedef typename Parent::H H;
+
+ class Nested : public X<H> {};
+
+ Nested m;
+
+ void Foo ();
+};
+
+void Foo (Derived<char> &x)
+{
+ x.Foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/scope3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/scope3.C
new file mode 100644
index 000000000..c191c79c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/scope3.C
@@ -0,0 +1,15 @@
+// PR c++/41038
+
+struct S
+{
+ int size() const;
+};
+
+template<typename T>
+struct Packer
+{
+ int foo() {
+ return Packer::var.size();
+ }
+ const S& var;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/scope4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/scope4.C
new file mode 100644
index 000000000..a4ae074c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/scope4.C
@@ -0,0 +1,15 @@
+// PR c++/46058
+
+class StringLiterals {
+public:
+ static const char dec[];
+};
+
+template<class St, class Base, const char* name>
+class NoValueCommand : public Base {
+public:
+};
+
+template<class St, class Base>
+class DecBasic : public NoValueCommand<St,Base,StringLiterals::dec> {
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae-dr657.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae-dr657.C
new file mode 100644
index 000000000..b78b5a919
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae-dr657.C
@@ -0,0 +1,22 @@
+// DR 657
+// Test that a return or parameter type with abstract class type causes a
+// deduction failure.
+
+struct A
+{
+ A();
+ A(int);
+ virtual void f() = 0;
+};
+
+template<class T> T declval();
+template<class T> int declval(...);
+
+template<class T> void arg(T);
+template<class T> int arg(...);
+
+int main()
+{
+ int i = declval<A>();
+ i = arg<A>(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae1.C
new file mode 100644
index 000000000..47db41154
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae1.C
@@ -0,0 +1,21 @@
+// PR c++/14337
+
+template <bool> struct Constraint;
+template <> struct Constraint<true> { typedef int Result; };
+
+template <typename T>
+struct IsInt { static const bool value = false; };
+
+template <>
+struct IsInt<int> { static const bool value = true; };
+
+template <typename T>
+typename Constraint<IsInt<T>::value>::Result foo(T);
+
+template <typename T>
+typename Constraint<!IsInt<T>::value>::Result foo(T);
+
+template <typename>
+void bar() {
+ foo(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae10.C
new file mode 100644
index 000000000..574feddb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae10.C
@@ -0,0 +1,180 @@
+// DR 339
+//
+// Test of the use of various unary operators with SFINAE
+// { dg-options "-fmessage-length=0 -pedantic-errors -Wno-long-long -ftrack-macro-expansion=0 " }
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#define DEFINE_PREFIX_UNARY_TRAIT(Name,Op) \
+template<typename T> \
+ typename enable_if<(sizeof(Op create_a<T>(), 1) > 0), \
+ yes_type>::type \
+ JOIN(check_,Name)(int); \
+ \
+template<typename T> \
+ no_type JOIN(check_,Name)(...); \
+ \
+template<typename T> \
+struct Name \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,Name)<T&>(0)) == sizeof(yes_type)); \
+}
+
+#define DEFINE_POSTFIX_UNARY_TRAIT(Name,Op) \
+template<typename T> \
+ typename enable_if<(sizeof(create_a<T>() Op, 1) > 0), \
+ yes_type>::type \
+ JOIN(check_,Name)(int); \
+ \
+template<typename T> \
+ no_type JOIN(check_,Name)(...); \
+ \
+template<typename T> \
+struct Name \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,Name)<T&>(0)) == sizeof(yes_type)); \
+}
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct W {
+ W operator+();
+ W operator-();
+ int operator*();
+ W operator~();
+ bool operator!();
+ W& operator++();
+ W& operator--();
+ W& operator++(int);
+ W& operator--(int);
+};
+
+struct X { };
+X operator+(X);
+X operator-(X);
+int operator*(X);
+X operator~(X);
+bool operator!(X);
+X& operator++(X&);
+X& operator--(X&);
+X& operator++(X&, int);
+X& operator--(X&, int);
+
+struct Y { };
+
+struct Z {
+private:
+ Z operator+();
+ Z operator-();
+ int operator*();
+ Z operator~();
+ bool operator!();
+ Z& operator++();
+ Z& operator--();
+ Z& operator++(int);
+ Z& operator--(int);
+};
+
+// has_unary_plus
+DEFINE_PREFIX_UNARY_TRAIT(has_unary_plus, +);
+STATIC_ASSERT((has_unary_plus<int>::value));
+STATIC_ASSERT((!has_unary_plus<int X::*>::value));
+STATIC_ASSERT((has_unary_plus<W>::value));
+STATIC_ASSERT((has_unary_plus<X>::value));
+STATIC_ASSERT((!has_unary_plus<Y>::value));
+
+// is_negatable
+DEFINE_PREFIX_UNARY_TRAIT(is_negatable, -);
+STATIC_ASSERT((is_negatable<int>::value));
+STATIC_ASSERT((!is_negatable<int X::*>::value));
+STATIC_ASSERT((is_negatable<W>::value));
+STATIC_ASSERT((is_negatable<X>::value));
+STATIC_ASSERT((!is_negatable<Y>::value));
+
+// is_dereferenceable
+DEFINE_PREFIX_UNARY_TRAIT(is_dereferenceable, *);
+STATIC_ASSERT((!is_dereferenceable<int>::value));
+STATIC_ASSERT((is_dereferenceable<int*>::value));
+STATIC_ASSERT((is_dereferenceable<W>::value));
+STATIC_ASSERT((is_dereferenceable<X>::value));
+STATIC_ASSERT((!is_dereferenceable<Y>::value));
+
+// has_bitwise_not
+DEFINE_PREFIX_UNARY_TRAIT(has_bitwise_not, ~);
+STATIC_ASSERT((has_bitwise_not<int>::value));
+STATIC_ASSERT((!has_bitwise_not<int*>::value));
+STATIC_ASSERT((has_bitwise_not<W>::value));
+STATIC_ASSERT((has_bitwise_not<X>::value));
+STATIC_ASSERT((!has_bitwise_not<Y>::value));
+
+// has_truth_not
+DEFINE_PREFIX_UNARY_TRAIT(has_truth_not, !);
+STATIC_ASSERT((has_truth_not<int>::value));
+STATIC_ASSERT((has_truth_not<int*>::value));
+STATIC_ASSERT((has_truth_not<W>::value));
+STATIC_ASSERT((has_truth_not<X>::value));
+STATIC_ASSERT((!has_truth_not<Y>::value));
+
+// has_preincrement
+DEFINE_PREFIX_UNARY_TRAIT(has_preincrement, ++);
+STATIC_ASSERT((has_preincrement<int>::value));
+STATIC_ASSERT((has_preincrement<int*>::value));
+STATIC_ASSERT((!has_preincrement<int X::*>::value));
+STATIC_ASSERT((has_preincrement<W>::value));
+STATIC_ASSERT((has_preincrement<X>::value));
+STATIC_ASSERT((!has_preincrement<Y>::value));
+
+// has_predecrement
+DEFINE_PREFIX_UNARY_TRAIT(has_predecrement, --);
+STATIC_ASSERT((has_predecrement<int>::value));
+STATIC_ASSERT((has_predecrement<int*>::value));
+STATIC_ASSERT((!has_predecrement<int X::*>::value));
+STATIC_ASSERT((has_predecrement<W>::value));
+STATIC_ASSERT((has_predecrement<X>::value));
+STATIC_ASSERT((!has_predecrement<Y>::value));
+
+// has_postincrement
+DEFINE_POSTFIX_UNARY_TRAIT(has_postincrement, ++);
+STATIC_ASSERT((has_postincrement<int>::value));
+STATIC_ASSERT((has_postincrement<int*>::value));
+STATIC_ASSERT((!has_postincrement<int X::*>::value));
+STATIC_ASSERT((has_postincrement<W>::value));
+STATIC_ASSERT((has_postincrement<X>::value));
+STATIC_ASSERT((!has_postincrement<Y>::value));
+
+// has_postdecrement
+DEFINE_POSTFIX_UNARY_TRAIT(has_postdecrement, --);
+STATIC_ASSERT((has_postdecrement<int>::value));
+STATIC_ASSERT((has_postdecrement<int*>::value));
+STATIC_ASSERT((!has_postdecrement<int X::*>::value));
+STATIC_ASSERT((has_postdecrement<W>::value));
+STATIC_ASSERT((has_postdecrement<X>::value));
+STATIC_ASSERT((!has_postdecrement<Y>::value));
+
+// Check for private members
+STATIC_ASSERT((!has_unary_plus<Z>::value));
+STATIC_ASSERT((!is_negatable<Z>::value));
+STATIC_ASSERT((!is_dereferenceable<Z>::value));
+STATIC_ASSERT((!has_bitwise_not<Z>::value));
+STATIC_ASSERT((!has_truth_not<Z>::value));
+STATIC_ASSERT((!has_preincrement<Z>::value));
+STATIC_ASSERT((!has_predecrement<Z>::value));
+STATIC_ASSERT((!has_postincrement<Z>::value));
+STATIC_ASSERT((!has_postdecrement<Z>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae11.C
new file mode 100644
index 000000000..a813055ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae11.C
@@ -0,0 +1,53 @@
+// DR 339
+//
+// Test of the use of the comma operator with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+template<typename T, typename U>
+ typename enable_if<(sizeof(create_a<T>(), create_a<U>()) > 0),
+ yes_type>::type
+ check_comma(int);
+
+template<typename T, typename U> no_type check_comma(...);
+
+template<typename T, typename U>
+struct has_comma
+{
+ static const bool value =
+ (sizeof(check_comma<T, U>(0)) == sizeof(yes_type));
+};
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct X { };
+struct Y { };
+struct Z { };
+
+bool operator,(X&, Y);
+bool operator,(X, Z);
+void operator,(const Y&, const Z&);
+
+STATIC_ASSERT((has_comma<int, float>::value));
+STATIC_ASSERT((has_comma<int, X>::value));
+STATIC_ASSERT((has_comma<X, X>::value));
+STATIC_ASSERT((has_comma<X, Y>::value));
+STATIC_ASSERT((has_comma<X&, Y>::value));
+STATIC_ASSERT((has_comma<X, Z>::value));
+STATIC_ASSERT((!has_comma<Y, Z>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae12.C
new file mode 100644
index 000000000..c51211be2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae12.C
@@ -0,0 +1,47 @@
+// DR 339
+//
+// Test of the use of the ternary operator with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+template<typename T, typename U, typename V>
+typename enable_if<
+ (sizeof((create_a<T>()? create_a<U>() : create_a<V>()), 0) > 0),
+ yes_type>::type
+ check_ternary(int);
+
+template<typename T, typename U, typename V> no_type check_ternary(...);
+
+template<typename T, typename U, typename V>
+struct has_ternary
+{
+ static const bool value =
+ (sizeof(check_ternary<T, U, V>(0)) == sizeof(yes_type));
+};
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct X { };
+struct Y { operator bool(); };
+
+STATIC_ASSERT((has_ternary<int, float, double>::value));
+STATIC_ASSERT((has_ternary<bool, double, double>::value));
+STATIC_ASSERT((!has_ternary<int, float*, double>::value));
+STATIC_ASSERT((!has_ternary<X, double, double>::value));
+STATIC_ASSERT((has_ternary<Y, double, double>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae13.C
new file mode 100644
index 000000000..b659685d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae13.C
@@ -0,0 +1,86 @@
+// DR 339
+//
+// Test of the use of casts with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#define CHECK_CAST(CastKind) \
+template<typename T, typename U> \
+ typename enable_if<(sizeof((JOIN(CastKind,_cast)<U>(create_a<T>())), 0) > 0), \
+ yes_type>::type \
+ JOIN(check_,JOIN(CastKind,_cast))(int); \
+ \
+template<typename T, typename U> \
+ no_type JOIN(check_,JOIN(CastKind,_cast))(...); \
+ \
+template<typename T, typename U> \
+struct JOIN(has_,JOIN(CastKind,_cast)) \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,JOIN(CastKind,_cast))<T, U>(0)) == sizeof(yes_type)); \
+}
+
+template<typename T, typename U>
+typename enable_if<(sizeof(((U)create_a<T>()), 0) > 0), yes_type>::type
+ check_c_cast(int);
+
+template<typename T, typename U> no_type check_c_cast(...);
+
+template<typename T, typename U>
+struct has_c_cast
+{
+ static const bool value =
+ (sizeof(check_c_cast<T, U>(0)) == sizeof(yes_type));
+};
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+CHECK_CAST(static);
+CHECK_CAST(dynamic);
+CHECK_CAST(const);
+CHECK_CAST(reinterpret);
+
+struct X { virtual void f(); };
+struct Y { operator bool(); };
+struct Z : public X { };
+
+STATIC_ASSERT((has_static_cast<int, float>::value));
+STATIC_ASSERT((!has_static_cast<X, Y>::value));
+STATIC_ASSERT((has_static_cast<Z, X>::value));
+
+STATIC_ASSERT(!(has_dynamic_cast<int, float>::value));
+STATIC_ASSERT(!(has_dynamic_cast<X, Y>::value));
+STATIC_ASSERT(!(has_dynamic_cast<X, Z>::value));
+STATIC_ASSERT(!(has_dynamic_cast<Y, Z>::value));
+STATIC_ASSERT((has_dynamic_cast<X*, Z*>::value));
+STATIC_ASSERT((has_dynamic_cast<X*, Y*>::value));
+STATIC_ASSERT(!(has_dynamic_cast<Y*, Z*>::value));
+
+STATIC_ASSERT(!(has_const_cast<int, float>::value));
+STATIC_ASSERT((has_const_cast<const int*, int*>::value));
+STATIC_ASSERT((has_const_cast<int*, const int*>::value));
+STATIC_ASSERT(!(has_const_cast<const int*, float*>::value));
+
+STATIC_ASSERT((has_reinterpret_cast<int*, float*>::value));
+STATIC_ASSERT(!(has_reinterpret_cast<void*, char>::value));
+STATIC_ASSERT(!(has_reinterpret_cast<const X, X>::value));
+
+STATIC_ASSERT((has_c_cast<int, float>::value));
+STATIC_ASSERT(!(has_c_cast<X, Y>::value));
+STATIC_ASSERT(!(has_c_cast<void*, char>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae14.C
new file mode 100644
index 000000000..93eba43a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae14.C
@@ -0,0 +1,79 @@
+// DR 339
+//
+// Test of the use of the new and new[] operators with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+template<typename T>
+typename enable_if<(sizeof(new T, 0) > 0), yes_type>::type
+ check_new(int);
+
+template<typename T> no_type check_new(...);
+
+template<typename T>
+struct has_new
+{
+ static const bool value =
+ (sizeof(check_new<T>(0)) == sizeof(yes_type));
+};
+
+template<typename T, typename U>
+typename enable_if<(sizeof((new T(create_a<U>())), 0) > 0),
+ yes_type>::type
+ check_new_one_arg(int);
+
+template<typename T, typename U> no_type check_new_one_arg(...);
+
+template<typename T, typename U>
+struct has_new_one_arg
+{
+ static const bool value =
+ (sizeof(check_new_one_arg<T, U>(0)) == sizeof(yes_type));
+};
+
+template<typename T, typename U, U N>
+typename enable_if<(sizeof(new T[N], 0) > 0), yes_type>::type
+ check_array_new(int);
+
+template<typename T, typename U, U N> no_type check_array_new(...);
+
+template<typename T, typename U, U N>
+struct has_array_new
+{
+ static const bool value =
+ (sizeof(check_array_new<T, U, N>(0)) == sizeof(yes_type));
+};
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct X {
+ X(int);
+};
+
+struct Y { int foo; };
+
+STATIC_ASSERT((has_new<Y>::value));
+STATIC_ASSERT(!(has_new<X>::value));
+STATIC_ASSERT((has_new_one_arg<Y, Y>::value));
+STATIC_ASSERT((has_new_one_arg<X, float>::value));
+STATIC_ASSERT(!(has_new_one_arg<X, int X::*>::value));
+
+STATIC_ASSERT((has_array_new<Y, int, 5>::value));
+STATIC_ASSERT(!(has_array_new<X, int Y::*, &Y::foo>::value));
+STATIC_ASSERT((has_array_new<X, int, 5>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae15.C
new file mode 100644
index 000000000..326823bcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae15.C
@@ -0,0 +1,22 @@
+// PR c++/40944
+// { dg-do run { target c++11 } }
+
+template<typename T>
+struct make { static T&& it(); };
+
+void (*pf)(int&) = 0;
+
+template< typename T >
+int bar(T const& x,
+ decltype( pf(make<T const&>::it()) )* = 0 // SFINAE!
+ ) {
+ return 1;
+}
+
+int bar(...) {
+ return 0;
+}
+
+int main() {
+ return bar(42);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae16.C
new file mode 100644
index 000000000..3df581a32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae16.C
@@ -0,0 +1,35 @@
+// PR c++/41927
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+
+// We were getting a spurious ||/&& warning about the enable_if with the
+// source position of d1.
+
+template<typename Tp>
+ struct is_int
+ { static const bool value = true; };
+
+template<bool, typename Tp = void>
+ struct enable_if
+ { };
+
+template<typename Tp>
+ struct enable_if<true, Tp>
+ { typedef Tp type; };
+
+template<typename Rep>
+ struct duration
+ {
+ duration() { }
+
+ template<typename Rep2, typename = typename
+ enable_if<false || (true && is_int<Rep2>::value)>::type>
+ duration(const duration<Rep2>&) { }
+ };
+
+int main()
+{
+ duration<int> d0;
+ duration<int> d1 = d0; // { dg-warning "set but not used" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae17.C
new file mode 100644
index 000000000..eb043cbdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae17.C
@@ -0,0 +1,28 @@
+// The conversion from D* to B* is ambiguous, but that should not produce
+// an error, it should remove the first f overload by SFINAE.
+
+#define static_assert(TEST,STR) \
+ do { int ar[(TEST)?1:-1]; } while (0);
+
+struct B {};
+
+struct B1 : B {};
+struct B2 : B {};
+
+struct D : B1, B2 {};
+
+template <class T> T create();
+
+typedef char one[1];
+typedef char two[2];
+
+template <class T>
+ one &f(char (*)[sizeof static_cast<T>(create<D *>())]);
+template <class T>
+ two &f(...);
+
+int main()
+{
+ static_assert(sizeof f<int>(0) == sizeof(two), "");
+ static_assert(sizeof f<B *>(0) == sizeof(two), "");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae18.C
new file mode 100644
index 000000000..bbc39cb3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae18.C
@@ -0,0 +1,10 @@
+// PR c++/41468
+
+typedef int Ft(int);
+struct A { operator Ft*(); };
+struct B { operator Ft*(); };
+struct C : A, B { };
+
+template<typename C> void f(int (*a)[sizeof(C()(0))]);
+template<typename C> void f(...);
+int main() { f<C>(0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae19.C
new file mode 100644
index 000000000..59be183fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae19.C
@@ -0,0 +1,44 @@
+// PR c++/44907
+
+struct A { };
+
+struct B
+: public A { };
+
+struct C
+: public A { };
+
+struct D
+: public B, public C { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename From, typename To>
+ class mini_is_convertible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename To1>
+ static void test_aux(To1);
+
+ template<typename To1, typename From1>
+ static typename
+ enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type
+ test(int);
+
+ template<typename, typename>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<To, From>(0)) == 1;
+ };
+
+template<typename From, typename To>
+ const bool mini_is_convertible<From, To>::value;
+
+int Test1[mini_is_convertible<D*, A*>::value ? -1 : 1];
+int Test2[mini_is_convertible<A*, D*>::value ? -1 : 1];
+int Test3[mini_is_convertible<D, A>::value ? -1 : 1];
+int Test4[mini_is_convertible<A, D>::value ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae2.C
new file mode 100644
index 000000000..c9e103114
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae2.C
@@ -0,0 +1,18 @@
+// PR c++/19989
+// Don't instantiate a function template if it would generate an
+// array of size zero.
+
+// { dg-do compile }
+
+template<int T> struct cl {
+ const static int value = T;
+};
+
+template<int I> void fn (char (*) [cl<I>::value] = 0 ); // { dg-error "zero-size array" }
+
+void foo (void)
+{
+ fn<0> (); // { dg-error "no matching function" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 15 }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae20.C
new file mode 100644
index 000000000..61bd8da93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae20.C
@@ -0,0 +1,45 @@
+// PR c++/44907
+// { dg-do compile { target c++11 } }
+
+#include <utility>
+
+struct A { };
+
+struct B
+: public A { };
+
+struct C
+: public A { };
+
+struct D
+: public B, public C { };
+
+template<typename From, typename To>
+ class mini_is_convertible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename To1>
+ static void test_aux(To1);
+
+ template<typename To1, typename From1>
+ static decltype(test_aux<To1>(std::declval<From1>()), one())
+ test(int);
+
+ template<typename, typename>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<To, From>(0)) == 1;
+ };
+
+template<typename From, typename To>
+ const bool mini_is_convertible<From, To>::value;
+
+static_assert (!mini_is_convertible<D*, A*>::value, "");
+static_assert (!mini_is_convertible<A*, D*>::value, "");
+static_assert (!mini_is_convertible<D&, A&>::value, "");
+static_assert (!mini_is_convertible<A&, D&>::value, "");
+static_assert (!mini_is_convertible<D, A>::value, "");
+static_assert (!mini_is_convertible<A, D>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae21.C
new file mode 100644
index 000000000..6086f2f9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae21.C
@@ -0,0 +1,40 @@
+// PR c++/44908
+
+struct A { };
+
+struct B
+: public virtual A { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename From, typename To>
+ class mini_is_convertible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename To1>
+ static void test_aux(To1);
+
+ template<typename To1, typename From1>
+ static typename
+ enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type
+ test(int);
+
+ template<typename, typename>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<To, From>(0)) == 1;
+ };
+
+template<typename From, typename To>
+ const bool mini_is_convertible<From, To>::value;
+
+int Test1[mini_is_convertible<int (B::*) (int),
+ int (A::*) (int)>::value ? -1 : 1];
+int Test2[mini_is_convertible<int (B::*), int (A::*)>::value ? -1 : 1];
+int Test3[mini_is_convertible<int (A::*) (int),
+ int (B::*) (int)>::value ? -1 : 1];
+int Test4[mini_is_convertible<int (A::*), int (B::*)>::value ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae22.C
new file mode 100644
index 000000000..57846feba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae22.C
@@ -0,0 +1,39 @@
+// PR c++/44908
+// { dg-do compile { target c++11 } }
+
+#include <utility>
+
+struct A { };
+
+struct B
+: public virtual A { };
+
+template<typename From, typename To>
+ class mini_is_convertible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename To1>
+ static void test_aux(To1);
+
+ template<typename To1, typename From1>
+ static decltype(test_aux<To1>(std::declval<From1>()), one())
+ test(int);
+
+ template<typename, typename>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<To, From>(0)) == 1;
+ };
+
+template<typename From, typename To>
+ const bool mini_is_convertible<From, To>::value;
+
+static_assert (!mini_is_convertible<int (B::*) (int),
+ int (A::*) (int)>::value, "");
+static_assert (!mini_is_convertible<int (B::*), int (A::*)>::value, "");
+static_assert (!mini_is_convertible<int (A::*) (int),
+ int (B::*) (int)>::value, "");
+static_assert (!mini_is_convertible<int (A::*), int (B::*)>::value, "");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae23.C
new file mode 100644
index 000000000..53ed51dd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae23.C
@@ -0,0 +1,23 @@
+// PR c++/44969
+// { dg-do compile { target c++11 } }
+
+template<typename Tp, typename... Args>
+ class mini_is_constructible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename Tp1, typename... Args1>
+ static decltype(Tp1(Args1()...), one())
+ test(int);
+
+ template<typename, typename...>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<Tp, Args...>(0)) == 1;
+ };
+
+class A { };
+
+int Test[mini_is_constructible<int, A, A>::value ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae24.C
new file mode 100644
index 000000000..7138c96e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae24.C
@@ -0,0 +1,26 @@
+// PR c++/44969
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename Tp, typename Arg1, typename Arg2>
+ class mini_is_constructible
+ {
+ typedef char one;
+ typedef struct { char arr[2]; } two;
+
+ template<typename Tp1, typename Arg1_, typename Arg2_>
+ static typename
+ enable_if<(sizeof(Tp1(Arg1_(), Arg2_()), 1) > 0), one>::type
+ test(int);
+
+ template<typename, typename, typename>
+ static two test(...);
+
+ public:
+ static const bool value = sizeof(test<Tp, Arg1, Arg2>(0)) == 1;
+ };
+
+class A { };
+
+int Test[mini_is_constructible<int, A, A>::value ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae25.C
new file mode 100644
index 000000000..e9ee83e12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae25.C
@@ -0,0 +1,14 @@
+template <int I>
+struct A { };
+
+template <int J>
+void f(A<1/J>);
+
+template <int J>
+void f(...) { }
+
+int main()
+{
+ f<0>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae26.C
new file mode 100644
index 000000000..dcb018f80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae26.C
@@ -0,0 +1,34 @@
+// Origin: PR c++/46170
+// { dg-do compile }
+
+namespace util {
+ struct option_value {
+ };
+ template <class T> struct options_map_impl {
+ typedef T options_struct_type;
+ typedef bool (*opt_func)(const option_value&, options_struct_type&);
+ template <class V, V K> static bool set_member_constant(const option_value&,
+ options_struct_type&, V options_struct_type::*);
+ template <class V, V options_struct_type::*mem, V K> static bool
+ set_member_constant(const option_value& opt, options_struct_type& t) {
+ return set_member_constant<V,K>(opt, t, mem);
+ }
+ };
+}
+struct cflat_options {
+ bool show_precharges;
+};
+typedef util::options_map_impl<cflat_options> options_map_impl_type;
+class register_options_modifier {
+ typedef options_map_impl_type::opt_func modifier_type;
+public: register_options_modifier();
+ register_options_modifier(const char* Mode, const modifier_type COM,
+ const char* h);
+};
+static const register_options_modifier
+cflat_opt_mod_show_precharges("precharges",
+ &options_map_impl_type::set_member_constant<bool,
+ &cflat_options::show_precharges, true>, "show precharge expressions"),
+ cflat_opt_mod_no_show_precharges("no-" "precharges",
+ &options_map_impl_type::set_member_constant<bool,
+ &cflat_options::show_precharges, false>, "hide precharge expressions");
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae27.C
new file mode 100644
index 000000000..0ecd1700d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae27.C
@@ -0,0 +1,33 @@
+// Origin: PR c++/46162
+
+struct small_type { char dummy; };
+struct large_type { char dummy[2]; };
+
+template<class T>
+struct has_foo_member_variable
+{
+ template<int T::*> struct tester;
+ template<class U> static small_type has_foo(tester<&U::foo> *);
+ template<class U> static large_type has_foo(...);
+ static const bool value = (sizeof(has_foo<T>(0)) == sizeof(small_type));
+};
+
+struct A
+{
+ static int foo()
+ {
+ return 0;
+ }
+};
+
+struct B
+{
+ static int foo;
+};
+
+void
+bar()
+{
+ bool b = has_foo_member_variable<A>::value;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae28.C
new file mode 100644
index 000000000..1bd9c2cd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae28.C
@@ -0,0 +1,24 @@
+// Origin: PR c++/44267
+
+struct B {};
+struct D : B {};
+struct VD : virtual B {};
+
+template <class T> T create();
+
+typedef char one[1];
+typedef char two[2];
+
+template <class D, class B>
+one& f(char (*)[sizeof(static_cast<D>(create<B>()))]);
+
+template <class D, class B>
+two& f(...);
+
+int main()
+{
+ f<D*, int>(0);
+ f<D*, B*>(0);
+ f<VD*, B*>(0);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae3.C
new file mode 100644
index 000000000..b08d20112
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae3.C
@@ -0,0 +1,17 @@
+// PR c++/24671
+// { dg-do compile }
+
+template<typename> struct A
+{
+ typedef int X;
+ static const int i = 0;
+};
+
+template<typename> struct B
+{
+ B(const B&);
+ typedef typename A<char[A<B>::i]>::X Y; // { dg-error "forbids zero-size array" }
+ template<typename T> B(T, Y);
+};
+
+B<int> b(0,0); // { dg-message "required from here" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae4.C
new file mode 100644
index 000000000..a9650511e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae4.C
@@ -0,0 +1,35 @@
+// DR 339
+//
+// Test of the use of free functions with SFINAE
+void foo(int) { }
+template<typename T> void foo(T*) { }
+
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename T>
+ typename enable_if<(sizeof(foo(create_a<T const&>()), 1) > 0),
+ yes_type>::type
+ check_has_foo(const volatile T&);
+
+no_type check_has_foo(...);
+
+template<typename T>
+struct has_foo
+{
+ static const bool value =
+ (sizeof(check_has_foo(create_a<T const&>())) == sizeof(yes_type));
+};
+
+struct X { };
+
+int a1[has_foo<int>::value? 1 : -1];
+int a2[has_foo<long>::value? 1 : -1];
+int a3[has_foo<int*>::value? 1 : -1];
+int a4[has_foo<X>::value? -1 : 1];
+int a5[has_foo<int X::*>::value? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae5.C
new file mode 100644
index 000000000..516e5cc85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae5.C
@@ -0,0 +1,47 @@
+// DR 339
+//
+// Test of the use of member functions with SFINAE
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename T>
+ typename enable_if<(sizeof(create_a<T>().foo(), 1) > 0),
+ yes_type>::type
+ check_has_member_foo(const volatile T&);
+
+no_type check_has_member_foo(...);
+
+template<typename T>
+struct has_foo
+{
+ static const bool value =
+ (sizeof(check_has_member_foo(create_a<T const&>())) == sizeof(yes_type));
+};
+
+struct X { };
+struct Y {
+ void foo();
+};
+struct Z {
+ void foo(int);
+};
+
+struct A {
+ int foo;
+};
+
+struct B {
+ static int foo();
+};
+
+int a1[has_foo<X>::value? -1 : 1];
+int a2[has_foo<Y>::value? 1 : -1];
+int a3[has_foo<Z>::value? -1 : 1];
+int a4[has_foo<int>::value? -1 : 1];
+int a5[has_foo<A>::value? -1 : 1];
+int a6[has_foo<B>::value? 1 : -1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6.C
new file mode 100644
index 000000000..64567aae2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6.C
@@ -0,0 +1,83 @@
+// DR 339
+//
+// Test of the use of the function call operator with SFINAE
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename F, typename T1, typename T2>
+ typename enable_if<sizeof(create_a<F>()(create_a<T1>(), create_a<T2>()), 1),
+ yes_type>::type
+ check_is_callable2(type<F>, type<T1>, type<T2>);
+
+no_type check_is_callable2(...);
+
+template<typename F, typename T1, typename T2 = T1>
+struct is_callable2
+{
+ static const bool value =
+ (sizeof(check_is_callable2(type<F>(), type<T1>(), type<T2>()))
+ == sizeof(yes_type));
+};
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+
+struct A;
+struct B;
+
+struct A {
+ A(B);
+};
+
+struct B {
+ B(A);
+};
+
+struct F1 { };
+
+struct F2 {
+ bool operator()(int, float);
+};
+
+struct F3 {
+ bool operator()(int);
+};
+
+struct F4 {
+ void operator()(A, A);
+ void operator()(B, B);
+};
+
+struct F5 {
+ void operator()(A, A);
+
+private:
+ void operator()(B, B);
+};
+
+STATIC_ASSERT((is_callable2<int(*)(int, int), long, int>::value));
+STATIC_ASSERT((!is_callable2<int(*)(int, int), int*, int>::value));
+STATIC_ASSERT((!is_callable2<F1, int, int>::value));
+STATIC_ASSERT((is_callable2<F2, int, int>::value));
+STATIC_ASSERT((!is_callable2<F2, int*, int>::value));
+STATIC_ASSERT((!is_callable2<F3, int, int>::value));
+STATIC_ASSERT((is_callable2<F4, A, A>::value));
+STATIC_ASSERT((is_callable2<F4, B, B>::value));
+STATIC_ASSERT((!is_callable2<F4, A, B>::value));
+STATIC_ASSERT((is_callable2<F5, A, A>::value));
+STATIC_ASSERT((!is_callable2<F5, A, B>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6_neg.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6_neg.C
new file mode 100644
index 000000000..6ed3d2267
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae6_neg.C
@@ -0,0 +1,58 @@
+// DR 339
+//
+// Test of the use of the function call operator with SFINAE
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+template<typename F, typename T1, typename T2>
+ typename enable_if<sizeof(create_a<F>()(create_a<T1>(), create_a<T2>()), 1),
+ yes_type>::type
+ check_is_callable2(type<F>, type<T1>, type<T2>);
+
+no_type check_is_callable2(...);
+
+template<typename F, typename T1, typename T2 = T1>
+struct is_callable2
+{
+ static const bool value =
+ (sizeof(check_is_callable2(type<F>(), type<T1>(), type<T2>()))
+ == sizeof(yes_type));
+};
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+
+struct A;
+struct B;
+
+struct A {
+ A(B);
+};
+
+struct B {
+ B(A);
+};
+
+struct F {
+ void operator()(A, A);
+
+private:
+ void operator()(B, B);
+};
+
+STATIC_ASSERT((!is_callable2<F, B, B>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae7.C
new file mode 100644
index 000000000..8551eb279
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae7.C
@@ -0,0 +1,199 @@
+// DR 339
+//
+// Test of the use of various binary operators with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#define DEFINE_INFIX_BINARY_TRAIT(Name,Op) \
+template<typename T, typename U> \
+ typename enable_if<(sizeof(create_a<T>() Op create_a<U>(), 1) > 0), \
+ yes_type>::type \
+ JOIN(check_,Name)(type<T>, type<U>); \
+ \
+no_type JOIN(check_,Name)(...); \
+ \
+template<typename T, typename U = T> \
+struct Name \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,Name)(type<T>(), type<U>())) == sizeof(yes_type)); \
+}
+
+template<typename T, typename U>
+ typename enable_if<(sizeof(create_a<T>()[create_a<U>()], 1) > 0),
+ yes_type>::type
+ check_subscript(int);
+
+template<typename T, typename U>
+ no_type check_subscript(...);
+
+template<typename T, typename U>
+struct can_subscript
+{
+ static const bool value =
+ (sizeof(check_subscript<T, U>(0)) == sizeof(yes_type));
+};
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct X { };
+struct Y { int operator[](X); };
+
+// is_addable
+DEFINE_INFIX_BINARY_TRAIT(is_addable, +);
+X operator+(X, X);
+X operator+(X, Y);
+STATIC_ASSERT((is_addable<int>::value));
+STATIC_ASSERT((is_addable<int, long>::value));
+STATIC_ASSERT((is_addable<X>::value));
+STATIC_ASSERT((is_addable<int*, int>::value));
+STATIC_ASSERT((!is_addable<int*>::value));
+STATIC_ASSERT((is_addable<X, Y>::value));
+STATIC_ASSERT((!is_addable<Y>::value));
+
+// is_subtractable
+DEFINE_INFIX_BINARY_TRAIT(is_subtractable, -);
+X operator-(X, X);
+X operator-(X, Y);
+STATIC_ASSERT((is_subtractable<int>::value));
+STATIC_ASSERT((is_subtractable<int, long>::value));
+STATIC_ASSERT((is_subtractable<X>::value));
+STATIC_ASSERT((is_subtractable<int*, int>::value));
+STATIC_ASSERT((is_subtractable<int*>::value));
+STATIC_ASSERT((is_subtractable<X, Y>::value));
+STATIC_ASSERT((!is_subtractable<Y>::value));
+STATIC_ASSERT((!is_subtractable<int X::*>::value));
+
+// is_multiplicable
+DEFINE_INFIX_BINARY_TRAIT(is_multiplicable, *);
+X operator*(X, X);
+X operator*(X, Y);
+STATIC_ASSERT((is_multiplicable<int>::value));
+STATIC_ASSERT((is_multiplicable<int, long>::value));
+STATIC_ASSERT((is_multiplicable<X>::value));
+STATIC_ASSERT((!is_multiplicable<int*, int>::value));
+STATIC_ASSERT((!is_multiplicable<int*>::value));
+STATIC_ASSERT((is_multiplicable<X, Y>::value));
+STATIC_ASSERT((!is_multiplicable<Y>::value));
+STATIC_ASSERT((!is_multiplicable<int X::*>::value));
+
+// is_divisible
+DEFINE_INFIX_BINARY_TRAIT(is_divisible, /);
+X operator/(X, X);
+X operator/(X, Y);
+STATIC_ASSERT((is_divisible<int>::value));
+STATIC_ASSERT((is_divisible<int, long>::value));
+STATIC_ASSERT((is_divisible<X>::value));
+STATIC_ASSERT((!is_divisible<int*, int>::value));
+STATIC_ASSERT((!is_divisible<int*>::value));
+STATIC_ASSERT((is_divisible<X, Y>::value));
+STATIC_ASSERT((!is_divisible<Y>::value));
+STATIC_ASSERT((!is_divisible<int X::*>::value));
+
+// has_remainder
+DEFINE_INFIX_BINARY_TRAIT(has_remainder, %);
+X operator%(X, X);
+X operator%(X, Y);
+STATIC_ASSERT((has_remainder<int>::value));
+STATIC_ASSERT((has_remainder<int, long>::value));
+STATIC_ASSERT((!has_remainder<float>::value));
+STATIC_ASSERT((has_remainder<X>::value));
+STATIC_ASSERT((!has_remainder<int*, int>::value));
+STATIC_ASSERT((!has_remainder<int*>::value));
+STATIC_ASSERT((has_remainder<X, Y>::value));
+STATIC_ASSERT((!has_remainder<Y>::value));
+STATIC_ASSERT((!has_remainder<int X::*>::value));
+
+// has_xor
+DEFINE_INFIX_BINARY_TRAIT(has_xor, ^);
+X operator^(X, X);
+X operator^(X, Y);
+STATIC_ASSERT((has_xor<int>::value));
+STATIC_ASSERT((has_xor<int, long>::value));
+STATIC_ASSERT((!has_xor<float>::value));
+STATIC_ASSERT((has_xor<X>::value));
+STATIC_ASSERT((!has_xor<int*, int>::value));
+STATIC_ASSERT((!has_xor<int*>::value));
+STATIC_ASSERT((has_xor<X, Y>::value));
+STATIC_ASSERT((!has_xor<Y>::value));
+STATIC_ASSERT((!has_xor<int X::*>::value));
+
+// has_bitand
+DEFINE_INFIX_BINARY_TRAIT(has_bitand, &);
+X operator&(X, X);
+X operator&(X, Y);
+STATIC_ASSERT((has_bitand<int>::value));
+STATIC_ASSERT((has_bitand<int, long>::value));
+STATIC_ASSERT((!has_bitand<float>::value));
+STATIC_ASSERT((has_bitand<X>::value));
+STATIC_ASSERT((!has_bitand<int*, int>::value));
+STATIC_ASSERT((!has_bitand<int*>::value));
+STATIC_ASSERT((has_bitand<X, Y>::value));
+STATIC_ASSERT((!has_bitand<Y>::value));
+STATIC_ASSERT((!has_bitand<int X::*>::value));
+
+// has_bitor
+DEFINE_INFIX_BINARY_TRAIT(has_bitor, |);
+X operator|(X, X);
+X operator|(X, Y);
+STATIC_ASSERT((has_bitor<int>::value));
+STATIC_ASSERT((has_bitor<int, long>::value));
+STATIC_ASSERT((!has_bitor<float>::value));
+STATIC_ASSERT((has_bitor<X>::value));
+STATIC_ASSERT((!has_bitor<int*, int>::value));
+STATIC_ASSERT((!has_bitor<int*>::value));
+STATIC_ASSERT((has_bitor<X, Y>::value));
+STATIC_ASSERT((!has_bitor<Y>::value));
+STATIC_ASSERT((!has_bitor<int X::*>::value));
+
+// has_left_shift
+DEFINE_INFIX_BINARY_TRAIT(has_left_shift, <<);
+X operator<<(X, X);
+X operator<<(X, Y);
+STATIC_ASSERT((has_left_shift<int>::value));
+STATIC_ASSERT((has_left_shift<int, long>::value));
+STATIC_ASSERT((!has_left_shift<float>::value));
+STATIC_ASSERT((has_left_shift<X>::value));
+STATIC_ASSERT((!has_left_shift<int*, int>::value));
+STATIC_ASSERT((!has_left_shift<int*>::value));
+STATIC_ASSERT((has_left_shift<X, Y>::value));
+STATIC_ASSERT((!has_left_shift<Y>::value));
+STATIC_ASSERT((!has_left_shift<int X::*>::value));
+
+// has_right_shift
+DEFINE_INFIX_BINARY_TRAIT(has_right_shift, >>);
+X operator>>(X, X);
+X operator>>(X, Y);
+STATIC_ASSERT((has_right_shift<int>::value));
+STATIC_ASSERT((has_right_shift<int, long>::value));
+STATIC_ASSERT((!has_right_shift<float>::value));
+STATIC_ASSERT((has_right_shift<X>::value));
+STATIC_ASSERT((!has_right_shift<int*, int>::value));
+STATIC_ASSERT((!has_right_shift<int*>::value));
+STATIC_ASSERT((has_right_shift<X, Y>::value));
+STATIC_ASSERT((!has_right_shift<Y>::value));
+STATIC_ASSERT((!has_right_shift<int X::*>::value));
+
+// can_subscript
+STATIC_ASSERT((can_subscript<int*, int>::value));
+STATIC_ASSERT((can_subscript<int, int*>::value));
+STATIC_ASSERT((can_subscript<int(&)[7], int>::value));
+STATIC_ASSERT((can_subscript<int, int(&)[7]>::value));
+STATIC_ASSERT((!can_subscript<X, Y>::value));
+STATIC_ASSERT((can_subscript<Y, X>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae8.C
new file mode 100644
index 000000000..5ac09c6b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae8.C
@@ -0,0 +1,182 @@
+// DR 339
+//
+// Test of the use of various boolean binary operators with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+bool accepts_bool(bool);
+
+#define DEFINE_BINARY_PREDICATE_TRAIT(Name,Op) \
+template<typename T, typename U> \
+ typename enable_if<sizeof(accepts_bool(create_a<T>() Op create_a<U>())), \
+ yes_type>::type \
+ JOIN(check_,Name)(type<T>, type<U>); \
+ \
+no_type JOIN(check_,Name)(...); \
+ \
+template<typename T, typename U = T> \
+struct Name \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,Name)(type<T>(), type<U>())) == sizeof(yes_type)); \
+}
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct X { };
+struct Y { };
+
+struct convertible_to_bool {
+ operator int convertible_to_bool::* ();
+};
+
+struct not_convertible_to_bool { };
+
+// is_less_than_comparable
+DEFINE_BINARY_PREDICATE_TRAIT(is_less_than_comparable,<);
+bool operator<(X, X);
+convertible_to_bool operator<(X, Y);
+not_convertible_to_bool operator<(Y, X);
+
+STATIC_ASSERT((is_less_than_comparable<int>::value));
+STATIC_ASSERT((is_less_than_comparable<int, long>::value));
+STATIC_ASSERT((is_less_than_comparable<int*>::value));
+STATIC_ASSERT((is_less_than_comparable<X>::value));
+STATIC_ASSERT((is_less_than_comparable<X, Y>::value));
+STATIC_ASSERT((!is_less_than_comparable<Y, X>::value));
+STATIC_ASSERT((!is_less_than_comparable<Y>::value));
+
+// is_less_equal_comparable
+DEFINE_BINARY_PREDICATE_TRAIT(is_less_equal_comparable,<=);
+bool operator<=(X, X);
+convertible_to_bool operator<=(X, Y);
+not_convertible_to_bool operator<=(Y, X);
+
+STATIC_ASSERT((is_less_equal_comparable<int>::value));
+STATIC_ASSERT((is_less_equal_comparable<int, long>::value));
+STATIC_ASSERT((is_less_equal_comparable<int*>::value));
+STATIC_ASSERT((is_less_equal_comparable<X>::value));
+STATIC_ASSERT((is_less_equal_comparable<X, Y>::value));
+STATIC_ASSERT((!is_less_equal_comparable<Y, X>::value));
+STATIC_ASSERT((!is_less_equal_comparable<Y>::value));
+
+// is_greater_than_comparable
+DEFINE_BINARY_PREDICATE_TRAIT(is_greater_than_comparable,>);
+bool operator>(X, X);
+convertible_to_bool operator>(X, Y);
+not_convertible_to_bool operator>(Y, X);
+
+STATIC_ASSERT((is_greater_than_comparable<int>::value));
+STATIC_ASSERT((is_greater_than_comparable<int, long>::value));
+STATIC_ASSERT((is_greater_than_comparable<int*>::value));
+STATIC_ASSERT((is_greater_than_comparable<X>::value));
+STATIC_ASSERT((is_greater_than_comparable<X, Y>::value));
+STATIC_ASSERT((!is_greater_than_comparable<Y, X>::value));
+STATIC_ASSERT((!is_greater_than_comparable<Y>::value));
+
+// is_greater_equal_comparable
+DEFINE_BINARY_PREDICATE_TRAIT(is_greater_equal_comparable,>=);
+bool operator>=(X, X);
+convertible_to_bool operator>=(X, Y);
+not_convertible_to_bool operator>=(Y, X);
+
+STATIC_ASSERT((is_greater_equal_comparable<int>::value));
+STATIC_ASSERT((is_greater_equal_comparable<int, long>::value));
+STATIC_ASSERT((is_greater_equal_comparable<int*>::value));
+STATIC_ASSERT((is_greater_equal_comparable<X>::value));
+STATIC_ASSERT((is_greater_equal_comparable<X, Y>::value));
+STATIC_ASSERT((!is_greater_equal_comparable<Y, X>::value));
+STATIC_ASSERT((!is_greater_equal_comparable<Y>::value));
+
+// is_equality_comparable
+struct Z : X { };
+DEFINE_BINARY_PREDICATE_TRAIT(is_equality_comparable,==);
+bool operator==(X, X);
+convertible_to_bool operator==(X, Y);
+not_convertible_to_bool operator==(Y, X);
+
+STATIC_ASSERT((is_equality_comparable<int>::value));
+STATIC_ASSERT((is_equality_comparable<int, long>::value));
+STATIC_ASSERT((is_equality_comparable<int*>::value));
+STATIC_ASSERT((is_equality_comparable<X>::value));
+STATIC_ASSERT((is_equality_comparable<X, Y>::value));
+STATIC_ASSERT((!is_equality_comparable<Y, X>::value));
+STATIC_ASSERT((!is_equality_comparable<Y>::value));
+STATIC_ASSERT((is_equality_comparable<int X::*>::value));
+STATIC_ASSERT((!is_equality_comparable<int X::*, int Y::*>::value));
+STATIC_ASSERT((!is_equality_comparable<int*, float*>::value));
+STATIC_ASSERT((is_equality_comparable<X*, Z*>::value));
+STATIC_ASSERT((!is_equality_comparable<X*, Y*>::value));
+
+// is_not_equal_comparable
+DEFINE_BINARY_PREDICATE_TRAIT(is_not_equal_comparable,!=);
+bool operator!=(X, X);
+convertible_to_bool operator!=(X, Y);
+not_convertible_to_bool operator!=(Y, X);
+
+STATIC_ASSERT((is_not_equal_comparable<int>::value));
+STATIC_ASSERT((is_not_equal_comparable<int, long>::value));
+STATIC_ASSERT((is_not_equal_comparable<int*>::value));
+STATIC_ASSERT((is_not_equal_comparable<X>::value));
+STATIC_ASSERT((is_not_equal_comparable<X, Y>::value));
+STATIC_ASSERT((!is_not_equal_comparable<Y, X>::value));
+STATIC_ASSERT((!is_not_equal_comparable<Y>::value));
+STATIC_ASSERT((is_not_equal_comparable<int X::*>::value));
+STATIC_ASSERT((!is_not_equal_comparable<int X::*, int Y::*>::value));
+STATIC_ASSERT((!is_not_equal_comparable<int*, float*>::value));
+STATIC_ASSERT((is_not_equal_comparable<X*, Z*>::value));
+STATIC_ASSERT((!is_not_equal_comparable<X*, Y*>::value));
+
+// has_logical_and
+DEFINE_BINARY_PREDICATE_TRAIT(has_logical_and,&&);
+bool operator&&(X, X);
+convertible_to_bool operator&&(X, Y);
+not_convertible_to_bool operator&&(Y, X);
+
+STATIC_ASSERT((has_logical_and<int>::value));
+STATIC_ASSERT((has_logical_and<int, long>::value));
+STATIC_ASSERT((has_logical_and<int*>::value));
+STATIC_ASSERT((has_logical_and<X>::value));
+STATIC_ASSERT((has_logical_and<X, Y>::value));
+STATIC_ASSERT((!has_logical_and<Y, X>::value));
+STATIC_ASSERT((!has_logical_and<Y>::value));
+STATIC_ASSERT((has_logical_and<int X::*>::value));
+STATIC_ASSERT((has_logical_and<int X::*, int Y::*>::value));
+STATIC_ASSERT((has_logical_and<int*, float*>::value));
+STATIC_ASSERT((has_logical_and<X*, Z*>::value));
+STATIC_ASSERT((has_logical_and<X*, Y*>::value));
+
+// has_logical_or
+DEFINE_BINARY_PREDICATE_TRAIT(has_logical_or,||);
+bool operator||(X, X);
+convertible_to_bool operator||(X, Y);
+not_convertible_to_bool operator||(Y, X);
+
+STATIC_ASSERT((has_logical_or<int>::value));
+STATIC_ASSERT((has_logical_or<int, long>::value));
+STATIC_ASSERT((has_logical_or<int*>::value));
+STATIC_ASSERT((has_logical_or<X>::value));
+STATIC_ASSERT((has_logical_or<X, Y>::value));
+STATIC_ASSERT((!has_logical_or<Y, X>::value));
+STATIC_ASSERT((!has_logical_or<Y>::value));
+STATIC_ASSERT((has_logical_or<int X::*>::value));
+STATIC_ASSERT((has_logical_or<int X::*, int Y::*>::value));
+STATIC_ASSERT((has_logical_or<int*, float*>::value));
+STATIC_ASSERT((has_logical_or<X*, Z*>::value));
+STATIC_ASSERT((has_logical_or<X*, Y*>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae9.C
new file mode 100644
index 000000000..4e27ff61b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sfinae9.C
@@ -0,0 +1,207 @@
+// DR 339
+//
+// Test of the use of various assignment operators with SFINAE
+
+// Boilerplate helpers
+typedef char yes_type;
+struct no_type { char data[2]; };
+
+template<typename T> T create_a();
+template<typename T> struct type { };
+
+template<bool, typename T = void> struct enable_if { typedef T type; };
+template<typename T> struct enable_if<false, T> { };
+
+#define JOIN( X, Y ) DO_JOIN( X, Y )
+#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
+#define DO_JOIN2( X, Y ) X##Y
+
+#define DEFINE_INFIX_BINARY_TRAIT(Name,Op) \
+template<typename T, typename U> \
+ typename enable_if<(sizeof(create_a<T>() Op create_a<U>(), 1) > 0), \
+ yes_type>::type \
+ JOIN(check_,Name)(type<T>, type<U>); \
+ \
+no_type JOIN(check_,Name)(...); \
+ \
+template<typename T, typename U = T> \
+struct Name \
+{ \
+ static const bool value = \
+ (sizeof(JOIN(check_,Name)(type<T&>(), type<U>())) == sizeof(yes_type)); \
+}
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
+#else
+# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
+#endif
+
+struct Y {
+ Y& operator=(Y&);
+};
+
+struct X {
+ X& operator=(Y);
+ X& operator+=(X);
+ X& operator-=(X);
+ X& operator*=(X);
+ X& operator/=(X);
+ X& operator%=(X);
+ X& operator^=(X);
+ X& operator&=(X);
+ X& operator|=(X);
+ X& operator<<=(X);
+ X& operator>>=(X);
+};
+struct Z { };
+
+// is_assignable
+DEFINE_INFIX_BINARY_TRAIT(is_assignable, =);
+STATIC_ASSERT((is_assignable<int>::value));
+STATIC_ASSERT((is_assignable<int, long>::value));
+STATIC_ASSERT((is_assignable<X>::value));
+STATIC_ASSERT((!is_assignable<int*, int>::value));
+STATIC_ASSERT((is_assignable<int*>::value));
+STATIC_ASSERT((is_assignable<X, Y>::value));
+STATIC_ASSERT((!is_assignable<X, Z>::value));
+STATIC_ASSERT((!is_assignable<Y>::value));
+STATIC_ASSERT((!is_assignable<const int, long>::value));
+
+// has_plus_assign
+DEFINE_INFIX_BINARY_TRAIT(has_plus_assign, +=);
+X& operator+=(X&, Y);
+STATIC_ASSERT((has_plus_assign<int>::value));
+STATIC_ASSERT((has_plus_assign<int, long>::value));
+STATIC_ASSERT((has_plus_assign<X>::value));
+STATIC_ASSERT((has_plus_assign<int*, int>::value));
+STATIC_ASSERT((!has_plus_assign<int*>::value));
+STATIC_ASSERT((has_plus_assign<X, Y>::value));
+STATIC_ASSERT((!has_plus_assign<X, Z>::value));
+STATIC_ASSERT((!has_plus_assign<Y>::value));
+STATIC_ASSERT((!has_plus_assign<const int, long>::value));
+
+// has_minus_assign
+DEFINE_INFIX_BINARY_TRAIT(has_minus_assign, -=);
+X& operator-=(X&, Y);
+STATIC_ASSERT((has_minus_assign<int>::value));
+STATIC_ASSERT((has_minus_assign<int, long>::value));
+STATIC_ASSERT((has_minus_assign<X>::value));
+STATIC_ASSERT((has_minus_assign<int*, int>::value));
+STATIC_ASSERT((!has_minus_assign<int*>::value));
+STATIC_ASSERT((has_minus_assign<X, Y>::value));
+STATIC_ASSERT((!has_minus_assign<X, Z>::value));
+STATIC_ASSERT((!has_minus_assign<Y>::value));
+STATIC_ASSERT((!has_minus_assign<int X::*>::value));
+STATIC_ASSERT((!has_minus_assign<const int, long>::value));
+
+// has_multiply_assign
+DEFINE_INFIX_BINARY_TRAIT(has_multiply_assign, *=);
+X& operator*=(X&, Y);
+STATIC_ASSERT((has_multiply_assign<int>::value));
+STATIC_ASSERT((has_multiply_assign<int, long>::value));
+STATIC_ASSERT((has_multiply_assign<X>::value));
+STATIC_ASSERT((!has_multiply_assign<int*, int>::value));
+STATIC_ASSERT((!has_multiply_assign<int*>::value));
+STATIC_ASSERT((has_multiply_assign<X, Y>::value));
+STATIC_ASSERT((!has_multiply_assign<X, Z>::value));
+STATIC_ASSERT((!has_multiply_assign<Y>::value));
+STATIC_ASSERT((!has_multiply_assign<int X::*>::value));
+STATIC_ASSERT((!has_multiply_assign<const int, long>::value));
+
+// has_divide_assign
+DEFINE_INFIX_BINARY_TRAIT(has_divide_assign, /=);
+X& operator/=(X&, Y);
+STATIC_ASSERT((has_divide_assign<int>::value));
+STATIC_ASSERT((has_divide_assign<int, long>::value));
+STATIC_ASSERT((has_divide_assign<X>::value));
+STATIC_ASSERT((!has_divide_assign<int*, int>::value));
+STATIC_ASSERT((!has_divide_assign<int*>::value));
+STATIC_ASSERT((has_divide_assign<X, Y>::value));
+STATIC_ASSERT((!has_divide_assign<X, Z>::value));
+STATIC_ASSERT((!has_divide_assign<Y>::value));
+STATIC_ASSERT((!has_divide_assign<int X::*>::value));
+
+// has_remainder_assign
+DEFINE_INFIX_BINARY_TRAIT(has_remainder_assign, %=);
+X& operator%=(X&, Y);
+STATIC_ASSERT((has_remainder_assign<int>::value));
+STATIC_ASSERT((has_remainder_assign<int, long>::value));
+STATIC_ASSERT((!has_remainder_assign<float>::value));
+STATIC_ASSERT((has_remainder_assign<X>::value));
+STATIC_ASSERT((!has_remainder_assign<int*, int>::value));
+STATIC_ASSERT((!has_remainder_assign<int*>::value));
+STATIC_ASSERT((has_remainder_assign<X, Y>::value));
+STATIC_ASSERT((!has_remainder_assign<X, Z>::value));
+STATIC_ASSERT((!has_remainder_assign<Y>::value));
+STATIC_ASSERT((!has_remainder_assign<int X::*>::value));
+
+// has_xor_assign
+DEFINE_INFIX_BINARY_TRAIT(has_xor_assign, ^=);
+X& operator^=(X&, Y);
+STATIC_ASSERT((has_xor_assign<int>::value));
+STATIC_ASSERT((has_xor_assign<int, long>::value));
+STATIC_ASSERT((!has_xor_assign<float>::value));
+STATIC_ASSERT((has_xor_assign<X>::value));
+STATIC_ASSERT((!has_xor_assign<int*, int>::value));
+STATIC_ASSERT((!has_xor_assign<int*>::value));
+STATIC_ASSERT((has_xor_assign<X, Y>::value));
+STATIC_ASSERT((!has_xor_assign<X, Z>::value));
+STATIC_ASSERT((!has_xor_assign<Y>::value));
+STATIC_ASSERT((!has_xor_assign<int X::*>::value));
+
+// has_bitand_assign
+DEFINE_INFIX_BINARY_TRAIT(has_bitand_assign, &=);
+X& operator&=(X&, Y);
+STATIC_ASSERT((has_bitand_assign<int>::value));
+STATIC_ASSERT((has_bitand_assign<int, long>::value));
+STATIC_ASSERT((!has_bitand_assign<float>::value));
+STATIC_ASSERT((has_bitand_assign<X>::value));
+STATIC_ASSERT((!has_bitand_assign<int*, int>::value));
+STATIC_ASSERT((!has_bitand_assign<int*>::value));
+STATIC_ASSERT((has_bitand_assign<X, Y>::value));
+STATIC_ASSERT((!has_bitand_assign<X, Z>::value));
+STATIC_ASSERT((!has_bitand_assign<Y>::value));
+STATIC_ASSERT((!has_bitand_assign<int X::*>::value));
+
+// has_bitor_assign
+DEFINE_INFIX_BINARY_TRAIT(has_bitor_assign, |=);
+X& operator|=(X&, Y);
+STATIC_ASSERT((has_bitor_assign<int>::value));
+STATIC_ASSERT((has_bitor_assign<int, long>::value));
+STATIC_ASSERT((!has_bitor_assign<float>::value));
+STATIC_ASSERT((has_bitor_assign<X>::value));
+STATIC_ASSERT((!has_bitor_assign<int*, int>::value));
+STATIC_ASSERT((!has_bitor_assign<int*>::value));
+STATIC_ASSERT((has_bitor_assign<X, Y>::value));
+STATIC_ASSERT((!has_bitor_assign<X, Z>::value));
+STATIC_ASSERT((!has_bitor_assign<Y>::value));
+STATIC_ASSERT((!has_bitor_assign<int X::*>::value));
+
+// has_left_shift_assign
+DEFINE_INFIX_BINARY_TRAIT(has_left_shift_assign, <<=);
+X& operator<<=(X&, Y);
+STATIC_ASSERT((has_left_shift_assign<int>::value));
+STATIC_ASSERT((has_left_shift_assign<int, long>::value));
+STATIC_ASSERT((!has_left_shift_assign<float>::value));
+STATIC_ASSERT((has_left_shift_assign<X>::value));
+STATIC_ASSERT((!has_left_shift_assign<int*, int>::value));
+STATIC_ASSERT((!has_left_shift_assign<int*>::value));
+STATIC_ASSERT((has_left_shift_assign<X, Y>::value));
+STATIC_ASSERT((!has_left_shift_assign<X, Z>::value));
+STATIC_ASSERT((!has_left_shift_assign<Y>::value));
+STATIC_ASSERT((!has_left_shift_assign<int X::*>::value));
+
+// has_right_shift_assign
+DEFINE_INFIX_BINARY_TRAIT(has_right_shift_assign, >>=);
+X& operator>>=(X&, Y);
+STATIC_ASSERT((has_right_shift_assign<int>::value));
+STATIC_ASSERT((has_right_shift_assign<int, long>::value));
+STATIC_ASSERT((!has_right_shift_assign<float>::value));
+STATIC_ASSERT((has_right_shift_assign<X>::value));
+STATIC_ASSERT((!has_right_shift_assign<int*, int>::value));
+STATIC_ASSERT((!has_right_shift_assign<int*>::value));
+STATIC_ASSERT((has_right_shift_assign<X, Y>::value));
+STATIC_ASSERT((!has_right_shift_assign<X, Z>::value));
+STATIC_ASSERT((!has_right_shift_assign<Y>::value));
+STATIC_ASSERT((!has_right_shift_assign<int X::*>::value));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/shadow1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/shadow1.C
new file mode 100644
index 000000000..6eb30d094
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/shadow1.C
@@ -0,0 +1,4 @@
+// PR c++/58632
+
+template<template<int I> class A> // { dg-message "shadows" }
+class A {}; // { dg-error "declaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/shift1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/shift1.C
new file mode 100644
index 000000000..a4ceec92c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/shift1.C
@@ -0,0 +1,11 @@
+// PR c++/18140
+// { dg-options "-std=gnu++98" }
+
+template <int N> struct IntHolder {
+ static const int value = N;
+};
+
+template <int N, int S> struct ShrIntHolder {
+ static const int value = IntHolder< N>>S >::value;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof-template-argument.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof-template-argument.C
new file mode 100644
index 000000000..31aeeec9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof-template-argument.C
@@ -0,0 +1,15 @@
+/* This used to ICE (PR c++/29573) */
+/* { dg-do compile } */
+
+template<int> struct A {};
+
+template<typename> struct B : A <sizeof(=)> {}; /* { dg-error "template argument" } */
+
+template<typename> struct C : A <sizeof(=)> {}; /* { dg-error "template argument" } */
+
+int a;
+
+template<typename> struct D : A <sizeof(a=1)> {}; /* This used to ICE as well. */
+
+template<typename> struct E : A <sizeof(a=1)> {}; /* This used to ICE as well. */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof1.C
new file mode 100644
index 000000000..45a7db48c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof1.C
@@ -0,0 +1,15 @@
+// Test use of `sizeof' as a template parameter.
+// Origin: smacdonald@seimac.com
+
+// { dg-do compile }
+
+template <unsigned I> struct A { static char *value; };
+
+template <typename SizeType>
+struct B
+{
+char * f() const
+{
+return (A<sizeof(void *)>::value);
+}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof10.C
new file mode 100644
index 000000000..5ecf13e13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof10.C
@@ -0,0 +1,7 @@
+// PR c++/23357
+
+template<typename T> bool foo()
+{
+ const long int i = sizeof(T) > 1 ? sizeof(T) : 0;
+ return i > 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof11.C
new file mode 100644
index 000000000..7428e0b23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof11.C
@@ -0,0 +1,14 @@
+// PR c++/29435
+
+template < class T > struct A {};
+template < int> void g()
+{
+ sizeof (A < int>);
+}
+
+template < class T > struct B;
+template < int> void f()
+{
+ sizeof (B<int>); // { dg-error "incomplete" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof12.C
new file mode 100644
index 000000000..e165d2aab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof12.C
@@ -0,0 +1,19 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/41863
+
+template<int X>
+struct Bar
+{
+};
+
+template<typename T>
+class Foo
+{
+ T m_foo;
+
+ void
+ crash()
+ {
+ Bar<sizeof(m_foo)> bar;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof13.C
new file mode 100644
index 000000000..2f4a26e50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof13.C
@@ -0,0 +1,17 @@
+// PR c++/42623
+// We should choose f(B) because f(A<undef>) involves applying sizeof to
+// an incomplete class, so it is removed by SFINAE.
+// { dg-do link }
+
+struct undef;
+
+template <typename U, int N = sizeof(U)> struct A { A(int); };
+template <typename U> void f(A<U>);
+
+template <typename U> struct B { B(int) { } };
+template <typename U> void f(B<U>) { }
+
+int main()
+{
+ f<undef>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof14.C
new file mode 100644
index 000000000..8f4020465
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof14.C
@@ -0,0 +1,4 @@
+// PR c++/54844
+// { dg-do compile }
+template <int N> int fn () { return sizeof (double); }
+int var = fn <0> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof15.C
new file mode 100644
index 000000000..3298dad3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof15.C
@@ -0,0 +1,13 @@
+// PR c++/55685
+
+typedef __SIZE_TYPE__ size_t;
+template <size_t T, size_t U>
+struct A;
+
+template <typename T> struct B
+{
+ static A <sizeof (T), 0> x;
+};
+
+template <typename T>
+A <sizeof (T), 0> B <T>::x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof2.C
new file mode 100644
index 000000000..76d1cf44c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof2.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+template<int size>
+struct Foobar {
+ // Contents irrelevant
+};
+
+template <typename A>
+struct Wrapper {
+ // Contents irrelevant
+};
+
+template <typename A>
+Foobar<sizeof(Wrapper<A>)> *
+compiler_bug (A)
+{
+ return 0;
+}
+
+int main()
+{
+ compiler_bug(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof3.C
new file mode 100644
index 000000000..7c9d0d2c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof3.C
@@ -0,0 +1,13 @@
+// The call to f is not potentially evaluated (3.2), so f<int> is not used,
+// so it should not be required.
+
+template <class T>
+T f (T)
+{
+ typename T::X x;
+}
+
+int main()
+{
+ int i = sizeof (f(0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof4.C
new file mode 100644
index 000000000..4856a2741
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof4.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: <anthwil at nortelnetworks dot com>
+// c++/4933: using sizeof with comma operator as template argument
+
+template<unsigned F>
+struct Foo {};
+
+template<typename T>
+T makeT();
+
+template<typename T,typename U>
+struct Bar
+{
+ typedef Foo
+ <
+ sizeof((makeT<T>(), makeT<U>()))
+ > Type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof5.C
new file mode 100644
index 000000000..4096fed53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof5.C
@@ -0,0 +1,15 @@
+// PR c++/9907
+// Origin: nes@lrde.epita.fr
+// sizeof(foo()) was not considered constant.
+
+
+template <unsigned n> struct bar {};
+
+int foo();
+
+template <class T>
+void baz()
+{
+ bar<sizeof(foo())> b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof6.C
new file mode 100644
index 000000000..3ef3794b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof6.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// PR c++/13683: bogus warning about passing non-PODs through ellipsis
+
+struct B {};
+struct NonPOD : B {};
+
+struct A
+{
+ static int check(...);
+ static NonPOD GetNonPOD(void);
+ enum { value = sizeof(A::check(A::GetNonPOD())) };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof7.C
new file mode 100644
index 000000000..4964bfd25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof7.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// Testcase by: bangerth@dealii.org
+// PR c++/10858: failure with calling a method inside sizeof in a template
+
+ template <int> struct P {};
+
+ void bar ();
+
+ template <class T> struct X {
+ static int foo(void (*)());
+ P<sizeof(foo(&bar))> p;
+ };
+
+ template class X<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof8.C
new file mode 100644
index 000000000..861febc16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof8.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Testcase by: bangerth@dealii.org
+// PR c++/11406: ICE
+
+template <int> struct S{};
+
+template <int N> S<sizeof(new double[N])> f() {}
+
+template S<sizeof(void*)> f<2>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof9.C
new file mode 100644
index 000000000..8d9ec95ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/sizeof9.C
@@ -0,0 +1,6 @@
+// PR c++/21025
+
+template<int N> struct X { char x[N]; };
+template<typename T> X<1 + sizeof(T) - sizeof(T)> F(T const &);
+template<int N> struct S { int d() { F(1); } };
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec1.C
new file mode 100644
index 000000000..27996377f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: <schmid@snake.iap.physik.tu-darmstadt.de>
+
+// Bug: ICE during invalid instantiation of member function
+// which enclosing class is specialized.
+
+template <class T>
+struct A
+{
+ void f(T) {}
+};
+
+template<>
+struct A<int>
+{
+ void f(int) {}
+};
+
+template
+void A<int>::f(int); // { dg-error "not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec10.C
new file mode 100644
index 000000000..4bf7f46a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec10.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+
+// Origin: Lynn Akers <lakers@peachtree.com>
+
+// PR c++/10940: Problem handling parameter list for static member
+// that is a specialization of a member template of a template class.
+
+template<int b>
+class o
+{
+public:
+ template<typename T> static void do_add(T* p, T v);
+};
+
+template<>
+template<typename T>
+inline void o<32>::do_add(T* p, T v)
+{
+ *p += v;
+}
+
+int main()
+{
+ int a = 0x1000;
+ o<32>().do_add<int>(&a, 0x2000);
+ return (a != 0x3000);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec11.C
new file mode 100644
index 000000000..36d93a94e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec11.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: jhbrown@bluefinrobotics.com
+
+// PR c++/13635: ICE explicit specialization of member function template
+
+template <class foo>
+class bar {
+public:
+ template <class baz>
+ int func(baz *x);
+};
+
+template <>
+template <class baz>
+int bar<double>::func(baz *x) { return 5;}
+
+template <>
+template <>
+int bar<double>::func(int *x) { return 5;}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec12.C
new file mode 100644
index 000000000..7cf2e2f0a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec12.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Contributed by: Wolfgang Bangerth <bangerth at dealii dot org>
+// PR c++/14409: Accepts invalid function signature for explicit instantiation
+
+struct X
+{
+ template <typename U>
+ void foo (U) {}
+
+ template <typename U>
+ void foo_const (U) const {}
+};
+
+template void X::foo (int);
+template void X::foo_const (int) const;
+
+template void X::foo (int) const; // { dg-error "" }
+template void X::foo_const (int); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec13.C
new file mode 100644
index 000000000..f2a3a373e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec13.C
@@ -0,0 +1,16 @@
+// { dg-options "-w" }
+
+template <typename T>
+struct S {
+ int i;
+ template <typename U> void f(U) {}
+};
+
+template<>
+template <typename U>
+void S<int>::f(U) { i; }
+
+void f() {
+ S<int> s;
+ s.f<int>(3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec14.C
new file mode 100644
index 000000000..9b59565c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec14.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: <weissr at informatik dot uni-tuebingen dot de>
+// PR c++/3671: Non-type enum parameters must not be converted
+
+enum T1 {a};
+enum T2 {b};
+
+struct Y {
+ template <T1 i> void foo() {}
+ template <T2 i> void foo() {}
+};
+
+struct Z {
+ template <T1 i> void foo() {}
+};
+
+template void Y::foo<b> ();
+template void Z::foo<b> (); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec15.C
new file mode 100644
index 000000000..37fbc08e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec15.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// Contributed by Wolfgang Bangerth <bangerth at ticam dot utexas dot edu>
+// PR c++/509: Make sure specializations of member templates match correctly
+// between template and non-template overloads.
+
+template <class T>
+struct A {
+ template <class U> void f (U);
+ void f2 (int);
+
+ template <class U> void h (U);
+ void h (long);
+};
+
+template <>
+struct A<float> {
+ template <class U> void g (U);
+ void g2 (float);
+};
+
+template <> void A<int>::f (int); // { dg-error "" }
+// { dg-message "need 2" "" { target *-*-* } 21 }
+template <> template <> void A<int>::f (int);
+
+template <> void A<int>::f2 (int);
+template <> template <> void A<int>::f2 (int); // { dg-error "" }
+
+template <> void A<float>::g (float);
+template <> template <> void A<float>::g(float); // { dg-error "" }
+
+template <> void A<float>::g2 (float); // { dg-error "" }
+template <> template <> void A<float>::g2(float); // { dg-error "" }
+
+template <> void A<long>::h (long);
+template <> template <> void A<long>::h(long);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec16.C
new file mode 100644
index 000000000..c872052a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec16.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// PR c++/14497: Reject specialization without template headers
+
+template <int N>
+struct A {
+ template<int M> void B () ;
+};
+
+void A<0>::B<0>() { // { dg-error "specializing member 'A<0>::B<0>' requires 'template<>' syntax" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec17.C
new file mode 100644
index 000000000..237557684
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec17.C
@@ -0,0 +1,11 @@
+// PR c++/16224
+
+namespace io {
+ template <typename> int foo(); // { dg-error "" }
+}
+
+using namespace io;
+
+template<> int foo<int>(); // { dg-error "" }
+
+int a = foo<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec18.C
new file mode 100644
index 000000000..a22e8543d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec18.C
@@ -0,0 +1,13 @@
+// PR c++/17936
+
+template<int, int N> struct A
+{
+ void foo();
+};
+
+template<int N> struct A<1, N>
+{
+ void foo();
+};
+
+template<> void A<1, 2>::foo();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec19.C
new file mode 100644
index 000000000..082431533
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec19.C
@@ -0,0 +1,23 @@
+// PR c++/18962
+
+template<class T1,int N1>
+class Klasse
+{
+public:
+ template <class T2,int N2>
+ void function( const Klasse<T2,N2>& );
+};
+
+template<>
+template<class T2,int N2>
+void Klasse<int,1>::function( const Klasse<T2,N2>& param )
+{
+ param; // make sure we use the argument list from the definition.
+}
+
+int main()
+{
+ Klasse<int,1> instance;
+ Klasse<char,2> param;
+ instance.function( param );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec2.C
new file mode 100644
index 000000000..de0fe4c15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec2.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: <schmid@snake.iap.physik.tu-darmstadt.de>
+
+// Bug: Overloading of ordinary and template member function
+// which enclosing class is specialized is not handled correctly.
+
+template <class T>
+struct A
+{
+ void f(T) {}
+};
+
+template<>
+struct A<int>
+{
+ void f(int) {}
+ template <class T> void f(T) {}
+};
+
+template
+void A<int>::f(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec20.C
new file mode 100644
index 000000000..71548e4af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec20.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com>
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+// Bug 19203: Failure to implement DR 214
+
+template <class A>
+void foo(const A& a);
+
+template <class RET, class ARG1>
+int foo(RET (&)(ARG1)); // this one
+
+
+float decl(int);
+
+int bar(void)
+{
+ return foo(decl);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec21.C
new file mode 100644
index 000000000..e04ac5a2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec21.C
@@ -0,0 +1,28 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com>
+
+// { dg-do run }
+// DR214
+
+template <class T> T f(int) {return 0;}
+template <class T, class U> T f(U){return 1;}
+
+template <typename T, typename R> T checked_cast (R const &) {return 0;}
+template <typename T, typename R> T checked_cast (R *) {return 1;}
+
+
+int main ()
+{
+ int i = 0;
+
+ if (f<int>(1))
+ return 1;
+
+ if (checked_cast<int>(i) != 0)
+ return 2;
+
+ if (checked_cast<int>(&i) != 1)
+ return 3;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec22.C
new file mode 100644
index 000000000..f916ea468
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec22.C
@@ -0,0 +1,21 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com>
+
+// PR 20723
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+// Nathan Sidwell <nathan@gcc.gnu.org>
+
+template <typename T> class srp;
+template <typename T> struct ptr
+{
+ template <typename U> ptr(const srp<U> &other); // { dg-message "ptr<T>::ptr" }
+};
+template <typename T> struct srp
+{
+ template <typename U> operator ptr<U>(void) const; // { dg-message "srp<T>::operator" }
+};
+ptr<int> parent_get()
+{
+ srp<int> parent; // { dg-message "candidate" }
+ return parent; // { dg-error "is ambiguous" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec23.C
new file mode 100644
index 000000000..3d401f00e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec23.C
@@ -0,0 +1,26 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com>
+
+// PR 20723
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+// Nathan Sidwell <nathan@gcc.gnu.org>
+
+struct Foo
+{
+ template <typename T>
+ Foo (const T &); // { dg-message "T = Bar" }
+};
+
+struct Bar
+{
+ template <typename T>
+ operator T () const; // { dg-message "T = Foo" }
+};
+
+Foo Quux (Bar const &b)
+{
+ return b; // { dg-error "ambiguous" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec24.C
new file mode 100644
index 000000000..08848952e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec24.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 June 2005 <nathan@codesourcery.com>
+
+// PR 20350: ICE on member specialization with later initialization
+// Origin: Carlo Wood carlo@gcc.gnu.org
+
+template <int i> struct Mutex
+{
+ static int mutex;
+};
+
+template <int i>
+int Mutex<i>::mutex = {1};
+
+template <> int Mutex<0>::mutex;
+template <> int Mutex<0>::mutex = 0;
+
+void g()
+{
+ Mutex<0>::mutex = 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec25.C
new file mode 100644
index 000000000..385d19ada
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec25.C
@@ -0,0 +1,10 @@
+namespace N {
+ template <typename T>
+ struct S {
+ void f() {} // { dg-error "definition" }
+ };
+}
+
+namespace K {
+ template <> void N::S<char>::f() {} // { dg-error "different namespace" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec26.C
new file mode 100644
index 000000000..3d187071a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec26.C
@@ -0,0 +1,35 @@
+// dg-do run
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2005 <nathan@codesourcery.com>
+
+// PR 23519 template specialization ordering (DR214)
+// Origin: Maxim Yegorushkin <maxim.yegorushkin@gmail.com>
+
+struct A
+{
+ template<class T> int operator+(T&) { return 1;}
+};
+
+template<class T> struct B
+{
+ int operator-(A&) {return 2;}
+ template<typename R> int operator*(R&) {return 3;}
+};
+
+template <typename T, typename R> int operator-(B<T>, R&) {return 4;}
+template<class T> int operator+(A&, B<T>&) { return 5;}
+template <typename T> int operator*(T &, A&){return 6;}
+
+int main()
+{
+ A a;
+ B<A> b;
+ if ((a + b) != 5)
+ return 1;
+
+ if ((b - a) != 2)
+ return 2;
+
+ if ((b * a) != 6)
+ return 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec27.C
new file mode 100644
index 000000000..a31adadd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec27.C
@@ -0,0 +1,14 @@
+// PR c++/24139
+
+template<typename T>
+struct O {
+ struct I;
+};
+
+template<>
+struct O<int>::I
+{
+ I();
+};
+
+O<int>::I::I() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec28.C
new file mode 100644
index 000000000..f0bb22cae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec28.C
@@ -0,0 +1,6 @@
+// PR c++/25854
+// Bad diagnostic
+// { dg-do compile }
+
+template<typename> struct A {}; // { dg-error "provided" }
+template<> struct A<> {}; // { dg-error "wrong number" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec29.C
new file mode 100644
index 000000000..4df00ee7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec29.C
@@ -0,0 +1,13 @@
+// PR c++/25855
+// { dg-do run }
+
+template <typename T> int qCompare(const T *t1, const T *t2) { return 1; }
+template <typename T> int qCompare(T *t1, T *t2) { return 2; }
+template <typename T1, typename T2> int qCompare(const T1 *t1, const T2 *t2) {
+ return 3; }
+template<> int qCompare(const char *t1, const char *t2) { return 4; }
+int main()
+{
+ if (qCompare("a", "b") != 4)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec3.C
new file mode 100644
index 000000000..d3fa401b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec3.C
@@ -0,0 +1,16 @@
+// PR c++/3870
+// Test that performing a type instantiation in order to match up a
+// specialization doesn't clobber last_function_parms.
+
+template <class T>
+struct A { typedef int I; };
+
+template <class T>
+inline typename T::I
+foo (typename T::I, const T*);
+
+template <>
+int foo (int i, const A<long>*)
+{
+ return i + 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec30.C
new file mode 100644
index 000000000..403b812f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec30.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+template<int N>
+inline int
+foo (int a)
+{
+ return a;
+}
+
+template<>
+inline int
+foo<0> (int a = 123) // { dg-error "default argument" }
+{
+ return a + 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec31.C
new file mode 100644
index 000000000..3b36ab486
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec31.C
@@ -0,0 +1,10 @@
+// PR c++/28058
+
+template<int> struct A
+{
+ A() {}
+};
+
+A<0> a;
+
+template<> A<0>::A() {} // { dg-error "specialization" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec32.C
new file mode 100644
index 000000000..6ef172b50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec32.C
@@ -0,0 +1,6 @@
+//PR c++/28861
+
+struct A
+{
+ template<template<int> class B> struct B<0>; // { dg-error "name of class shadows" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec33.C
new file mode 100644
index 000000000..7b7a75198
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec33.C
@@ -0,0 +1,7 @@
+//PR c++/27667
+
+struct A
+{
+ template<int> static void foo () {}
+ template<> static void foo<0>() {} // { dg-error "explicit|template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec34.C
new file mode 100644
index 000000000..6c28e57fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec34.C
@@ -0,0 +1,9 @@
+// PR c++/26988
+
+struct B{};
+
+struct Bar : virtual B {
+ template <typename T> Bar( T const& cast );
+};
+
+template <> Bar::Bar( int const & cast ) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec35.C
new file mode 100644
index 000000000..709ece5dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec35.C
@@ -0,0 +1,29 @@
+// PR c++/31923
+// C++ DR 605 -- "...the linkage of an explicit specialization must be that of
+// the template."
+
+// { dg-require-weak "" }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+
+template<class T>
+static void f1 (T) { }
+
+// { dg-final { scan-assembler-not ".glob(a|)l\[\t \]*_?_Z2f1IfEvT_" } }
+template<>
+void f1<float> (float) { } // Expected to have static linkage
+
+template<class T>
+void f2 (T) { }
+
+// { dg-final { scan-assembler ".glob(a|)l\[\t \]*_?_Z2f2IfEvT_" } }
+template<>
+void f2<float> (float) { } // Expected to have global linkage
+
+void instantiator ()
+{
+ // { dg-final { scan-assembler-not ".glob(a|)l\[\t \]*_?_Z2f1IiEvT_" } }
+ f1(0); // Expected to have static linkage
+
+ // { dg-final { scan-assembler ".weak(_definition)?\[\t \]*_?_Z2f2IiEvT_" { target { ! { *-*-mingw* *-*-cygwin } } } } }
+ f2(0); // Expected to have weak global linkage
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec36.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec36.C
new file mode 100644
index 000000000..7e8dc5241
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec36.C
@@ -0,0 +1,16 @@
+/* PR c++/38089 */
+/* { dg-do compile } */
+
+struct basic_string
+{
+ basic_string(const int __s);
+};
+namespace MyNS {
+ class MyClass {
+ template <typename T>
+ T test() { } /* { dg-error "from definition" } */
+ };
+}
+template <>
+basic_string MyNS::MyClass::test() /* { dg-error "specialization of" } */
+{ return 1; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec37.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec37.C
new file mode 100644
index 000000000..2c01eb028
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec37.C
@@ -0,0 +1,6 @@
+// PR c++/28300
+
+template<typename> struct A
+{
+ template<typename T> struct A<T*>; // { dg-error "namespace scope" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec4.C
new file mode 100644
index 000000000..18116acb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec4.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+
+// PR c++/2863
+// Default function argument and template specialization.
+
+struct X {
+ template <int dim> void f(int=0);
+};
+
+template <> void X::f<1> () {} // { dg-error "(not match|declaration)" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec5.C
new file mode 100644
index 000000000..ad101b01d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec5.C
@@ -0,0 +1,3 @@
+template <int i> struct A;
+template <> struct A<0> { struct B; };
+struct A<0>::B {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec6.C
new file mode 100644
index 000000000..915b83312
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec6.C
@@ -0,0 +1,10 @@
+template <bool, int> struct X {};
+
+template <bool C> struct X<C,1> {
+ typedef double* type;
+ type foo () const;
+};
+
+template <bool C>
+typename X<C,1>::type
+X<C,1>::foo () const {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec7.C
new file mode 100644
index 000000000..18d3c90c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec7.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// PR c++/6440: Specialization of member class template.
+
+template<class T> struct A
+{
+ template<class U> struct B {};
+};
+
+template<> template<class U>
+struct A<int>::B
+{
+ void f();
+ template <class V> void g(V);
+};
+
+template<> template<> template <class V> void A<int>::B<char>::g(V)
+{
+}
+
+A<int>::B<char> b;
+
+int h()
+{
+ b.f();
+ b.g(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec8.C
new file mode 100644
index 000000000..ccbf17c2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec8.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Specialization of member class template.
+
+template<class T1> struct A
+{
+ template<class T2> struct B {};
+ template<class T2> struct C {};
+};
+
+template <> template <> struct A<int>::B<int>;
+template <> template <class U> struct A<int>::B {};
+A<int>::B<int> ab; // { dg-error "incomplete" }
+
+A<int>::C<char> ac;
+template <> template <class U> struct A<int>::C {}; // { dg-error "specialization" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec9.C
new file mode 100644
index 000000000..013fa0d99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec9.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Lynn Akers <lakers@peachtree.com>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/10956: Incorrect template substitution for member template
+// specialization inside template class.
+
+template <int> struct C {
+ template<typename T> void pre_add(T);
+};
+
+template<>
+template<typename T>
+void C<32>::pre_add(T) {
+ T pre;
+}
+
+int main() {
+ C<32>().pre_add<int>(1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static1.C
new file mode 100644
index 000000000..98e1acb9e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static1.C
@@ -0,0 +1,4 @@
+template <typename T> struct A
+{
+ static const int t[1][1]={{0}}; // { dg-error "brace-enclosed|in-class" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static10.C
new file mode 100644
index 000000000..881db081c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static10.C
@@ -0,0 +1,24 @@
+// PR c++/19555
+
+namespace __gnu_debug_def { }
+namespace std
+{
+ using namespace __gnu_debug_def;
+ template<typename _Tp> class allocator {}; // { dg-message "std::allocator" }
+}
+namespace __gnu_debug_def
+{
+ template<typename _Tp,
+ typename _Allocator = std::allocator<_Tp> >
+ class vector
+ {
+ void
+ swap(vector<_Tp,_Allocator>& __x);
+ };
+}
+namespace std
+{
+ template<> void
+ vector<int, allocator<int> >::swap(vector<int, allocator<int> >&) { } // { dg-error "" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 22 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static11.C
new file mode 100644
index 000000000..3e489eac5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static11.C
@@ -0,0 +1,8 @@
+// PR c++/19826
+
+template<typename T> struct A
+{
+ static const T i = 1;
+ char a[i];
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static12.C
new file mode 100644
index 000000000..73becab27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static12.C
@@ -0,0 +1,13 @@
+// PR c++/18470
+
+template<typename> struct A
+{
+ static const int i=1;
+};
+
+template<typename T> struct B : A<T>
+{
+ using A<T>::i;
+ char s[i]; // fails
+ char t[A<T>::i]; // compiles
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static13.C
new file mode 100644
index 000000000..c43f55547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static13.C
@@ -0,0 +1,14 @@
+// PR c++/23099
+
+struct Base {
+ int x;
+};
+
+template <typename T>
+struct A {
+ static const int N = sizeof(static_cast<Base*>(T()));
+};
+
+struct Derived : Base {
+ A<Derived*> a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static14.C
new file mode 100644
index 000000000..5bc0e731a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static14.C
@@ -0,0 +1,13 @@
+struct Base {
+ int x;
+};
+
+template <typename T>
+struct A {
+ static const int N = sizeof(static_cast<Base*>(T()));
+ int a[N];
+};
+
+struct Derived : Base {
+ A<Derived*> a;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static15.C
new file mode 100644
index 000000000..d8faa35a6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static15.C
@@ -0,0 +1,71 @@
+// PR c++/23667
+// { dg-options "-std=gnu++98" }
+
+template<int dummy>
+ struct X
+ {
+ static const int n_primes = 256;
+ static const unsigned long primes[n_primes + 1];
+ };
+
+template<int dummy>
+ const int X<dummy>::n_primes;
+
+template<int dummy>
+ const unsigned long X<dummy>::primes[n_primes + 1] =
+ {
+ 2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul,
+ 37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul,
+ 83ul, 89ul, 97ul, 103ul, 109ul, 113ul, 127ul, 137ul, 139ul, 149ul,
+ 157ul, 167ul, 179ul, 193ul, 199ul, 211ul, 227ul, 241ul, 257ul,
+ 277ul, 293ul, 313ul, 337ul, 359ul, 383ul, 409ul, 439ul, 467ul,
+ 503ul, 541ul, 577ul, 619ul, 661ul, 709ul, 761ul, 823ul, 887ul,
+ 953ul, 1031ul, 1109ul, 1193ul, 1289ul, 1381ul, 1493ul, 1613ul,
+ 1741ul, 1879ul, 2029ul, 2179ul, 2357ul, 2549ul, 2753ul, 2971ul,
+ 3209ul, 3469ul, 3739ul, 4027ul, 4349ul, 4703ul, 5087ul, 5503ul,
+ 5953ul, 6427ul, 6949ul, 7517ul, 8123ul, 8783ul, 9497ul, 10273ul,
+ 11113ul, 12011ul, 12983ul, 14033ul, 15173ul, 16411ul, 17749ul,
+ 19183ul, 20753ul, 22447ul, 24281ul, 26267ul, 28411ul, 30727ul,
+ 33223ul, 35933ul, 38873ul, 42043ul, 45481ul, 49201ul, 53201ul,
+ 57557ul, 62233ul, 67307ul, 72817ul, 78779ul, 85229ul, 92203ul,
+ 99733ul, 107897ul, 116731ul, 126271ul, 136607ul, 147793ul,
+ 159871ul, 172933ul, 187091ul, 202409ul, 218971ul, 236897ul,
+ 256279ul, 277261ul, 299951ul, 324503ul, 351061ul, 379787ul,
+ 410857ul, 444487ul, 480881ul, 520241ul, 562841ul, 608903ul,
+ 658753ul, 712697ul, 771049ul, 834181ul, 902483ul, 976369ul,
+ 1056323ul, 1142821ul, 1236397ul, 1337629ul, 1447153ul, 1565659ul,
+ 1693859ul, 1832561ul, 1982627ul, 2144977ul, 2320627ul, 2510653ul,
+ 2716249ul, 2938679ul, 3179303ul, 3439651ul, 3721303ul, 4026031ul,
+ 4355707ul, 4712381ul, 5098259ul, 5515729ul, 5967347ul, 6456007ul,
+ 6984629ul, 7556579ul, 8175383ul, 8844859ul, 9569143ul, 10352717ul,
+ 11200489ul, 12117689ul, 13109983ul, 14183539ul, 15345007ul,
+ 16601593ul, 17961079ul, 19431899ul, 21023161ul, 22744717ul,
+ 24607243ul, 26622317ul, 28802401ul, 31160981ul, 33712729ul,
+ 36473443ul, 39460231ul, 42691603ul, 46187573ul, 49969847ul,
+ 54061849ul, 58488943ul, 63278561ul, 68460391ul, 74066549ul,
+ 80131819ul, 86693767ul, 93793069ul, 101473717ul, 109783337ul,
+ 118773397ul, 128499677ul, 139022417ul, 150406843ul, 162723577ul,
+ 176048909ul, 190465427ul, 206062531ul, 222936881ul, 241193053ul,
+ 260944219ul, 282312799ul, 305431229ul, 330442829ul, 357502601ul,
+ 386778277ul, 418451333ul, 452718089ul, 489790921ul, 529899637ul,
+ 573292817ul, 620239453ul, 671030513ul, 725980837ul, 785430967ul,
+ 849749479ul, 919334987ul, 994618837ul, 1076067617ul, 1164186217ul,
+ 1259520799ul, 1362662261ul, 1474249943ul, 1594975441ul,
+ 1725587117ul, 1866894511ul, 2019773507ul, 2185171673ul,
+ 2364114217ul, 2557710269ul, 2767159799ul, 2993761039ul,
+ 3238918481ul, 3504151727ul, 3791104843ul, 4101556399ul,
+ 4294967291ul,
+ 4294967291ul // sentinel so we don't have to test result of
+ // lower_bound
+ };
+
+template<bool b>
+ struct static_assert;
+
+template<>
+ struct static_assert<true> { };
+
+int main()
+{
+ static_assert< X<0>::n_primes == 256 >();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static16.C
new file mode 100644
index 000000000..f33ac3a55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static16.C
@@ -0,0 +1,20 @@
+// PR c++/23691
+
+namespace std {
+ class type_info {
+ bool operator==(const type_info& __arg) const;
+ };
+}
+template <class T, T val> struct integral_constant {
+ static const T value = val;
+};
+template< typename T > struct is_integral : integral_constant<bool,false> {};
+template <bool B> struct enable_if_c {};
+template<typename Functor>
+typename enable_if_c<(is_integral<Functor>::value)>::type
+operator==(const int& f, Functor g);
+template<class D>
+int get_deleter( std::type_info const & ti )
+{
+ return ti == typeid(D);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static17.C
new file mode 100644
index 000000000..bf79bccc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static17.C
@@ -0,0 +1,13 @@
+// PR c++/23896
+
+template <int> struct X {};
+
+template <typename T> struct length {
+ static const int value = 2;
+};
+
+template <typename T> void foo () {
+ sizeof(X<length<T>::value>);
+}
+
+template void foo<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static18.C
new file mode 100644
index 000000000..2a2ace939
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static18.C
@@ -0,0 +1,13 @@
+// PR c++/23914
+
+template <class T>
+struct foo_template {
+ static const unsigned complexity = 0;
+};
+
+template <int x> struct STATIC_ASSERTION {};
+
+void gcc_402_problem_minimal()
+{
+ sizeof(STATIC_ASSERTION< foo_template<int>::complexity >);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static19.C
new file mode 100644
index 000000000..d720127b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static19.C
@@ -0,0 +1,18 @@
+// PR c++/24275
+
+template <bool val> struct bool_var {
+ static const bool value = val;
+};
+namespace is_inc_ {
+ struct any {
+ template <class T> any(T const&);
+ };
+ int operator++(any const&);
+ template <class T> struct impl {
+ static T &x;
+ static const bool value = sizeof(++x) == 1;
+ };
+}
+template<typename T> struct is_incr : bool_var< is_inc_::impl<T>::value> {};
+struct not_incr{};
+typedef int sa1[ is_incr<not_incr>::value ? -1 : 1];
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static2.C
new file mode 100644
index 000000000..881f07ce9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static2.C
@@ -0,0 +1,17 @@
+class A;
+
+template<int A::* P>
+class B
+{
+public:
+ static int A::* const p = P; // { dg-error "" }
+};
+
+class A
+{
+public:
+
+int dummy;
+
+B<&A::dummy> d;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static20.C
new file mode 100644
index 000000000..6f1096b88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static20.C
@@ -0,0 +1,14 @@
+// PR c++/24277
+
+template< int Bits > struct uint_t {
+ typedef unsigned short fast;
+};
+template < int Bits > struct mask_uint_t {
+ typedef typename uint_t< Bits >::fast fast;
+ static const fast sig_bits = 1;
+ static const fast sig_bits_fast = fast(sig_bits);
+};
+template < int Bits> int checksum ( ) {
+ return 1 & mask_uint_t<Bits>::sig_bits_fast;
+}
+int i = checksum<1>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static21-a.cc b/gcc-4.9/gcc/testsuite/g++.dg/template/static21-a.cc
new file mode 100644
index 000000000..9489ae7d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static21-a.cc
@@ -0,0 +1,17 @@
+template<int dummy>
+ struct X
+ {
+ static const int n_primes = 256;
+ static const unsigned long primes[n_primes + 1];
+ };
+
+ template<int dummy>
+ const int X<dummy>::n_primes;
+
+ template<int dummy>
+ const unsigned long X<dummy>::primes[n_primes + 1] =
+ { 0 };
+
+
+const unsigned long *f1(void){return &X<0>::primes[0];}
+int main(){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static21.C
new file mode 100644
index 000000000..66b045087
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static21.C
@@ -0,0 +1,20 @@
+// PR c++/24389
+// { dg-additional-sources "static21-a.cc" }
+// { dg-do link }
+
+template<int dummy>
+struct X
+{
+ static const int n_primes = 256;
+ static const unsigned long primes[n_primes + 1];
+};
+
+template<int dummy>
+const int X<dummy>::n_primes;
+
+template<int dummy>
+const unsigned long X<dummy>::primes[n_primes + 1] =
+ { 0 };
+
+const unsigned long *f(void){return &X<0>::primes[0];}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static22.C
new file mode 100644
index 000000000..02c7a0cd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static22.C
@@ -0,0 +1,11 @@
+// PR c++/26266
+
+template<typename> struct A
+{
+ static const int i = 1;
+ static const int j = i;
+ static const int k = int(j);
+ int x[k];
+};
+
+A<char> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static23.C
new file mode 100644
index 000000000..b28400a64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static23.C
@@ -0,0 +1,15 @@
+// PR c++/26266
+
+template<typename> struct A
+{
+ static const int i = 1;
+};
+
+template<typename> struct B
+{
+ static const int j = A<char>::i;
+ static const int k = int(j);
+ int x[k];
+};
+
+B<char> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static24.C
new file mode 100644
index 000000000..3d8f9e326
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static24.C
@@ -0,0 +1,15 @@
+template<typename> struct A;
+
+template<> struct A<char>
+{
+ static const char i = 1;
+};
+
+template<typename T> struct B
+{
+ static const int j = A<T>::i;
+ static const int k = int(j);
+ int x[k];
+};
+
+B<char> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static25.C
new file mode 100644
index 000000000..20c0c846e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static25.C
@@ -0,0 +1,14 @@
+// PR c++/27819
+
+struct A
+{
+ static const char i = 1;
+};
+
+template<int> struct B
+{
+ static const int j = A::i;
+ int x[int(j)];
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static26.C
new file mode 100644
index 000000000..095248bac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static26.C
@@ -0,0 +1,10 @@
+// PR c++/28016
+// { dg-final { scan-assembler-not "computed" } }
+
+template<class T1, class T2>
+struct scalar_divides_assign {
+ static const bool computed ;
+};
+
+template<class T1, class T2>
+const bool scalar_divides_assign<T1,T2>::computed = true;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static27.C
new file mode 100644
index 000000000..0b63967e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static27.C
@@ -0,0 +1,13 @@
+// PR c++/28235
+
+template<typename> struct A
+{
+ static const bool i = true;
+ template<bool = i> struct B {};
+ B<> b;
+};
+
+void f() {
+ A<int> a1, a2;
+ a1.b = a2.b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static28.C
new file mode 100644
index 000000000..eb5ec5313
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static28.C
@@ -0,0 +1,15 @@
+// PR c++/29518
+
+template< bool C > int assertion_failed( int);
+template< class >
+struct N
+{
+ static bool const okay = true;
+ enum {
+ t = sizeof( assertion_failed<okay>( 0))
+ };
+};
+int main()
+{
+ N<int> n;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static29.C
new file mode 100644
index 000000000..a949c0cd8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static29.C
@@ -0,0 +1,5 @@
+// PR c++/29570
+
+template<int> struct A { static const int i; };
+
+template<int N> const int A<N>::i = { A<N>::i };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static3.C
new file mode 100644
index 000000000..65cf2c9e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static3.C
@@ -0,0 +1,25 @@
+template <class data> class foo
+{
+ public:
+ static const int a;
+ static const int b;
+ static const int c;
+ static const int d;
+};
+
+template <class data> const int foo<data>::a = 1;
+template <class data> const int foo<data>::b = a;
+template <class data> const int foo<data>::c = b;
+template <class data> const int foo<data>::d = c;
+
+typedef foo<int> fooInt;
+
+int main( void )
+{
+ fooInt *f;
+
+ f = new fooInt();
+
+ if (f->c != 1 || f->d != 1)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static30.C
new file mode 100644
index 000000000..07dafe23f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static30.C
@@ -0,0 +1,10 @@
+// PR c++/31992
+
+template <int> struct A
+{
+ static const int i1;
+ static const int i2;
+};
+
+template <int N> const int A<N>::i1(A<N>::i);
+template <int N> const int A<N>::i2(3, A<N>::i); // { dg-error "expression list" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static31.C
new file mode 100644
index 000000000..935a8a790
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static31.C
@@ -0,0 +1,19 @@
+// PR c++/32674
+
+class C
+{
+ static const int j = 3;
+};
+
+template<int> class A
+{
+ static const int i1;
+ static const int i2;
+ static const int i3;
+ static const int i4;
+};
+
+template<int N> const int A<N>::i1(C::j);
+template<int N> const int A<N>::i2 = C::j;
+template<int N> const int A<N>::i3(C::j, 5); // { dg-error "compound expression" }
+template<int N> const int A<N>::i4 = (C::j, 7);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static32.C
new file mode 100644
index 000000000..b17d14dd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static32.C
@@ -0,0 +1,9 @@
+// PR c++/51430
+// { dg-do compile }
+
+template<int> struct A
+{
+ static const int x[] = 0; // { dg-error "in-class initialization|initializer fails" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static33.C
new file mode 100644
index 000000000..2d7b97da1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static33.C
@@ -0,0 +1,18 @@
+// PR c++/52688
+// { dg-do link }
+
+template<typename T>
+T f()
+{
+ static const double staticLocalVariable = 100.0;
+ struct local
+ {
+ static double f() { return staticLocalVariable; }
+ };
+ return T(local::f());
+}
+
+int main()
+{
+ f<double>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static34.C
new file mode 100644
index 000000000..122fffafb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static34.C
@@ -0,0 +1,21 @@
+// PR c++/52688
+// { dg-do link }
+
+template<class T>
+struct A {
+ static bool test() {
+ static bool value = false;
+ if (value)
+ return false;
+ struct S {
+ S() { value = true; }
+ };
+ static S s;
+ return true;
+ }
+};
+
+int main()
+{
+ A<int>::test();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static35.C
new file mode 100644
index 000000000..d645f2490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static35.C
@@ -0,0 +1,21 @@
+// PR c++/10291
+// { dg-do link }
+
+template <class T>
+int foo ()
+{
+ static int i;
+
+ struct S {
+ int bar () {
+ return i;
+ }
+ } s;
+
+ return s.bar ();
+}
+
+int main ()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static4.C
new file mode 100644
index 000000000..526ced67e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static4.C
@@ -0,0 +1,7 @@
+template <class R>
+struct A {
+ static int _test; // { dg-message "" }
+ static int _test; // { dg-error "" }
+};
+template <class R> int A<R>::_test = 0;
+struct B : public A <int> { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static5.C
new file mode 100644
index 000000000..05eaf8fbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static5.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Origin: Mirek Fidler <cxl@ntllib.org>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/12932: ICE address of static function as template argument
+
+struct Test {
+ static void fun();
+};
+
+template <void (*fun)()>
+void foo () { (*fun)(); }
+
+
+template
+void foo<Test::fun> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static6.C
new file mode 100644
index 000000000..30ecae940
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static6.C
@@ -0,0 +1,14 @@
+// PR c++/13969
+
+struct B {
+ static const int N=10;
+};
+
+template <int> struct X {};
+
+template <typename> struct S {
+ static const int N = B::N;
+ X<N> x;
+};
+
+template class S<float>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static7.C
new file mode 100644
index 000000000..edb8e6a8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static7.C
@@ -0,0 +1,16 @@
+// PR c++/17530
+// { dg-do link }
+
+typedef void (*Func) ();
+void f (Func) {}
+struct B
+{
+ static void staticfunc () {}
+};
+template <int>
+void C(){ f (B::staticfunc); }
+int main ()
+{
+ C<0>();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static8.C
new file mode 100644
index 000000000..f8229fd82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static8.C
@@ -0,0 +1,8 @@
+// PR c++/17585
+
+template <void (*p)(void)> struct S03 {};
+class C03 {
+public:
+ static void f(void) {}
+ void g(void) { S03<&f> s03; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/static9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/static9.C
new file mode 100644
index 000000000..058d4dec5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/static9.C
@@ -0,0 +1,8 @@
+// PR c++/17524
+
+template<typename T> struct A
+{
+ static const T i = 0; // { dg-error "declared void" "void" }
+};
+
+A<void> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/stdarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/stdarg1.C
new file mode 100644
index 000000000..94804eeed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/stdarg1.C
@@ -0,0 +1,55 @@
+// PR c++/47022
+// { dg-do compile }
+// Suppress a warning that is irrelevant to the purpose of this test.
+// { dg-options "-Wno-abi" { target arm_eabi } }
+
+#include <cstdarg>
+
+template <typename T>
+void
+f1 (T *p, va_list ap)
+{
+ *p = va_arg (ap, long double);
+ *p += va_arg (ap, double);
+}
+
+template <typename T>
+void
+f2 (T *p, va_list ap)
+{
+ *p = __real__ va_arg (ap, _Complex int);
+ *p += __imag__ va_arg (ap, _Complex double);
+ *p += __imag__ va_arg (ap, _Complex long double);
+}
+
+template <typename T>
+void
+f3 (T *p, va_list ap)
+{
+ *p = va_arg (ap, T);
+}
+
+void
+foo (int x, va_list ap)
+{
+ if (x == 0)
+ {
+ long double ld;
+ f1 (&ld, ap);
+ }
+ else if (x == 1)
+ {
+ int i;
+ f2 (&i, ap);
+ }
+ else if (x == 2)
+ {
+ long double ld;
+ f3 (&ld, ap);
+ }
+ else if (x == 3)
+ {
+ _Complex double cd;
+ f3 (&cd, ap);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr1.C
new file mode 100644
index 000000000..a470ca8f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr1.C
@@ -0,0 +1,10 @@
+// PR c++/17404
+// { dg-do compile }
+// { dg-options "" }
+
+template <int> void foo ()
+{
+ __builtin_expect (({0;}), 1);
+}
+
+template void foo<1> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr2.C
new file mode 100644
index 000000000..ef29b43c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/stmtexpr2.C
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/36408
+// { dg-options "" }
+// { dg-do compile }
+
+template<int>
+void
+foo()
+{
+ int i = ({ }); // { dg-error "void value not ignored" }
+}
+
+template<int>
+void
+bar()
+{
+ int i = ({ ({}); }); // { dg-error "void value not ignored" }
+}
+
+int
+main ()
+{
+ foo<0> ();
+ bar<0> ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/string1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/string1.C
new file mode 100644
index 000000000..a5d6c7dd6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/string1.C
@@ -0,0 +1,7 @@
+// PR c++/28337
+
+template <int> void foo()
+{
+ (0 ? "" : "X") + 1;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/strlen1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/strlen1.C
new file mode 100644
index 000000000..ddec51d7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/strlen1.C
@@ -0,0 +1,9 @@
+template <typename A1>
+void monk2 (A1) {}
+
+unsigned int strlen (const char*);
+
+void monk ()
+{
+ monk2 (strlen (""));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/subst1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/subst1.C
new file mode 100644
index 000000000..827af23d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/subst1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7718. ICE.
+
+template <typename OBJECT>
+void default_initializer(const OBJECT &) { }
+
+
+template <typename OBJECT, void init_function(const OBJECT &)>
+class cContainer {
+ public:
+ template <typename INITIALIZER>
+ void Add(const INITIALIZER &initializer) {
+ init_function(initializer);
+ }
+};
+
+int main() {
+ cContainer<int, default_initializer<int> > c;
+
+ c.Add<int>(42);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-1.C
new file mode 100644
index 000000000..60ce4e7ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-1.C
@@ -0,0 +1,33 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/1058
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// { dg-do compile }
+
+struct A {
+ typedef int Y;
+ typedef double Z;
+};
+
+struct B {
+ template<typename T>
+ void func(typename T::Y, typename T::Z) { }
+};
+
+template<typename T>
+struct X {
+ void gunc();
+};
+
+template<typename T>
+void X<T>::gunc()
+{
+ B b;
+ b.func<A>(0, 3.);
+}
+
+int main()
+{
+ X<int> x;
+ x.gunc();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-2.C
new file mode 100644
index 000000000..d214716cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-2.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
+
+// PR c++/12924
+
+template<typename> struct A {};
+
+template<> struct A<void>
+{
+ template<typename T> void foo()
+ {
+ A<T> a;
+ a.template foo<int>(); // { dg-error "member" }
+ }
+};
+
+void bar()
+{
+ A<void> a;
+ a.foo<int>(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-3.C
new file mode 100644
index 000000000..e0753abd9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-3.C
@@ -0,0 +1,22 @@
+// PR c++/48261
+
+typedef double (*gaddType)(double,double);
+struct Foo2
+{
+ static gaddType add;
+};
+
+template<typename T>
+struct Something
+{
+ void work()
+ {
+ double x=T::template add<double>(5.0,6.0); // { dg-error "add" }
+ }
+};
+
+int main()
+{
+ Something<Foo2> s2;
+ s2.work();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-4.C
new file mode 100644
index 000000000..26f4809bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/template-id-4.C
@@ -0,0 +1,22 @@
+// PR c++/48157
+
+struct AType
+{
+ template<class AA>
+ void SomeFuncTemplate()
+ { }
+};
+
+template < class T >
+struct TTest2
+{
+ template<T> struct helper;
+
+ template<class U>
+ static void check(helper<&U::template SomeFuncTemplate<int> > *);
+};
+
+int main()
+{
+ TTest2< void (AType::*)() >::check<AType>(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/this-targ1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/this-targ1.C
new file mode 100644
index 000000000..6864be5ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/this-targ1.C
@@ -0,0 +1,23 @@
+// PR c++/47904
+
+template <bool>
+struct S
+{
+};
+
+template <class T>
+class U
+{
+ T t;
+ int foo () const
+ {
+ S <sizeof (t) == 1> s;
+ return 1;
+ }
+ int bar () const
+ {
+ S <sizeof (t) == 1> s;
+ return 1;
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp1.C
new file mode 100644
index 000000000..7b323028e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp1.C
@@ -0,0 +1,9 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template <template <typename T> class A >
+class B : virtual A<void>
+{
+ typedef int INT;
+ INT i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp10.C
new file mode 100644
index 000000000..09bdb1a84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp10.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/16175: Missing cv qualifier in error message output
+
+template <typename> struct Template {};
+
+template<template<typename> class D>
+struct B {
+ static void foo1(const D<void> *); // { dg-error "const" }
+ static void foo2(volatile D<void> *);// { dg-error "volatile" }
+};
+
+class E : protected B<Template> {};
+
+void bar() {
+ E::foo1 (0); // { dg-error "context" }
+ E::foo2 (0); // { dg-error "context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp11.C
new file mode 100644
index 000000000..84867e107
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp11.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: heinlein@informatik.uni-ulm.de
+
+// PR c++/14429: Matching of template template parameter containing
+// non-type parameter with type that depends on earlier parameter.
+
+template <template <typename U, U* p> class T>
+struct X {};
+
+template <template <typename U, U* p> class T>
+struct Y {
+ X<T> x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp12.C
new file mode 100644
index 000000000..554738bf4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp12.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Check the type of non-type parameter in template template parameter
+// only if it is dependent.
+
+template <template <int* p> class T>
+struct X {};
+
+template <typename U, template <U* p> class T>
+struct Y {
+ X<T> x;
+};
+
+template <int* p> struct Z {};
+
+Y<int, Z> y1;
+Y<char, Z> y2; // { dg-error "mismatch|expected|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp13.C
new file mode 100644
index 000000000..2c35b3a79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp13.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/15664: Template substitution of template template parameter
+
+template <int N> struct S {
+ template<template<typename> class A>
+ friend void foo();
+};
+
+template<template<typename> class A>
+void foo();
+
+template <typename> struct X {};
+
+int main () {
+ S<1> s;
+ foo<X>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp14.C
new file mode 100644
index 000000000..2b216090b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp14.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: akim@epita.fr
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18276: Template substitution of template template parameter
+
+template<template<int> class> struct A;
+
+template<int> struct B
+{
+ template<template<int> class> friend class A;
+};
+
+B<0> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp15.C
new file mode 100644
index 000000000..5bb285eb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp15.C
@@ -0,0 +1,21 @@
+struct Dense {
+ static const unsigned int dim = 1;
+};
+
+template <template <typename> class View,
+ typename Block>
+void operator+(float, View<Block> const&);
+
+template <typename Block,
+ unsigned int Dim = Block::dim>
+struct Lvalue_proxy {
+ operator float() const;
+};
+
+void
+test_1d (void)
+{
+ Lvalue_proxy<Dense> p;
+ float b;
+ b + p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp16.C
new file mode 100644
index 000000000..c556c7d98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp16.C
@@ -0,0 +1,7 @@
+template <template <typename> class C>
+void f() {}
+
+template <typename T, typename U = int>
+struct S {};
+
+template void f<S>(); // { dg-error "match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp17.C
new file mode 100644
index 000000000..f1ddeb12e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp17.C
@@ -0,0 +1,7 @@
+template <template <typename> class C>
+void f(C<double>) {}
+
+template <typename T, typename U = int>
+struct S {};
+
+template void f(S<double>); // { dg-error "match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp18.C
new file mode 100644
index 000000000..095c07fb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp18.C
@@ -0,0 +1,10 @@
+template <template <typename> class T>
+void f(T<int>) {}
+
+template <typename T>
+union U {};
+
+void g() {
+ f(U<int>());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp19.C
new file mode 100644
index 000000000..12a37c9cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp19.C
@@ -0,0 +1,7 @@
+// PR c++/27689
+
+void f (...);
+template <template <typename> class F, typename T> void f (F<T>);
+template <typename> struct foo { struct bar {}; };
+void g (foo<int>::bar x) { f(x); }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp2.C
new file mode 100644
index 000000000..45d9abddf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp2.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <class U> struct Alloc {};
+
+template <class T, class U = Alloc<T> > struct Vector {};
+
+template <template <class T, class U = Alloc<T> > class TT>
+struct C {
+ TT<int> tt;
+};
+
+int main()
+{
+ C<Vector> c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp20.C
new file mode 100644
index 000000000..0d1784c9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp20.C
@@ -0,0 +1,11 @@
+// PR c++/27424
+// Bug: failing to substitute the 'int' into C
+
+template<typename T> struct A
+{
+ template<template<T> class> struct B {};
+ template<T> struct C;
+ B<C> b;
+};
+
+A<int> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp21.C
new file mode 100644
index 000000000..f0bda99d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp21.C
@@ -0,0 +1,5 @@
+// PR c++/28853
+// { dg-do compile }
+
+template<template<int> class A>
+int A<0>::i; // { dg-error "template template parameter" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp22.C
new file mode 100644
index 000000000..08eaa3042
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp22.C
@@ -0,0 +1,8 @@
+// PR c++/28860
+// { dg-do compile }
+
+template<template<int> class A>
+class A<0>; // { dg-error "shadows template template parameter" }
+
+template<template<int> class B>
+class B<0> {}; // { dg-error "shadows template template parameter" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp23.C
new file mode 100644
index 000000000..1210f042f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp23.C
@@ -0,0 +1,17 @@
+// PR c++/29236
+
+template <typename T> struct A {};
+
+template <template <typename> class P>
+struct B {
+ template <template <typename> class Q>
+ friend bool foo (const B<Q>& a);
+};
+
+template <template <typename> class Q>
+bool foo (const B<Q>& a);
+
+void bar () {
+ B<A> a;
+ foo (a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp24.C
new file mode 100644
index 000000000..2b8e28515
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp24.C
@@ -0,0 +1,6 @@
+// PR c++/30897
+
+template<template <typename T, typename = T > class U> struct A
+{
+ template<int> U<int> foo();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp25.C
new file mode 100644
index 000000000..46762ae21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp25.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+template<typename T, template<T> class C>
+void f1(T, C<5>); // { dg-message "note" }
+
+template<typename T, template<T> class C>
+void f2(C<5>, T);
+
+template<typename T, template<T> class C>
+void f3(C<5>, T); // { dg-message "note" }
+
+template<typename T> struct metafun { typedef T type; };
+
+template<> struct metafun<short> { typedef int type; };
+
+template<typename T, template<typename metafun<T>::type> class C>
+void f4(T, C<5>); // { dg-message "note" }
+
+template<int N> struct X {};
+void g() {
+ f1(5l, X<5>()); // { dg-error "no matching" }
+ // { dg-message "(candidate|inconsistent with)" "candidate note" { target *-*-* } 20 }
+ f2(X<5>(), 5);
+ f3(X<5>(), 5l); // { dg-error "no matching" }
+ // { dg-message "(candidate|inconsistent with)" "candidate note" { target *-*-* } 23 }
+ f4(5, X<5>());
+ f4(5l, X<5>()); // { dg-error "no matching" }
+ // { dg-message "(candidate|inconsistent with)" "candidate note" { target *-*-* } 26 }
+ f4((short)5, X<5>());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp26.C
new file mode 100644
index 000000000..6ba5cb28a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp26.C
@@ -0,0 +1,5 @@
+// PR c++/34052
+template<typename T = int, typename U> class C; // { dg-error "no default argument" }
+
+template<template<typename T = int, typename U> class C> struct X; // { dg-error "no default argument" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp27.C
new file mode 100644
index 000000000..f69369085
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp27.C
@@ -0,0 +1,6 @@
+// PR c++/35678
+
+template<typename T, T> struct A;
+template<typename> struct B;
+template<template<typename T, T> class U> struct B<U<char, 'h'> > {};
+B<A<char,'h'> > x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp28.C
new file mode 100644
index 000000000..a15dea1e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp28.C
@@ -0,0 +1,21 @@
+// PR c++/56971
+
+template <typename T>
+class rp {
+};
+
+template <template <typename> class P>
+struct b {
+ template <class, template <typename> class FriendP>
+ friend void f(b<FriendP> from);
+};
+
+template <class, template <typename> class P>
+void f(b<P> from) {
+}
+
+int main() {
+ b<rp> v;
+ f<int>(v);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp3.C
new file mode 100644
index 000000000..a7f231a7f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp3.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5213. We failed to spot that class List was a template, rather
+// than a non-template or specialization
+
+
+template <class T> class vector { };
+
+class OUTER {
+ public:
+ template <class T>
+ class List { };
+
+ vector<class List> data; // { dg-error "invalid|required|ISO C" "" }
+};
+
+template <class T>
+class List { };
+
+// This next line should just do a lookup of 'class List', and then
+// get a type/value mismatch. Instead we try and push 'class List'
+// into the global namespace and get a redeclaration error.
+vector<class List > data; // { dg-error "invalid|required|declaration" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp4.C
new file mode 100644
index 000000000..4dff70103
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp4.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// Origin: Ewgenij Gawrilow <gawrilow@math.tu-berlin.de>
+
+// PR c++/6723
+// ICE when default template argument contains instantiation of
+// template template parameter.
+
+template <typename A, typename B,
+ template <typename,typename> class Predicate,
+ bool _matches=Predicate<A,B>::answer>
+struct helper { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp5.C
new file mode 100644
index 000000000..ee9d1ff7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp5.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: sneechy@hotmail.com
+
+// PR c++/8772: Incorrect diagnostics for template template parameter
+// mismatch
+
+template <int> struct A {
+ template <int> struct B {
+ enum { v = 1 };
+ };
+};
+
+template <template <int> class F> struct C {
+ enum { v = F<1>::v || 2 };
+};
+
+template <int n> struct D {
+ enum { v = C<A<n>::B>::v }; // { dg-error "mismatch|class template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp6.C
new file mode 100644
index 000000000..a4c6ab059
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp6.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Eelis van der Weegen <gccbugs@contacts.eelis.net>
+
+// PR c++/10552: Member class template as template template argument
+// substitution issue.
+
+template <template <typename> class A, typename>
+struct B
+{
+ typedef typename A<int>::t t;
+};
+
+template <typename D>
+struct E
+{
+ template <typename> struct F { typedef int t; };
+ typedef typename B<F, D>::t t;
+};
+
+typedef E<int>::t t;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp7.C
new file mode 100644
index 000000000..0bcaa8f72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp7.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Contributed by Andrew Pinski <pinskia at gcc dot gnu dot org>
+// PR c++/13810: ICE while parsing invalid default argument for a
+// template template parameter.
+
+struct X;
+template<int> struct A {};
+
+template<template<int> class = X > struct B1 {}; // { dg-error "as a default value" }
+template<template<int> class = A<0> > struct B2 {}; // { dg-error "as a default value" }
+
+template <typename T>
+struct S {
+ template <template <typename> class = S> struct I1 {}; // { dg-error "as a default value" }
+ template <template <typename> class = ::S> struct I2 {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp8.C
new file mode 100644
index 000000000..99f99b965
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp8.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Contributed by: Niall Douglas <s_gccbugzilla at netprod dot com>
+// PR c++/14284: Failure to select specialization
+
+template<typename> struct S;
+template<template<class> class> struct I {};
+
+template<class, int> struct Match;
+
+template<template<class> class C>
+struct Match<I<C>, 0> {};
+
+template<template<class> class C, int i>
+struct Match<I<C>, i>;
+
+Match<I<S>, 0> v;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ttp9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp9.C
new file mode 100644
index 000000000..060ab7788
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ttp9.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Origin: David Abrahams <dave@boost-consulting.com>
+// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/12170: Deducing template template parameter from nested
+// class template.
+
+template <typename> struct W {};
+
+template< template<typename> class F, typename T>
+int foo(W< F<T> >);
+
+
+template<typename T>
+struct L {
+ static int const value = sizeof(foo(W<T>()));
+ typedef T type;
+};
+
+
+template <typename>
+struct Y {
+ template <typename> struct X { typedef int type; };
+ typedef typename L<X<int> >::type type;
+};
+
+template struct Y<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/type1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/type1.C
new file mode 100644
index 000000000..b74d975ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/type1.C
@@ -0,0 +1,8 @@
+// Test for helpful error messages on invalid nested-name-specifiers.
+
+struct A {
+ template <class T> struct B { static int c; };
+};
+
+int A::B::c; // { dg-error "parameters" }
+int A::C::d; // { dg-error "declared" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/type2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/type2.C
new file mode 100644
index 000000000..509c4820d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/type2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Origin: Juan Carlos Arevalo-Baeza <jcab@JCABs-Rumblings.com>
+
+// PR c++/8442
+// Type template parameter incorrectly treated as template template
+// parameter.
+
+template <typename T> struct A {};
+
+template <typename T> struct B
+{
+ template <typename U> struct C {};
+ template <typename U> A<C<U> > foo(U);
+};
+
+B<void> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef1.C
new file mode 100644
index 000000000..270adcdc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef1.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 9 Dec 2001 <nathan@nathan@codesourcery.com>
+
+// PR 72
+
+template <typename T> struct A
+{
+ typedef T type;
+};
+
+template <typename T> struct B
+{
+ typedef int xxx; // { dg-message "" }
+ typedef T xxx; // { dg-error "" }
+ typedef typename A<T>::type xxx; // { dg-error "" }
+ typedef A<int>::type xxx; // { dg-error "" }
+};
+
+B<int> good;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef10.C
new file mode 100644
index 000000000..c2a2108f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef10.C
@@ -0,0 +1,14 @@
+// PR c++/34573
+
+template < class Gtr_>
+void compute_gr()
+{
+ typedef int Less_chain;
+ struct utils {
+ utils(const Less_chain& lc) {};
+ };
+ utils U(1);
+}
+int main(void){
+ compute_gr<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef11.C
new file mode 100644
index 000000000..a08d7b3a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef11.C
@@ -0,0 +1,25 @@
+// Author: Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/26693
+// { dg-do compile }
+
+
+class Alpha
+{
+ typedef int X; // { dg-error "'typedef int Alpha::X' is private" }
+};
+
+template<int>
+class Beta
+{
+ typedef int Y; // { dg-error "'typedef int Beta<0>::Y' is private" }
+};
+
+template <int>
+int
+bar ()
+{
+ Beta<0>::Y i = 0; // { dg-error "within this context" }
+ return Alpha::X (); // { dg-error "within this context" }
+}
+
+int i = bar<0> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef12.C
new file mode 100644
index 000000000..30605044f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef12.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: Jason Merrill <jason@redhat.com>, PR c++/26693
+// { dg-do compile }
+
+class A
+{
+ protected:
+ typedef int mytype;
+};
+
+template <class T> class B;
+
+class C: public A
+{
+ template <class T> friend class B;
+};
+
+template <class T> class B
+{
+ C::mytype mem;
+};
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef13.C
new file mode 100644
index 000000000..5d40e63f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef13.C
@@ -0,0 +1,16 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/26693
+// { dg-do compile }
+
+class A
+{
+ typedef int mytype; // { dg-error "typedef int A::mytype' is private" }
+};
+
+template <class T> class B : public A
+{
+ mytype mem; // { dg-error "within this context" }
+};
+
+B<int> b; // { dg-message "required from here" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef14.C
new file mode 100644
index 000000000..caa565a08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef14.C
@@ -0,0 +1,16 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/26693
+// { dg-do compile }
+
+template <class T>
+struct A
+{
+ typedef int mytype;
+
+ void
+ foo ()
+ {
+ mytype v = ~static_cast<mytype> (0);
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef15.C
new file mode 100644
index 000000000..e9e3d94ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef15.C
@@ -0,0 +1,25 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/26693
+// { dg-do compile }
+
+template<class T> struct C0;
+
+struct Foo {
+ typedef int TypedefedFoo;
+ typedef C0<Foo> TypedefedC0;
+};
+
+template<class T>
+struct C0
+{
+ typedef Foo TypedefedFoo;
+ typename T::TypedefedC0::TypedefedFoo m;
+};
+
+template<class U>
+struct C1
+{
+ typedef C0<Foo> TypedefedC0;
+};
+
+C0<C1<int> > c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef16.C
new file mode 100644
index 000000000..29870605a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef16.C
@@ -0,0 +1,27 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/26693
+// { dg-do compile }
+
+struct C0
+{
+};
+
+template<class T, class U>
+struct C1
+{
+ typedef C0 TypedefedC0;
+
+ template<class W>
+ void foo (TypedefedC0 *, W)
+ {
+ }
+
+ template<class W> C1 (W w)
+ {
+ TypedefedC0 c;
+ foo (&c, w);
+ }
+
+};
+C0 c0;
+C1<int, char> c1 (&c0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef17.C
new file mode 100644
index 000000000..263e28886
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef17.C
@@ -0,0 +1,32 @@
+// PR c++/37806
+
+extern "C" int printf (const char *, ...);
+
+template <typename T>
+struct S1
+{
+ typedef void (function_type)(int) const;
+};
+
+
+struct S2: public S1<int>
+{
+ virtual function_type f = 0;
+};
+
+struct S3: public S2
+{
+ void
+ f (int i) const
+ {
+ printf ("Hello world: %d\n", i);
+ }
+};
+
+
+int
+main()
+{
+ S3 s;
+ s.f(5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef18.C
new file mode 100644
index 000000000..8ea3c736a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef18.C
@@ -0,0 +1,24 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40007
+// { dg-do compile }
+
+template<typename T>
+struct x
+{
+ protected:
+ typedef int type;
+};
+
+template<typename T>
+struct y : public x<T>
+{
+ typename x<T>::type z;
+};
+
+template<>
+struct y<void> : public x<void>
+{
+ typedef x<void>::type z;
+};
+
+template class y<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef19.C
new file mode 100644
index 000000000..2fac20ea0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef19.C
@@ -0,0 +1,21 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40007
+// { dg-do compile }
+
+class A
+{
+ typedef int mytype; // { dg-error "'typedef int A::mytype' is private" }
+};
+
+template <class T>
+class B : public A
+{
+};
+
+template<class T>
+class B<T*> : public A
+{
+ mytype mem; // { dg-error "within this context" }
+};
+
+B<int*> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef2.C
new file mode 100644
index 000000000..cfe0f3f75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef2.C
@@ -0,0 +1,4 @@
+// PR c++/18155
+
+template<int> typedef struct A; // { dg-warning "'typedef' was ignored" }
+ // { dg-error "" "" { target *-*-* } 3 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef20.C
new file mode 100644
index 000000000..c768ce0a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef20.C
@@ -0,0 +1,27 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40007
+// { dg-do compile }
+
+class x
+{
+ typedef int privtype; // { dg-error "is private" }
+
+protected:
+ typedef int type;
+};
+
+template<typename T>
+struct y : public x
+{
+ typename x::type z;
+};
+
+template<typename T>
+struct y<T*> : public x
+{
+ typedef x::type good;
+ typedef x::privtype bad; // { dg-error "within this context" }
+};
+
+template class y<int>;
+template class y<int*>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef21.C
new file mode 100644
index 000000000..3185331be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef21.C
@@ -0,0 +1,11 @@
+// PR c++/37037
+
+typedef void F(void);
+template <typename T> struct S
+{
+ static F f;
+};
+template class S<int>;
+template <class T> void S<T>::f(void)
+{}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef22.C
new file mode 100644
index 000000000..e3ecfcb36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef22.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/14777
+// { dg-do compile }
+
+template <typename T>
+struct B
+{
+protected:
+ typedef int M; // { dg-error "protected" }
+};
+
+template <typename T>
+struct A : B<T> {
+ typedef typename B<char>::M N; // { dg-error "context" }
+ A (int = N ());
+};
+
+A<int> a = A<int> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef23.C
new file mode 100644
index 000000000..e70355037
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef23.C
@@ -0,0 +1,25 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42069
+// { dg-do compile }
+
+struct A
+{
+ static const int N = 0;
+};
+
+template<int> struct B {};
+
+template<typename T, int>
+struct C
+{
+ typedef T U;
+ B<U::N> b;
+};
+
+template<typename T>
+struct C<T*, 0>
+{
+ B<T::N> b;
+};
+
+C<A*, 0> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef24.C
new file mode 100644
index 000000000..ddcae1d61
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef24.C
@@ -0,0 +1,33 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42225
+// { dg-do compile }
+
+template<class T>
+struct A
+{
+ typedef T I;
+};
+
+template<class T, int>
+struct B
+{
+ typedef T TT;
+ typedef typename TT::I TT_I;
+ typedef A<TT_I> TA;
+};
+
+template<class T>
+void
+foo()
+{
+ typedef T TT;
+ typedef typename TT::I TT_I;
+ typedef A<TT_I> TA;
+}
+
+int
+main()
+{
+ foo<A<int> >();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef25.C
new file mode 100644
index 000000000..f5a13ea85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef25.C
@@ -0,0 +1,42 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/42225
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct A
+{
+ typedef T I;
+ static const char *i;
+};
+
+template<class T, int>
+struct B
+{
+ typedef T TT;
+ typedef decltype(TT::i) TT_I0;
+ typedef decltype(&TT::i) TT_I1;
+ typedef decltype(*TT::i) TT_I2;
+ typedef A<TT_I0> TA0;
+ typedef A<TT_I1> TA1;
+ typedef A<TT_I2> TA2;
+};
+
+template<class T>
+void
+foo()
+{
+ typedef T TT;
+ typedef decltype(TT::i) TT_I0;
+ typedef decltype(&TT::i) TT_I1;
+ typedef decltype(*TT::i) TT_I2;
+ typedef A<TT_I0> TA0;
+ typedef A<TT_I1> TA1;
+ typedef A<TT_I2> TA2;
+}
+
+int
+main()
+{
+ foo<A<int> >();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef26.C
new file mode 100644
index 000000000..7f4bc6b5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef26.C
@@ -0,0 +1,40 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/42225
+// { dg-do compile }
+
+struct A
+{
+ typedef int TI;
+};
+
+template<class T0>
+struct S0
+{
+ int i;
+};
+
+template<class _T, int>
+struct S1
+{
+ typedef _T T;
+ typedef typename T::TI TTI;
+ typedef S0<TTI> TT0;
+ typedef S0<typename T::TI> TT1;
+};
+
+template<class T>
+void
+foo(const T&)
+{
+ typedef typename T::TI TTI;
+ typedef S0<TTI> TT1;
+ typedef S0<typename T::TI> TT2;
+}
+
+int
+main()
+{
+ A a;
+ foo (a);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef27.C
new file mode 100644
index 000000000..e50f17ccd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef27.C
@@ -0,0 +1,55 @@
+// Origin: PR c++/42713
+// { dg-do compile }
+
+template<class T>
+struct S
+{
+};
+
+template<class T>
+struct S0
+{
+ typedef T TT;
+};
+
+template<class U, class V>
+struct super_struct : S0<V>
+{
+ typedef S0<V> super;
+};
+
+template<class U, class V, class W>
+struct S1 : super_struct<U, V>
+{
+ typedef super_struct<U, V> super;
+ typedef typename super::super Super2;
+ typedef typename Super2::TT Super2TT;
+ void
+ foo()
+ {
+ S<Super2TT> s1;
+ }
+};
+
+template<class U, class V>
+struct S2 : super_struct<U, V>
+{
+ typedef super_struct<U, V> super;
+ typedef typename super::super Super2;
+ typedef typename Super2::TT Super2TT;
+ void
+ foo()
+ {
+ S<Super2TT> s1;
+ }
+};
+
+int
+main()
+{
+ S1<int, S<int>, int> s1;
+ s1.foo();
+ S2<int, S<int> > s2;
+ s2.foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef28.C
new file mode 100644
index 000000000..a0bad1bb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef28.C
@@ -0,0 +1,28 @@
+// Origin: PR c++/42820
+// { dg-do compile }
+
+
+template <class T> struct vector{};
+struct Traits{struct Primitive{struct Id{};};};
+
+template <class Tree, class Polyhedron> struct Tree_vs_naive
+{
+ typedef typename Tree::Primitive Primitive;
+
+ void f() const
+ {
+ typedef vector<typename Primitive::Id> Id_vector;
+ }
+};
+
+template <class Tree> void test_hint_strategies()
+{
+ vector<typename Tree::Primitive::Id> v;
+}
+
+int main(void)
+{
+ test_hint_strategies<Traits>();
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef29.C
new file mode 100644
index 000000000..bb3b81e35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef29.C
@@ -0,0 +1,25 @@
+// Origin: PR c++/42820
+// { dg-do compile }
+
+template <class T> struct vector{};
+template<class T>struct Traits{struct Primitive{struct Id{};};};
+
+template <template<class T> class Tree, class Polyhedron> struct Tree_vs_naive
+{
+ typedef typename Tree<int>::Primitive Primitive;
+
+ void f() const
+ {
+ typedef vector<typename Primitive::Id> Id_vector;
+ }
+};
+
+template <template<class T> class Tree> void test_hint_strategies()
+{
+ vector<typename Tree<int>::Primitive::Id> v;
+}
+
+int main(void)
+{
+ test_hint_strategies<Traits>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef3.C
new file mode 100644
index 000000000..481f451d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef3.C
@@ -0,0 +1,7 @@
+// PR c++/19397
+// { dg-do compile }
+
+template<typename> struct A
+{
+ typedef int ::template; // { dg-error "template" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef30.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef30.C
new file mode 100644
index 000000000..2f9362a1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef30.C
@@ -0,0 +1,20 @@
+// Origin: PR c++/43206
+// { dg-do compile }
+
+template<class A> struct NumericTraits{ typedef A TInputImage;};
+template<class B> class CovariantVector{};
+template<class C> struct Image{ typedef C PixelType;};
+template<class H, class E, class D>
+class F {
+ typedef H G;
+ typedef
+ typename NumericTraits<typename G::PixelType>::RealType
+ InputRealType;
+};
+
+template<typename TInputImage,
+ typename TOutputImage=Image<CovariantVector<typename NumericTraits<typename TInputImage::PixelType>::TInputImage> > >
+class XXX{};
+
+XXX<Image<float> > x;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef31.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef31.C
new file mode 100644
index 000000000..7d66e3f5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef31.C
@@ -0,0 +1,21 @@
+// Origin: PR c++/43558
+// { dg-do compile }
+
+class Compressible;
+template <class T, class EngineTag> class Engine;
+template <class T>
+class Engine<T, Compressible>
+{
+ public:
+ typedef T Element_t;
+ //Element_t read(int);
+ T read(int);
+};
+
+template <class T>
+T Engine<T, Compressible>::read(int)
+{
+}
+
+Engine<int, Compressible> x;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef32.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef32.C
new file mode 100644
index 000000000..b32e66c3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef32.C
@@ -0,0 +1,46 @@
+// Origin: PR c++/43704
+// { dg-do compile }
+
+template<typename T2, typename T3>
+struct if_
+{
+ typedef T2 type;
+};
+
+template<class I1>
+struct iterator_restrict_traits
+{
+ struct iterator_category {};
+};
+
+template<class T>
+struct matrix
+{
+ struct ci {struct ic {};};
+ class i {};
+};
+
+template<class M, class TRI>
+struct triangular_adaptor
+{
+ typedef typename if_<typename M::ci,typename M::i>::type ty1;
+ class iterator2 : iterator_restrict_traits<typename ty1::ic>::iterator_category
+ {
+ };
+};
+
+template<class M>
+struct banded_adaptor
+{
+ typedef typename if_<typename M::ci,typename M::i>::type ty1;
+ class iterator1 : iterator_restrict_traits<typename ty1::ic>::iterator_category
+ {
+ };
+};
+
+template<class T>
+struct singular_decomposition
+{
+ banded_adaptor<matrix<double> >::iterator1 it1;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef33.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef33.C
new file mode 100644
index 000000000..1d2117b3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef33.C
@@ -0,0 +1,21 @@
+// Origin PR c++/43800
+// { dg-do compile }
+
+template<class T, class U=T>
+struct V
+{
+ typedef T t_type;
+};
+
+template<class T>
+class J
+{
+ typedef typename V<T>::t_type t_type;
+ const t_type& f(); // #0:
+private:
+ t_type b;
+};
+
+template<class T>
+const typename V<T>::t_type& J<T>::f() {return b;} // #1
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef34.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef34.C
new file mode 100644
index 000000000..a82e155e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef34.C
@@ -0,0 +1,37 @@
+// Origin PR c++/45200
+// { dg-do compile }
+
+template<typename T>
+struct remove_reference
+{
+ typedef T type;
+};
+
+template<typename TestType>
+struct forward_as_lref
+{
+};
+
+template<typename Seq, typename N>
+struct apply1
+{
+ typedef typename remove_reference<Seq>::type seq;
+ typedef forward_as_lref<typename seq::seq_type> type; //#0
+};
+
+template<typename Seq>
+struct apply
+{
+ typedef forward_as_lref<typename remove_reference<Seq>::type::seq_type> type; //#1
+};
+
+struct reverse_view
+{
+ typedef int seq_type;
+};
+
+int
+main()
+{
+ apply<reverse_view >::type a2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef35.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef35.C
new file mode 100644
index 000000000..2dddf0966
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef35.C
@@ -0,0 +1,41 @@
+// Origin c++/45558
+// { dg-do compile }
+
+template <typename S, typename T>
+struct C
+{
+ template <typename U>
+ struct B
+ {
+ template <typename W>
+ struct E
+ {
+ explicit E(const W &x) : w(x) {}
+ const W &w;
+ };
+ };
+};
+
+struct F;
+template <typename X>
+struct D
+{
+ D() {}
+};
+
+const D<F> g;
+template <typename S, typename T>
+struct A
+{
+ template <typename U>
+ struct B : C<S, T>::template B<U>
+ {
+ typedef typename C<S, T>::template B<U> V;
+ static const D<typename V::template E<D<F> > > a;
+ };
+};
+
+template <typename S, typename T>
+template <typename U>
+const D<typename C<S, T>::template B<U>::template E<D<F> > >
+A<S, T>::B<U>::a = typename C<S, T>::template B<U>::template E<D<F> >(g);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef36.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef36.C
new file mode 100644
index 000000000..318deef92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef36.C
@@ -0,0 +1,23 @@
+// Origin: PR c++/45606
+// { dg-do compile }
+
+template<class T, class U = int>
+struct S0
+{
+ typedef int const_iterator;
+};
+
+template<class T>
+struct Test
+{
+ typedef S0<T> SAlias;
+ typedef typename SAlias::const_iterator const_iterator;
+ const_iterator begin ();
+};
+
+template<class T>
+typename S0<T>::const_iterator
+Test<T>::begin()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef37.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef37.C
new file mode 100644
index 000000000..eefa38316
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef37.C
@@ -0,0 +1,58 @@
+// Origin: PR c++/47398
+// { dg-do compile }
+
+template<int>
+struct A
+{
+ typedef int INT;
+};
+
+template<int I>
+struct transform
+{
+ static int bar();
+};
+
+template<class T, int a, class U, int b>
+struct B
+{
+ typedef typename A<a>::INT TINT;
+ void baz();
+};
+
+template<class T, int a, class U>
+struct B<T, a, U, 1>
+{
+ typedef typename A<a>::INT TINT;
+ void foo();
+};
+
+template<class T, int a, class U, int b>
+void
+B<T, a, U, b>::baz()
+{
+ int c = transform<sizeof(TINT)>::bar();//#0
+}
+
+template<class T, int a, class U>
+void
+B<T, a, U, 1>::foo()
+{
+ int c = transform<sizeof(TINT)>::bar();//#1
+}
+
+int
+main()
+{
+ B<int, 2, char, 1> i;
+ i.foo();
+ // While instantiating
+ //
+ // template<class T, int a, class U> void B<T, a, U, 1>::foo()
+ //
+ // lookup_template_class resolves transform<sizeof(TINT)> in #1 to
+ // the wrong one; it picks up the one in #0 instead. This is because
+ // to compare the two A<a> comp_template_args uses cp_tree_equal
+ // that fails to consider the number of siblings of parm 'a'.
+return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef38.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef38.C
new file mode 100644
index 000000000..42abbbb15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef38.C
@@ -0,0 +1,26 @@
+// Origin: PR c++/46394
+// { dg-do compile { target c++11 } }
+
+template<class T>
+struct S0
+{
+ typedef T type;
+};
+
+template<class... X>
+struct S1
+{
+ typedef int I;
+};
+
+struct A
+{
+ template<class...U, class V=typename S1<typename S0<U>::type...>::I>
+ A(U...u);
+};
+
+int
+main()
+{
+ A a(1, 2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef39.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef39.C
new file mode 100644
index 000000000..71d8bdb1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef39.C
@@ -0,0 +1,15 @@
+// PR c++/50852
+
+template<int d> class A;
+template<class T> struct B {typedef int K;typedef int L;};
+template<class U,class V> struct C
+{
+ typedef typename U::L X;
+ typedef A<X::a-1> W; // { dg-error "not a member" }
+};
+template<class U,int d> struct D
+{
+ typedef typename U::L X;
+ typedef A<X::a-1> W; // the error should really be on this line
+};
+template class D<B<A<1> >,3>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef4.C
new file mode 100644
index 000000000..60fad0688
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef4.C
@@ -0,0 +1,10 @@
+// PR c++/27572
+// { dg-do compile }
+
+template<typedef> void foo(); // { dg-error "no type|typedef declaration|template" }
+
+void bar()
+{
+ foo<int>(); // { dg-error "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 8 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef40.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef40.C
new file mode 100644
index 000000000..1d8be358a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef40.C
@@ -0,0 +1,21 @@
+// PR c++/55058
+
+template <typename T>
+struct A { };
+
+template <typename T>
+struct B {
+ B(const A<T> T::* p);
+ typedef A<T> D;
+};
+
+template <typename T>
+B<T>::B(const D T::* p) { }
+
+struct C {
+ C() : e() {};
+
+ const A<C> e;
+};
+
+B<C> g(&C::e);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef41.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef41.C
new file mode 100644
index 000000000..dc25518bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef41.C
@@ -0,0 +1,8 @@
+// PR c++/59347
+
+template<int> struct A
+{
+ typedef int ::X; // { dg-error "" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef5.C
new file mode 100644
index 000000000..04b8eac3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef5.C
@@ -0,0 +1,7 @@
+// PR c++/27572
+// { dg-do compile }
+
+template<typedef,int> struct A1; // { dg-error "no type|typedef declaration|default argument" }
+template<typedef x,int> struct A2; // { dg-error "type|typedef declaration|default argument" }
+template<typedef x[],int> struct A3; // { dg-error "no type|typedef declaration|expected" }
+template<typedef int x, int> struct A4; // { dg-error "typedef declaration|default argument" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef6.C
new file mode 100644
index 000000000..c95945966
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef6.C
@@ -0,0 +1,8 @@
+//PR c++/28303
+
+template<typename T> struct A
+{
+ typedef struct typename T::X X; // { dg-error "expected identifier|two or more" }
+};
+
+template<typename T> A<T>::X::X() {} // { dg-error "not a type|forbids declaration|invalid use of" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef7.C
new file mode 100644
index 000000000..2d39c90b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef7.C
@@ -0,0 +1,15 @@
+// An intermediate version of the fix for c++/19407 broke this example.
+
+struct A
+{
+ typedef struct { int i; } S;
+};
+
+template <class T>
+struct B: public A
+{
+ template <class U>
+ static S f ();
+};
+
+template struct B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef8.C
new file mode 100644
index 000000000..f13260688
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef8.C
@@ -0,0 +1,21 @@
+// PR c++/34206
+
+template<class _T1, class _T2> struct pair { };
+template <class T0, class T1> struct tuple {
+ template <class U1, class U2>
+ tuple& operator=(const pair<U1, U2>& k) { }
+};
+template<class T1, class T2> inline tuple<T1&, T2&> tie(T1& t1, T2& t2) { }
+
+template <class T> struct A
+{
+ typedef T type;
+ pair<type, type> f();
+};
+
+void g(A<int> a)
+{
+ typedef A<int>::type type;
+ type begin1, end1;
+ tie(begin1, end1) = a.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typedef9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef9.C
new file mode 100644
index 000000000..8d2ed3675
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typedef9.C
@@ -0,0 +1,25 @@
+// PR c++/34846
+
+template<typename, typename> struct __are_same { enum { __value = 0 }; };
+template<typename _Tp> struct __are_same<_Tp, _Tp> { enum { __value = 1 }; };
+template<typename, bool> struct __enable_if { };
+template<typename _Tp> struct __enable_if<_Tp, true> { typedef _Tp __type; };
+template<typename _Iterator, typename _Container> class __normal_iterator {
+public:
+ __normal_iterator();
+ template<typename _Iter>
+ __normal_iterator(
+ const __normal_iterator<_Iter, typename __enable_if<_Container,
+(__are_same<_Iter, typename _Container::pointer>::__value) >::__type>& __i)
+ { }
+};
+template<typename _Tp> class vector {
+public:
+ typedef _Tp* pointer;
+ typedef __normal_iterator<int, vector<_Tp> > iterator;
+};
+void test() {
+ typedef int t;
+ vector<t*>::iterator x;
+ vector<t*>::iterator y = x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typeid-template-argument.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typeid-template-argument.C
new file mode 100644
index 000000000..38dbfd3f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typeid-template-argument.C
@@ -0,0 +1,7 @@
+// This used to ICE (PR28420)
+
+// { dg-do compile }
+
+template<int> struct A;
+
+int i = sizeof(A<typeid>); // { dg-error "operator cannot appear in a constant-expression|template argument 1 is invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typeid1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typeid1.C
new file mode 100644
index 000000000..6df5f71ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typeid1.C
@@ -0,0 +1,17 @@
+// PR c++/55878
+
+#include <typeinfo>
+
+struct S;
+
+template <typename T>
+static bool fn (S *s)
+{
+ return typeid (*s) == typeid (T);
+}
+
+struct S
+{
+};
+
+bool x = fn<S> (__null);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename1.C
new file mode 100644
index 000000000..86658c5f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename1.C
@@ -0,0 +1,9 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template <class T>
+class B : virtual T::A
+{
+ typedef int INT;
+ INT i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename10.C
new file mode 100644
index 000000000..f6f9931df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename10.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Copyright (C) 2006 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 25 Aug 2006 <nathan@codesourcery.com>
+
+// Origin: Tobias Schwinger <tschwinger@neoscientists.org>
+// PR 27787. Too eager to resolve a typename
+
+template<typename X>
+struct x
+{
+ template<typename Y>
+ struct y
+ {
+ typedef Y type;
+ };
+};
+
+template<typename A>
+struct a : x<A>
+{
+ template<typename B>
+ typename a::template y<B>::type f(B);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename11.C
new file mode 100644
index 000000000..fb776105f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename11.C
@@ -0,0 +1,11 @@
+// PR c++/28999
+
+namespace N
+{
+ template<int> void foo();
+}
+
+template<int> struct A
+{
+ friend void typename N::foo<0>(); // { dg-error "type|expected" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename12.C
new file mode 100644
index 000000000..0bb78c7c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename12.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com>
+
+// Origin: sschunck@pdf.de
+// PR 30818, failure to resolve typename typedef
+
+template < typename T >
+class A
+{
+ typedef int type;
+ class B;
+};
+
+template < typename T >
+class A<T>::B
+{
+ typedef typename A<T>::type type;
+ type f();
+};
+
+template < typename T >
+typename A<T>::B::type
+A<T>::B::f() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename13.C
new file mode 100644
index 000000000..527b0d153
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename13.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com>
+
+template <typename T> struct A
+{
+ struct B;
+ typedef typename B::type type;
+};
+
+template <typename T> struct A<T>::B
+{
+ typedef typename A<T>::type type;
+
+ type Foo ();
+};
+
+template <typename T>
+typename A<T>::B::type
+A<T>::B::Foo ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename14.C
new file mode 100644
index 000000000..7e73cb0f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename14.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com>
+
+template <typename T> struct A
+{
+ typedef const T X;
+
+ struct B;
+};
+
+template <typename T> struct A<T>::B
+{
+ typedef volatile typename A<T>::X Y;
+
+ T const volatile *Foo ();
+};
+
+template<typename T>
+typename A<T>::B::Y *A<T>::B::Foo ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename15.C
new file mode 100644
index 000000000..fece885ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename15.C
@@ -0,0 +1,12 @@
+// PR37314 ice-on-valid-code, from w.doeringer
+template <typename T>
+class Cdeque {
+ typedef T *pointer;
+ class iterator {
+ typedef typename Cdeque<T>::pointer pointer;
+ pointer operator->();
+ };
+};
+template <typename T> T* Cdeque<T>::iterator::operator->() { }
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename16.C
new file mode 100644
index 000000000..45da11162
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename16.C
@@ -0,0 +1,25 @@
+// PR37314 rejects-valid, from w.doeringer
+template <typename T>
+struct A {
+ typedef __PTRDIFF_TYPE__ difference_type;
+ struct B {
+ typedef typename A<T>::difference_type difference_type;
+ difference_type operator-(B const&) const;
+ T t;
+ };
+};
+//
+
+template <typename T>
+typename A<T>::B::difference_type A<T>::B::operator-(B const&) const {
+ return -1;
+}
+
+//
+int main() {
+ A<int>::B i;
+ ++i.t;
+ return 0;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename17.C
new file mode 100644
index 000000000..748b1f7ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename17.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+// This should fail as A::foo<0> is not a typename at all.
+struct A
+{
+ template<int> void foo(int i)
+ {
+ typename A::foo<0>(i1); // { dg-error "" }
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename18.C
new file mode 100644
index 000000000..4134ef6f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename18.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// These typename should work as they are types.
+struct A
+{
+ typedef int a;
+ template <int>
+ struct f {};
+ template<int> void foo(int i)
+ {
+ typename A::a(i1);
+ typename A::f<0>(i2);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename19.C
new file mode 100644
index 000000000..735deb277
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename19.C
@@ -0,0 +1,24 @@
+// PR c++/56395
+
+struct A
+{
+ template <class T> struct B { };
+};
+
+template <class T> struct D { };
+
+template <class T, class U> struct C
+{
+ typedef T _Type;
+ typedef typename T::template B<_Type> _BType;
+ D<_BType> d;
+};
+
+template <class T> struct C<T,T>
+{
+ typedef T _Type;
+ typedef typename T::template B<_Type> _BType;
+ D<_BType> d;
+};
+
+C<A,A> c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename2.C
new file mode 100644
index 000000000..b0e16d464
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename2.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "" }
+
+// Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Mar 2002 <nathan@codesourcery.com>
+
+// PR 5507. Overzealous implicit typename warning
+
+template<typename _CharT>
+class __ctype_abstract_base
+{
+ typedef int mask;
+};
+
+template<typename _CharT>
+class ctype : public __ctype_abstract_base<_CharT>
+{
+ typedef typename ctype::mask mask;
+};
+
+template<typename _CharT>
+class ctype2 : public __ctype_abstract_base<_CharT>
+{
+ typedef mask mask; // { dg-error "does not name a type" "no type" }
+ // { dg-message "note" "note" { target *-*-* } 24 }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename20.C
new file mode 100644
index 000000000..d5bd51f35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename20.C
@@ -0,0 +1,11 @@
+// PR c++/56543
+
+template <typename>
+struct S;
+
+template <typename T>
+struct U
+{
+ typedef typename S <T>::template V <> W;
+ S <W> x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename3.C
new file mode 100644
index 000000000..0ad9a2a0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename3.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// crash test - PR 7266
+
+template <class A>
+struct B {
+ typedef A::C::D E; // { dg-error "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename4.C
new file mode 100644
index 000000000..56b505142
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename4.C
@@ -0,0 +1,3 @@
+struct B { template <typename U> struct C; };
+template <typename T> struct A { typedef typename T::C V; }; // { dg-error "not a type" }
+void f () { A<B>::V p; } // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename5.C
new file mode 100644
index 000000000..2f72b5f86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: ariels@compugen.co.il
+
+// PR c++/2513: typename handling when scope is dependent as
+// described in DR108.
+
+template <bool flag> struct Select {
+ typedef int Result;
+};
+
+template <template<class> class Pred> struct FindType {
+ typedef typename Select<true>::Result Result;
+};
+
+template <int bits> struct Int {
+ template<typename T> struct RightSize {};
+ typedef typename FindType<RightSize>::Result type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename6.C
new file mode 100644
index 000000000..937ea96aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename6.C
@@ -0,0 +1,11 @@
+struct O {
+ template <typename T>
+ struct I {
+ I (int);
+ };
+};
+
+template <typename T>
+void f() {
+ typename ::O::I<int>(3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename7.C
new file mode 100644
index 000000000..d9c8f2609
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename7.C
@@ -0,0 +1,19 @@
+// PR c++/17501
+
+template<int> struct A;
+
+template<> struct A<0>
+{
+ struct B
+ {
+ struct C
+ {
+ typedef int D;
+ };
+ };
+};
+
+template<int I> struct E
+{
+ typename A<I>::B::C::D i;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename8.C
new file mode 100644
index 000000000..85f585d94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename8.C
@@ -0,0 +1,10 @@
+// PR c++/18738
+
+namespace foo {
+ typedef int my_type;
+}
+
+template<typename T>
+struct A {
+ typename foo::my_type bar();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/typename9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/typename9.C
new file mode 100644
index 000000000..5f6fb96bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/typename9.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18981. ICE
+// Origin: Andreas Schwab <schwab@suse.de>
+
+template <class T>
+struct tree {
+ struct iterator;
+ struct sibling_iterator {
+ friend struct tree<T>::iterator;
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify1.C
new file mode 100644
index 000000000..2f0a18cf4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify1.C
@@ -0,0 +1,26 @@
+// Test non-type template argument folding.
+// Origin: smacdonald@seimac.com
+
+// { dg-do compile }
+
+template < int I1, int I2 >
+class unit
+{
+public:
+ unit() {}
+ unit( const unit<I1,I2>& ) {}
+
+ template< int Q1, int Q2 >
+ unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const {
+ return unit< I1 - Q1, I2 - Q2 >();
+ }
+
+};
+
+int main()
+{
+ const unit<1,0> u1;
+ const unit<2,0> u2;
+
+ unit<-1,0> u3( u1 / u2 );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify10.C
new file mode 100644
index 000000000..7f2fd5346
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify10.C
@@ -0,0 +1,60 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <bangerth at ticam dot utexas dot edu>
+// and Rene Fonseca <fonseca at mip dot sdu dot dk>
+// PR c++/8271: Check cv-qualifiers while unifying pointer to member
+// functions.
+
+struct MyClass {
+ void mMethod() throw() {}
+ void cMethod() const throw() {}
+ void vMethod() volatile throw() {}
+ void cvMethod() const volatile throw() {}
+};
+
+template<class CLASS>
+void mFunction(void (CLASS::* method)()) {} // { dg-message "note" }
+
+template<class CLASS>
+void cFunction(void (CLASS::* method)() const) {} // { dg-message "note" }
+
+template<class CLASS>
+void vFunction(void (CLASS::* method)() volatile) {} // { dg-message "note" }
+
+template<class CLASS>
+void cvFunction(void (CLASS::* method)() const volatile) {} // { dg-message "note" }
+
+int main() {
+ mFunction(&MyClass::mMethod);
+ mFunction(&MyClass::cMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 28 }
+ mFunction(&MyClass::vMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 30 }
+ mFunction(&MyClass::cvMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 32 }
+
+ cFunction(&MyClass::mMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 35 }
+ cFunction(&MyClass::cMethod);
+ cFunction(&MyClass::vMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 38 }
+ cFunction(&MyClass::cvMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 40 }
+
+ vFunction(&MyClass::mMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 43 }
+ vFunction(&MyClass::cMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 45 }
+ vFunction(&MyClass::vMethod);
+ vFunction(&MyClass::cvMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 48 }
+
+ cvFunction(&MyClass::mMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 51 }
+ cvFunction(&MyClass::cMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 53 }
+ cvFunction(&MyClass::vMethod); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 55 }
+ cvFunction(&MyClass::cvMethod);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify11.C
new file mode 100644
index 000000000..80ae98d48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify11.C
@@ -0,0 +1,37 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40684
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+};
+
+template <typename S, typename T, typename U,
+ typename S::v = &S::v::s> // { dg-error "is not a" }
+typename S::A
+foo (S c, T t, U u)
+{
+}
+
+struct B
+{
+ struct C
+ {
+ template <typename U>
+ C (U t)
+ {
+ A a;
+ A b = foo (this, a, t); // { dg-error "no matching function" }
+ }
+ } c;
+ B () : c (A ())
+ {
+ }
+};
+
+int
+main ()
+{
+ B f;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify2.C
new file mode 100644
index 000000000..e5e6d1904
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+template<int I> void f1 (char [][I+1]) {}
+template<int I> void f2 (char [][I+0]) {}
+template<int I> void f3 (char [][I]) {}
+template<int I> void f4 (char [][I-0]) {}
+template<int I> void f5 (char [][I-1]) {}
+
+template void f1 (char [][6]); // { dg-error "does not match" }
+template void f2 (char [][6]); // { dg-error "does not match" }
+template void f3 (char [][6]);
+template void f4 (char [][6]); // { dg-error "does not match" }
+template void f5 (char [][6]); // { dg-error "does not match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify3.C
new file mode 100644
index 000000000..190a0cb95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify3.C
@@ -0,0 +1,11 @@
+// Test unifying SCOPE_REF.
+// Origin: Marc Duflot <m.duflot@ulg.ac.be>
+// { dg-do compile }
+
+template <int n> class A {};
+template <int m> class R {};
+
+template <int n> struct Trait { enum {m = n}; };
+
+template <int n> R<Trait<n>::m> f(A<n>);
+template <> R<1> f(A<1>) {return R<1>();}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify4.C
new file mode 100644
index 000000000..19d9f3a9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify4.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9437. We'd unify 'T *' with 'U C::*', which is obviously broken
+
+struct X
+{
+ template <typename T>
+ operator T* () const { return static_cast<T*> (0); }
+} null;
+
+struct A { int i; };
+
+static void f (int A::* pmi) { }
+
+int main () { f (null); } // { dg-error "cannot convert" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify5.C
new file mode 100644
index 000000000..6928f1f84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify5.C
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com>
+// Origin:Matt Austern <austern@apple.com>
+
+// PR:c++/14007
+
+template <typename T> struct X {}; // #1
+template <typename T> struct X<const T>; //#2
+template struct X<int&>; //#3
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify6.C
new file mode 100644
index 000000000..551c96ebb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify6.C
@@ -0,0 +1,23 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com>
+
+void Baz ();
+
+template <typename T> void Foo1 (T *); // #1
+template <typename T> void Foo1 (T const *a) {a (1);} // #2
+
+template <typename T> T const *Foo2 (T *);
+
+template <typename T> void Foo3 (T *, T const * = 0); // { dg-message "note" }
+
+void Bar ()
+{
+ Foo1 (&Baz); // #1
+
+ Foo2 (&Baz);
+
+ Foo3 (&Baz);
+
+ Foo3 (&Baz, &Baz); // { dg-error "no matching function" "" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 21 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify7.C
new file mode 100644
index 000000000..88d9fd9ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify7.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com>
+
+// PR c++/3518
+template <typename T> void Foo (const T &);
+template <typename T> void Baz (const T (*)()); // { dg-message "note" }
+
+int &f ();
+
+int main()
+{
+ Foo (f);
+ Baz (f); // { dg-error "no matching function" "" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 13 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify8.C
new file mode 100644
index 000000000..9caf085f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify8.C
@@ -0,0 +1,20 @@
+// { dg-do link }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jul 2005 <nathan@codesourcery.com>
+
+// Origin:Wolfgang Bangerth <bangerth@dealii.org>
+// PR 21799: deduction of cvqualifiers on member functions was wrong
+
+template <class T> void f (T &, void (T::*)() );
+template <class T> void f (const T &, void (T::*)() const) {}
+
+struct X {
+ void g() const {}
+};
+
+const X *x;
+
+int main () {
+ f (*x, &X::g);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/unify9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/unify9.C
new file mode 100644
index 000000000..f06f83a8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/unify9.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jul 2005 <nathan@codesourcery.com>
+
+// Origin:Wolfgang Bangerth <bangerth@dealii.org>
+// PR 21799: deduction of cvqualifiers on member functions was wrong
+
+template <class T> void f (T &, void (T::*)() ); // { dg-message "note" }
+
+struct X {
+ void g() const {}
+};
+
+const X *x;
+
+int main () {
+ f (*x, &X::g); // { dg-error "no matching function" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 16 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/union1.C
new file mode 100644
index 000000000..9019c38a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/union1.C
@@ -0,0 +1,29 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+void g (char c)
+{
+ if (c != 'a')
+ abort ();
+}
+
+void h (int i)
+{
+ if (i != 3)
+ abort ();
+}
+
+template <typename T> void f(T const &t)
+{
+ union { char c; T t_; };
+
+ c = 'a';
+ g (c);
+ t_ = 3;
+ h (t_);
+}
+
+int main () {
+ f (3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/union2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/union2.C
new file mode 100644
index 000000000..25f1e086f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/union2.C
@@ -0,0 +1,12 @@
+/* PR c++/40557 */
+/* { dg-do compile } */
+
+struct A
+{
+ typedef int X;
+};
+
+template<int> union B
+{
+ A::X x;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using1.C
new file mode 100644
index 000000000..e4d4a004e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using1.C
@@ -0,0 +1,42 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR 9447. Using decls in template classes.
+
+template <class T>
+struct Foo {
+ int i;
+};
+
+struct Baz
+{
+ int j;
+};
+
+template <class T>
+struct Bar : public Foo<T>, Baz {
+ using Foo<T>::i;
+ using Baz::j;
+
+ int foo () { return i; }
+ int baz () { return j; }
+};
+
+int main()
+{
+ Bar<int> bar;
+
+ bar.i = 1;
+ bar.j = 2;
+
+ if (bar.foo() != 1)
+ return 1;
+
+ if (bar.baz() != 2)
+ return 1;
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using10.C
new file mode 100644
index 000000000..902773cd5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using10.C
@@ -0,0 +1,11 @@
+// PR c++/22136
+
+struct B {
+ void foo();
+};
+
+template <typename T> class I : public B {};
+
+template <typename T> class D : private I<T> {
+ I<T>::B::foo; // { dg-warning "deprecated" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using11.C
new file mode 100644
index 000000000..21cc5d2ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using11.C
@@ -0,0 +1,8 @@
+struct X {
+ void f();
+};
+
+template <typename T>
+struct S : public T {
+ using X::f;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using12.C
new file mode 100644
index 000000000..cebfab1ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using12.C
@@ -0,0 +1,7 @@
+struct A {
+};
+
+template <typename T>
+struct S : public A {
+ using A::operator(); // { dg-error "no member" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using13.C
new file mode 100644
index 000000000..3f86ede37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using13.C
@@ -0,0 +1,11 @@
+//PR c++/28051
+
+template<int> struct A {};
+
+template<int N> struct B : A<N>
+{
+ using A<N>::operator typename A<N>::X; // { dg-error "no type named" }
+};
+
+B<0> b;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using14.C
new file mode 100644
index 000000000..276c40b87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using14.C
@@ -0,0 +1,21 @@
+// PR c++/26102
+
+template <class T> struct B1 { int i(); };
+
+struct B2 { int i(); };
+
+template <class T> struct C : public B1<T>, public B2
+{
+ using B2::i;
+ void f()
+ {
+ i(); // should be accepted
+ i.i(); // { dg-error "member" }
+ }
+};
+
+int main()
+{
+ C<int> c;
+ c.f(); // { dg-message "required" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using15.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using15.C
new file mode 100644
index 000000000..b158ac09c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using15.C
@@ -0,0 +1,25 @@
+// Reduced from the testcase for c++/29433
+
+template <class T>
+struct A: T
+{
+ void f(typename T::type);
+ using T::f;
+ void g() { f(1); }
+};
+
+template <class T>
+struct B: T
+{ typedef int type; };
+
+struct C
+{
+ typedef double type;
+ void f();
+};
+
+int main()
+{
+ A<B<A<C> > > a;
+ a.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using16.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using16.C
new file mode 100644
index 000000000..589f7f18f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using16.C
@@ -0,0 +1,42 @@
+// { dg-do compile }
+
+template <class T>
+struct A
+{
+ typedef T type;
+};
+
+template <class T>
+struct B
+{
+ class type
+ {
+ type(); // { dg-error "private" }
+ };
+};
+
+template <class T>
+struct C : A<T>, B<T>
+{
+ using typename B<T>::type;
+
+ void f()
+ {
+ type j; // { dg-error "context" }
+ }
+};
+
+template class C<int>; // { dg-message "required" }
+
+template <class T>
+struct D
+{
+ typedef T type;
+};
+
+template <class T>
+class E : D<T>
+{
+ using typename D<T>::type; // { dg-message "previous" }
+ using typename D<T>::type; // { dg-error "redeclaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using17.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using17.C
new file mode 100644
index 000000000..1af1dc71e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using17.C
@@ -0,0 +1,44 @@
+// PR c++/14258
+// { dg-do run }
+
+template<typename T>
+struct A
+{
+ typedef T type;
+ typedef A type2;
+};
+
+template<typename T>
+struct B : A<T>
+{
+ using typename A<T>::type;
+ type t;
+
+ using typename A<T>::type2;
+
+ type f()
+ {
+ type i = 1;
+ return i;
+ }
+};
+
+int main()
+{
+ B<int>::type t = 4;
+ if (t != 4)
+ __builtin_abort();
+
+ B<double> b;
+ b.t = 3;
+ if (b.t != 3)
+ __builtin_abort();
+
+ B<long> b2;
+ if (b2.f() != 1)
+ __builtin_abort();
+
+ B<double>::type2::type tt = 12;
+ if (tt != 12)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using18.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using18.C
new file mode 100644
index 000000000..b4ef6df47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using18.C
@@ -0,0 +1,31 @@
+// PR c++/23211
+// { dg-do compile }
+
+template<class T>
+struct foo
+{
+ typedef int jtype;
+ struct bar
+ {
+ using typename foo<T>::jtype; // { dg-error "not a base type" }
+ using foo<T>::jtype; // { dg-error "not a base type" }
+ };
+};
+
+template <class T>
+struct A : T
+{
+ using T::i;
+ using typename T::type;
+};
+
+struct B1 {};
+template <class T> struct B2 {};
+
+template <class T>
+struct C : B1, B2<T>
+{
+ using B1::x; // { dg-error "no member" }
+ using B2<T>::y;
+ using typename B2<T>::type;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using19.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using19.C
new file mode 100644
index 000000000..dc89f92ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using19.C
@@ -0,0 +1,12 @@
+// PR c++/23211
+// { dg-do compile }
+
+struct A { int x; };
+
+template <class T>
+struct B: A
+{
+ using T::x;
+};
+
+B<A> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using2.C
new file mode 100644
index 000000000..5987254d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using2.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR 9447. Using decls in template classes.
+
+template <class T>
+struct Foo {
+ int i;
+};
+
+struct Baz
+{
+ int i;
+};
+
+template <class T>
+struct Bar : public Foo<T>, Baz
+{
+ using Foo<T>::i; // { dg-message "previous declaration" }
+ using Baz::i; // { dg-error "redeclaration" }
+
+ int foo () { return i; }
+};
+
+void foo (Bar<int> &bar)
+{
+ bar.foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using20.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using20.C
new file mode 100644
index 000000000..1df9549cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using20.C
@@ -0,0 +1,18 @@
+// PR c++/51925
+
+struct E
+{
+ int e ();
+};
+template <typename T1>
+struct G : public E
+{
+ using E::e;
+ template <int> void e ();
+ void f () { e <0> (); }
+};
+int f(void)
+{
+ G<int> a;
+ a.f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using21.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using21.C
new file mode 100644
index 000000000..65313aaf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using21.C
@@ -0,0 +1,37 @@
+// PR c++/52126
+// { dg-do compile }
+
+template<typename T>
+struct A
+{
+ int foo;
+
+ struct B;
+ struct C;
+ struct D;
+ struct E;
+};
+
+template <class T>
+struct A<T>::B : A<T>
+{
+ using A::foo;
+};
+
+template <class T>
+struct A<T>::C : A
+{
+ using A::foo;
+};
+
+template <class T>
+struct A<T>::D : A<T>
+{
+ using A<T>::foo;
+};
+
+template <class T>
+struct A<T>::E : A
+{
+ using A<T>::foo;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using22.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using22.C
new file mode 100644
index 000000000..9ea3d8a1e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using22.C
@@ -0,0 +1,44 @@
+// PR c++/52126
+// { dg-do compile }
+
+template <class T> struct Z {};
+
+template<typename T>
+struct A
+{
+ struct B;
+ struct C;
+ struct D;
+ struct E;
+ struct F;
+};
+
+template <class T>
+struct A<T>::B : A<T>
+{
+ using A::nonexist; // { dg-error "no members matching" }
+};
+
+template <class T>
+struct A<T>::C : A
+{
+ using A::nonexist; // { dg-error "no members matching" }
+};
+
+template <class T>
+struct A<T>::D : A<T>
+{
+ using A<T>::nonexist; // { dg-error "no members matching" }
+};
+
+template <class T>
+struct A<T>::E : A
+{
+ using A<T>::nonexist; // { dg-error "no members matching" }
+};
+
+template <class T>
+struct A<T>::F : Z<T>
+{
+ using Z<T>::nonexist;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using23.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using23.C
new file mode 100644
index 000000000..abb90de4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using23.C
@@ -0,0 +1,15 @@
+// PR c++/57831
+
+struct A {
+ void f();
+};
+template <class T> struct B : T {
+ typedef T base;
+ using base::f; // If I write "using B<T>::f" it's ok
+ void g( ) {
+ B<T>::f(); // This is OK as expected
+ (this->*&T::f)(); // This is also OK
+ (this->*&B<T>::f)(); // This causes error
+ }
+};
+template struct B< A >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using24.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using24.C
new file mode 100644
index 000000000..c3cdf93ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using24.C
@@ -0,0 +1,30 @@
+// PR c++/21682
+
+template <class T>
+struct t
+{
+ typedef typename T::type type;
+};
+template<> class t<int>{};
+
+template <class T> struct t1{ };
+template<> struct t1<int>
+{
+ typedef int type;
+};
+
+namespace name1
+{
+ template <class S> typename t<S>::type begin(S const& s);
+ namespace name2
+ {
+ template <class S> typename t1<S>::type begin(S const& s);
+ }
+ using name2::begin;
+}
+
+/* Test calling the function. */
+int f(int a) { return name1::begin(a); }
+
+struct aa { typedef double type; };
+double g(aa t) { return name1::begin(t); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using25.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using25.C
new file mode 100644
index 000000000..6f4a7def7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using25.C
@@ -0,0 +1,17 @@
+// PR c++/21682
+
+namespace one {
+ template<typename T> void fun(T);
+}
+
+using one::fun;
+
+template<typename T> void fun(T); // { dg-error "conflicts" }
+
+template<typename T> void funr(T);
+
+namespace oner {
+ template<typename T> void funr(T);
+}
+
+using oner::funr; // { dg-error "conflicts" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using26.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using26.C
new file mode 100644
index 000000000..ca21857aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using26.C
@@ -0,0 +1,49 @@
+// PR c++/21682
+
+namespace one {
+ template<typename T> int bar1(T);
+}
+
+using one::bar1;
+
+template<typename T> void bar1(T);
+
+template<typename T> void bar1r(T);
+
+namespace oner {
+ template<typename T> int bar1r(T);
+}
+
+using oner::bar1r;
+
+namespace two {
+ template<typename T, typename U> void bar2(T);
+}
+
+using two::bar2;
+
+template<typename T> void bar2(T);
+
+template<typename T> void bar2r(T);
+
+namespace twor {
+ template<typename T, typename U> void bar2r(T);
+}
+
+using twor::bar2r;
+
+namespace three {
+ template<int i> void bar3();
+}
+
+using three::bar3;
+
+template<typename T> void bar3();
+
+template<typename T> void bar3r();
+
+namespace threer {
+ template<int i> void bar3r();
+}
+
+using threer::bar3r;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using27.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using27.C
new file mode 100644
index 000000000..f1835e171
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using27.C
@@ -0,0 +1,33 @@
+// PR c++/37140
+
+struct X
+{
+ typedef int nested_type;
+};
+
+template <class T>
+struct A
+{
+ typedef X type;
+};
+
+template <class T>
+struct B : A<T>
+{
+ using typename A<T>::type;
+ typename type::nested_type x;
+};
+
+template <class T>
+struct C : B<T>
+{
+ using typename B<T>::type;
+ typename type::nested_type y;
+};
+
+struct D : C<int>
+{
+ using C<int>::type;
+ type::nested_type z;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using28.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using28.C
new file mode 100644
index 000000000..52f68cfe4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using28.C
@@ -0,0 +1,17 @@
+// PR c++/37140
+
+struct C
+{
+ static const int block_size = 1;
+};
+
+template <typename T> struct A {
+ typedef C type;
+};
+
+template <typename T> struct B : public A<T> {
+ using typename A<T>::type;
+ static const int block_size = type::block_size;
+};
+
+template class B<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using29.C
new file mode 100644
index 000000000..8726547ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using29.C
@@ -0,0 +1,21 @@
+// PR c++/58047
+
+template <int N>
+struct print_arg { };
+
+struct const_holder {
+ static const int CONSTANT = 42;
+};
+
+template <typename T>
+struct identity {
+ typedef T type;
+};
+
+template <class T>
+struct test_case : public identity<T> {
+ using typename identity<T>::type;
+ print_arg<type::CONSTANT> printer;
+};
+
+template struct test_case<const_holder>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using3.C
new file mode 100644
index 000000000..11f2899c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using3.C
@@ -0,0 +1,42 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR 9447. Using decls in template classes.
+
+template <class T>
+struct Foo {
+ int i (int) {return 1;}
+};
+
+struct Baz
+{
+ int k (int) {return 2;}
+};
+
+template <class T>
+struct Bar : public Foo<T> , Baz {
+ using Foo<T>::i;
+ using Baz::k;
+
+ int i (float) {return 3;}
+ int k (float) {return 3;}
+
+ int foo()
+ {
+ if (i (1) != 1)
+ return 1;
+ if (k (1) != 2)
+ return 2;
+
+ return 0;
+ }
+};
+
+int main()
+{
+ Bar<int> bar;
+
+ return bar.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using4.C
new file mode 100644
index 000000000..8c46da464
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using4.C
@@ -0,0 +1,39 @@
+// { dg-do run }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR 9447. Using decls in template classes.
+
+template <class T>
+struct Foo {
+ int k (float) {return 1;}
+};
+
+struct Baz
+{
+ int k (int) {return 2;}
+};
+
+template <class T>
+struct Bar : public Foo<T> , Baz {
+ using Foo<T>::k;
+ using Baz::k;
+
+ int foo()
+ {
+ if (k (1.0f) != 1)
+ return 1;
+ if (k (1) != 2)
+ return 2;
+
+ return 0;
+ }
+};
+
+int main()
+{
+ Bar<int> bar;
+
+ return bar.foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using5.C
new file mode 100644
index 000000000..096ddc0b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using5.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com>
+
+// PR 9447. further test cases for dependent using decl
+
+template <typename T> struct Base;
+
+template <typename T> struct Derived : public Base<T> {
+ using Base<T>::i;
+
+ Derived() { i; }
+
+ int get_i() { return i.f(); }
+
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using6.C
new file mode 100644
index 000000000..ee8d5be96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using6.C
@@ -0,0 +1,14 @@
+namespace foo {
+ template<typename T>
+ struct A {};
+}
+
+namespace bar {
+ template<typename T>
+ struct A {};
+}
+
+namespace foo {
+ using bar::A; // { dg-error "" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using7.C
new file mode 100644
index 000000000..390dfbaac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using7.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Aug 2003 <nathan@codesourcery.com>
+
+// PR 9447. Using decls in reopened template classes.
+
+template <typename> struct A { int i; };
+
+template <typename T> struct B : public A<T>
+{
+ using A<T>::i;
+ int foo() const;
+};
+
+struct C {};
+
+template <typename T> int B<T>::foo() const
+{
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using8.C
new file mode 100644
index 000000000..a79158710
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using8.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Sergey Shandar <comer@pisem.net>
+
+// PR c++/9810: Access checking for member function template
+// appeared in using declaration.
+
+struct A
+{
+ template<class R> void F(R) {}
+};
+
+struct B: private A
+{
+ using A::F;
+};
+
+int main()
+{
+ B b;
+ b.F(3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/using9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/using9.C
new file mode 100644
index 000000000..ac5194509
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/using9.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: stefaandr@hotmail.com
+
+// PR c++/17154: Using declaration in partial class template specialization.
+
+template <int numrows, class T> struct A { void test_A() {} };
+template <int numrows, class T> struct B {};
+template <class T> struct B <3, T> : public A <3, T> {
+ using A <3, T>::test_A;
+ void test_B_spec() { test_A(); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/value-dep1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/value-dep1.C
new file mode 100644
index 000000000..7c9b927bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/value-dep1.C
@@ -0,0 +1,6 @@
+// PR c++/48265
+
+template < int > struct S
+{
+ S () { const int i = i; i; };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/varmod1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/varmod1.C
new file mode 100644
index 000000000..4ba11049b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/varmod1.C
@@ -0,0 +1,11 @@
+// { dg-options "-w" }
+
+template<typename T> void foo(T); // { dg-message "note" }
+
+void bar()
+{
+ int i;
+ int A[i][i];
+ foo(A); // { dg-error "" }
+ // { dg-message "(candidate|not a valid template argument)" "candidate note" { target *-*-* } 9 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual1.C
new file mode 100644
index 000000000..ee86bf399
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual1.C
@@ -0,0 +1,14 @@
+// PR c++/51029
+
+struct A
+{
+ void foo();
+};
+
+struct B : virtual A
+{
+ template<int> B()
+ {
+ foo();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual2.C
new file mode 100644
index 000000000..83b7ed6be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual2.C
@@ -0,0 +1,11 @@
+// PR c++/51137
+
+struct A {};
+
+template<int> struct B : virtual A
+{
+ void foo()
+ {
+ (new A(*this))->A::~A();
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/virtual3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual3.C
new file mode 100644
index 000000000..9fcfc455b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual3.C
@@ -0,0 +1,11 @@
+// PR c++/51620
+
+template<int> class A
+{
+ virtual ~A(); // { dg-error "non-deleted|private" }
+};
+
+struct B : A<0>, A<1> // { dg-error "deleted|context" }
+{
+ B() {} // { dg-error "context" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/virtual4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual4.C
new file mode 100644
index 000000000..a2c7420b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/virtual4.C
@@ -0,0 +1,30 @@
+// PR c++/56243
+
+struct A
+{
+ virtual int String ();
+};
+
+struct F: A { };
+
+struct G
+{
+ F value;
+};
+
+struct D
+{
+ template <int>
+ void Verify()
+ {
+ G x;
+ F& name = x.value;
+ name.String();
+ }
+};
+
+int main()
+{
+ D d;
+ d.Verify<42>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/vla1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/vla1.C
new file mode 100644
index 000000000..fe93440f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/vla1.C
@@ -0,0 +1,9 @@
+// PR c++/29226
+// { dg-options "" }
+
+template <bool>
+static int label (int w)
+{
+ sizeof(int[w]);
+}
+int a = label<false>(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/vla2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/vla2.C
new file mode 100644
index 000000000..183f8fadc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/vla2.C
@@ -0,0 +1,20 @@
+// PR c++/28879
+// { dg-do compile }
+// { dg-options "" }
+
+struct A
+{
+ static int i;
+ int j;
+};
+
+template<int> void foo ()
+{
+ int x[A::i];
+//int y[A().j];
+}
+
+void bar ()
+{
+ foo<6> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void1.C
new file mode 100644
index 000000000..732e9d06e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void1.C
@@ -0,0 +1,4 @@
+// PR c++/27430
+// { dg-do compile }
+
+template<void[]> struct A; // { dg-error "array of void" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void10.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void10.C
new file mode 100644
index 000000000..4904a281a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void10.C
@@ -0,0 +1,10 @@
+//PR c++/28736
+
+template<void> struct A // { dg-error "not a valid type" }
+{
+ template<typename> friend struct B;
+};
+
+template<typename> struct B {};
+
+B<int> b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void11.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void11.C
new file mode 100644
index 000000000..1aad7a157
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void11.C
@@ -0,0 +1,12 @@
+// PR c++/31446
+
+template<void> struct A // { dg-error "valid type" }
+
+{
+ template<int> friend void foo();
+};
+
+void bar()
+{
+ foo<0>(); // { dg-error "not declared|primary-expression" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void12.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void12.C
new file mode 100644
index 000000000..1d064b63e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void12.C
@@ -0,0 +1,7 @@
+// PR c++/28639
+
+template<void> struct A // { dg-error "not a valid type" }
+{
+ static const int i = 1;
+ char a[i];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void13.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void13.C
new file mode 100644
index 000000000..3f36735db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void13.C
@@ -0,0 +1,11 @@
+// PR c++/30299
+
+struct A
+{
+ int i;
+};
+
+template<void> struct B : A // { dg-error "not a valid type" }
+{
+ B() { this->i; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void14.C
new file mode 100644
index 000000000..7781c6187
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void14.C
@@ -0,0 +1,7 @@
+// PR c++/36411
+// { dg-do compile }
+
+template<template<void> class> struct A // { dg-error "not a valid type" }
+{
+ template<template<int> class T> A<T> foo(); // { dg-error "mismatch|expected|invalid" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void2.C
new file mode 100644
index 000000000..eceb36219
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void2.C
@@ -0,0 +1,9 @@
+// PR c++/27496
+// { dg-do compile }
+
+template<int> struct A
+{
+ template<void> friend class X; // { dg-error "void|valid type" }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void3.C
new file mode 100644
index 000000000..bb59934ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void3.C
@@ -0,0 +1,5 @@
+//PR c++/28637
+
+template<void> struct A {}; // { dg-error "not a valid type" }
+A<0> a; // { dg-error "type" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void4.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void4.C
new file mode 100644
index 000000000..fe30b2e37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void4.C
@@ -0,0 +1,7 @@
+//PR c++/28638
+
+template<void> struct A; // { dg-error "not a valid type" }
+
+template<template<int> class> struct B {};
+
+B<A> b; // { dg-error "template|invalid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void5.C
new file mode 100644
index 000000000..bef9b91f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void5.C
@@ -0,0 +1,5 @@
+//PR c++/28640
+
+template<void> struct A; // { dg-error "not a valid type" }
+template<int> struct A;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void6.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void6.C
new file mode 100644
index 000000000..2d5f7ead1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void6.C
@@ -0,0 +1,3 @@
+//PR c++/28594
+
+template<void, int> struct A; // { dg-error "not a valid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void7.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void7.C
new file mode 100644
index 000000000..95d87a207
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void7.C
@@ -0,0 +1,8 @@
+//PR c++/28741
+
+template<void> struct A // { dg-error "not a valid type" }
+{
+ static int i;
+};
+
+A<0> a; // { dg-error "invalid type|not a valid type" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void8.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void8.C
new file mode 100644
index 000000000..e45c91c04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void8.C
@@ -0,0 +1,7 @@
+//PR c++/28737
+
+template<void> struct A; // { dg-error "not a valid type" }
+
+template<typename> struct B;
+
+template<void N> struct B<A<N> > {}; // { dg-error "not a valid type|declared|invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/void9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/void9.C
new file mode 100644
index 000000000..319a684fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/void9.C
@@ -0,0 +1,4 @@
+//PR c++/28738
+
+template<int,void> struct A {}; // { dg-error "not a valid type" }
+template<int N> struct A<N,0> {}; // { dg-message "invalid" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/vtable1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/vtable1.C
new file mode 100644
index 000000000..c5f122adb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/vtable1.C
@@ -0,0 +1,23 @@
+// Test that vtables are set up properly for constructors and destructors
+// of template classes.
+
+// { dg-do run }
+
+int r;
+
+template <class T>
+struct A {
+ virtual void f () { }
+ A() { f (); }
+ ~A() { f (); }
+};
+
+struct B : public A<int> {
+ virtual void f () { ++r; }
+};
+
+int main ()
+{
+ { B b; }
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/vtable2.C b/gcc-4.9/gcc/testsuite/g++.dg/template/vtable2.C
new file mode 100644
index 000000000..3bcc1ac3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/vtable2.C
@@ -0,0 +1,18 @@
+// Use a small template instantiation depth to speed up testing
+// { dg-options "-ftemplate-depth-5" }
+// { dg-do compile }
+
+// Origin: rullo.pat@tiscalinet.it
+// Nathanael Nerode <neroden@gcc.gnu.org>
+// Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/6749: Infinite loop generating vtable.
+
+template <class T> struct inner {};
+
+template <class T> struct parent {
+ virtual void f() // { dg-error "instantiation depth" }
+ { parent<inner<T> > p; };
+};
+
+template struct parent<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/warn1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/warn1.C
new file mode 100644
index 000000000..5067d76e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/warn1.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Aug 2003 <nathan@codesourcery.com>
+
+// PR 11512. erroneous warnings
+
+template <class T> void Foo(T i)
+{
+ i++, i++;
+ i, i++; // { dg-warning "left operand" "" }
+ i++, i; // { dg-warning "right operand" "" }
+ for (;; --i, ++i)
+ ;
+}
+
+void Bar ()
+{
+ Foo (1); // { dg-message "required" }
+}
+
+struct M {};
+
+struct C
+{
+ M m;
+ C () :m (M ()) {}
+};
+
+
+void Baz (int i)
+{
+ i ? i + 1 : i + 2; // { dg-warning "operand of" }
+ i ? i++ : 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/wrap1.C b/gcc-4.9/gcc/testsuite/g++.dg/template/wrap1.C
new file mode 100644
index 000000000..72f687efd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/template/wrap1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Michael Matz 03 Mar 2002 <matz@suse.de>
+// instance of an actual pattern in 252.eon from SPEC2000
+
+// The last Wrapper<char> once wasn't completed when applying '='.
+
+template <class T>
+class Wrapper {
+ public:
+ Wrapper (T& a);
+ Wrapper (const Wrapper<char>& ref);
+};
+
+template <class T>
+class Element {
+public:
+ T * operator[](int x);
+};
+
+void test()
+{
+ char bla = 42;
+ Element< Wrapper <unsigned char> > elem;
+ elem[1][1] = Wrapper<char> (bla);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-1.C
new file mode 100644
index 000000000..af538719d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-1.C
@@ -0,0 +1,31 @@
+// Valid __thread specifiers.
+// { dg-require-effective-target tls }
+
+__thread int g1;
+extern __thread int g2;
+static __thread int g3;
+
+void foo()
+{
+ extern __thread int l1;
+ static __thread int l2;
+}
+
+struct A {
+ static __thread int i;
+};
+
+__thread int A::i = 42;
+
+template <typename T> struct B {
+ static __thread T t;
+};
+
+template <typename T>
+__thread T B<T>::t = 42;
+
+void bar ()
+{
+ int j = B<int>::t;
+ int k = B<const int>::t;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-2.C
new file mode 100644
index 000000000..b5d02e7fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-2.C
@@ -0,0 +1,26 @@
+/* Invalid __thread specifiers. */
+/* { dg-require-effective-target tls } */
+
+__thread extern int g1; /* { dg-error "'__thread' before 'extern'" } */
+__thread static int g2; /* { dg-error "'__thread' before 'static'" } */
+__thread __thread int g3; /* { dg-error "duplicate '__thread'" } */
+typedef __thread int g4; /* { dg-error "multiple storage classes" } */
+
+void foo()
+{
+ __thread int l1; /* { dg-error "implicitly auto and declared '__thread'" } */
+ auto __thread int l2; /* { dg-error "multiple storage classes|data types" } */
+ __thread extern int l3; /* { dg-error "'__thread' before 'extern'" } */
+ register __thread int l4; /* { dg-error "multiple storage classes" } */
+}
+
+__thread void f1 (); /* { dg-error "invalid for function" } */
+extern __thread void f2 (); /* { dg-error "invalid for function" } */
+static __thread void f3 (); /* { dg-error "invalid for function" } */
+__thread void f4 () { } /* { dg-error "invalid for function" } */
+
+void bar(__thread int p1); /* { dg-error "(invalid in parameter)|(specified for parameter)" } */
+
+struct A {
+ __thread int i; /* { dg-error "storage class specified" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-3.C
new file mode 100644
index 000000000..06046170b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-3.C
@@ -0,0 +1,11 @@
+// Report invalid extern and __thread combinations.
+// { dg-require-effective-target tls }
+
+extern int j; // { dg-message "previously declared here" }
+__thread int j; // { dg-error "follows non-thread-local" }
+
+extern __thread int i; // { dg-message "previously declared here" }
+int i; // { dg-error "follows thread-local" }
+
+extern __thread int k; // This is fine.
+__thread int k;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-4.C
new file mode 100644
index 000000000..7d07d9deb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-4.C
@@ -0,0 +1,10 @@
+/* Invalid __thread specifiers. */
+/* { dg-require-effective-target tls } */
+
+__thread typedef int g4; /* { dg-error "multiple storage classes" } */
+
+void foo()
+{
+ __thread auto int l2; /* { dg-error "multiple storage classes|data types" } */
+ __thread register int l4; /* { dg-error "multiple storage classes" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-5.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-5.C
new file mode 100644
index 000000000..ca92b3074
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/diag-5.C
@@ -0,0 +1,5 @@
+// PR c++/30536
+// Invalid __thread specifiers.
+// { dg-require-effective-target tls }
+
+struct A { __thread register int i; }; // { dg-error "multiple storage classes|storage class specified" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/init-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/init-1.C
new file mode 100644
index 000000000..97867123a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/init-1.C
@@ -0,0 +1,14 @@
+/* Valid initializations. */
+/* { dg-require-effective-target tls } */
+
+__thread int i = 42;
+
+static int j;
+__thread int *p = &j;
+
+/* Note that this is valid in C++ (unlike C) as a run-time initialization. */
+int *q = &i;
+
+/* Valid because "const int k" is an integral constant expression in C++. */
+__thread const int k = 42;
+__thread const int l = k;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/init-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/init-2.C
new file mode 100644
index 000000000..327c309e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/init-2.C
@@ -0,0 +1,14 @@
+/* Invalid initializations. */
+/* { dg-require-effective-target tls } */
+
+extern __thread int i;
+__thread int *p = &i; /* { dg-error "dynamic initialization" } */
+
+extern int f();
+__thread int j = f(); /* { dg-error "dynamic initialization" } */
+
+struct S
+{
+ S();
+};
+__thread S s; /* { dg-error "dynamic initialization" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1.C
new file mode 100644
index 000000000..506b0fcf7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1.C
@@ -0,0 +1,30 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-require-effective-target tls_runtime }
+// { dg-add-options tls }
+// { dg-additional-sources "static-1a.cc" }
+
+extern "C" void abort ();
+extern int test ();
+
+struct A
+{
+ static __thread int i;
+};
+
+__thread int A::i = 8;
+
+int
+main ()
+{
+ if (A::i != 8)
+ abort ();
+
+ if (test ())
+ abort ();
+
+ if (A::i != 17)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1a.cc b/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1a.cc
new file mode 100644
index 000000000..1c6109f86
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/static-1a.cc
@@ -0,0 +1,20 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-require-effective-target tls_runtime }
+// { dg-add-options tls }
+// { dg-additional-sources "static-1a.cc" }
+
+struct A
+{
+ static __thread int i;
+};
+
+int
+test ()
+{
+ if (A::i != 8)
+ return 1;
+
+ A::i = 17;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/static2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/static2.C
new file mode 100644
index 000000000..ab688dd8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/static2.C
@@ -0,0 +1,18 @@
+// { dg-final { scan-assembler-not "_ZTHN1A1iE" } }
+// { dg-final { scan-assembler-not "_ZTWN1A1iE" } }
+// { dg-require-effective-target tls }
+
+struct A
+{
+ static __thread int i;
+};
+
+int
+test ()
+{
+ if (A::i != 8)
+ return 1;
+
+ A::i = 17;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-cse.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-cse.C
new file mode 100644
index 000000000..5a47e988f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-cse.C
@@ -0,0 +1,20 @@
+// Test for CSE of the wrapper function: we should only call it once
+// for the two references to ir.
+// { dg-do run { target c++11 } }
+// { dg-options "-O -fno-inline -save-temps" }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+// { dg-final { scan-assembler-times "call *_ZTW2ir" 1 { xfail *-*-* } } }
+// { dg-final cleanup-saved-temps }
+
+// XFAILed until the back end supports a way to mark a function as cseable
+// though not pure.
+
+int f() { return 42; }
+
+thread_local int ir = f();
+
+int main()
+{
+ return ir + ir - 84;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice.C
new file mode 100644
index 000000000..274e800c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice.C
@@ -0,0 +1,6 @@
+// PR c++/55801
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+class C;
+thread_local C O, O2 = O; // { dg-error "incomplete" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice2.C
new file mode 100644
index 000000000..5d3ba697a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-ice2.C
@@ -0,0 +1,11 @@
+// PR c++/58672
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+struct A
+{
+ A(int);
+ i; // { dg-error "" }
+};
+
+thread_local A a(0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order1.C
new file mode 100644
index 000000000..a43cf884b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order1.C
@@ -0,0 +1,25 @@
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-cxa-atexit "" }
+
+extern "C" void abort();
+extern "C" int printf (const char *, ...);
+#define printf(...)
+
+int c;
+struct A {
+ int i;
+ A(int i): i(i) { printf ("A(%d)\n", i); if (i != c++) abort (); }
+ ~A() { printf("~A(%d)\n", i); if (i != --c) abort(); }
+};
+
+A a0(0);
+thread_local A a1(1);
+thread_local A a2(2);
+A* ap = &a1;
+
+int main()
+{
+ if (c != 3) abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order2.C
new file mode 100644
index 000000000..f8df91737
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-order2.C
@@ -0,0 +1,28 @@
+// The standard says that a1 should be destroyed before a0 even though
+// that isn't reverse order of construction. We need to move
+// __cxa_thread_atexit into glibc to get this right.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-effective-target c++11 }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+
+extern "C" void abort();
+extern "C" int printf (const char *, ...);
+#define printf(...)
+
+int c;
+struct A {
+ int i;
+ A(int i): i(i) { printf ("A(%d)\n", i); ++c; }
+ ~A() { printf("~A(%d)\n", i); if (i != --c) abort(); }
+};
+
+thread_local A a1(1);
+A* ap = &a1;
+A a0(0);
+
+int main()
+{
+ if (c != 2) abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap1.C
new file mode 100644
index 000000000..813a6727b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap1.C
@@ -0,0 +1,13 @@
+// If we can see the definition at the use site, we don't need to bother
+// with a wrapper.
+
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler-not "_ZTW1i" } }
+
+thread_local int i = 42;
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap2.C
new file mode 100644
index 000000000..f07d7ae07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap2.C
@@ -0,0 +1,16 @@
+// If we can't see the definition at the use site, but it's in this translation
+// unit, we build a wrapper but don't bother with an init function.
+
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler "_ZTW1i" } }
+// { dg-final { scan-assembler-not "_ZTH1i" } }
+
+extern thread_local int i;
+
+int main()
+{
+ return i - 42;
+}
+
+thread_local int i = 42;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap3.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap3.C
new file mode 100644
index 000000000..ee8f14791
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap3.C
@@ -0,0 +1,15 @@
+// If we can't see the definition at all, we need to assume there might be
+// an init function.
+
+// { dg-do compile { target c++11 } }
+// { dg-require-alias "" }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler "_ZTW1i" } }
+// { dg-final { scan-assembler "_ZTH1i" } }
+
+extern thread_local int i;
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C
new file mode 100644
index 000000000..292c86806
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C
@@ -0,0 +1,15 @@
+// We don't need to call the wrapper through the PLT; we can use a separate
+// copy per shared object.
+
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+// { dg-require-effective-target fpic }
+// { dg-options "-fPIC" }
+// { dg-final { scan-assembler-not "_ZTW1i@PLT" { target i?86-*-* x86_64-*-* } } }
+
+extern thread_local int i;
+
+int main()
+{
+ return i - 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local1.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local1.C
new file mode 100644
index 000000000..67bde5549
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local1.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+// The variable should have a guard.
+// { dg-final { scan-assembler "_ZGVZ1fvE1a" } }
+// But since it's thread local we don't need to guard against
+// simultaneous execution.
+// { dg-final { scan-assembler-not "cxa_guard" } }
+// The guard should be TLS, not local common.
+// { dg-final { scan-assembler-not "\.comm" } }
+
+struct A
+{
+ A();
+};
+
+A &f()
+{
+ thread_local A a;
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2.C
new file mode 100644
index 000000000..6b67466fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2.C
@@ -0,0 +1,27 @@
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+
+extern "C" void abort();
+
+struct A
+{
+ A();
+ int i;
+};
+
+A &f()
+{
+ thread_local A a;
+ return a;
+}
+
+int j;
+A::A(): i(j) { }
+
+int main()
+{
+ j = 42;
+ if (f().i != 42)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2g.C
new file mode 100644
index 000000000..8304a4d2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local2g.C
@@ -0,0 +1,28 @@
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+
+extern "C" void abort();
+
+struct A
+{
+ A();
+ int i;
+};
+
+thread_local A a;
+
+A &f()
+{
+ return a;
+}
+
+int j;
+A::A(): i(j) { }
+
+int main()
+{
+ j = 42;
+ if (f().i != 42)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3.C
new file mode 100644
index 000000000..e05a0b953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3.C
@@ -0,0 +1,38 @@
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() { ++d; }
+};
+
+void f()
+{
+ thread_local A a;
+}
+
+void *thread_main(void *)
+{
+ f(); f(); f();
+}
+
+#include <pthread.h>
+
+int main()
+{
+ pthread_t thread;
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+
+ if (c != 2 || d != 2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3g.C
new file mode 100644
index 000000000..a3c9ebcc2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local3g.C
@@ -0,0 +1,36 @@
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-require-cxa-atexit "" }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() { ++d; }
+};
+
+thread_local A a;
+
+void *thread_main(void *)
+{
+ A* ap = &a;
+}
+
+#include <pthread.h>
+
+int main()
+{
+ pthread_t thread;
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+
+ if (c != 2 || d != 2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4.C
new file mode 100644
index 000000000..24f2de6ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4.C
@@ -0,0 +1,49 @@
+// Test for cleanups with pthread_cancel.
+
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-require-effective-target non_bionic }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+#include <pthread.h>
+#include <unistd.h>
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() { ++d; }
+};
+
+void f()
+{
+ thread_local A a;
+}
+
+void *thread_main(void *)
+{
+ f(); f(); f();
+ while (true)
+ {
+ pthread_testcancel();
+ sleep (1);
+ }
+}
+
+int main()
+{
+ pthread_t thread;
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_cancel(thread);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_cancel(thread);
+ pthread_join(thread, 0);
+
+ if (c != 2 || d != 2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4g.C
new file mode 100644
index 000000000..f6a5d4c5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local4g.C
@@ -0,0 +1,47 @@
+// Test for cleanups with pthread_cancel.
+
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-require-effective-target non_bionic }
+// { dg-require-cxa-atexit "" }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+#include <pthread.h>
+#include <unistd.h>
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() { ++d; }
+};
+
+thread_local A a;
+
+void *thread_main(void *)
+{
+ A *ap = &a;
+ while (true)
+ {
+ pthread_testcancel();
+ sleep (1);
+ }
+}
+
+int main()
+{
+ pthread_t thread;
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_cancel(thread);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_cancel(thread);
+ pthread_join(thread, 0);
+
+ if (c != 2 || d != 2)
+ __builtin_abort();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5.C
new file mode 100644
index 000000000..8d17584ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5.C
@@ -0,0 +1,48 @@
+// Test for cleanups in the main thread, too.
+
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+#include <pthread.h>
+#include <unistd.h>
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() {
+ if (++d == 3)
+ _exit (0);
+ }
+};
+
+void f()
+{
+ thread_local A a;
+}
+
+void *thread_main(void *)
+{
+ f(); f(); f();
+}
+
+int main()
+{
+ pthread_t thread;
+ thread_main(0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+
+ // The dtor for a in the main thread is run after main exits, so we
+ // return 1 now and override the return value with _exit above.
+ if (c != 3 || d != 2)
+ __builtin_abort();
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5g.C
new file mode 100644
index 000000000..f87b0382d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local5g.C
@@ -0,0 +1,46 @@
+// Test for cleanups in the main thread, too.
+
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-effective-target pthread }
+// { dg-require-cxa-atexit "" }
+// { dg-options -pthread }
+// { dg-add-options tls }
+
+#include <pthread.h>
+#include <unistd.h>
+
+int c;
+int d;
+struct A
+{
+ A() { ++c; }
+ ~A() {
+ if (++d == 3)
+ _exit (0);
+ }
+};
+
+thread_local A a;
+
+void *thread_main(void *)
+{
+ A* ap = &a;
+}
+
+int main()
+{
+ pthread_t thread;
+ thread_main(0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+ pthread_create (&thread, 0, thread_main, 0);
+ pthread_join(thread, 0);
+
+ // The dtor for a in the main thread is run after main exits, so we
+ // return 1 now and override the return value with _exit above.
+ if (c != 3 || d != 2)
+ __builtin_abort();
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6.C
new file mode 100644
index 000000000..378cf3d58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6.C
@@ -0,0 +1,33 @@
+// Test for cleanups in the main thread without -pthread.
+
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+
+extern "C" void _exit (int);
+
+int c;
+struct A
+{
+ A() { ++c; }
+ ~A() { if (c == 1) _exit(0); }
+};
+
+void f()
+{
+ thread_local A a;
+}
+
+void *thread_main(void *)
+{
+ f(); f(); f();
+}
+
+int main()
+{
+ thread_main(0);
+
+ // The dtor for a in the main thread is run after main exits, so we
+ // return 1 now and override the return value with _exit above.
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6g.C
new file mode 100644
index 000000000..f261d5419
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local6g.C
@@ -0,0 +1,31 @@
+// Test for cleanups in the main thread without -pthread.
+
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+// { dg-require-cxa-atexit "" }
+
+extern "C" void _exit (int);
+
+int c;
+struct A
+{
+ A() { ++c; }
+ ~A() { if (c == 1) _exit(0); }
+};
+
+thread_local A a;
+
+void *thread_main(void *)
+{
+ A* ap = &a;
+}
+
+int main()
+{
+ thread_main(0);
+
+ // The dtor for a in the main thread is run after main exits, so we
+ // return 1 now and override the return value with _exit above.
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7.C
new file mode 100644
index 000000000..3cb02dd51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7.C
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+// The reference temp should be TLS, not normal data.
+// { dg-final { scan-assembler-not "\\.data" { target tls_native } } }
+
+void f()
+{
+ thread_local int&& ir = 42;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7g.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7g.C
new file mode 100644
index 000000000..fb847ce4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local7g.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+// The reference temp should be TLS, not normal data.
+// { dg-final { scan-assembler-not "\\.data" { target tls_native } } }
+
+thread_local int&& ir = 42;
+
+void f()
+{
+ ir = 24;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local8.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local8.C
new file mode 100644
index 000000000..23f2a1b5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/thread_local8.C
@@ -0,0 +1,12 @@
+// PR c++/55800
+// { dg-do compile { target c++11 } }
+// { dg-require-alias "" }
+// { dg-require-effective-target tls }
+// { dg-final { scan-assembler "_ZTH12foo_instance" { target tls_native } } }
+
+struct foo
+{
+ foo();
+};
+
+thread_local foo foo_instance;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/tls.exp b/gcc-4.9/gcc/testsuite/g++.dg/tls/tls.exp
new file mode 100644
index 000000000..279fdfdcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/tls.exp
@@ -0,0 +1,35 @@
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CXXFLAGS
+if ![info exists DEFAULT_CXXFLAGS] then {
+ set DEFAULT_CXXFLAGS " -pedantic-errors -Wno-long-long"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] $DEFAULT_CXXFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tls/trivial.C b/gcc-4.9/gcc/testsuite/g++.dg/tls/trivial.C
new file mode 100644
index 000000000..e2b8f45b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tls/trivial.C
@@ -0,0 +1,3 @@
+// { dg-require-effective-target tls }
+
+__thread int i;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/20100429.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/20100429.C
new file mode 100644
index 000000000..087ce32b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/20100429.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+int foo(int a);
+int foo(float a);
+int
+bar(int a)
+{
+ int r;
+ __transaction_atomic
+ {
+ r = foo(a); // { dg-error "unsafe function call 'int foo\\(int\\)'" }
+ }
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/20100727.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/20100727.C
new file mode 100644
index 000000000..bda2df060
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/20100727.C
@@ -0,0 +1,796 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+typedef long int ptrdiff_t;
+typedef long unsigned int size_t;
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ using::ptrdiff_t;
+ using::size_t;
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ struct input_iterator_tag
+ {
+ };
+ struct output_iterator_tag
+ {
+ };
+ struct forward_iterator_tag:public input_iterator_tag
+ {
+ };
+ struct bidirectional_iterator_tag:public forward_iterator_tag
+ {
+ };
+ struct random_access_iterator_tag:public bidirectional_iterator_tag
+ {
+ };
+ template < typename _Category, typename _Tp, typename _Distance =
+ ptrdiff_t, typename _Pointer = _Tp *, typename _Reference =
+ _Tp & >struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template < typename _Iterator > struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template < typename _Tp > struct iterator_traits <_Tp * >
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp *pointer;
+ typedef _Tp & reference;
+ };
+ template < typename _Tp > struct iterator_traits <const _Tp *>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp *pointer;
+ typedef const _Tp & reference;
+ };
+ template < typename _Iter > inline typename iterator_traits <
+ _Iter >::iterator_category __iterator_category (const _Iter &)
+ {
+ return typename iterator_traits < _Iter >::iterator_category ();
+ }
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+template < typename _Iterator > class reverse_iterator:public iterator < typename iterator_traits < _Iterator >::iterator_category,
+ typename iterator_traits < _Iterator >::value_type,
+ typename iterator_traits < _Iterator >::difference_type,
+ typename iterator_traits < _Iterator >::pointer,
+ typename iterator_traits < _Iterator >::reference >
+ {
+ protected:_Iterator current;
+ typedef iterator_traits < _Iterator > __traits_type;
+ public:typedef _Iterator iterator_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::pointer pointer;
+ typedef typename __traits_type::reference reference;
+ reverse_iterator ():current ()
+ {
+ } explicit reverse_iterator (iterator_type __x):current (__x)
+ {
+ } reverse_iterator (const reverse_iterator & __x):current (__x.current)
+ {
+ } template < typename _Iter > reverse_iterator (const reverse_iterator <
+ _Iter >
+ &__x):current (__x.
+ base ())
+ {
+ } iterator_type base () const
+ {
+ return current;
+ }
+ reference operator* () const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer operator-> () const
+ {
+ return &(operator* ());
+ }
+ reverse_iterator & operator++ ()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator operator++ (int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator & operator-- ()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator operator-- (int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator operator+ (difference_type __n) const
+ {
+ return reverse_iterator (current - __n);
+ }
+ reverse_iterator & operator+= (difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator operator- (difference_type __n) const
+ {
+ return reverse_iterator (current + __n);
+ }
+ reverse_iterator & operator-= (difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference operator[] (difference_type __n) const
+ {
+ return *(*this + __n);
+ }
+ };
+ template < typename _Iterator >
+ inline bool operator== (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return __x.base () == __y.base ();
+ }
+ template < typename _Iterator >
+ inline bool operator< (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return __y.base () < __x.base ();
+ }
+ template < typename _Iterator >
+ inline bool operator!= (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return !(__x == __y);
+ }
+ template < typename _Iterator >
+ inline bool operator> (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return __y < __x;
+ }
+ template < typename _Iterator >
+ inline bool operator<= (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return !(__y < __x);
+ }
+ template < typename _Iterator >
+ inline bool operator>= (const reverse_iterator < _Iterator > &__x,
+ const reverse_iterator < _Iterator > &__y)
+ {
+ return !(__x < __y);
+ }
+ template < typename _Iterator > inline typename reverse_iterator <
+ _Iterator >::difference_type operator- (const reverse_iterator <
+ _Iterator > &__x,
+ const reverse_iterator <
+ _Iterator > &__y)
+ {
+ return __y.base () - __x.base ();
+ }
+ template < typename _Iterator > inline reverse_iterator < _Iterator >
+ operator+ (typename reverse_iterator < _Iterator >::difference_type __n,
+ const reverse_iterator < _Iterator > &__x)
+ {
+ return reverse_iterator < _Iterator > (__x.base () - __n);
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator== (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return __x.base () == __y.base ();
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator< (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return __y.base () < __x.base ();
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator!= (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return !(__x == __y);
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator> (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return __y < __x;
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator<= (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return !(__y < __x);
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline bool operator>= (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return !(__x < __y);
+ }
+ template < typename _IteratorL,
+ typename _IteratorR > inline typename reverse_iterator <
+ _IteratorL >::difference_type operator- (const reverse_iterator <
+ _IteratorL > &__x,
+ const reverse_iterator <
+ _IteratorR > &__y)
+ {
+ return __y.base () - __x.base ();
+ }
+template < typename _Container > class back_insert_iterator:public iterator < output_iterator_tag, void, void, void,
+ void >
+ {
+ protected:_Container * container;
+ public:typedef _Container container_type;
+ explicit back_insert_iterator (_Container & __x):container (&__x)
+ {
+ } back_insert_iterator & operator= (typename _Container::
+ const_reference __value)
+ {
+ container->push_back (__value);
+ return *this;
+ }
+ back_insert_iterator & operator* ()
+ {
+ return *this;
+ }
+ back_insert_iterator & operator++ ()
+ {
+ return *this;
+ }
+ back_insert_iterator operator++ (int)
+ {
+ return *this;
+ }
+ };
+ template < typename _Container > inline back_insert_iterator < _Container >
+ back_inserter (_Container & __x)
+ {
+ return back_insert_iterator < _Container > (__x);
+ }
+template < typename _Container > class front_insert_iterator:public iterator < output_iterator_tag, void, void, void,
+ void >
+ {
+ protected:_Container * container;
+ public:typedef _Container container_type;
+ explicit front_insert_iterator (_Container & __x):container (&__x)
+ {
+ } front_insert_iterator & operator= (typename _Container::
+ const_reference __value)
+ {
+ container->push_front (__value);
+ return *this;
+ }
+ front_insert_iterator & operator* ()
+ {
+ return *this;
+ }
+ front_insert_iterator & operator++ ()
+ {
+ return *this;
+ }
+ front_insert_iterator operator++ (int)
+ {
+ return *this;
+ }
+ };
+ template < typename _Container > inline front_insert_iterator < _Container >
+ front_inserter (_Container & __x)
+ {
+ return front_insert_iterator < _Container > (__x);
+ }
+template < typename _Container > class insert_iterator:public iterator < output_iterator_tag, void, void, void,
+ void >
+ {
+ protected:_Container * container;
+ typename _Container::iterator iter;
+ public:typedef _Container container_type;
+ insert_iterator (_Container & __x,
+ typename _Container::iterator __i):container (&__x),
+ iter (__i)
+ {
+ } insert_iterator & operator= (typename _Container::
+ const_reference __value)
+ {
+ iter = container->insert (iter, __value);
+ ++iter;
+ return *this;
+ }
+ insert_iterator & operator* ()
+ {
+ return *this;
+ }
+ insert_iterator & operator++ ()
+ {
+ return *this;
+ }
+ insert_iterator & operator++ (int)
+ {
+ return *this;
+ }
+ };
+ template < typename _Container,
+ typename _Iterator > inline insert_iterator < _Container >
+ inserter (_Container & __x, _Iterator __i)
+ {
+ return insert_iterator < _Container > (__x,
+ typename _Container::
+ iterator (__i));
+ }
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ using std::size_t;
+ using std::ptrdiff_t;
+ template < typename _Tp > class new_allocator
+ {
+ public:typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp *pointer;
+ typedef const _Tp *const_pointer;
+ typedef _Tp & reference;
+ typedef const _Tp & const_reference;
+ typedef _Tp value_type;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef new_allocator < _Tp1 > other;
+ };
+ new_allocator ()throw ()
+ {
+ } new_allocator (const new_allocator &) throw ()
+ {
+ } template < typename _Tp1 > new_allocator (const new_allocator < _Tp1 >
+ &) throw ()
+ {
+ } ~new_allocator ()throw ()
+ {
+ } pointer address (reference __x) const
+ {
+ return &__x;
+ }
+ const_pointer address (const_reference __x) const
+ {
+ return &__x;
+ }
+ pointer allocate (size_type __n, const void * = 0)
+ {
+ return static_cast < _Tp * >(::operator new (__n * sizeof (_Tp)));
+ }
+ void deallocate (pointer __p, size_type)
+ {
+ ::operator delete (__p);
+ } size_type max_size () const throw ()
+ {
+ return size_t (-1) / sizeof (_Tp);
+ }
+ void construct (pointer __p, const _Tp & __val)
+ {
+ ::new ((void *) __p) _Tp (__val);
+ } void destroy (pointer __p)
+ {
+ __p->~_Tp ();
+ }};
+ template < typename _Tp > inline bool operator== (const new_allocator <
+ _Tp > &,
+ const new_allocator <
+ _Tp > &)
+ {
+ return true;
+ }
+ template < typename _Tp > inline bool operator!= (const new_allocator <
+ _Tp > &,
+ const new_allocator <
+ _Tp > &)
+ {
+ return false;
+ }
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp > class allocator;
+ template <> class allocator < void >
+ {
+ public:typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void *pointer;
+ typedef const void *const_pointer;
+ typedef void value_type;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef allocator < _Tp1 > other;
+ };
+ };
+template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
+ _Tp >
+ {
+ public:typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp *pointer;
+ typedef const _Tp *const_pointer;
+ typedef _Tp & reference;
+ typedef const _Tp & const_reference;
+ typedef _Tp value_type;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef allocator < _Tp1 > other;
+ };
+ allocator ()throw ()
+ {
+ } allocator (const allocator & __a) throw ():__gnu_cxx::new_allocator <
+ _Tp > (__a)
+ {
+ } template < typename _Tp1 > allocator (const allocator < _Tp1 >
+ &) throw ()
+ {
+ } ~allocator ()throw ()
+ {
+ }};
+ template < typename _T1,
+ typename _T2 > inline bool operator== (const allocator < _T1 > &,
+ const allocator < _T2 > &)
+ {
+ return true;
+ }
+ template < typename _Tp > inline bool operator== (const allocator < _Tp > &,
+ const allocator < _Tp > &)
+ {
+ return true;
+ }
+ template < typename _T1,
+ typename _T2 > inline bool operator!= (const allocator < _T1 > &,
+ const allocator < _T2 > &)
+ {
+ return false;
+ }
+ template < typename _Tp > inline bool operator!= (const allocator < _Tp > &,
+ const allocator < _Tp > &)
+ {
+ return false;
+ }
+ template < typename _Alloc, bool = __is_empty (_Alloc) > struct __alloc_swap
+ {
+ static void _S_do_it (_Alloc &, _Alloc &)
+ {
+ }};
+ template < typename _Alloc > struct __alloc_swap <_Alloc, false >
+ {
+ static void _S_do_it (_Alloc & __one, _Alloc & __two)
+ {
+ if (__one != __two)
+ swap (__one, __two);
+ }
+ };
+ template < typename _Alloc, bool = __is_empty (_Alloc) > struct __alloc_neq
+ {
+ static bool _S_do_it (const _Alloc &, const _Alloc &)
+ {
+ return false;
+ }
+ };
+ template < typename _Alloc > struct __alloc_neq <_Alloc, false >
+ {
+ static bool _S_do_it (const _Alloc & __one, const _Alloc & __two)
+ {
+ return __one != __two;
+ }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ struct _List_node_base
+ {
+ _List_node_base *_M_next;
+ _List_node_base *_M_prev;
+ static void swap (_List_node_base & __x, _List_node_base & __y) throw ();
+ void _M_transfer (_List_node_base * const __first,
+ _List_node_base * const __last) throw ();
+ void _M_reverse () throw ();
+ void _M_hook (_List_node_base * const __position) throw ();
+ void _M_unhook () throw ();
+ };
+ template < typename _Tp > struct _List_node:public _List_node_base
+ {
+ _Tp _M_data;
+ };
+ template < typename _Tp > struct _List_iterator
+ {
+ typedef _List_iterator < _Tp > _Self;
+ typedef _List_node < _Tp > _Node;
+ typedef ptrdiff_t difference_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Tp *pointer;
+ typedef _Tp & reference;
+ _List_iterator ():_M_node ()
+ {
+ } explicit _List_iterator (_List_node_base * __x):_M_node (__x)
+ {
+ } reference operator* () const
+ {
+ return static_cast < _Node * >(_M_node)->_M_data;
+ }
+ pointer operator-> () const
+ {
+ return &static_cast < _Node * >(_M_node)->_M_data;
+ }
+ _Self & operator++ ()
+ {
+ _M_node = _M_node->_M_next;
+ return *this;
+ }
+ _Self operator++ (int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_next;
+ return __tmp;
+ }
+ _Self & operator-- ()
+ {
+ _M_node = _M_node->_M_prev;
+ return *this;
+ }
+ _Self operator-- (int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_prev;
+ return __tmp;
+ }
+ bool operator== (const _Self & __x) const
+ {
+ return _M_node == __x._M_node;
+ }
+ bool operator!= (const _Self & __x) const
+ {
+ return _M_node != __x._M_node;
+ }
+ _List_node_base *_M_node;
+ };
+ template < typename _Tp > struct _List_const_iterator
+ {
+ typedef _List_const_iterator < _Tp > _Self;
+ typedef const _List_node < _Tp > _Node;
+ typedef _List_iterator < _Tp > iterator;
+ typedef ptrdiff_t difference_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef const _Tp *pointer;
+ typedef const _Tp & reference;
+ _List_const_iterator ():_M_node ()
+ {
+ } explicit _List_const_iterator (const _List_node_base *
+ __x):_M_node (__x)
+ {
+ } _List_const_iterator (const iterator & __x):_M_node (__x._M_node)
+ {
+ } reference operator* () const
+ {
+ return static_cast < _Node * >(_M_node)->_M_data;
+ }
+ pointer operator-> () const
+ {
+ return &static_cast < _Node * >(_M_node)->_M_data;
+ }
+ _Self & operator++ ()
+ {
+ _M_node = _M_node->_M_next;
+ return *this;
+ }
+ _Self operator++ (int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_next;
+ return __tmp;
+ }
+ _Self & operator-- ()
+ {
+ _M_node = _M_node->_M_prev;
+ return *this;
+ }
+ _Self operator-- (int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_prev;
+ return __tmp;
+ }
+ bool operator== (const _Self & __x) const
+ {
+ return _M_node == __x._M_node;
+ }
+ bool operator!= (const _Self & __x) const
+ {
+ return _M_node != __x._M_node;
+ }
+ const _List_node_base *_M_node;
+ };
+ template < typename _Tp, typename _Alloc > class _List_base
+ {
+ protected:typedef typename _Alloc::template rebind < _List_node < _Tp >
+ >::other _Node_alloc_type;
+ typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
+ struct _List_impl:public _Node_alloc_type
+ {
+ _List_node_base _M_node;
+ _List_impl ():_Node_alloc_type (), _M_node ()
+ {
+ } _List_impl (const _Node_alloc_type & __a):_Node_alloc_type (__a),
+ _M_node ()
+ {
+ }};
+ _List_impl _M_impl;
+ _List_node < _Tp > *_M_get_node ()
+ {
+ return _M_impl._Node_alloc_type::allocate (1);
+ }
+ void _M_put_node (_List_node < _Tp > *__p)
+ {
+ _M_impl._Node_alloc_type::deallocate (__p, 1);
+ } public:typedef _Alloc allocator_type;
+ _Node_alloc_type & _M_get_Node_allocator ()
+ {
+ return *static_cast < _Node_alloc_type * >(&this->_M_impl);
+ }
+ const _Node_alloc_type & _M_get_Node_allocator () const
+ {
+ return *static_cast < const _Node_alloc_type *>(&this->_M_impl);
+ } _Tp_alloc_type _M_get_Tp_allocator () const
+ {
+ return _Tp_alloc_type (_M_get_Node_allocator ());
+ }
+ allocator_type get_allocator () const
+ {
+ return allocator_type (_M_get_Node_allocator ());
+ }
+ _List_base ():_M_impl ()
+ {
+ _M_init ();
+ }
+ _List_base (const allocator_type & __a):_M_impl (__a)
+ {
+ _M_init ();
+ } ~_List_base ()
+ {
+ _M_clear ();
+ } void _M_clear ();
+ void _M_init ()
+ {
+ this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
+ this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
+ }};
+template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class list:protected _List_base < _Tp,
+ _Alloc
+ >
+ {
+ typedef typename _Alloc::value_type _Alloc_value_type;
+ typedef _List_base < _Tp, _Alloc > _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
+ typedef _List_iterator < _Tp > iterator;
+ typedef _List_const_iterator < _Tp > const_iterator;
+ typedef std::reverse_iterator < const_iterator > const_reverse_iterator;
+ typedef std::reverse_iterator < iterator > reverse_iterator;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Alloc allocator_type;
+ protected:typedef _List_node < _Tp > _Node;
+ using _Base::_M_impl;
+ using _Base::_M_put_node;
+ using _Base::_M_get_node;
+ using _Base::_M_get_Tp_allocator;
+ using _Base::_M_get_Node_allocator;
+ public:iterator begin ()
+ {
+ return iterator (this->_M_impl._M_node._M_next);
+ }
+ const_iterator begin () const
+ {
+ return const_iterator (this->_M_impl._M_node._M_next);
+ }
+ iterator end ()
+ {
+ return iterator (&this->_M_impl._M_node);
+ }
+ void remove (const _Tp & __value);
+ template < typename _Predicate > void remove_if (_Predicate);
+ void _M_erase (iterator __position)
+ {
+ __position._M_node->_M_unhook ();
+ _Node *__n = static_cast < _Node * >(__position._M_node);
+ _M_get_Tp_allocator ().destroy (&__n->_M_data);
+ _M_put_node (__n);
+ } void _M_check_equal_allocators (list & __x)
+ {
+ if (std::__alloc_neq <
+ typename _Base::_Node_alloc_type >::
+ _S_do_it (_M_get_Node_allocator (), __x._M_get_Node_allocator ()));
+ }
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp, typename _Alloc > void list < _Tp,
+ _Alloc >::remove (const value_type & __value)
+ {
+ iterator __first = begin ();
+ iterator __last = end ();
+ iterator __extra = __last;
+ while (__first != __last)
+ {
+ iterator __next = __first;
+ ++__next;
+ if (*__first == __value)
+ {
+ if (&*__first != &__value)
+ _M_erase (__first);
+ else
+ __extra = __first;
+ }
+ __first = __next;
+ }
+ if (__extra != __last)
+ _M_erase (__extra);
+ }
+}
+
+class Unit
+{
+public:int dummy;
+};
+class Building
+{
+public:__attribute__ ((transaction_callable)) void removeUnitFromInside (Unit *
+ unit);
+ std::list < Unit * >unitsInside;
+};
+void
+Building::removeUnitFromInside (Unit * unit)
+{
+ unitsInside.remove (unit);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/alias.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/alias.C
new file mode 100644
index 000000000..4459c703b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/alias.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0" }
+
+/* Test that we generate transactional clones for both the base and
+ the complete dtor for class Itemset. */
+
+class Itemset {
+public:
+ __attribute__((transaction_safe)) ~Itemset();
+ __attribute__((transaction_safe)) void operator delete(void *);
+private:
+};
+
+__attribute__((transaction_safe))
+Itemset::~Itemset()
+{
+}
+
+// { dg-final { scan-assembler "_ZGTtN7ItemsetD1Ev" } }
+// { dg-final { scan-assembler "_ZGTtN7ItemsetD2Ev" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/asm-1.c b/gcc-4.9/gcc/testsuite/g++.dg/tm/asm-1.c
new file mode 100644
index 000000000..3c8ebd2f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/asm-1.c
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O1" }
+
+template<class T> class shared_ptr {
+public:
+ shared_ptr() {
+ __asm__ ("");
+ }
+};
+template<typename _Tp> class deque {
+public:
+ void push_back() {
+ ::new _Tp();
+ }
+};
+class Bar {
+ __attribute__((transaction_callable)) void push();
+ deque<shared_ptr<int> > events;
+};
+void Bar::push() {
+ events.push_back();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-2.C
new file mode 100644
index 000000000..6a418e559
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-2.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -fdump-tree-optimized-asmname" }
+
+struct __attribute__((transaction_safe)) Tsafe
+{
+ void f();
+};
+
+void Tsafe::f() { }
+
+struct __attribute__((transaction_callable)) Tcall
+{
+ void f();
+};
+
+void Tcall::f() { }
+
+// { dg-final { scan-tree-dump-times "_ZN5Tsafe1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZN5Tcall1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZGTtN5Tsafe1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZGTtN5Tcall1fEv" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-3.C
new file mode 100644
index 000000000..a2c9718bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-3.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -fdump-tree-optimized-asmname" }
+
+struct __attribute__((transaction_safe)) A
+{
+};
+
+struct B : public A
+{
+ void f();
+};
+
+struct C
+{
+};
+
+struct D : public C
+{
+};
+
+struct E : public D, public A
+{
+ void f();
+};
+
+void B::f() { }
+void E::f() { }
+
+// { dg-final { scan-tree-dump-times "_ZN1B1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZGTtN1B1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZN1E1fEv" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "_ZGTtN1E1fEv" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-4.C
new file mode 100644
index 000000000..b589b9d41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/attrib-4.C
@@ -0,0 +1,48 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+#define __ts __attribute__((transaction_safe))
+#define __tc __attribute__((transaction_callable))
+#define __tp __attribute__((transaction_pure))
+#define __tu __attribute__((transaction_unsafe))
+
+struct __ts A
+{
+ virtual void f();
+ virtual void g();
+};
+
+struct __tc B : public A
+{
+ void f() __tc; // { dg-error ".transaction_callable. overriding .transaction_safe." }
+ void g();
+ virtual void h();
+};
+
+struct C : public B
+{
+ void g() __tc; // { dg-error ".transaction_callable. overriding .transaction_safe." }
+};
+
+struct C2 : public B
+{
+ void g() __ts;
+ void h() __tu; // { dg-error ".transaction_unsafe. overriding .transaction_callable." }
+};
+
+struct D
+{
+ virtual void f() __tp;
+ virtual void g() __tp;
+};
+
+struct E : public D
+{
+ void f() __ts; // { dg-error ".transaction_safe. overriding .transaction_pure." }
+ void g();
+};
+
+struct F : public E
+{
+ void g() __ts; // { dg-error ".transaction_safe. overriding .transaction_pure." }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/cgraph_edge.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/cgraph_edge.C
new file mode 100644
index 000000000..d4c8f77fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/cgraph_edge.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O3" }
+
+template<typename _InputIterator, typename _Distance> inline void advance(_InputIterator& __i, _Distance __n)
+ {
+ if (__n > 0)
+ while (__n--)
+ --__i;
+ else
+ --__i;
+ }
+
+void _Rb_tree_increment ();
+
+template<typename _Tp> struct _Rb_tree_iterator
+ {
+ typedef _Rb_tree_iterator<_Tp> iterator;
+
+ iterator& operator--()
+ {
+ _Rb_tree_increment();
+ }
+ };
+
+void update ()
+ {
+ _Rb_tree_iterator<int>::iterator it;
+ __transaction_relaxed
+ {
+ advance (it, 0);
+ }
+ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/fatomic-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/fatomic-1.C
new file mode 100644
index 000000000..dac850aac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/fatomic-1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+struct S
+{
+ int i, j, k;
+ S();
+};
+
+S::S() __transaction_atomic : i(1), j(2), k(3) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-1.C
new file mode 100644
index 000000000..1f4e19e98
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+class HashTree
+{
+public:
+ __attribute__((transaction_safe))
+ int add_element2();
+private:
+ int Count;
+};
+
+
+__attribute__((transaction_safe))
+int HashTree::add_element2()
+{
+ int tt;
+ __transaction_atomic {
+ tt = Count;
+ }
+ return tt;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-2.C
new file mode 100644
index 000000000..c6d5d98ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-2.C
@@ -0,0 +1,41 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+typedef unsigned long int uint64_t;
+extern int *hash_indx;
+
+typedef struct
+{
+ uint64_t exit_atomicsec_time;
+} ent_ex_times;
+class HashTree
+{
+public:
+ __attribute__((transaction_safe))
+ void *operator new(__SIZE_TYPE__);
+ __attribute__((transaction_safe))
+ int add_element();
+private:
+ HashTree **Hash_table;
+ int Count;
+};
+
+
+__attribute__((transaction_safe))
+int HashTree::add_element()
+{
+ ent_ex_times enter_exit_times_inside;
+ int val = hash_indx[5];
+ int tt;
+ if (Hash_table[val] == __null)
+ {
+ __transaction_atomic {
+ Hash_table[val] = new HashTree;
+ }
+ }
+ __transaction_atomic {
+ tt = Count++;
+ enter_exit_times_inside.exit_atomicsec_time = 5;
+ }
+ return tt;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-3.C
new file mode 100644
index 000000000..19718c34a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/nested-3.C
@@ -0,0 +1,43 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0" }
+
+// Same as nested-2.C but with no optimization.
+
+typedef unsigned long int uint64_t;
+extern int *hash_indx;
+
+typedef struct
+{
+ uint64_t exit_atomicsec_time;
+} ent_ex_times;
+class HashTree
+{
+public:
+ __attribute__((transaction_safe))
+ void *operator new(__SIZE_TYPE__);
+ __attribute__((transaction_safe))
+ int add_element();
+private:
+ HashTree **Hash_table;
+ int Count;
+};
+
+
+__attribute__((transaction_safe))
+int HashTree::add_element()
+{
+ ent_ex_times enter_exit_times_inside;
+ int val = hash_indx[5];
+ int tt;
+ if (Hash_table[val] == __null)
+ {
+ __transaction_atomic {
+ Hash_table[val] = new HashTree;
+ }
+ }
+ __transaction_atomic {
+ tt = Count++;
+ enter_exit_times_inside.exit_atomicsec_time = 5;
+ }
+ return tt;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-1.C
new file mode 100644
index 000000000..887945af6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-1.C
@@ -0,0 +1,38 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark -fdump-tree-tmlower" }
+
+struct TrueFalse
+{
+ static constexpr bool v() { return true; }
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ __transaction_atomic noexcept(T::v()) { global += 1; }
+ return __transaction_atomic noexcept(T::v()) (global + 2);
+}
+
+int f1()
+{
+ return foo<TrueFalse>();
+}
+
+int f2()
+{
+ return __transaction_atomic noexcept(true) (global + 3)
+ + __transaction_atomic noexcept(TrueFalse::v()) (global + 4);
+}
+
+int f3()
+{
+ __transaction_atomic noexcept(true) { global += 5; }
+ __transaction_atomic noexcept(TrueFalse::v()) { global += 6; }
+ return global;
+}
+
+/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 6 "tmlower" } } */
+/* { dg-final { scan-tree-dump-times "ITM_RU" 6 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmlower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-2.C
new file mode 100644
index 000000000..d2282489e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-2.C
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm" }
+
+// All of these must fail, because they are not constant expressions.
+template<typename T> int foo(int x, T t)
+{
+ __transaction_atomic noexcept(t) { x++; } /* { dg-error "not a constant" } */
+ return __transaction_atomic noexcept(t) (x+1); /* { dg-error "not a constant" } */
+}
+
+int bar(int x)
+{
+ __transaction_atomic noexcept(x == 23) { x++; } /* { dg-error "not a constant" } */
+ return __transaction_atomic noexcept(x == 42) (x+1); /* { dg-error "not a constant" } */
+}
+
+int f(int x)
+{
+ return foo<bool>(x, true);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-3.C
new file mode 100644
index 000000000..973b442ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-3.C
@@ -0,0 +1,40 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark -fdump-tree-tmlower" }
+
+// Same as noexcept-1.C but all noexcepts are false.
+
+struct TrueFalse
+{
+ static constexpr bool v() { return false; }
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ __transaction_atomic noexcept(T::v()) { global += 1; }
+ return __transaction_atomic noexcept(T::v()) (global + 2);
+}
+
+int f1()
+{
+ return foo<TrueFalse>();
+}
+
+int f2()
+{
+ return __transaction_atomic noexcept(false) (global + 3)
+ + __transaction_atomic noexcept(TrueFalse::v()) (global + 4);
+}
+
+int f3()
+{
+ __transaction_atomic noexcept(false) { global += 5; }
+ __transaction_atomic noexcept(TrueFalse::v()) { global += 6; }
+ return global;
+}
+
+/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 0 "tmlower" } } */
+/* { dg-final { scan-tree-dump-times "ITM_RU" 6 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmlower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-4.C
new file mode 100644
index 000000000..a7eb7ef93
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-4.C
@@ -0,0 +1,35 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark -fdump-tree-tmlower" }
+
+// Similar to noexcept-1.C but without an explicit (true) for noexcept.
+
+struct TrueFalse
+{
+ static constexpr bool v() { return true; }
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ __transaction_atomic noexcept { global += 1; }
+ return __transaction_atomic noexcept (global + 2)
+ + __transaction_atomic noexcept (global + 3);
+}
+
+int f1()
+{
+ return foo<TrueFalse>();
+}
+
+int f3()
+{
+ __transaction_atomic noexcept { global += 4; }
+ return __transaction_atomic noexcept (global + 5)
+ + __transaction_atomic noexcept (global + 6);
+}
+
+/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 6 "tmlower" } } */
+/* { dg-final { scan-tree-dump-times "ITM_RU" 6 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmlower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-5.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-5.C
new file mode 100644
index 000000000..426743291
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-5.C
@@ -0,0 +1,21 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark -fdump-tree-tmlower" }
+
+int global;
+
+void f2(int x)
+{
+ __transaction_atomic
+ {
+ __transaction_atomic noexcept(true)
+ {
+ global += 1;
+ if (x)
+ throw 23;
+ }
+ }
+}
+/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 1 "tmlower" } } */
+/* { dg-final { scan-tree-dump-times "ITM_RU" 1 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmlower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-6.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-6.C
new file mode 100644
index 000000000..dd9845c09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/noexcept-6.C
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-exceptions -fgnu-tm -O -fdump-tree-tmlower" }
+
+struct TrueFalse
+{
+ static constexpr bool v() { return true; }
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ return __transaction_atomic noexcept(T::v()) (global + 1);
+}
+
+int f1()
+{
+ return foo<TrueFalse>();
+}
+
+/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 0 "tmlower" } } */
+/* { dg-final { scan-tree-dump-times "__transaction_atomic" 1 "tmlower" } } */
+/* { dg-final { cleanup-tree-dump "tmlower" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/opt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/opt-1.C
new file mode 100644
index 000000000..8dd41a5bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/opt-1.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+struct S
+{
+ virtual void f() __attribute__((transaction_safe));
+};
+
+void f(S *s) { __transaction_atomic { s->f(); } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-2.C
new file mode 100644
index 000000000..ab10c34ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-2.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O1" }
+
+__attribute__((transaction_pure))
+inline int atomic_exchange_and_add(int dv )
+{
+ int r;
+ __asm__ ("" : "=r"(r));
+ return r;
+}
+
+class sp_counted_base
+{
+public:
+ __attribute__((transaction_safe))
+ void release()
+ {
+ if( atomic_exchange_and_add(-1 ) == 1 )
+ {
+ }
+ }
+};
+
+sp_counted_base *base;
+
+void here(){
+ __transaction_atomic {
+ base->release();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-3.C
new file mode 100644
index 000000000..c8caee6c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-3.C
@@ -0,0 +1,69 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0" }
+
+__attribute__((transaction_safe))
+void* operator new (__SIZE_TYPE__);
+
+__attribute__((transaction_pure))
+inline int atomic_exchange_and_add( int * pw, int dv )
+{
+ int r;
+ __asm__ ("" : "=r"(r));
+ return r;
+}
+
+class sp_counted_base
+{
+protected:
+ int use_count_; // #shared
+public:
+ __attribute__((transaction_safe))
+ virtual void dispose() = 0; // nothrow
+
+ __attribute__((transaction_safe))
+ void release() // nothrow
+ {
+ if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
+ {
+ dispose();
+ }
+ }
+};
+
+class sp_counted_base_x86 : public sp_counted_base
+{
+public:
+ void dispose()
+ {
+ release();
+ }
+};
+
+class shared_count
+{
+private:
+ sp_counted_base * pi_;
+public:
+ int j;
+ __attribute__((transaction_safe))
+ shared_count(): pi_(new sp_counted_base_x86()), j(0)
+ {
+ }
+ __attribute__((transaction_safe))
+ ~shared_count() // nothrow
+ {
+ if( pi_ != 0 ) pi_->release();
+ }
+};
+
+volatile int i = 1;
+shared_count * c;
+int main()
+{
+ if ( i == 0) {
+ __transaction_atomic {
+ shared_count sc;
+ }
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-4.C
new file mode 100644
index 000000000..d1cb8d55a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940-4.C
@@ -0,0 +1,69 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O1" }
+
+__attribute__((transaction_safe))
+void* operator new (__SIZE_TYPE__);
+
+__attribute__((transaction_pure))
+inline int atomic_exchange_and_add( int * pw, int dv )
+{
+ int r;
+ __asm__ ("" : "=r"(r));
+ return r;
+}
+
+class sp_counted_base
+{
+protected:
+ int use_count_; // #shared
+public:
+ __attribute__((transaction_safe))
+ virtual void dispose() = 0; // nothrow
+
+ __attribute__((transaction_safe))
+ void release() // nothrow
+ {
+ if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
+ {
+ dispose();
+ }
+ }
+};
+
+class sp_counted_base_x86 : public sp_counted_base
+{
+public:
+ void dispose()
+ {
+ release();
+ }
+};
+
+class shared_count
+{
+private:
+ sp_counted_base * pi_;
+public:
+ int j;
+ __attribute__((transaction_safe))
+ shared_count(): pi_(new sp_counted_base_x86()), j(0)
+ {
+ }
+ __attribute__((transaction_safe))
+ ~shared_count() // nothrow
+ {
+ if( pi_ != 0 ) pi_->release();
+ }
+};
+
+volatile int i = 1;
+shared_count * c;
+int main()
+{
+ if ( i == 0) {
+ __transaction_atomic {
+ shared_count sc;
+ }
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940.C
new file mode 100644
index 000000000..3e9a2c3f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr45940.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0" }
+
+__attribute__((transaction_pure))
+inline int atomic_exchange_and_add(int dv )
+{
+ int r;
+ __asm__ ("" : "=r"(r));
+ return r;
+}
+
+class sp_counted_base
+{
+public:
+ __attribute__((transaction_safe))
+ void release()
+ {
+ if( atomic_exchange_and_add(-1 ) == 1 )
+ {
+ }
+ }
+};
+
+sp_counted_base *base;
+
+void here(){
+ __transaction_atomic {
+ base->release();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46269.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46269.C
new file mode 100644
index 000000000..b4b13af5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46269.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+static inline void atomic_exchange_and_add()
+{
+ __asm__ ("");
+}
+
+template<class T> class shared_ptr
+{
+public:
+ shared_ptr( T * p )
+ {
+ atomic_exchange_and_add();
+ }
+};
+
+class BuildingCompletedEvent
+{
+ public:
+ __attribute__((transaction_callable)) void updateBuildingSite(void);
+ __attribute__((transaction_pure)) BuildingCompletedEvent();
+};
+
+void BuildingCompletedEvent::updateBuildingSite(void)
+{
+ shared_ptr<BuildingCompletedEvent> event(new BuildingCompletedEvent());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46270.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46270.C
new file mode 100644
index 000000000..291e620a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46270.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+#include <list>
+class Game
+{
+public:
+ struct BuildProject
+ {
+ int posX;
+ };
+ std::list<BuildProject> buildProjects;
+};
+
+static Game game;
+static std::list<std::list<Game::BuildProject>::iterator> erasableBuildProjects;
+
+static void *buildProjectSyncStepConcurrently(int id, int localTeam)
+{
+ __transaction_relaxed {
+ std::list<std::list<Game::BuildProject>::iterator>::iterator it
+ = erasableBuildProjects.begin();
+ game.buildProjects.erase( (std::list<Game::BuildProject>
+ ::iterator) *it);
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46300.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46300.C
new file mode 100644
index 000000000..7b3c613c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46300.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+void foo(){
+ __transaction_atomic {
+ throw 5;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46567.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46567.C
new file mode 100644
index 000000000..2f0ef93f2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46567.C
@@ -0,0 +1,2676 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O2" }
+
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+typedef __SIZE_TYPE__ size_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ void
+ __throw_bad_exception(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_cast(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_typeid(void) __attribute__((__noreturn__));
+ void
+ __throw_logic_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_domain_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_invalid_argument(const char*) __attribute__((__noreturn__));
+ void
+ __throw_length_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_out_of_range(const char*) __attribute__((__noreturn__));
+ void
+ __throw_runtime_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_range_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_overflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_underflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_ios_failure(const char*) __attribute__((__noreturn__));
+ void
+ __throw_system_error(int) __attribute__((__noreturn__));
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct __true_type { };
+ struct __false_type { };
+ template<bool>
+ struct __truth_type
+ { typedef __false_type __type; };
+ template<>
+ struct __truth_type<true>
+ { typedef __true_type __type; };
+ template<class _Sp, class _Tp>
+ struct __traitor
+ {
+ enum { __value = bool(_Sp::__value) || bool(_Tp::__value) };
+ typedef typename __truth_type<__value>::__type __type;
+ };
+ template<typename, typename>
+ struct __are_same
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __are_same<_Tp, _Tp>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_void
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_void<void>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_integer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_integer<bool>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned short>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned int>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_integer<unsigned long long>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_floating
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_floating<float>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_floating<long double>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Tp>
+ struct __is_pointer<_Tp*>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_normal_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<typename _Iterator, typename _Container>
+ struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator,
+ _Container> >
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_arithmetic
+ : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_fundamental
+ : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_scalar
+ : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> >
+ { };
+ template<typename _Tp>
+ struct __is_char
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_char<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_char<wchar_t>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_byte
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+ template<>
+ struct __is_byte<char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<signed char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<>
+ struct __is_byte<unsigned char>
+ {
+ enum { __value = 1 };
+ typedef __true_type __type;
+ };
+ template<typename _Tp>
+ struct __is_move_iterator
+ {
+ enum { __value = 0 };
+ typedef __false_type __type;
+ };
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<bool, typename>
+ struct __enable_if
+ { };
+ template<typename _Tp>
+ struct __enable_if<true, _Tp>
+ { typedef _Tp __type; };
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct __conditional_type
+ { typedef _Iftrue __type; };
+ template<typename _Iftrue, typename _Iffalse>
+ struct __conditional_type<false, _Iftrue, _Iffalse>
+ { typedef _Iffalse __type; };
+ template<typename _Tp>
+ struct __add_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __add_unsigned<char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<signed char>
+ { typedef unsigned char __type; };
+ template<>
+ struct __add_unsigned<short>
+ { typedef unsigned short __type; };
+ template<>
+ struct __add_unsigned<int>
+ { typedef unsigned int __type; };
+ template<>
+ struct __add_unsigned<long>
+ { typedef unsigned long __type; };
+ template<>
+ struct __add_unsigned<long long>
+ { typedef unsigned long long __type; };
+ template<>
+ struct __add_unsigned<bool>;
+ template<>
+ struct __add_unsigned<wchar_t>;
+ template<typename _Tp>
+ struct __remove_unsigned
+ {
+ private:
+ typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
+ public:
+ typedef typename __if_type::__type __type;
+ };
+ template<>
+ struct __remove_unsigned<char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned char>
+ { typedef signed char __type; };
+ template<>
+ struct __remove_unsigned<unsigned short>
+ { typedef short __type; };
+ template<>
+ struct __remove_unsigned<unsigned int>
+ { typedef int __type; };
+ template<>
+ struct __remove_unsigned<unsigned long>
+ { typedef long __type; };
+ template<>
+ struct __remove_unsigned<unsigned long long>
+ { typedef long long __type; };
+ template<>
+ struct __remove_unsigned<bool>;
+ template<>
+ struct __remove_unsigned<wchar_t>;
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type* __ptr)
+ { return __ptr == 0; }
+ template<typename _Type>
+ inline bool
+ __is_null_pointer(_Type)
+ { return false; }
+ template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
+ struct __promote
+ { typedef double __type; };
+ template<typename _Tp>
+ struct __promote<_Tp, false>
+ { typedef _Tp __type; };
+ template<typename _Tp, typename _Up>
+ struct __promote_2
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ public:
+ typedef __typeof__(__type1() + __type2()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp>
+ struct __promote_3
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3()) __type;
+ };
+ template<typename _Tp, typename _Up, typename _Vp, typename _Wp>
+ struct __promote_4
+ {
+ private:
+ typedef typename __promote<_Tp>::__type __type1;
+ typedef typename __promote<_Up>::__type __type2;
+ typedef typename __promote<_Vp>::__type __type3;
+ typedef typename __promote<_Wp>::__type __type4;
+ public:
+ typedef __typeof__(__type1() + __type2() + __type3() + __type4()) __type;
+ };
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Value>
+ struct __numeric_traits_integer
+ {
+ static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0);
+ static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0);
+ static const bool __is_signed = ((_Value)(-1) < 0);
+ static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0));
+ };
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__min;
+ template<typename _Value>
+ const _Value __numeric_traits_integer<_Value>::__max;
+ template<typename _Value>
+ const bool __numeric_traits_integer<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_integer<_Value>::__digits;
+ template<typename _Value>
+ struct __numeric_traits_floating
+ {
+ static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 3010 / 10000);
+ static const bool __is_signed = true;
+ static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18);
+ static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932);
+ };
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_digits10;
+ template<typename _Value>
+ const bool __numeric_traits_floating<_Value>::__is_signed;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__digits10;
+ template<typename _Value>
+ const int __numeric_traits_floating<_Value>::__max_exponent10;
+ template<typename _Value>
+ struct __numeric_traits
+ : public __conditional_type<std::__is_integer<_Value>::__value,
+ __numeric_traits_integer<_Value>,
+ __numeric_traits_floating<_Value> >::__type
+ { };
+}
+
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ inline void
+ swap(_Tp& __a, _Tp& __b)
+ {
+
+ _Tp __tmp = (__a);
+ __a = (__b);
+ __b = (__tmp);
+ }
+ template<typename _Tp, size_t _Nm>
+ inline void
+ swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+ {
+ for (size_t __n = 0; __n < _Nm; ++__n)
+ swap(__a[__n], __b[__n]);
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair()
+ : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ template<class _U1, class _U2>
+ pair(const pair<_U1, _U2>& __p)
+ : first(__p.first),
+ second(__p.second) { }
+ };
+ template<class _T1, class _T2>
+ inline bool
+ operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first == __y.first && __x.second == __y.second; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __x.first < __y.first
+ || (!(__y.first < __x.first) && __x.second < __y.second); }
+ template<class _T1, class _T2>
+ inline bool
+ operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x == __y); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return __y < __x; }
+ template<class _T1, class _T2>
+ inline bool
+ operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__y < __x); }
+ template<class _T1, class _T2>
+ inline bool
+ operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+ { return !(__x < __y); }
+ template<class _T1, class _T2>
+ inline pair<_T1, _T2>
+ make_pair(_T1 __x, _T2 __y)
+ { return pair<_T1, _T2>(__x, __y); }
+}
+
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct input_iterator_tag { };
+ struct output_iterator_tag { };
+ struct forward_iterator_tag : public input_iterator_tag { };
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<const _Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ };
+ template<typename _Iter>
+ inline typename iterator_traits<_Iter>::iterator_category
+ __iterator_category(const _Iter&)
+ { return typename iterator_traits<_Iter>::iterator_category(); }
+}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ __distance(_InputIterator __first, _InputIterator __last,
+ input_iterator_tag)
+ {
+
+ typename iterator_traits<_InputIterator>::difference_type __n = 0;
+ while (__first != __last)
+ {
+ ++__first;
+ ++__n;
+ }
+ return __n;
+ }
+ template<typename _RandomAccessIterator>
+ inline typename iterator_traits<_RandomAccessIterator>::difference_type
+ __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
+ random_access_iterator_tag)
+ {
+
+ return __last - __first;
+ }
+ template<typename _InputIterator>
+ inline typename iterator_traits<_InputIterator>::difference_type
+ distance(_InputIterator __first, _InputIterator __last)
+ {
+ return std::__distance(__first, __last,
+ std::__iterator_category(__first));
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
+ {
+
+ while (__n--)
+ ++__i;
+ }
+ template<typename _BidirectionalIterator, typename _Distance>
+ inline void
+ __advance(_BidirectionalIterator& __i, _Distance __n,
+ bidirectional_iterator_tag)
+ {
+
+ if (__n > 0)
+ while (__n--)
+ ++__i;
+ else
+ while (__n++)
+ --__i;
+ }
+ template<typename _RandomAccessIterator, typename _Distance>
+ inline void
+ __advance(_RandomAccessIterator& __i, _Distance __n,
+ random_access_iterator_tag)
+ {
+
+ __i += __n;
+ }
+ template<typename _InputIterator, typename _Distance>
+ inline void
+ advance(_InputIterator& __i, _Distance __n)
+ {
+ typename iterator_traits<_InputIterator>::difference_type __d = __n;
+ std::__advance(__i, __d, std::__iterator_category(__i));
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename iterator_traits<_Iterator>::difference_type
+ difference_type;
+ typedef typename iterator_traits<_Iterator>::reference reference;
+ typedef typename iterator_traits<_Iterator>::pointer pointer;
+ public:
+ reverse_iterator() : current() { }
+ explicit
+ reverse_iterator(iterator_type __x) : current(__x) { }
+ reverse_iterator(const reverse_iterator& __x)
+ : current(__x.current) { }
+ template<typename _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x)
+ : current(__x.base()) { }
+ iterator_type
+ base() const
+ { return current; }
+ reference
+ operator*() const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer
+ operator->() const
+ { return &(operator*()); }
+ reverse_iterator&
+ operator++()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator
+ operator++(int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator&
+ operator--()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator
+ operator--(int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator
+ operator+(difference_type __n) const
+ { return reverse_iterator(current - __n); }
+ reverse_iterator&
+ operator+=(difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator
+ operator-(difference_type __n) const
+ { return reverse_iterator(current + __n); }
+ reverse_iterator&
+ operator-=(difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference
+ operator[](difference_type __n) const
+ { return *(*this + __n); }
+ };
+ template<typename _Iterator>
+ inline bool
+ operator==(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator<(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _Iterator>
+ inline bool
+ operator!=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x == __y); }
+ template<typename _Iterator>
+ inline bool
+ operator>(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y < __x; }
+ template<typename _Iterator>
+ inline bool
+ operator<=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__y < __x); }
+ template<typename _Iterator>
+ inline bool
+ operator>=(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return !(__x < __y); }
+ template<typename _Iterator>
+ inline typename reverse_iterator<_Iterator>::difference_type
+ operator-(const reverse_iterator<_Iterator>& __x,
+ const reverse_iterator<_Iterator>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Iterator>
+ inline reverse_iterator<_Iterator>
+ operator+(typename reverse_iterator<_Iterator>::difference_type __n,
+ const reverse_iterator<_Iterator>& __x)
+ { return reverse_iterator<_Iterator>(__x.base() - __n); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator==(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __x.base() == __y.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() < __x.base(); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator!=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x == __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y < __x; }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator<=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__y < __x); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline bool
+ operator>=(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return !(__x < __y); }
+ template<typename _IteratorL, typename _IteratorR>
+ inline typename reverse_iterator<_IteratorL>::difference_type
+ operator-(const reverse_iterator<_IteratorL>& __x,
+ const reverse_iterator<_IteratorR>& __y)
+ { return __y.base() - __x.base(); }
+ template<typename _Container>
+ class back_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit
+ back_insert_iterator(_Container& __x) : container(&__x) { }
+ back_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_back(__value);
+ return *this;
+ }
+ back_insert_iterator&
+ operator*()
+ { return *this; }
+ back_insert_iterator&
+ operator++()
+ { return *this; }
+ back_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline back_insert_iterator<_Container>
+ back_inserter(_Container& __x)
+ { return back_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class front_insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ public:
+ typedef _Container container_type;
+ explicit front_insert_iterator(_Container& __x) : container(&__x) { }
+ front_insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ container->push_front(__value);
+ return *this;
+ }
+ front_insert_iterator&
+ operator*()
+ { return *this; }
+ front_insert_iterator&
+ operator++()
+ { return *this; }
+ front_insert_iterator
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container>
+ inline front_insert_iterator<_Container>
+ front_inserter(_Container& __x)
+ { return front_insert_iterator<_Container>(__x); }
+ template<typename _Container>
+ class insert_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ protected:
+ _Container* container;
+ typename _Container::iterator iter;
+ public:
+ typedef _Container container_type;
+ insert_iterator(_Container& __x, typename _Container::iterator __i)
+ : container(&__x), iter(__i) {}
+ insert_iterator&
+ operator=(typename _Container::const_reference __value)
+ {
+ iter = container->insert(iter, __value);
+ ++iter;
+ return *this;
+ }
+ insert_iterator&
+ operator*()
+ { return *this; }
+ insert_iterator&
+ operator++()
+ { return *this; }
+ insert_iterator&
+ operator++(int)
+ { return *this; }
+ };
+ template<typename _Container, typename _Iterator>
+ inline insert_iterator<_Container>
+ inserter(_Container& __x, _Iterator __i)
+ {
+ return insert_iterator<_Container>(__x,
+ typename _Container::iterator(__i));
+ }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ using std::iterator_traits;
+ using std::iterator;
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator
+ {
+ protected:
+ _Iterator _M_current;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename iterator_traits<_Iterator>::iterator_category
+ iterator_category;
+ typedef typename iterator_traits<_Iterator>::value_type value_type;
+ typedef typename iterator_traits<_Iterator>::difference_type
+ difference_type;
+ typedef typename iterator_traits<_Iterator>::reference reference;
+ typedef typename iterator_traits<_Iterator>::pointer pointer;
+ __normal_iterator() : _M_current(_Iterator()) { }
+ explicit
+ __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
+ template<typename _Iter>
+ __normal_iterator(const __normal_iterator<_Iter,
+ typename __enable_if<
+ (std::__are_same<_Iter, typename _Container::pointer>::__value),
+ _Container>::__type>& __i)
+ : _M_current(__i.base()) { }
+ reference
+ operator*() const
+ { return *_M_current; }
+ pointer
+ operator->() const
+ { return _M_current; }
+ __normal_iterator&
+ operator++()
+ {
+ ++_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator++(int)
+ { return __normal_iterator(_M_current++); }
+ __normal_iterator&
+ operator--()
+ {
+ --_M_current;
+ return *this;
+ }
+ __normal_iterator
+ operator--(int)
+ { return __normal_iterator(_M_current--); }
+ reference
+ operator[](const difference_type& __n) const
+ { return _M_current[__n]; }
+ __normal_iterator&
+ operator+=(const difference_type& __n)
+ { _M_current += __n; return *this; }
+ __normal_iterator
+ operator+(const difference_type& __n) const
+ { return __normal_iterator(_M_current + __n); }
+ __normal_iterator&
+ operator-=(const difference_type& __n)
+ { _M_current -= __n; return *this; }
+ __normal_iterator
+ operator-(const difference_type& __n) const
+ { return __normal_iterator(_M_current - __n); }
+ const _Iterator&
+ base() const
+ { return _M_current; }
+ };
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() == __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() != __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() < __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() > __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() <= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline bool
+ operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() >= __rhs.base(); }
+ template<typename _IteratorL, typename _IteratorR, typename _Container>
+ inline typename __normal_iterator<_IteratorL, _Container>::difference_type
+ operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
+ const __normal_iterator<_IteratorR, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline typename __normal_iterator<_Iterator, _Container>::difference_type
+ operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
+ const __normal_iterator<_Iterator, _Container>& __rhs)
+ { return __lhs.base() - __rhs.base(); }
+ template<typename _Iterator, typename _Container>
+ inline __normal_iterator<_Iterator, _Container>
+ operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
+ __n, const __normal_iterator<_Iterator, _Container>& __i)
+ { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
+}
+namespace std
+{
+ namespace __debug { }
+}
+namespace __gnu_debug
+{
+ using namespace std::__debug;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<bool _BoolType>
+ struct __iter_swap
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ _ValueType1 __tmp = (*__a);
+ *__a = (*__b);
+ *__b = (__tmp);
+ }
+ };
+ template<>
+ struct __iter_swap<true>
+ {
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ static void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ swap(*__a, *__b);
+ }
+ };
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ inline void
+ iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
+ {
+ typedef typename iterator_traits<_ForwardIterator1>::value_type
+ _ValueType1;
+ typedef typename iterator_traits<_ForwardIterator2>::value_type
+ _ValueType2;
+
+
+
+
+ typedef typename iterator_traits<_ForwardIterator1>::reference
+ _ReferenceType1;
+ typedef typename iterator_traits<_ForwardIterator2>::reference
+ _ReferenceType2;
+ std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value
+ && __are_same<_ValueType1&, _ReferenceType1>::__value
+ && __are_same<_ValueType2&, _ReferenceType2>::__value>::
+ iter_swap(__a, __b);
+ }
+ template<typename _ForwardIterator1, typename _ForwardIterator2>
+ _ForwardIterator2
+ swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
+ _ForwardIterator2 __first2)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ std::iter_swap(__first1, __first2);
+ return __first2;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__b < __a)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b)
+ {
+
+ if (__a < __b)
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ min(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__b, __a))
+ return __b;
+ return __a;
+ }
+ template<typename _Tp, typename _Compare>
+ inline const _Tp&
+ max(const _Tp& __a, const _Tp& __b, _Compare __comp)
+ {
+ if (__comp(__a, __b))
+ return __b;
+ return __a;
+ }
+ template<typename _Iterator,
+ bool _IsNormal = __is_normal_iterator<_Iterator>::__value>
+ struct __niter_base
+ {
+ static _Iterator
+ __b(_Iterator __it)
+ { return __it; }
+ };
+ template<typename _Iterator>
+ struct __niter_base<_Iterator, true>
+ {
+ static typename _Iterator::iterator_type
+ __b(_Iterator __it)
+ { return __it.base(); }
+ };
+ template<typename _Iterator,
+ bool _IsMove = __is_move_iterator<_Iterator>::__value>
+ struct __miter_base
+ {
+ static _Iterator
+ __b(_Iterator __it)
+ { return __it; }
+ };
+ template<typename _Iterator>
+ struct __miter_base<_Iterator, true>
+ {
+ static typename _Iterator::iterator_type
+ __b(_Iterator __it)
+ { return __it.base(); }
+ };
+ template<bool, bool, typename>
+ struct __copy_move
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ for (; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move<false, false, random_access_iterator_tag>
+ {
+ template<typename _II, typename _OI>
+ static _OI
+ __copy_m(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::difference_type _Distance;
+ for(_Distance __n = __last - __first; __n > 0; --__n)
+ {
+ *__result = *__first;
+ ++__first;
+ ++__result;
+ }
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ __builtin_memmove(__result, __first,
+ sizeof(_Tp) * (__last - __first));
+ return __result + (__last - __first);
+ }
+ };
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a(_II __first, _II __last, _OI __result)
+ {
+ typedef typename iterator_traits<_II>::value_type _ValueTypeI;
+ typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
+ typedef typename iterator_traits<_II>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueTypeI)
+ && __is_pointer<_II>::__value
+ && __is_pointer<_OI>::__value
+ && __are_same<_ValueTypeI, _ValueTypeO>::__value);
+ return std::__copy_move<_IsMove, __simple,
+ _Category>::__copy_m(__first, __last, __result);
+ }
+ template<typename _CharT>
+ struct char_traits;
+ template<typename _CharT, typename _Traits>
+ class istreambuf_iterator;
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator;
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(_CharT*, _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
+ __copy_move_a2(const _CharT*, const _CharT*,
+ ostreambuf_iterator<_CharT, char_traits<_CharT> >);
+ template<bool _IsMove, typename _CharT>
+ typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
+ _CharT*>::__type
+ __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
+ istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
+ template<bool _IsMove, typename _II, typename _OI>
+ inline _OI
+ __copy_move_a2(_II __first, _II __last, _OI __result)
+ {
+ return _OI(std::__copy_move_a<_IsMove>
+ (std::__niter_base<_II>::__b(__first),
+ std::__niter_base<_II>::__b(__last),
+ std::__niter_base<_OI>::__b(__result)));
+ }
+ template<typename _II, typename _OI>
+ inline _OI
+ copy(_II __first, _II __last, _OI __result)
+ {
+
+
+ ;
+ return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
+ (std::__miter_base<_II>::__b(__first),
+ std::__miter_base<_II>::__b(__last), __result));
+ }
+ template<bool, bool, typename>
+ struct __copy_move_backward
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ while (__first != __last)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<>
+ struct __copy_move_backward<false, false, random_access_iterator_tag>
+ {
+ template<typename _BI1, typename _BI2>
+ static _BI2
+ __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typename iterator_traits<_BI1>::difference_type __n;
+ for (__n = __last - __first; __n > 0; --__n)
+ *--__result = *--__last;
+ return __result;
+ }
+ };
+ template<bool _IsMove>
+ struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
+ {
+ template<typename _Tp>
+ static _Tp*
+ __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
+ {
+ const ptrdiff_t _Num = __last - __first;
+ __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
+ return __result - _Num;
+ }
+ };
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ typedef typename iterator_traits<_BI1>::value_type _ValueType1;
+ typedef typename iterator_traits<_BI2>::value_type _ValueType2;
+ typedef typename iterator_traits<_BI1>::iterator_category _Category;
+ const bool __simple = (__is_pod(_ValueType1)
+ && __is_pointer<_BI1>::__value
+ && __is_pointer<_BI2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__copy_move_backward<_IsMove, __simple,
+ _Category>::__copy_move_b(__first,
+ __last,
+ __result);
+ }
+ template<bool _IsMove, typename _BI1, typename _BI2>
+ inline _BI2
+ __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+ return _BI2(std::__copy_move_backward_a<_IsMove>
+ (std::__niter_base<_BI1>::__b(__first),
+ std::__niter_base<_BI1>::__b(__last),
+ std::__niter_base<_BI2>::__b(__result)));
+ }
+ template<typename _BI1, typename _BI2>
+ inline _BI2
+ copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
+ {
+
+
+
+ ;
+ return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+ (std::__miter_base<_BI1>::__b(__first),
+ std::__miter_base<_BI1>::__b(__last), __result));
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ for (; __first != __last; ++__first)
+ *__first = __value;
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
+ __fill_a(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __first != __last; ++__first)
+ *__first = __tmp;
+ }
+ template<typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
+ __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
+ {
+ const _Tp __tmp = __c;
+ __builtin_memset(__first, static_cast<unsigned char>(__tmp),
+ __last - __first);
+ }
+ template<typename _ForwardIterator, typename _Tp>
+ inline void
+ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ {
+
+ ;
+ std::__fill_a(std::__niter_base<_ForwardIterator>::__b(__first),
+ std::__niter_base<_ForwardIterator>::__b(__last), __value);
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ for (; __n > 0; --__n, ++__first)
+ *__first = __value;
+ return __first;
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
+ __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ const _Tp __tmp = __value;
+ for (; __n > 0; --__n, ++__first)
+ *__first = __tmp;
+ return __first;
+ }
+ template<typename _Size, typename _Tp>
+ inline typename
+ __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
+ __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
+ {
+ std::__fill_a(__first, __first + __n, __c);
+ return __first + __n;
+ }
+ template<typename _OI, typename _Size, typename _Tp>
+ inline _OI
+ fill_n(_OI __first, _Size __n, const _Tp& __value)
+ {
+
+ return _OI(std::__fill_n_a(std::__niter_base<_OI>::__b(__first),
+ __n, __value));
+ }
+ template<bool _BoolType>
+ struct __equal
+ {
+ template<typename _II1, typename _II2>
+ static bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!(*__first1 == *__first2))
+ return false;
+ return true;
+ }
+ };
+ template<>
+ struct __equal<true>
+ {
+ template<typename _Tp>
+ static bool
+ equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
+ {
+ return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
+ * (__last1 - __first1));
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple = (__is_integer<_ValueType1>::__value
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value
+ && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__equal<__simple>::equal(__first1, __last1, __first2);
+ }
+ template<typename, typename>
+ struct __lc_rai
+ {
+ template<typename _II1, typename _II2>
+ static _II1
+ __newlast1(_II1, _II1 __last1, _II2, _II2)
+ { return __last1; }
+ template<typename _II>
+ static bool
+ __cnd2(_II __first, _II __last)
+ { return __first != __last; }
+ };
+ template<>
+ struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
+ {
+ template<typename _RAI1, typename _RAI2>
+ static _RAI1
+ __newlast1(_RAI1 __first1, _RAI1 __last1,
+ _RAI2 __first2, _RAI2 __last2)
+ {
+ const typename iterator_traits<_RAI1>::difference_type
+ __diff1 = __last1 - __first1;
+ const typename iterator_traits<_RAI2>::difference_type
+ __diff2 = __last2 - __first2;
+ return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
+ }
+ template<typename _RAI>
+ static bool
+ __cnd2(_RAI, _RAI)
+ { return true; }
+ };
+ template<bool _BoolType>
+ struct __lexicographical_compare
+ {
+ template<typename _II1, typename _II2>
+ static bool __lc(_II1, _II1, _II2, _II2);
+ };
+ template<bool _BoolType>
+ template<typename _II1, typename _II2>
+ bool
+ __lexicographical_compare<_BoolType>::
+ __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+ __last1 = __rai_type::__newlast1(__first1, __last1,
+ __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (*__first1 < *__first2)
+ return true;
+ if (*__first2 < *__first1)
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<>
+ struct __lexicographical_compare<true>
+ {
+ template<typename _Tp, typename _Up>
+ static bool
+ __lc(const _Tp* __first1, const _Tp* __last1,
+ const _Up* __first2, const _Up* __last2)
+ {
+ const size_t __len1 = __last1 - __first1;
+ const size_t __len2 = __last2 - __first2;
+ const int __result = __builtin_memcmp(__first1, __first2,
+ std::min(__len1, __len2));
+ return __result != 0 ? __result < 0 : __len1 < __len2;
+ }
+ };
+ template<typename _II1, typename _II2>
+ inline bool
+ __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple =
+ (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value
+ && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed
+ && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed
+ && __is_pointer<_II1>::__value
+ && __is_pointer<_II2>::__value);
+ return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
+ __first2, __last2);
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _II1, typename _II2>
+ inline bool
+ equal(_II1 __first1, _II1 __last1, _II2 __first2)
+ {
+
+
+
+ ;
+ return std::__equal_aux(std::__niter_base<_II1>::__b(__first1),
+ std::__niter_base<_II1>::__b(__last1),
+ std::__niter_base<_II2>::__b(__first2));
+ }
+ template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
+ inline bool
+ equal(_IIter1 __first1, _IIter1 __last1,
+ _IIter2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ for (; __first1 != __last1; ++__first1, ++__first2)
+ if (!bool(__binary_pred(*__first1, *__first2)))
+ return false;
+ return true;
+ }
+ template<typename _II1, typename _II2>
+ inline bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2)
+ {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+
+
+
+
+ ;
+ ;
+ return std::__lexicographical_compare_aux
+ (std::__niter_base<_II1>::__b(__first1),
+ std::__niter_base<_II1>::__b(__last1),
+ std::__niter_base<_II2>::__b(__first2),
+ std::__niter_base<_II2>::__b(__last2));
+ }
+ template<typename _II1, typename _II2, typename _Compare>
+ bool
+ lexicographical_compare(_II1 __first1, _II1 __last1,
+ _II2 __first2, _II2 __last2, _Compare __comp)
+ {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef std::__lc_rai<_Category1, _Category2> __rai_type;
+
+
+ ;
+ ;
+ __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
+ for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2)
+ {
+ if (__comp(*__first1, *__first2))
+ return true;
+ if (__comp(*__first2, *__first1))
+ return false;
+ }
+ return __first1 == __last1 && __first2 != __last2;
+ }
+ template<typename _InputIterator1, typename _InputIterator2>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2)
+ {
+
+
+
+ ;
+ while (__first1 != __last1 && *__first1 == *__first2)
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+ template<typename _InputIterator1, typename _InputIterator2,
+ typename _BinaryPredicate>
+ pair<_InputIterator1, _InputIterator2>
+ mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
+ _InputIterator2 __first2, _BinaryPredicate __binary_pred)
+ {
+
+
+ ;
+ while (__first1 != __last1 && bool(__binary_pred(*__first1, *__first2)))
+ {
+ ++__first1;
+ ++__first2;
+ }
+ return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
+ }
+}
+
+extern "C++" {
+namespace std
+{
+ class exception
+ {
+ public:
+ exception() throw() { }
+ virtual ~exception() throw();
+ virtual const char* what() const throw();
+ };
+ class bad_exception : public exception
+ {
+ public:
+ bad_exception() throw() { }
+ virtual ~bad_exception() throw();
+ virtual const char* what() const throw();
+ };
+ typedef void (*terminate_handler) ();
+ typedef void (*unexpected_handler) ();
+ terminate_handler set_terminate(terminate_handler) throw();
+ void terminate() __attribute__ ((__noreturn__));
+ unexpected_handler set_unexpected(unexpected_handler) throw();
+ void unexpected() __attribute__ ((__noreturn__));
+ bool uncaught_exception() throw();
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ void __verbose_terminate_handler();
+}
+}
+extern "C++" {
+namespace std
+{
+ class bad_alloc : public exception
+ {
+ public:
+ bad_alloc() throw() { }
+ virtual ~bad_alloc() throw();
+ virtual const char* what() const throw();
+ };
+ struct nothrow_t { };
+ extern const nothrow_t nothrow;
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler) throw();
+}
+void* operator new(std::size_t) throw (std::bad_alloc);
+void* operator new[](std::size_t) throw (std::bad_alloc);
+void operator delete(void*) throw();
+void operator delete[](void*) throw();
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { }
+inline void operator delete[](void*, void*) throw() { }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+ ~new_allocator() throw() { }
+ pointer
+ address(reference __x) const { return &__x; }
+ const_pointer
+ address(const_reference __x) const { return &__x; }
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__builtin_expect(__n > this->max_size(), false))
+ std::__throw_bad_alloc();
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+ size_type
+ max_size() const throw()
+ { return size_t(-1) / sizeof(_Tp); }
+ void
+ construct(pointer __p, const _Tp& __val)
+ { ::new((void *)__p) _Tp(__val); }
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+ template<typename _Tp>
+ inline bool
+ operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return false; }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class allocator;
+ template<>
+ class allocator<void>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ };
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ allocator() throw() { }
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+ ~allocator() throw() { }
+ };
+ template<typename _T1, typename _T2>
+ inline bool
+ operator==(const allocator<_T1>&, const allocator<_T2>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator==(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return true; }
+ template<typename _T1, typename _T2>
+ inline bool
+ operator!=(const allocator<_T1>&, const allocator<_T2>&)
+ { return false; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return false; }
+ extern template class allocator<char>;
+ extern template class allocator<wchar_t>;
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_swap
+ { static void _S_do_it(_Alloc&, _Alloc&) { } };
+ template<typename _Alloc>
+ struct __alloc_swap<_Alloc, false>
+ {
+ static void
+ _S_do_it(_Alloc& __one, _Alloc& __two)
+ {
+ if (__one != __two)
+ swap(__one, __two);
+ }
+ };
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_neq
+ {
+ static bool
+ _S_do_it(const _Alloc&, const _Alloc&)
+ { return false; }
+ };
+ template<typename _Alloc>
+ struct __alloc_neq<_Alloc, false>
+ {
+ static bool
+ _S_do_it(const _Alloc& __one, const _Alloc& __two)
+ { return __one != __two; }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct _List_node_base
+ {
+ _List_node_base* _M_next;
+ _List_node_base* _M_prev;
+ static void
+ swap(_List_node_base& __x, _List_node_base& __y);
+ void
+ transfer(_List_node_base * const __first,
+ _List_node_base * const __last);
+ void
+ reverse();
+ void
+ hook(_List_node_base * const __position);
+ void
+ unhook();
+ };
+ template<typename _Tp>
+ struct _List_node : public _List_node_base
+ {
+ _Tp _M_data;
+ };
+ template<typename _Tp>
+ struct _List_iterator
+ {
+ typedef _List_iterator<_Tp> _Self;
+ typedef _List_node<_Tp> _Node;
+ typedef ptrdiff_t difference_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ _List_iterator()
+ : _M_node() { }
+ explicit
+ _List_iterator(_List_node_base* __x)
+ : _M_node(__x) { }
+ reference
+ operator*() const
+ { return static_cast<_Node*>(_M_node)->_M_data; }
+ pointer
+ operator->() const
+ { return &static_cast<_Node*>(_M_node)->_M_data; }
+ _Self&
+ operator++()
+ {
+ _M_node = _M_node->_M_next;
+ return *this;
+ }
+ _Self
+ operator++(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_next;
+ return __tmp;
+ }
+ _Self&
+ operator--()
+ {
+ _M_node = _M_node->_M_prev;
+ return *this;
+ }
+ _Self
+ operator--(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_prev;
+ return __tmp;
+ }
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+ _List_node_base* _M_node;
+ };
+ template<typename _Tp>
+ struct _List_const_iterator
+ {
+ typedef _List_const_iterator<_Tp> _Self;
+ typedef const _List_node<_Tp> _Node;
+ typedef _List_iterator<_Tp> iterator;
+ typedef ptrdiff_t difference_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ _List_const_iterator()
+ : _M_node() { }
+ explicit
+ _List_const_iterator(const _List_node_base* __x)
+ : _M_node(__x) { }
+ _List_const_iterator(const iterator& __x)
+ : _M_node(__x._M_node) { }
+ reference
+ operator*() const
+ { return static_cast<_Node*>(_M_node)->_M_data; }
+ pointer
+ operator->() const
+ { return &static_cast<_Node*>(_M_node)->_M_data; }
+ _Self&
+ operator++()
+ {
+ _M_node = _M_node->_M_next;
+ return *this;
+ }
+ _Self
+ operator++(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_next;
+ return __tmp;
+ }
+ _Self&
+ operator--()
+ {
+ _M_node = _M_node->_M_prev;
+ return *this;
+ }
+ _Self
+ operator--(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _M_node->_M_prev;
+ return __tmp;
+ }
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+ const _List_node_base* _M_node;
+ };
+ template<typename _Val>
+ inline bool
+ operator==(const _List_iterator<_Val>& __x,
+ const _List_const_iterator<_Val>& __y)
+ { return __x._M_node == __y._M_node; }
+ template<typename _Val>
+ inline bool
+ operator!=(const _List_iterator<_Val>& __x,
+ const _List_const_iterator<_Val>& __y)
+ { return __x._M_node != __y._M_node; }
+ template<typename _Tp, typename _Alloc>
+ class _List_base
+ {
+ protected:
+ typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
+ _Node_alloc_type;
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+ struct _List_impl
+ : public _Node_alloc_type
+ {
+ _List_node_base _M_node;
+ _List_impl()
+ : _Node_alloc_type(), _M_node()
+ { }
+ _List_impl(const _Node_alloc_type& __a)
+ : _Node_alloc_type(__a), _M_node()
+ { }
+ };
+ _List_impl _M_impl;
+ _List_node<_Tp>*
+ _M_get_node()
+ { return _M_impl._Node_alloc_type::allocate(1); }
+ void
+ _M_put_node(_List_node<_Tp>* __p)
+ { _M_impl._Node_alloc_type::deallocate(__p, 1); }
+ public:
+ typedef _Alloc allocator_type;
+ _Node_alloc_type&
+ _M_get_Node_allocator()
+ { return *static_cast<_Node_alloc_type*>(&this->_M_impl); }
+ const _Node_alloc_type&
+ _M_get_Node_allocator() const
+ { return *static_cast<const _Node_alloc_type*>(&this->_M_impl); }
+ _Tp_alloc_type
+ _M_get_Tp_allocator() const
+ { return _Tp_alloc_type(_M_get_Node_allocator()); }
+ allocator_type
+ get_allocator() const
+ { return allocator_type(_M_get_Node_allocator()); }
+ _List_base()
+ : _M_impl()
+ { _M_init(); }
+ _List_base(const allocator_type& __a)
+ : _M_impl(__a)
+ { _M_init(); }
+ ~_List_base()
+ { _M_clear(); }
+ void
+ _M_clear();
+ void
+ _M_init()
+ {
+ this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
+ this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
+ }
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
+ class list : protected _List_base<_Tp, _Alloc>
+ {
+ typedef typename _Alloc::value_type _Alloc_value_type;
+
+
+ typedef _List_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:
+ typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
+ typedef _List_iterator<_Tp> iterator;
+ typedef _List_const_iterator<_Tp> const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Alloc allocator_type;
+ protected:
+ typedef _List_node<_Tp> _Node;
+ using _Base::_M_impl;
+ using _Base::_M_put_node;
+ using _Base::_M_get_node;
+ using _Base::_M_get_Tp_allocator;
+ using _Base::_M_get_Node_allocator;
+ _Node*
+ _M_create_node(const value_type& __x)
+ {
+ _Node* __p = this->_M_get_node();
+ try
+ {
+ _M_get_Tp_allocator().construct(&__p->_M_data, __x);
+ }
+ catch(...)
+ {
+ _M_put_node(__p);
+ throw;
+ }
+ return __p;
+ }
+ public:
+ list()
+ : _Base() { }
+ explicit
+ list(const allocator_type& __a)
+ : _Base(__a) { }
+ explicit
+ list(size_type __n, const value_type& __value = value_type(),
+ const allocator_type& __a = allocator_type())
+ : _Base(__a)
+ { _M_fill_initialize(__n, __value); }
+ list(const list& __x)
+ : _Base(__x._M_get_Node_allocator())
+ { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
+ template<typename _InputIterator>
+ list(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type())
+ : _Base(__a)
+ {
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ _M_initialize_dispatch(__first, __last, _Integral());
+ }
+ list&
+ operator=(const list& __x);
+ void
+ assign(size_type __n, const value_type& __val)
+ { _M_fill_assign(__n, __val); }
+ template<typename _InputIterator>
+ void
+ assign(_InputIterator __first, _InputIterator __last)
+ {
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ _M_assign_dispatch(__first, __last, _Integral());
+ }
+ allocator_type
+ get_allocator() const
+ { return _Base::get_allocator(); }
+ iterator
+ begin()
+ { return iterator(this->_M_impl._M_node._M_next); }
+ const_iterator
+ begin() const
+ { return const_iterator(this->_M_impl._M_node._M_next); }
+ iterator
+ end()
+ { return iterator(&this->_M_impl._M_node); }
+ const_iterator
+ end() const
+ { return const_iterator(&this->_M_impl._M_node); }
+ reverse_iterator
+ rbegin()
+ { return reverse_iterator(end()); }
+ const_reverse_iterator
+ rbegin() const
+ { return const_reverse_iterator(end()); }
+ reverse_iterator
+ rend()
+ { return reverse_iterator(begin()); }
+ const_reverse_iterator
+ rend() const
+ { return const_reverse_iterator(begin()); }
+ bool
+ empty() const
+ { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
+ size_type
+ size() const
+ { return std::distance(begin(), end()); }
+ size_type
+ max_size() const
+ { return _M_get_Node_allocator().max_size(); }
+ void
+ resize(size_type __new_size, value_type __x = value_type());
+ reference
+ front()
+ { return *begin(); }
+ const_reference
+ front() const
+ { return *begin(); }
+ reference
+ back()
+ {
+ iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+ const_reference
+ back() const
+ {
+ const_iterator __tmp = end();
+ --__tmp;
+ return *__tmp;
+ }
+ void
+ push_front(const value_type& __x)
+ { this->_M_insert(begin(), __x); }
+ void
+ pop_front()
+ { this->_M_erase(begin()); }
+ void
+ push_back(const value_type& __x)
+ { this->_M_insert(end(), __x); }
+ void
+ pop_back()
+ { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
+ iterator
+ insert(iterator __position, const value_type& __x);
+ void
+ insert(iterator __position, size_type __n, const value_type& __x)
+ {
+ list __tmp(__n, __x, _M_get_Node_allocator());
+ splice(__position, __tmp);
+ }
+ template<typename _InputIterator>
+ void
+ insert(iterator __position, _InputIterator __first,
+ _InputIterator __last)
+ {
+ list __tmp(__first, __last, _M_get_Node_allocator());
+ splice(__position, __tmp);
+ }
+ iterator
+ erase(iterator __position);
+ iterator
+ erase(iterator __first, iterator __last)
+ {
+ while (__first != __last)
+ __first = erase(__first);
+ return __last;
+ }
+ void
+ swap(list& __x)
+ {
+ _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node);
+ std::__alloc_swap<typename _Base::_Node_alloc_type>::
+ _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator());
+ }
+ void
+ clear()
+ {
+ _Base::_M_clear();
+ _Base::_M_init();
+ }
+ void
+ splice(iterator __position, list& __x)
+ {
+ if (!__x.empty())
+ {
+ _M_check_equal_allocators(__x);
+ this->_M_transfer(__position, __x.begin(), __x.end());
+ }
+ }
+ void
+ splice(iterator __position, list& __x, iterator __i)
+ {
+ iterator __j = __i;
+ ++__j;
+ if (__position == __i || __position == __j)
+ return;
+ if (this != &__x)
+ _M_check_equal_allocators(__x);
+ this->_M_transfer(__position, __i, __j);
+ }
+ void
+ splice(iterator __position, list& __x, iterator __first,
+ iterator __last)
+ {
+ if (__first != __last)
+ {
+ if (this != &__x)
+ _M_check_equal_allocators(__x);
+ this->_M_transfer(__position, __first, __last);
+ }
+ }
+ void
+ remove(const _Tp& __value);
+ template<typename _Predicate>
+ void
+ remove_if(_Predicate);
+ void
+ unique();
+ template<typename _BinaryPredicate>
+ void
+ unique(_BinaryPredicate);
+ void
+ merge(list& __x);
+ template<typename _StrictWeakOrdering>
+ void
+ merge(list&, _StrictWeakOrdering);
+ void
+ reverse()
+ { this->_M_impl._M_node.reverse(); }
+ void
+ sort();
+ template<typename _StrictWeakOrdering>
+ void
+ sort(_StrictWeakOrdering);
+ protected:
+ template<typename _Integer>
+ void
+ _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
+ { _M_fill_initialize(static_cast<size_type>(__n), __x); }
+ template<typename _InputIterator>
+ void
+ _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
+ __false_type)
+ {
+ for (; __first != __last; ++__first)
+ push_back(*__first);
+ }
+ void
+ _M_fill_initialize(size_type __n, const value_type& __x)
+ {
+ for (; __n > 0; --__n)
+ push_back(__x);
+ }
+ template<typename _Integer>
+ void
+ _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
+ { _M_fill_assign(__n, __val); }
+ template<typename _InputIterator>
+ void
+ _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
+ __false_type);
+ void
+ _M_fill_assign(size_type __n, const value_type& __val);
+ void
+ _M_transfer(iterator __position, iterator __first, iterator __last)
+ { __position._M_node->transfer(__first._M_node, __last._M_node); }
+ void
+ _M_insert(iterator __position, const value_type& __x)
+ {
+ _Node* __tmp = _M_create_node(__x);
+ __tmp->hook(__position._M_node);
+ }
+ void
+ _M_erase(iterator __position)
+ {
+ __position._M_node->unhook();
+ _Node* __n = static_cast<_Node*>(__position._M_node);
+ _M_get_Tp_allocator().destroy(&__n->_M_data);
+ _M_put_node(__n);
+ }
+ void
+ _M_check_equal_allocators(list& __x)
+ {
+ if (std::__alloc_neq<typename _Base::_Node_alloc_type>::
+ _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
+ __throw_runtime_error(("list::_M_check_equal_allocators"));
+ }
+ };
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ {
+ typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
+ const_iterator __end1 = __x.end();
+ const_iterator __end2 = __y.end();
+ const_iterator __i1 = __x.begin();
+ const_iterator __i2 = __y.begin();
+ while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)
+ {
+ ++__i1;
+ ++__i2;
+ }
+ return __i1 == __end1 && __i2 == __end2;
+ }
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ { return std::lexicographical_compare(__x.begin(), __x.end(),
+ __y.begin(), __y.end()); }
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ { return !(__x == __y); }
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ { return __y < __x; }
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ { return !(__y < __x); }
+ template<typename _Tp, typename _Alloc>
+ inline bool
+ operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
+ { return !(__x < __y); }
+ template<typename _Tp, typename _Alloc>
+ inline void
+ swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
+ { __x.swap(__y); }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp, typename _Alloc>
+ void
+ _List_base<_Tp, _Alloc>::
+ _M_clear()
+ {
+ typedef _List_node<_Tp> _Node;
+ _Node* __cur = static_cast<_Node*>(this->_M_impl._M_node._M_next);
+ while (__cur != &this->_M_impl._M_node)
+ {
+ _Node* __tmp = __cur;
+ __cur = static_cast<_Node*>(__cur->_M_next);
+ _M_get_Tp_allocator().destroy(&__tmp->_M_data);
+ _M_put_node(__tmp);
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ typename list<_Tp, _Alloc>::iterator
+ list<_Tp, _Alloc>::
+ insert(iterator __position, const value_type& __x)
+ {
+ _Node* __tmp = _M_create_node(__x);
+ __tmp->hook(__position._M_node);
+ return iterator(__tmp);
+ }
+ template<typename _Tp, typename _Alloc>
+ typename list<_Tp, _Alloc>::iterator
+ list<_Tp, _Alloc>::
+ erase(iterator __position)
+ {
+ iterator __ret = iterator(__position._M_node->_M_next);
+ _M_erase(__position);
+ return __ret;
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ resize(size_type __new_size, value_type __x)
+ {
+ iterator __i = begin();
+ size_type __len = 0;
+ for (; __i != end() && __len < __new_size; ++__i, ++__len)
+ ;
+ if (__len == __new_size)
+ erase(__i, end());
+ else
+ insert(end(), __new_size - __len, __x);
+ }
+ template<typename _Tp, typename _Alloc>
+ list<_Tp, _Alloc>&
+ list<_Tp, _Alloc>::
+ operator=(const list& __x)
+ {
+ if (this != &__x)
+ {
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ const_iterator __first2 = __x.begin();
+ const_iterator __last2 = __x.end();
+ for (; __first1 != __last1 && __first2 != __last2;
+ ++__first1, ++__first2)
+ *__first1 = *__first2;
+ if (__first2 == __last2)
+ erase(__first1, __last1);
+ else
+ insert(__last1, __first2, __last2);
+ }
+ return *this;
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ _M_fill_assign(size_type __n, const value_type& __val)
+ {
+ iterator __i = begin();
+ for (; __i != end() && __n > 0; ++__i, --__n)
+ *__i = __val;
+ if (__n > 0)
+ insert(end(), __n, __val);
+ else
+ erase(__i, end());
+ }
+ template<typename _Tp, typename _Alloc>
+ template <typename _InputIterator>
+ void
+ list<_Tp, _Alloc>::
+ _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
+ __false_type)
+ {
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ for (; __first1 != __last1 && __first2 != __last2;
+ ++__first1, ++__first2)
+ *__first1 = *__first2;
+ if (__first2 == __last2)
+ erase(__first1, __last1);
+ else
+ insert(__last1, __first2, __last2);
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ remove(const value_type& __value)
+ {
+ iterator __first = begin();
+ iterator __last = end();
+ iterator __extra = __last;
+ while (__first != __last)
+ {
+ iterator __next = __first;
+ ++__next;
+ if (*__first == __value)
+ {
+ if (&*__first != &__value)
+ _M_erase(__first);
+ else
+ __extra = __first;
+ }
+ __first = __next;
+ }
+ if (__extra != __last)
+ _M_erase(__extra);
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ unique()
+ {
+ iterator __first = begin();
+ iterator __last = end();
+ if (__first == __last)
+ return;
+ iterator __next = __first;
+ while (++__next != __last)
+ {
+ if (*__first == *__next)
+ _M_erase(__next);
+ else
+ __first = __next;
+ __next = __first;
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ merge(list& __x)
+ {
+ if (this != &__x)
+ {
+ _M_check_equal_allocators(__x);
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ iterator __first2 = __x.begin();
+ iterator __last2 = __x.end();
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first2 < *__first1)
+ {
+ iterator __next = __first2;
+ _M_transfer(__first1, __first2, ++__next);
+ __first2 = __next;
+ }
+ else
+ ++__first1;
+ if (__first2 != __last2)
+ _M_transfer(__last1, __first2, __last2);
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ template <typename _StrictWeakOrdering>
+ void
+ list<_Tp, _Alloc>::
+ merge(list& __x, _StrictWeakOrdering __comp)
+ {
+ if (this != &__x)
+ {
+ _M_check_equal_allocators(__x);
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ iterator __first2 = __x.begin();
+ iterator __last2 = __x.end();
+ while (__first1 != __last1 && __first2 != __last2)
+ if (__comp(*__first2, *__first1))
+ {
+ iterator __next = __first2;
+ _M_transfer(__first1, __first2, ++__next);
+ __first2 = __next;
+ }
+ else
+ ++__first1;
+ if (__first2 != __last2)
+ _M_transfer(__last1, __first2, __last2);
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ void
+ list<_Tp, _Alloc>::
+ sort()
+ {
+ if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
+ && this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
+ {
+ list __carry;
+ list __tmp[64];
+ list * __fill = &__tmp[0];
+ list * __counter;
+ do
+ {
+ __carry.splice(__carry.begin(), *this, begin());
+ for(__counter = &__tmp[0];
+ __counter != __fill && !__counter->empty();
+ ++__counter)
+ {
+ __counter->merge(__carry);
+ __carry.swap(*__counter);
+ }
+ __carry.swap(*__counter);
+ if (__counter == __fill)
+ ++__fill;
+ }
+ while ( !empty() );
+ for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
+ __counter->merge(*(__counter - 1));
+ swap( *(__fill - 1) );
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ template <typename _Predicate>
+ void
+ list<_Tp, _Alloc>::
+ remove_if(_Predicate __pred)
+ {
+ iterator __first = begin();
+ iterator __last = end();
+ while (__first != __last)
+ {
+ iterator __next = __first;
+ ++__next;
+ if (__pred(*__first))
+ _M_erase(__first);
+ __first = __next;
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ template <typename _BinaryPredicate>
+ void
+ list<_Tp, _Alloc>::
+ unique(_BinaryPredicate __binary_pred)
+ {
+ iterator __first = begin();
+ iterator __last = end();
+ if (__first == __last)
+ return;
+ iterator __next = __first;
+ while (++__next != __last)
+ {
+ if (__binary_pred(*__first, *__next))
+ _M_erase(__next);
+ else
+ __first = __next;
+ __next = __first;
+ }
+ }
+ template<typename _Tp, typename _Alloc>
+ template <typename _StrictWeakOrdering>
+ void
+ list<_Tp, _Alloc>::
+ sort(_StrictWeakOrdering __comp)
+ {
+ if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
+ && this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
+ {
+ list __carry;
+ list __tmp[64];
+ list * __fill = &__tmp[0];
+ list * __counter;
+ do
+ {
+ __carry.splice(__carry.begin(), *this, begin());
+ for(__counter = &__tmp[0];
+ __counter != __fill && !__counter->empty();
+ ++__counter)
+ {
+ __counter->merge(__carry, __comp);
+ __carry.swap(*__counter);
+ }
+ __carry.swap(*__counter);
+ if (__counter == __fill)
+ ++__fill;
+ }
+ while ( !empty() );
+ for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
+ __counter->merge(*(__counter - 1), __comp);
+ swap(*(__fill - 1));
+ }
+ }
+}
+extern void foobarit(void);
+class Game
+{
+public:
+ struct BuildProject
+ {
+ int posX;
+ };
+ std::list<BuildProject> buildProjects;
+};
+static Game game;
+static std::list<std::list<Game::BuildProject>::iterator>
+erasableBuildProjects;
+void *buildProjectSyncStepConcurrently(int id, int localTeam)
+{
+ __transaction_relaxed {
+ std::list<std::list<Game::BuildProject>::iterator>::iterator it
+= erasableBuildProjects.begin();
+ foobarit();
+ game.buildProjects.erase( (std::list<Game::BuildProject>
+::iterator) *it);
+ }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46646.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46646.C
new file mode 100644
index 000000000..9431615b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46646.C
@@ -0,0 +1,890 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0"}
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _T1, class _T2>
+ struct pair
+ {
+ typedef _T1 first_type;
+ typedef _T2 second_type;
+ _T1 first;
+ _T2 second;
+ pair()
+ : first(), second() { }
+ pair(const _T1& __a, const _T2& __b)
+ : first(__a), second(__b) { }
+ };
+}
+
+
+typedef long int ptrdiff_t;
+typedef __SIZE_TYPE__ size_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::ptrdiff_t;
+ using ::size_t;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ struct input_iterator_tag { };
+ struct output_iterator_tag { };
+ struct forward_iterator_tag : public input_iterator_tag { };
+ struct bidirectional_iterator_tag : public forward_iterator_tag { };
+ struct random_access_iterator_tag : public bidirectional_iterator_tag { };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
+ typename _Pointer = _Tp*, typename _Reference = _Tp&>
+ struct iterator
+ {
+ typedef _Category iterator_category;
+ typedef _Tp value_type;
+ typedef _Distance difference_type;
+ typedef _Pointer pointer;
+ typedef _Reference reference;
+ };
+ template<typename _Iterator>
+ struct iterator_traits
+ {
+ typedef typename _Iterator::iterator_category iterator_category;
+ typedef typename _Iterator::value_type value_type;
+ typedef typename _Iterator::difference_type difference_type;
+ typedef typename _Iterator::pointer pointer;
+ typedef typename _Iterator::reference reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<_Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ };
+ template<typename _Tp>
+ struct iterator_traits<const _Tp*>
+ {
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef ptrdiff_t difference_type;
+ typedef const _Tp* pointer;
+ typedef const _Tp& reference;
+ };
+ template<typename _Iter>
+ inline typename iterator_traits<_Iter>::iterator_category
+ __iterator_category(const _Iter&)
+ { return typename iterator_traits<_Iter>::iterator_category(); }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator>
+ class reverse_iterator
+ : public iterator<typename iterator_traits<_Iterator>::iterator_category,
+ typename iterator_traits<_Iterator>::value_type,
+ typename iterator_traits<_Iterator>::difference_type,
+ typename iterator_traits<_Iterator>::pointer,
+ typename iterator_traits<_Iterator>::reference>
+ {
+ protected:
+ _Iterator current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef _Iterator iterator_type;
+ typedef typename __traits_type::difference_type difference_type;
+ typedef typename __traits_type::pointer pointer;
+ typedef typename __traits_type::reference reference;
+ reverse_iterator() : current() { }
+ explicit
+ reverse_iterator(iterator_type __x) : current(__x) { }
+ reverse_iterator(const reverse_iterator& __x)
+ : current(__x.current) { }
+ template<typename _Iter>
+ reverse_iterator(const reverse_iterator<_Iter>& __x)
+ : current(__x.base()) { }
+ iterator_type
+ base() const
+ { return current; }
+ reference
+ operator*() const
+ {
+ _Iterator __tmp = current;
+ return *--__tmp;
+ }
+ pointer
+ operator->() const
+ { return &(operator*()); }
+ reverse_iterator&
+ operator++()
+ {
+ --current;
+ return *this;
+ }
+ reverse_iterator
+ operator++(int)
+ {
+ reverse_iterator __tmp = *this;
+ --current;
+ return __tmp;
+ }
+ reverse_iterator&
+ operator--()
+ {
+ ++current;
+ return *this;
+ }
+ reverse_iterator
+ operator--(int)
+ {
+ reverse_iterator __tmp = *this;
+ ++current;
+ return __tmp;
+ }
+ reverse_iterator
+ operator+(difference_type __n) const
+ { return reverse_iterator(current - __n); }
+ reverse_iterator&
+ operator+=(difference_type __n)
+ {
+ current -= __n;
+ return *this;
+ }
+ reverse_iterator
+ operator-(difference_type __n) const
+ { return reverse_iterator(current + __n); }
+ reverse_iterator&
+ operator-=(difference_type __n)
+ {
+ current += __n;
+ return *this;
+ }
+ reference
+ operator[](difference_type __n) const
+ { return *(*this + __n); }
+ };
+}
+
+
+
+extern "C++" {
+namespace std
+{
+ class exception
+ {
+ public:
+ exception() throw() { }
+ virtual ~exception() throw();
+ virtual const char* what() const throw();
+ };
+ class bad_exception : public exception
+ {
+ public:
+ bad_exception() throw() { }
+ virtual ~bad_exception() throw();
+ virtual const char* what() const throw();
+ };
+ typedef void (*terminate_handler) ();
+ typedef void (*unexpected_handler) ();
+ terminate_handler set_terminate(terminate_handler) throw();
+ void terminate() throw() __attribute__ ((__noreturn__));
+ unexpected_handler set_unexpected(unexpected_handler) throw();
+ void unexpected() __attribute__ ((__noreturn__));
+ bool uncaught_exception() throw() __attribute__ ((__pure__));
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ void __verbose_terminate_handler();
+}
+}
+extern "C++" {
+namespace std
+{
+ class bad_alloc : public exception
+ {
+ public:
+ bad_alloc() throw() { }
+ virtual ~bad_alloc() throw();
+ virtual const char* what() const throw();
+ };
+ struct nothrow_t { };
+ extern const nothrow_t nothrow;
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler) throw();
+}
+
+void* operator new(std::size_t, const std::nothrow_t&) throw();
+void* operator new[](std::size_t, const std::nothrow_t&) throw();
+void operator delete(void*, const std::nothrow_t&) throw();
+void operator delete[](void*, const std::nothrow_t&) throw();
+inline void* operator new(std::size_t, void* __p) throw() { return __p; }
+inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
+inline void operator delete (void*, void*) throw() { }
+inline void operator delete[](void*, void*) throw() { }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ void
+ __throw_bad_exception(void) __attribute__((__noreturn__));
+ __attribute__((transaction_safe))
+ void
+ __throw_bad_alloc(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_cast(void) __attribute__((__noreturn__));
+ void
+ __throw_bad_typeid(void) __attribute__((__noreturn__));
+ void
+ __throw_logic_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_domain_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_invalid_argument(const char*) __attribute__((__noreturn__));
+ void
+ __throw_length_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_out_of_range(const char*) __attribute__((__noreturn__));
+ void
+ __throw_runtime_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_range_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_overflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_underflow_error(const char*) __attribute__((__noreturn__));
+ void
+ __throw_ios_failure(const char*) __attribute__((__noreturn__));
+ void
+ __throw_system_error(int) __attribute__((__noreturn__));
+ void
+ __throw_future_error(int) __attribute__((__noreturn__));
+ void
+ __throw_bad_function_call() __attribute__((__noreturn__));
+}
+
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ inline void
+ swap(_Tp& __a, _Tp& __b)
+ {
+
+ _Tp __tmp = (__a);
+ __a = (__b);
+ __b = (__tmp);
+ }
+ template<typename _Tp, size_t _Nm>
+ inline void
+ swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
+ {
+ for (size_t __n = 0; __n < _Nm; ++__n)
+ swap(__a[__n], __b[__n]);
+ }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ using std::size_t;
+ using std::ptrdiff_t;
+ template<typename _Tp>
+ class new_allocator
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef new_allocator<_Tp1> other; };
+ new_allocator() throw() { }
+ new_allocator(const new_allocator&) throw() { }
+ template<typename _Tp1>
+ new_allocator(const new_allocator<_Tp1>&) throw() { }
+ ~new_allocator() throw() { }
+ pointer
+ address(reference __x) const { return &__x; }
+ const_pointer
+ address(const_reference __x) const { return &__x; }
+ __attribute__((transaction_safe))
+ pointer
+ allocate(size_type __n, const void* = 0)
+ {
+ if (__n > this->max_size())
+ std::__throw_bad_alloc();
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+__attribute__((transaction_safe))
+void
+ deallocate(pointer __p, size_type)
+ { ::operator delete(__p); }
+ size_type
+ max_size() const throw()
+ { return size_t(-1) / sizeof(_Tp); }
+ void
+ construct(pointer __p, const _Tp& __val)
+ { ::new((void *)__p) _Tp(__val); }
+ void
+ destroy(pointer __p) { __p->~_Tp(); }
+ };
+ template<typename _Tp>
+ inline bool
+ operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
+ { return false; }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp>
+ class allocator;
+ template<>
+ class allocator<void>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ };
+ template<typename _Tp>
+ class allocator: public __gnu_cxx::new_allocator<_Tp>
+ {
+ public:
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ template<typename _Tp1>
+ struct rebind
+ { typedef allocator<_Tp1> other; };
+ allocator() throw() { }
+ allocator(const allocator& __a) throw()
+ : __gnu_cxx::new_allocator<_Tp>(__a) { }
+ template<typename _Tp1>
+ allocator(const allocator<_Tp1>&) throw() { }
+ ~allocator() throw() { }
+ };
+ template<typename _T1, typename _T2>
+ inline bool
+ operator==(const allocator<_T1>&, const allocator<_T2>&)
+ { return true; }
+ template<typename _Tp>
+ inline bool
+ operator==(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return true; }
+ template<typename _T1, typename _T2>
+ inline bool
+ operator!=(const allocator<_T1>&, const allocator<_T2>&)
+ { return false; }
+ template<typename _Tp>
+ inline bool
+ operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
+ { return false; }
+ //extern template class allocator<char>;
+ // extern template class allocator<wchar_t>;
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_swap
+ { static void _S_do_it(_Alloc&, _Alloc&) { } };
+ template<typename _Alloc>
+ struct __alloc_swap<_Alloc, false>
+ {
+ static void
+ _S_do_it(_Alloc& __one, _Alloc& __two)
+ {
+ if (__one != __two)
+ swap(__one, __two);
+ }
+ };
+ template<typename _Alloc, bool = __is_empty(_Alloc)>
+ struct __alloc_neq
+ {
+ static bool
+ _S_do_it(const _Alloc&, const _Alloc&)
+ { return false; }
+ };
+ template<typename _Alloc>
+ struct __alloc_neq<_Alloc, false>
+ {
+ static bool
+ _S_do_it(const _Alloc& __one, const _Alloc& __two)
+ { return __one != __two; }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Arg, typename _Result>
+ struct unary_function
+ {
+ typedef _Arg argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function
+ {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _Tp>
+ struct equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x == __y; }
+ };
+ template<typename _Tp>
+ struct not_equal_to : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x != __y; }
+ };
+ template<typename _Tp>
+ struct greater : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x > __y; }
+ };
+ template<typename _Tp>
+ struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
+ template<typename _Tp>
+ struct _Identity : public unary_function<_Tp,_Tp>
+ {
+ _Tp&
+ operator()(_Tp& __x) const
+ { return __x; }
+ const _Tp&
+ operator()(const _Tp& __x) const
+ { return __x; }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ enum _Rb_tree_color { _S_red = false, _S_black = true };
+ struct _Rb_tree_node_base
+ {
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ _Rb_tree_color _M_color;
+ _Base_ptr _M_parent;
+ _Base_ptr _M_left;
+ _Base_ptr _M_right;
+ static _Base_ptr
+ _S_minimum(_Base_ptr __x)
+ {
+ while (__x->_M_left != 0) __x = __x->_M_left;
+ return __x;
+ }
+ static _Const_Base_ptr
+ _S_minimum(_Const_Base_ptr __x)
+ {
+ while (__x->_M_left != 0) __x = __x->_M_left;
+ return __x;
+ }
+ static _Base_ptr
+ _S_maximum(_Base_ptr __x)
+ {
+ while (__x->_M_right != 0) __x = __x->_M_right;
+ return __x;
+ }
+ static _Const_Base_ptr
+ _S_maximum(_Const_Base_ptr __x)
+ {
+ while (__x->_M_right != 0) __x = __x->_M_right;
+ return __x;
+ }
+ };
+ template<typename _Val>
+ struct _Rb_tree_node : public _Rb_tree_node_base
+ {
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ _Val _M_value_field;
+ };
+ __attribute__ ((__pure__)) _Rb_tree_node_base*
+ _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
+ __attribute__ ((__pure__)) const _Rb_tree_node_base*
+ _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ();
+ __attribute__ ((__pure__)) _Rb_tree_node_base*
+ _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ();
+ __attribute__ ((__pure__)) const _Rb_tree_node_base*
+ _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ();
+ template<typename _Tp>
+ struct _Rb_tree_iterator
+ {
+ typedef _Tp value_type;
+ typedef _Tp& reference;
+ typedef _Tp* pointer;
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef _Rb_tree_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
+ typedef _Rb_tree_node<_Tp>* _Link_type;
+ _Rb_tree_iterator()
+ : _M_node() { }
+ explicit
+ _Rb_tree_iterator(_Link_type __x)
+ : _M_node(__x) { }
+ reference
+ operator*() const
+ { return static_cast<_Link_type>(_M_node)->_M_value_field; }
+ pointer
+ operator->() const
+ { return &static_cast<_Link_type>(_M_node)->_M_value_field; }
+ _Self&
+ operator++()
+ {
+ _M_node = _Rb_tree_increment(_M_node);
+ return *this;
+ }
+ _Self
+ operator++(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _Rb_tree_increment(_M_node);
+ return __tmp;
+ }
+ _Self&
+ operator--()
+ {
+ _M_node = _Rb_tree_decrement(_M_node);
+ return *this;
+ }
+ _Self
+ operator--(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _Rb_tree_decrement(_M_node);
+ return __tmp;
+ }
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+ _Base_ptr _M_node;
+ };
+ template<typename _Tp>
+ struct _Rb_tree_const_iterator
+ {
+ typedef _Tp value_type;
+ typedef const _Tp& reference;
+ typedef const _Tp* pointer;
+ typedef _Rb_tree_iterator<_Tp> iterator;
+ typedef bidirectional_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef _Rb_tree_const_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
+ typedef const _Rb_tree_node<_Tp>* _Link_type;
+ _Rb_tree_const_iterator()
+ : _M_node() { }
+ explicit
+ _Rb_tree_const_iterator(_Link_type __x)
+ : _M_node(__x) { }
+ _Rb_tree_const_iterator(const iterator& __it)
+ : _M_node(__it._M_node) { }
+ reference
+ operator*() const
+ { return static_cast<_Link_type>(_M_node)->_M_value_field; }
+ pointer
+ operator->() const
+ { return &static_cast<_Link_type>(_M_node)->_M_value_field; }
+ _Self&
+ operator++()
+ {
+ _M_node = _Rb_tree_increment(_M_node);
+ return *this;
+ }
+ _Self
+ operator++(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _Rb_tree_increment(_M_node);
+ return __tmp;
+ }
+ _Self&
+ operator--()
+ {
+ _M_node = _Rb_tree_decrement(_M_node);
+ return *this;
+ }
+ _Self
+ operator--(int)
+ {
+ _Self __tmp = *this;
+ _M_node = _Rb_tree_decrement(_M_node);
+ return __tmp;
+ }
+ bool
+ operator==(const _Self& __x) const
+ { return _M_node == __x._M_node; }
+ bool
+ operator!=(const _Self& __x) const
+ { return _M_node != __x._M_node; }
+ _Base_ptr _M_node;
+ };
+ void
+ _Rb_tree_insert_and_rebalance(const bool __insert_left,
+ _Rb_tree_node_base* __x,
+ _Rb_tree_node_base* __p,
+ _Rb_tree_node_base& __header) throw ();
+ _Rb_tree_node_base*
+ _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
+ _Rb_tree_node_base& __header) throw ();
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc = allocator<_Val> >
+ class _Rb_tree
+ {
+ typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other
+ _Node_allocator;
+ protected:
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ public:
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef _Rb_tree_node<_Val>* _Link_type;
+ typedef const _Rb_tree_node<_Val>* _Const_Link_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Alloc allocator_type;
+ _Node_allocator&
+ _M_get_Node_allocator()
+ { return *static_cast<_Node_allocator*>(&this->_M_impl); }
+ const _Node_allocator&
+ _M_get_Node_allocator() const
+ { return *static_cast<const _Node_allocator*>(&this->_M_impl); }
+ allocator_type
+ get_allocator() const
+ { return allocator_type(_M_get_Node_allocator()); }
+ protected:
+ _Link_type
+ _M_get_node()
+ { return _M_impl._Node_allocator::allocate(1); }
+ __attribute__((transaction_safe))
+ void
+ _M_put_node(_Link_type __p)
+ { _M_impl._Node_allocator::deallocate(__p, 1); }
+ __attribute__((transaction_safe))
+ _Link_type
+ _M_create_node(const value_type& __x)
+ {
+ _Link_type __tmp = _M_get_node();
+ try
+ { get_allocator().construct(&__tmp->_M_value_field, __x); }
+ catch(...)
+ {
+ _M_put_node(__tmp);
+ throw;
+ }
+ return __tmp;
+ }
+ void
+ _M_destroy_node(_Link_type __p)
+ {
+ get_allocator().destroy(&__p->_M_value_field);
+ _M_put_node(__p);
+ }
+ protected:
+ template<typename _Key_compare,
+ bool _Is_pod_comparator = __is_pod(_Key_compare)>
+ struct _Rb_tree_impl : public _Node_allocator
+ {
+ _Key_compare _M_key_compare;
+ _Rb_tree_node_base _M_header;
+ size_type _M_node_count;
+ _Rb_tree_impl()
+ : _Node_allocator(), _M_key_compare(), _M_header(),
+ _M_node_count(0)
+ { _M_initialize(); }
+ _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a)
+ : _Node_allocator(__a), _M_key_compare(__comp), _M_header(),
+ _M_node_count(0)
+ { _M_initialize(); }
+ private:
+ void
+ _M_initialize()
+ {
+ this->_M_header._M_color = _S_red;
+ this->_M_header._M_parent = 0;
+ this->_M_header._M_left = &this->_M_header;
+ this->_M_header._M_right = &this->_M_header;
+ }
+ };
+ _Rb_tree_impl<_Compare> _M_impl;
+ protected:
+ _Base_ptr&
+ _M_root()
+ { return this->_M_impl._M_header._M_parent; }
+ _Const_Base_ptr
+ _M_root() const
+ { return this->_M_impl._M_header._M_parent; }
+ _Base_ptr&
+ _M_leftmost()
+ { return this->_M_impl._M_header._M_left; }
+ _Const_Base_ptr
+ _M_leftmost() const
+ { return this->_M_impl._M_header._M_left; }
+ _Base_ptr&
+ _M_rightmost()
+ { return this->_M_impl._M_header._M_right; }
+ _Const_Base_ptr
+ _M_rightmost() const
+ { return this->_M_impl._M_header._M_right; }
+ _Link_type
+ _M_begin()
+ { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); }
+ _Const_Link_type
+ _M_begin() const
+ {
+ return static_cast<_Const_Link_type>
+ (this->_M_impl._M_header._M_parent);
+ }
+ _Link_type
+ _M_end()
+ { return static_cast<_Link_type>(&this->_M_impl._M_header); }
+ _Const_Link_type
+ _M_end() const
+ { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); }
+ static const_reference
+ _S_value(_Const_Link_type __x)
+ { return __x->_M_value_field; }
+ static const _Key&
+ _S_key(_Const_Link_type __x)
+ { return _KeyOfValue()(_S_value(__x)); }
+ static _Link_type
+ _S_left(_Base_ptr __x)
+ { return static_cast<_Link_type>(__x->_M_left); }
+ static _Const_Link_type
+ _S_left(_Const_Base_ptr __x)
+ { return static_cast<_Const_Link_type>(__x->_M_left); }
+ static _Link_type
+ _S_right(_Base_ptr __x)
+ { return static_cast<_Link_type>(__x->_M_right); }
+ static _Const_Link_type
+ _S_right(_Const_Base_ptr __x)
+ { return static_cast<_Const_Link_type>(__x->_M_right); }
+ static const_reference
+ _S_value(_Const_Base_ptr __x)
+ { return static_cast<_Const_Link_type>(__x)->_M_value_field; }
+ static const _Key&
+ _S_key(_Const_Base_ptr __x)
+ { return _KeyOfValue()(_S_value(__x)); }
+ public:
+ typedef _Rb_tree_iterator<value_type> iterator;
+ typedef _Rb_tree_const_iterator<value_type> const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ private:
+ iterator
+ _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __y,
+ const value_type& __v);
+ public:
+ _Rb_tree() { }
+ iterator
+ begin()
+ {
+ return iterator(static_cast<_Link_type>
+ (this->_M_impl._M_header._M_left));
+ }
+ const_iterator
+ begin() const
+ {
+ return const_iterator(static_cast<_Const_Link_type>
+ (this->_M_impl._M_header._M_left));
+ }
+ iterator
+ end()
+ { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); }
+ const_iterator
+ end() const
+ {
+ return const_iterator(static_cast<_Const_Link_type>
+ (&this->_M_impl._M_header));
+ }
+ pair<iterator, bool>
+ _M_insert_unique(const value_type& __x);
+ };
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc>
+ typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
+ _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
+ _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v)
+ {
+ _Link_type __z = _M_create_node(__v);
+ return iterator(__z);
+ }
+ template<typename _Key, typename _Val, typename _KeyOfValue,
+ typename _Compare, typename _Alloc>
+ pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
+ _Compare, _Alloc>::iterator, bool>
+ _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
+ _M_insert_unique(const _Val& __v)
+ {
+ _Link_type __x = _M_begin();
+ _Link_type __y = _M_end();
+ iterator __j = iterator(__y);
+ return pair<iterator, bool>(_M_insert_(__x, __y, __v), true);
+ }
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Key, typename _Compare = std::less<_Key>,
+ typename _Alloc = std::allocator<_Key> >
+ class set
+ {
+ public:
+ typedef _Key key_type;
+ typedef _Key value_type;
+ typedef _Compare key_compare;
+ typedef _Compare value_compare;
+ typedef _Alloc allocator_type;
+ private:
+ typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type;
+ typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
+ key_compare, _Key_alloc_type> _Rep_type;
+ _Rep_type _M_t;
+ public:
+ typedef typename _Key_alloc_type::pointer pointer;
+ typedef typename _Key_alloc_type::const_pointer const_pointer;
+ typedef typename _Key_alloc_type::reference reference;
+ typedef typename _Key_alloc_type::const_reference const_reference;
+ typedef typename _Rep_type::const_iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+ std::pair<iterator, bool>
+ insert(const value_type& __x)
+ {
+ _M_t._M_insert_unique(__x);
+ }
+ };
+}
+__attribute__((transaction_pure))
+void* operator new(size_t);
+__attribute__((transaction_pure))
+void operator delete(void*);
+class Widget
+{
+private:
+};
+class Screen
+{
+protected:
+std::set<Widget *> widgets;
+public:
+void addWidget(Widget* widget);
+};
+void Screen::addWidget(Widget* widget)
+{
+widgets.insert(widget);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46653.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46653.C
new file mode 100644
index 000000000..f8f3a1d31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46653.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+class shared_count
+{
+public:
+ volatile int j;
+ shared_count() : j(0) { }
+};
+
+shared_count * c;
+int main()
+{
+ __transaction_atomic {
+ shared_count sc;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46714.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46714.C
new file mode 100644
index 000000000..130b58cdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46714.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+static int asdf __attribute__ ((__weakref__("funky")));
+
+class Building
+{
+public:
+ __attribute__((transaction_safe)) ~Building(void);
+};
+
+Building::~Building()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46941.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46941.C
new file mode 100644
index 000000000..eac543831
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr46941.C
@@ -0,0 +1,37 @@
+// { dg-do "compile" }
+// { dg-options "-fgnu-tm" }
+
+class Obj
+{
+ int dummy;
+};
+
+__attribute__((transaction_safe))
+Obj* allocate()
+{
+ return new Obj;
+}
+
+__attribute__((transaction_safe))
+void deallocate(Obj * o)
+{
+ delete o;
+}
+
+__attribute__((transaction_safe))
+Obj* allocatearray()
+{
+ return new Obj[2];
+}
+
+__attribute__((transaction_safe))
+void deallocatearray(Obj *o[])
+{
+ delete [] o;
+}
+
+/* The delete/new operators are handled by the libitm runtime. */
+/* { dg-final { scan-assembler "_ZGTtnw\[mj\]" } } */
+/* { dg-final { scan-assembler "_ZGTtna\[mj\]" } } */
+/* { dg-final { scan-assembler "_ZGTtdlPv" } } */
+/* { dg-final { scan-assembler "_ZGTtdaPv" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47340.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47340.C
new file mode 100644
index 000000000..ead3361fa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47340.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+void* operator new(__SIZE_TYPE__) throw (int);
+
+void *point;
+
+void funky()
+{
+ point = new (int);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530-2.C
new file mode 100644
index 000000000..bcfdbe948
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530-2.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O2 -fno-inline -fdump-tree-tmedge" }
+
+class RBTree
+{
+ struct RBNode
+ {
+ RBNode* next;
+ };
+
+ public:
+ RBNode* sentinel;
+ __attribute__((transaction_safe)) bool lookup();
+};
+
+bool RBTree::lookup()
+{
+ RBNode* x = sentinel;
+ while (x)
+ x = x->next;
+ return false;
+}
+
+
+RBTree* SET;
+
+void bench_test()
+{
+ __transaction_atomic {
+ SET->lookup();
+ }
+}
+
+// There should be two calls to commitTransaction.
+// The one in the uninstrumented code path is a tail call.
+// The one in the instrumented code path is not.
+// { dg-final { scan-tree-dump-times "ITM_commitTransaction.*tail call" 1 "tmedge" } }
+
+// { dg-final { cleanup-tree-dump "tmedge" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530.C
new file mode 100644
index 000000000..6a9fb1b00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47530.C
@@ -0,0 +1,80 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O2 -fdump-tree-optimized" }
+
+typedef __SIZE_TYPE__ size_t;
+extern void *malloc(size_t);
+
+namespace bench
+{
+ class LLNode
+ {
+ LLNode* next;
+ int data;
+
+ public:
+ __attribute__((transaction_safe))
+ LLNode(int val, LLNode* m_next)
+ {
+ data = val;
+ next = m_next;
+ }
+ __attribute__((transaction_safe))
+ ~LLNode(){}
+ __attribute__((transaction_safe))
+ int get_val() {return data;}
+ __attribute__((transaction_safe))
+ LLNode* get_next() {return next;}
+ __attribute__((transaction_safe))
+ void set_val(int val) {data = val;}
+ __attribute__((transaction_safe))
+ void set_next(LLNode* n) {next = n;}
+ __attribute__((transaction_safe))
+ void *operator new(size_t size);
+ };
+
+ class LinkedList
+ {
+ LLNode* head;
+ public:
+ LinkedList();
+ void insert(int val);
+ };
+}
+
+using bench::LinkedList;
+using bench::LLNode;
+
+
+__attribute__((transaction_safe))
+void* LLNode::operator new(size_t size)
+{
+ return malloc(size);
+}
+
+LinkedList::LinkedList() : head(new LLNode(-1, 0)) { }
+
+void LinkedList::insert(int val)
+{
+ __transaction_atomic {
+ LLNode* prev = head;
+ LLNode* curr = head->get_next();
+
+ while (curr != 0) {
+ if (curr->get_val() >= val)
+ break;
+ prev = curr;
+ curr = prev->get_next();
+ }
+
+ if (!curr || (curr->get_val() > val)){
+ LLNode* tmp = new LLNode(val,curr);
+ prev->set_next(tmp);
+ }
+ }
+}
+
+// Make sure we don't do tail optimization on the commit, except on
+// the uninstrumented code path.
+// { dg-final { scan-tree-dump-times "commitTransaction...; .tail call" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47554.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47554.C
new file mode 100644
index 000000000..28841bb15
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47554.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+class list
+{
+ public: list()
+ {
+ }
+ list(const list&)
+ {
+ }
+ const list& _M_get_Node_allocator() const
+ {
+ }
+ list _M_get_Tp_allocator() const
+ {
+ return list(_M_get_Node_allocator());
+ }
+};
+static list buildProjects;
+static void build()
+{
+ __transaction_relaxed
+ {
+ buildProjects._M_get_Tp_allocator();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47573.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47573.C
new file mode 100644
index 000000000..239d9222e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47573.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+template<typename _Tp> class allocator
+{
+ public:
+ allocator() { }
+};
+extern template class allocator<char>;
+
+template<typename _Alloc = allocator<char> > class basic_string
+{
+ public:
+ _Alloc _M_dataplus;
+
+ __attribute__((transaction_safe))
+ basic_string() : _M_dataplus(_Alloc())
+ {
+ }
+};
+
+int getStringHeight()
+{
+ basic_string<> tmp;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47746.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47746.C
new file mode 100644
index 000000000..7cd9e1006
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47746.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+class InputStream
+{
+ public:
+ virtual unsigned int readUint32 () = 0;
+};
+
+class Building
+{
+ public:
+ __attribute__((transaction_safe)) Building (InputStream *stream);
+ __attribute__((transaction_safe)) void freeGradients ();
+ void load (InputStream *stream);
+};
+
+Building::Building (InputStream *stream)
+{
+ load(stream);
+}
+
+void Building::load (InputStream *stream)
+{
+ int j = (int)stream->readUint32 ();
+ freeGradients ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47747.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47747.C
new file mode 100644
index 000000000..3b50904b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr47747.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+class InputStream
+{
+ public:
+// __attribute__((transaction_safe))
+ virtual unsigned int readUint32 () = 0;
+};
+
+class Building
+{
+ public:
+ __attribute__((transaction_safe))
+ Building (InputStream *stream);
+};
+
+Building::Building (InputStream *stream)
+{
+ stream->readUint32 (); /* { dg-error "InputStream::readUint32" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51212.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51212.C
new file mode 100644
index 000000000..9d2971bbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51212.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -fnon-call-exceptions" }
+
+struct S
+{
+ S ()
+ {
+ }
+};
+
+__attribute__ ((transaction_callable))
+void foo (int *p)
+{
+ S s;
+ if (*p)
+ ;
+}
+
+// { dg-message "sorry, unimplemented: transactional memory is not supported with non-call exceptions" "-fnon-call-exceptions and -fgnu-tm together" { target *-*-* } 0 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411-2.C
new file mode 100644
index 000000000..4105d66ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411-2.C
@@ -0,0 +1,49 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O0" }
+
+namespace std {
+template<typename _CharT> struct char_traits;
+
+template<typename _Tp> class allocator {
+};
+
+template<typename _Tp> struct less {
+ bool operator()(const _Tp& __x, const _Tp& __y) const {
+ return __x < __y;
+ }
+};
+
+template <typename _Key, typename _Compare = std::less<_Key> > class map {
+public:
+ _Compare _M_key_compare;
+ bool find(const _Key& __x) {
+ return _M_key_compare(__x, __x);
+ }
+};
+
+template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string {
+public:
+ bool compare(const basic_string& __str) const {
+ return 0;
+ }
+};
+
+typedef basic_string<char> string;
+
+template<typename _CharT, typename _Traits>
+inline bool operator<(const basic_string<_CharT, _Traits>& __lhs, const basic_string<_CharT, _Traits>& __rhs) {
+ return __lhs.compare(__rhs);
+}
+
+extern template class basic_string<char>;
+
+}
+
+std::map<std::string> units;
+
+__attribute__((transaction_callable))
+void get(const std::string &name) {
+ units.find(name);
+}
+
+// { dg-final { scan-assembler "_ZGTtNKSs7compareERKSs:" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411.C
new file mode 100644
index 000000000..df20b87c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51411.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+struct A
+{
+ __attribute__ ((transaction_safe)) virtual void virtfoo () { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51516.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51516.C
new file mode 100644
index 000000000..4e9100651
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51516.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -fdump-tree-optimized" } */
+
+struct C {
+ long l;
+ C():l(0) {}
+};
+
+int main()
+{
+ C* alloc;
+ __transaction_atomic {
+ alloc = new C;
+ }
+ alloc->l = 2;
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-not "_ITM_getTMCloneOrIrrevocable" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51928.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51928.C
new file mode 100644
index 000000000..22dbadd4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr51928.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm" } */
+
+struct A; // { dg-error "forward declaration of 'struct A'" }
+
+struct B
+{
+ virtual B* foo(A);
+};
+
+struct C : virtual B
+{
+ virtual C* foo(A) { return 0; } // { dg-error "'<anonymous>' has incomplete type" }
+};
+
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr56419.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr56419.C
new file mode 100644
index 000000000..c9a33a813
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr56419.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+int x = 0;
+int inc_func(int i) {
+ for (int j = 0; j < i; ++j)
+ {
+ __transaction_atomic { x+=1; }
+ }
+ return 0;
+}
+
+// { dg-final { scan-assembler "ITM_commitTransaction" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58516.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58516.C
new file mode 100644
index 000000000..131fa3826
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58516.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm" }
+
+void foo()
+{
+ __transaction_atomic noexcept(false) {}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-1.C
new file mode 100644
index 000000000..b566b0c84
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-1.C
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm" }
+
+int
+foo (void)
+{
+ return __transaction_atomic noexcept(false) (false);
+}
+
+int
+bar (int i)
+{
+ return __transaction_atomic noexcept(false) (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-2.C
new file mode 100644
index 000000000..9380fe71f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr58635-2.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm" }
+
+int
+foo (void)
+{
+ return __transaction_atomic noexcept(false) (x); // { dg-error "was not declared in this scope" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/pr60004.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr60004.C
new file mode 100644
index 000000000..b8c2c0e03
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/pr60004.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm" }
+
+int a;
+int f() {
+ __transaction_atomic {
+ if (a == 5)
+ return 1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/template-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/template-1.C
new file mode 100644
index 000000000..cb6bb382f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/template-1.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark" }
+
+struct TrueFalse
+{
+ static bool v() { return true; }
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ __transaction_atomic { global += 2; }
+ return __transaction_atomic (global + 1);
+}
+
+template<typename T> int bar() __transaction_atomic
+{
+ return global + 3;
+}
+
+template<typename T> void bar2() __transaction_atomic
+{
+ global += 4;
+}
+
+int f1()
+{
+ bar2<TrueFalse>();
+ return foo<TrueFalse>() + bar<TrueFalse>();
+}
+
+/* 4 transactions overall, two of them write to global: */
+/* { dg-final { scan-tree-dump-times "ITM_RU4\\s*\\(&global" 4 "tmmark" } } */
+/* { dg-final { scan-tree-dump-times "ITM_WU4\\s*\\(&global" 2 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/template-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/template-2.C
new file mode 100644
index 000000000..09deb809b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/template-2.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fgnu-tm -O -fdump-tree-tmmark" }
+
+struct TrueFalse
+{
+};
+
+int global;
+
+template<typename T> int foo()
+{
+ return __transaction_atomic (global + 2)
+ + __transaction_atomic (global + 3);
+}
+
+int f1()
+{
+ return foo<TrueFalse>();
+}
+
+/* { dg-final { scan-tree-dump-times "ITM_RU" 2 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/tm.exp b/gcc-4.9/gcc/testsuite/g++.dg/tm/tm.exp
new file mode 100644
index 000000000..1d1dc3c79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/tm.exp
@@ -0,0 +1,43 @@
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+if ![check_effective_target_fgnu_tm] {
+ return
+}
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CXXFLAGS
+if ![info exists DEFAULT_CXXFLAGS] then {
+ set DEFAULT_CXXFLAGS " -pedantic-errors -Wno-long-long"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Run the tests that are shared with C.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/tm/*.c]] \
+ $DEFAULT_CXXFLAGS
+# Run the C++ only tests.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] \
+ $DEFAULT_CXXFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/vector-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/vector-1.C
new file mode 100644
index 000000000..2c5bb39f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/vector-1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O3" }
+
+class HashTree
+{
+ __attribute__((transaction_safe)) void rehash();
+ HashTree **Hash_table;
+ int Hash_function;
+};
+
+__attribute__((transaction_safe)) void HashTree::rehash()
+{
+ for (int i=0; i < Hash_function; i++)
+ Hash_table[i] = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tm/wrap-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tm/wrap-2.C
new file mode 100644
index 000000000..e2948c8c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tm/wrap-2.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -ftrack-macro-expansion=0" } */
+
+#define W(X) __attribute__((transaction_wrap(X)))
+void f1(void);
+void f2(int);
+int i3;
+int f7(void);
+
+void g1(void) W(f1);
+void g2(void) W(f2); /* { dg-error "is not compatible" } */
+void g3(void) W(i3); /* { dg-error "is not a function" } */
+void g4(void) W(f4); /* { dg-error "not declared in this scope\|not an identifier" } */
+void g5(void) W(1); /* { dg-error "not an identifier" } */
+void g6(void) W("f1"); /* { dg-error "not an identifier" } */
+void g7(void) W(f7); /* { dg-error "is not compatible" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20070621-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20070621-1.C
new file mode 100644
index 000000000..15d1ac74c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20070621-1.C
@@ -0,0 +1,117 @@
+// { dg-do compile }
+/* Reduced from libstdc++-v3/testsuite/25_algorithms/equal/1.cc
+
+1.2.ii: In function 'void test1()':
+1.2.ii:104: error: true/false edge after a non-COND_EXPR in bb 15
+1.2.ii:104: internal compiler error: verify_flow_info failed
+
+*/
+
+__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename, typename> struct __are_same {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_integer {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_pointer {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_normal_iterator {
+ enum {
+ __value = 0 };
+ };
+ struct input_iterator_tag {
+ };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator {
+ typedef _Tp value_type;
+ };
+ template<typename _Iterator> struct iterator_traits {
+ typedef typename _Iterator::value_type value_type;
+ };
+ template<typename _Iterator, bool _BoolType = __is_normal_iterator<_Iterator>::__value> struct __niter_base {
+ static const _Iterator& __b(const _Iterator& __it) {
+ return __it;
+ }
+ };
+ template<bool _BoolType> struct __equal {
+ template<typename _II1, typename _II2> static bool equal(_II1 __first1, _II1 __last1, _II2 __first2) {
+ for (;
+ __first1 != __last1;
+ ++__first1, ++__first2) if (!(*__first1 == *__first2)) return false;
+ }
+ };
+ template<typename _II1, typename _II2> inline bool __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2) {
+ typedef typename iterator_traits<_II1>::value_type _ValueType1;
+ typedef typename iterator_traits<_II2>::value_type _ValueType2;
+ const bool __simple = (__is_integer<_ValueType1>::__value && __is_pointer<_II1>::__value && __is_pointer<_II2>::__value && __are_same<_ValueType1, _ValueType2>::__value);
+ return std::__equal<__simple>::equal(__first1, __last1, __first2);
+ }
+ template<typename _II1, typename _II2> inline bool equal(_II1 __first1, _II1 __last1, _II2 __first2) {
+ return std::__equal_aux(__niter_base<_II1>::__b(__first1), __niter_base<_II1>::__b(__last1), __niter_base<_II2>::__b(__first2));
+ }
+ }
+extern "C" {
+ extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__));
+ }
+namespace __gnu_test {
+ template<typename T> struct BoundsContainer {
+ T* first;
+ T* last;
+ BoundsContainer(T* _first, T* _last) : first(_first), last(_last) {
+ }
+ };
+ template<class T> class input_iterator_wrapper:public std::iterator <std::input_iterator_tag, T, ptrdiff_t, T*, T&> {
+ public:
+ typedef BoundsContainer<T> ContainerType;
+ T* ptr;
+ ContainerType* SharedInfo;
+ input_iterator_wrapper(T* _ptr, ContainerType* SharedInfo_in) : ptr(_ptr), SharedInfo(SharedInfo_in) {
+ }
+ bool operator==(const input_iterator_wrapper& in) const {
+ (static_cast<void> (__builtin_expect (!!(SharedInfo != __null && SharedInfo == in.SharedInfo), 1) ? 0 : (__assert_fail ("SharedInfo != __null && SharedInfo == in.SharedInfo", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 201, __PRETTY_FUNCTION__), 0)));
+ (static_cast<void> (__builtin_expect (!!(ptr>=SharedInfo->first && in.ptr>=SharedInfo->first), 1) ? 0 : (__assert_fail ("ptr>=SharedInfo->first && in.ptr>=SharedInfo->first", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 202, __PRETTY_FUNCTION__), 0)));
+ }
+ bool operator!=(const input_iterator_wrapper& in) const {
+ return !(*this == in);
+ }
+ T& operator*() const {
+ (static_cast<void> (__builtin_expect (!!(SharedInfo && ptr < SharedInfo->last), 1) ? 0 : (__assert_fail ("SharedInfo && ptr < SharedInfo->last", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 215, __PRETTY_FUNCTION__), 0)));
+ (static_cast<void> (__builtin_expect (!!(ptr >= SharedInfo->first), 1) ? 0 : (__assert_fail ("ptr >= SharedInfo->first", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 216, __PRETTY_FUNCTION__), 0)));
+ }
+ input_iterator_wrapper& operator++() {
+ (static_cast<void> (__builtin_expect (!!(SharedInfo && ptr < SharedInfo->last), 1) ? 0 : (__assert_fail ("SharedInfo && ptr < SharedInfo->last", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 237, __PRETTY_FUNCTION__), 0)));
+ ptr++;
+ SharedInfo->first=ptr;
+ }
+ };
+ template <class T, template<class T> class ItType> struct test_container {
+ typename ItType<T>::ContainerType bounds;
+ test_container(T* _first, T* _last):bounds(_first, _last) {
+ }
+ ItType<T> it(T* pos) {
+ return ItType<T>(pos, &bounds);
+ }
+ ItType<T> begin() {
+ return it(bounds.first);
+ }
+ ItType<T> end() {
+ }
+ };
+ }
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+typedef test_container<int, input_iterator_wrapper> Container;
+int array1[] = {
+ 0, 1};
+int array2[] = {
+ 1, 0};
+void test1() {
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ (static_cast<void> (__builtin_expect (!!(std::equal(con1.begin(), con1.end(), con2.begin())), 1) ? 0 : (__assert_fail ("std::equal(con1.begin(), con1.end(), con2.begin())", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/25_algorithms/equal/1.cc", 35, __PRETTY_FUNCTION__), 0)));
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20080625-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20080625-1.C
new file mode 100644
index 000000000..b18c28226
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20080625-1.C
@@ -0,0 +1,27 @@
+extern "C" {
+ typedef unsigned char sal_Bool;
+ typedef struct _rtl_uString {
+ } rtl_uString;
+ void rtl_uString_release( rtl_uString * str ) throw ();
+}
+class OUString {
+ rtl_uString * pData;
+public:
+ OUString() {}
+ ~OUString() {
+ rtl_uString_release( pData );
+ }
+ sal_Bool equalsIgnoreAsciiCase( const OUString & str ) const;
+};
+bool findAndRemove();
+long getAttributeProps()
+{
+ long nAttrs = 0;
+ OUString aValue;
+ if (findAndRemove()
+ && aValue.equalsIgnoreAsciiCase(OUString()))
+ ;
+ else
+ nAttrs |= 1;
+ return nAttrs;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20090329-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20090329-1.C
new file mode 100644
index 000000000..0274a1944
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20090329-1.C
@@ -0,0 +1,59 @@
+/* { dg-do compile } */
+
+struct input_iterator_tag { };
+template<typename _Category, typename _Tp, typename _Distance = long, typename _Pointer = _Tp*, typename _Reference = _Tp&>
+struct iterator {
+ typedef _Category iterator_category;
+};
+template<typename _Iterator> struct iterator_traits {
+ typedef typename _Iterator::iterator_category iterator_category;
+};
+template<typename, typename> struct __lc_rai {
+ template<typename _II1, typename _II2>
+ static _II1 __newlast1(_II1, _II1 __last1, _II2, _II2) {
+ return __last1;
+ }
+ template<typename _II>
+ static bool __cnd2(_II __first, _II __last) {
+ return __first != __last;
+ }
+};
+template<typename _II1, typename _II2, typename _Compare>
+bool lexicographical_compare(_II1 __first1, _II1 __last1, _II2 __first2,
+ _II2 __last2, _Compare __comp) {
+ typedef typename iterator_traits<_II1>::iterator_category _Category1;
+ typedef typename iterator_traits<_II2>::iterator_category _Category2;
+ typedef __lc_rai<_Category1, _Category2> __rai_type;
+ __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
+ for (;
+ __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
+ ++__first1, ++__first2) {
+ if (__comp(*__first1, *__first2)) return true;
+ }
+}
+void __assert_fail () throw () __attribute__ ((__noreturn__));
+template<typename T> struct BoundsContainer { };
+template<class T> class input_iterator_wrapper : public iterator<input_iterator_tag, T, long, T*, T&> {
+public:
+ typedef BoundsContainer<T> ContainerType;
+ T* ptr;
+ ContainerType* SharedInfo;
+ input_iterator_wrapper(const input_iterator_wrapper& in) : ptr(in.ptr), SharedInfo(in.SharedInfo) { }
+ bool operator==(const input_iterator_wrapper& in) const {
+ (static_cast<void> ((SharedInfo != __null
+ && SharedInfo == in.SharedInfo)
+ ? 0 : (__assert_fail (), 0)));
+ }
+ bool operator!=(const input_iterator_wrapper& in) const {
+ return !(*this == in);
+ }
+ T& operator*() const { }
+ input_iterator_wrapper& operator++() { }
+};
+struct X { };
+bool predicate(const X&, const X&) {
+ return true;
+}
+bool test2(input_iterator_wrapper<X>& x) {
+ return lexicographical_compare(x, x, x, x, predicate);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20090706-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20090706-1.C
new file mode 100644
index 000000000..43a59f0e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20090706-1.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator { };
+ template<typename _Tp> class allocator: public new_allocator<_Tp> { };
+ template<typename _Tp, typename _Alloc> struct _Vector_base { };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
+ class vector : protected _Vector_base<_Tp, _Alloc> { };
+};
+template<int Dim> class Vector { };
+enum CenteringType { VertexType, EdgeType, FaceType, CellType };
+enum ContinuityType { XDim = 1, YDim = XDim << 1, ZDim = YDim << 1 };
+template <int Dim> class Centering {
+public:
+ typedef Vector<Dim> Position;
+ typedef std::vector<Position> Positions;
+ Centering(const Positions &positions);
+ Positions positions_m;
+};
+template <int Dim> class CanonicalCentering {
+ CanonicalCentering();
+ template <class T> static T combine(const T &op1, const T &op2);
+ static Centering<Dim>*** centering_table_m;
+};
+template <int Dim> CanonicalCentering<Dim>::CanonicalCentering()
+{
+ typename Centering<Dim>::Positions positions[Dim][2];
+ enum { x = 0, y, z };
+ int cont = 0;
+ if (Dim > 1)
+ {
+ centering_table_m[EdgeType][cont][YDim] = Centering<Dim>(positions[y][cont]);
+ centering_table_m[EdgeType][cont][XDim|YDim] = Centering<Dim>(combine(positions[x][cont], positions[y][cont]));
+ }
+ if (Dim > 2)
+ {
+ centering_table_m[EdgeType][cont][ZDim] = Centering<Dim>(positions[z][cont]);
+ centering_table_m[EdgeType][cont][XDim|ZDim] = Centering<Dim>(combine(positions[x][cont], positions[z][cont]));
+ }
+}
+template class CanonicalCentering<2>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20100702-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20100702-1.C
new file mode 100644
index 000000000..3d223fffb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20100702-1.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// { dg-options "-fprefetch-loop-arrays -w" }
+
+class ggPoint3 {
+public:
+ ggPoint3();
+ inline double &x() {
+ return e[0];
+ }
+ inline double &y() {
+ return e[1];
+ }
+ ggPoint3(const ggPoint3 &p);
+ double e[3];
+};
+class ggBox3 {
+public:
+ ggPoint3 min() const;
+};
+class ggHAffineMatrix3;
+ggPoint3 operator*(const ggHAffineMatrix3 &m, const ggPoint3 &v);
+void foo (ggPoint3 *);
+void SetMatrix(ggHAffineMatrix3& toworld, ggBox3& box)
+{
+ ggPoint3 p[2][2][2];
+ int i, j, k;
+ for (i = 0; i < 2; j++)
+ for (k = 0; k < 2; k++)
+ {
+ if (i == 0)
+ p[i][j][k].x() = box.min().x();
+ if (j == 0)
+ p[i][j][k].y() = box.min().y();
+ p[i][j][k] = toworld * p[i][j][k];
+ }
+ foo (&p[0][0][0]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20100825.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20100825.C
new file mode 100644
index 000000000..460c1b608
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20100825.C
@@ -0,0 +1,15 @@
+// { dg-do run }
+
+typedef enum { zero = 0, one = 1, two = 2, ENUM_MAX = 3 } my_enum;
+my_enum e;
+extern "C" void abort (void);
+int __attribute__((noinline)) foo() { return 10; }
+int main()
+{
+ int r;
+ r = foo();
+ if ((r < 0) || (r >= ENUM_MAX))
+ return 0;
+ e = (my_enum)r;
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20120420-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20120420-1.C
new file mode 100644
index 000000000..ada0ab67e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20120420-1.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+int g, *gp[100];
+struct V {
+ int* x;
+ int y;
+};
+
+void foo (V **p, V* end, int i)
+{
+ *p = 0;
+ V* pp = *p;
+ int s = 100;
+ for (; pp < end; )
+ {
+ pp++;
+ (pp-1)->x = &g;
+ if (g)
+ {
+ if (g>10)
+ g++;
+ int *t = (int*) operator new (100);
+ (pp-1)->x = t;
+ }
+ else
+ s--;
+ gp[end-pp] = (pp-1)->x + s;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/20121105-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/20121105-1.C
new file mode 100644
index 000000000..10eeeb909
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/20121105-1.C
@@ -0,0 +1,44 @@
+// PR tree-optimization/54986
+// Reported by Remi Vanicat <vanicat@debian.org>
+// Reduced testcase by Markus Trippelsdorf <markus@trippelsdorf.de>
+
+__extension__ typedef __INTPTR_TYPE__ intptr_t;
+
+struct A;
+struct B
+{
+ int *_ptr;
+ bool operator==(B *p1)
+ {
+ return p1->_ptr;
+ }
+};
+struct C {
+ A* ref_SYMBptr();
+};
+struct A
+{
+ B sommet;
+};
+typedef C *gen_op_context;
+struct D
+{
+ D(gen_op_context) {}
+};
+
+D c(0);
+const intptr_t d = (intptr_t)&c;
+B *const e = (B *)&d;
+
+static bool
+fn1(C& p1)
+{
+ return p1.ref_SYMBptr()->sommet == e;
+}
+
+void
+fn2()
+{
+ C b;
+ fn1(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/PR58294.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/PR58294.C
new file mode 100644
index 000000000..e1fb95ae2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/PR58294.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+struct A {
+ virtual ~A();
+ virtual void m_fn1() { delete this; }
+ void m_fn2() { m_fn1(); }
+};
+
+struct B {
+ A *pi_;
+ B() { pi_->m_fn2(); }
+};
+struct C {
+ B pn;
+};
+void _setjmp();
+int png_decode() {
+ _setjmp();
+ C a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess1.C
new file mode 100644
index 000000000..6cb39809d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess1.C
@@ -0,0 +1,716 @@
+// Test -Wsizeof-pointer-memaccess warnings.
+// { dg-do compile }
+// { dg-options "-Wall" }
+// Test just twice, once with -O0 non-fortified, once with -O2 fortified.
+// { dg-skip-if "" { *-*-* } { "*" } { "-O0" "-O2" } }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+
+extern "C" {
+
+typedef __SIZE_TYPE__ size_t;
+extern void *memset (void *, int, size_t);
+extern void *memcpy (void *__restrict, const void *__restrict, size_t);
+extern void *memmove (void *__restrict, const void *__restrict, size_t);
+extern int memcmp (const void *, const void *, size_t);
+extern char *strncpy (char *__restrict, const char *__restrict, size_t);
+extern char *strncat (char *__restrict, const char *__restrict, size_t);
+extern char *stpncpy (char *__restrict, const char *__restrict, size_t);
+extern char *strndup (const char *, size_t);
+extern int strncmp (const char *, const char *, size_t);
+extern int strncasecmp (const char *, const char *, size_t);
+
+#ifdef __OPTIMIZE__
+# define bos(ptr) __builtin_object_size (ptr, 1)
+# define bos0(ptr) __builtin_object_size (ptr, 0)
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memset (void *dest, int c, size_t len)
+{
+ return __builtin___memset_chk (dest, c, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memcpy (void *__restrict dest, const void *__restrict src, size_t len)
+{
+ return __builtin___memcpy_chk (dest, src, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memmove (void *dest, const void *src, size_t len)
+{
+ return __builtin___memmove_chk (dest, src, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+strncpy (char *__restrict dest, const char *__restrict src, size_t len)
+{
+ return __builtin___strncpy_chk (dest, src, len, bos (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+strncat (char *dest, const char *src, size_t len)
+{
+ return __builtin___strncat_chk (dest, src, len, bos (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+stpncpy (char *__restrict dest, const char *__restrict src, size_t len)
+{
+ return __builtin___stpncpy_chk (dest, src, len, bos (dest));
+}
+#endif
+
+}
+
+struct A { short a, b; int c, d; long e, f; };
+typedef struct A TA;
+typedef struct A *PA;
+typedef TA *PTA;
+struct B {};
+typedef struct B TB;
+typedef struct B *PB;
+typedef TB *PTB;
+typedef int X[3][3][3];
+
+int
+f1 (void *x, int z)
+{
+ struct A a, *pa1 = &a;
+ TA *pa2 = &a;
+ PA pa3 = &a;
+ PTA pa4 = &a;
+ memset (&a, 0, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (pa1, 0, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa2, 0, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa3, 0, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa4, 0, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa1, 0, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa2, 0, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa3, 0, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa4, 0, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa1, x, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa4, x, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa1, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa4, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa1, x, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa4, x, sizeof (__typeof (pa4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa1, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa4, sizeof (__typeof (pa4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa1, x, sizeof (struct A *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa1, sizeof (struct A *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+
+ // These are correct, no warning.
+ memset (&a, 0, sizeof a);
+ memset (&a, 0, sizeof (a));
+ memset (&a, 0, sizeof (struct A));
+ memset (&a, 0, sizeof (const struct A));
+ memset (&a, 0, sizeof (volatile struct A));
+ memset (&a, 0, sizeof (volatile const struct A));
+ memset (&a, 0, sizeof (TA));
+ memset (&a, 0, sizeof (__typeof (*&a)));
+ memset (pa1, 0, sizeof (*pa1));
+ memset (pa2, 0, sizeof (*pa3));
+ memset (pa3, 0, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) &a, 0, sizeof (&a));
+ memset ((char *) &a, 0, sizeof (&a));
+ memset (&a, 0, sizeof (&a) + 0);
+ memset (&a, 0, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memcpy (&a, x, sizeof a);
+ memcpy (&a, x, sizeof (a));
+ memcpy (&a, x, sizeof (struct A));
+ memcpy (&a, x, sizeof (const struct A));
+ memcpy (&a, x, sizeof (volatile struct A));
+ memcpy (&a, x, sizeof (volatile const struct A));
+ memcpy (&a, x, sizeof (TA));
+ memcpy (&a, x, sizeof (__typeof (*&a)));
+ memcpy (pa1, x, sizeof (*pa1));
+ memcpy (pa2, x, sizeof (*pa3));
+ memcpy (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) &a, x, sizeof (&a));
+ memcpy ((char *) &a, x, sizeof (&a));
+ memcpy (&a, x, sizeof (&a) + 0);
+ memcpy (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memcpy (x, &a, sizeof a);
+ memcpy (x, &a, sizeof (a));
+ memcpy (x, &a, sizeof (struct A));
+ memcpy (x, &a, sizeof (const struct A));
+ memcpy (x, &a, sizeof (volatile struct A));
+ memcpy (x, &a, sizeof (volatile const struct A));
+ memcpy (x, &a, sizeof (TA));
+ memcpy (x, &a, sizeof (__typeof (*&a)));
+ memcpy (x, pa1, sizeof (*pa1));
+ memcpy (x, pa2, sizeof (*pa3));
+ memcpy (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) &a, sizeof (&a));
+ memcpy (x, (char *) &a, sizeof (&a));
+ memcpy (x, &a, sizeof (&a) + 0);
+ memcpy (x, &a, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memmove (&a, x, sizeof a);
+ memmove (&a, x, sizeof (a));
+ memmove (&a, x, sizeof (struct A));
+ memmove (&a, x, sizeof (const struct A));
+ memmove (&a, x, sizeof (volatile struct A));
+ memmove (&a, x, sizeof (volatile const struct A));
+ memmove (&a, x, sizeof (TA));
+ memmove (&a, x, sizeof (__typeof (*&a)));
+ memmove (pa1, x, sizeof (*pa1));
+ memmove (pa2, x, sizeof (*pa3));
+ memmove (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) &a, x, sizeof (&a));
+ memmove ((char *) &a, x, sizeof (&a));
+ memmove (&a, x, sizeof (&a) + 0);
+ memmove (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memmove (x, &a, sizeof a);
+ memmove (x, &a, sizeof (a));
+ memmove (x, &a, sizeof (struct A));
+ memmove (x, &a, sizeof (const struct A));
+ memmove (x, &a, sizeof (volatile struct A));
+ memmove (x, &a, sizeof (volatile const struct A));
+ memmove (x, &a, sizeof (TA));
+ memmove (x, &a, sizeof (__typeof (*&a)));
+ memmove (x, pa1, sizeof (*pa1));
+ memmove (x, pa2, sizeof (*pa3));
+ memmove (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) &a, sizeof (&a));
+ memmove (x, (char *) &a, sizeof (&a));
+ memmove (x, &a, sizeof (&a) + 0);
+ memmove (x, &a, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ z += memcmp (&a, x, sizeof a);
+ z += memcmp (&a, x, sizeof (a));
+ z += memcmp (&a, x, sizeof (struct A));
+ z += memcmp (&a, x, sizeof (const struct A));
+ z += memcmp (&a, x, sizeof (volatile struct A));
+ z += memcmp (&a, x, sizeof (volatile const struct A));
+ z += memcmp (&a, x, sizeof (TA));
+ z += memcmp (&a, x, sizeof (__typeof (*&a)));
+ z += memcmp (pa1, x, sizeof (*pa1));
+ z += memcmp (pa2, x, sizeof (*pa3));
+ z += memcmp (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) &a, x, sizeof (&a));
+ z += memcmp ((char *) &a, x, sizeof (&a));
+ z += memcmp (&a, x, sizeof (&a) + 0);
+ z += memcmp (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ z += memcmp (x, &a, sizeof a);
+ z += memcmp (x, &a, sizeof (a));
+ z += memcmp (x, &a, sizeof (struct A));
+ z += memcmp (x, &a, sizeof (const struct A));
+ z += memcmp (x, &a, sizeof (volatile struct A));
+ z += memcmp (x, &a, sizeof (volatile const struct A));
+ z += memcmp (x, &a, sizeof (TA));
+ z += memcmp (x, &a, sizeof (__typeof (*&a)));
+ z += memcmp (x, pa1, sizeof (*pa1));
+ z += memcmp (x, pa2, sizeof (*pa3));
+ z += memcmp (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) &a, sizeof (&a));
+ z += memcmp (x, (char *) &a, sizeof (&a));
+ z += memcmp (x, &a, sizeof (&a) + 0);
+ z += memcmp (x, &a, 0 + sizeof (&a));
+
+ return z;
+}
+
+int
+f2 (void *x, int z)
+{
+ struct B b, *pb1 = &b;
+ TB *pb2 = &b;
+ PB pb3 = &b;
+ PTB pb4 = &b;
+ memset (&b, 0, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (pb1, 0, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb2, 0, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb3, 0, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb4, 0, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb1, 0, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb2, 0, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb3, 0, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb4, 0, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb1, x, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb4, x, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb1, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb4, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb1, x, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb4, x, sizeof (__typeof (pb4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb1, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb4, sizeof (__typeof (pb4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb1, x, sizeof (struct B *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb1, sizeof (struct B *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+
+ // These are correct, no warning.
+ memset (&b, 0, sizeof b);
+ memset (&b, 0, sizeof (b));
+ memset (&b, 0, sizeof (struct B));
+ memset (&b, 0, sizeof (const struct B));
+ memset (&b, 0, sizeof (volatile struct B));
+ memset (&b, 0, sizeof (volatile const struct B));
+ memset (&b, 0, sizeof (TB));
+ memset (&b, 0, sizeof (__typeof (*&b)));
+ memset (pb1, 0, sizeof (*pb1));
+ memset (pb2, 0, sizeof (*pb3));
+ memset (pb3, 0, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) &b, 0, sizeof (&b));
+ memset ((char *) &b, 0, sizeof (&b));
+ memset (&b, 0, sizeof (&b) + 0);
+ memset (&b, 0, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memcpy (&b, x, sizeof b);
+ memcpy (&b, x, sizeof (b));
+ memcpy (&b, x, sizeof (struct B));
+ memcpy (&b, x, sizeof (const struct B));
+ memcpy (&b, x, sizeof (volatile struct B));
+ memcpy (&b, x, sizeof (volatile const struct B));
+ memcpy (&b, x, sizeof (TB));
+ memcpy (&b, x, sizeof (__typeof (*&b)));
+ memcpy (pb1, x, sizeof (*pb1));
+ memcpy (pb2, x, sizeof (*pb3));
+ memcpy (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) &b, x, sizeof (&b));
+ memcpy ((char *) &b, x, sizeof (&b));
+ memcpy (&b, x, sizeof (&b) + 0);
+ memcpy (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memcpy (x, &b, sizeof b);
+ memcpy (x, &b, sizeof (b));
+ memcpy (x, &b, sizeof (struct B));
+ memcpy (x, &b, sizeof (const struct B));
+ memcpy (x, &b, sizeof (volatile struct B));
+ memcpy (x, &b, sizeof (volatile const struct B));
+ memcpy (x, &b, sizeof (TB));
+ memcpy (x, &b, sizeof (__typeof (*&b)));
+ memcpy (x, pb1, sizeof (*pb1));
+ memcpy (x, pb2, sizeof (*pb3));
+ memcpy (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) &b, sizeof (&b));
+ memcpy (x, (char *) &b, sizeof (&b));
+ memcpy (x, &b, sizeof (&b) + 0);
+ memcpy (x, &b, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memmove (&b, x, sizeof b);
+ memmove (&b, x, sizeof (b));
+ memmove (&b, x, sizeof (struct B));
+ memmove (&b, x, sizeof (const struct B));
+ memmove (&b, x, sizeof (volatile struct B));
+ memmove (&b, x, sizeof (volatile const struct B));
+ memmove (&b, x, sizeof (TB));
+ memmove (&b, x, sizeof (__typeof (*&b)));
+ memmove (pb1, x, sizeof (*pb1));
+ memmove (pb2, x, sizeof (*pb3));
+ memmove (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) &b, x, sizeof (&b));
+ memmove ((char *) &b, x, sizeof (&b));
+ memmove (&b, x, sizeof (&b) + 0);
+ memmove (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memmove (x, &b, sizeof b);
+ memmove (x, &b, sizeof (b));
+ memmove (x, &b, sizeof (struct B));
+ memmove (x, &b, sizeof (const struct B));
+ memmove (x, &b, sizeof (volatile struct B));
+ memmove (x, &b, sizeof (volatile const struct B));
+ memmove (x, &b, sizeof (TB));
+ memmove (x, &b, sizeof (__typeof (*&b)));
+ memmove (x, pb1, sizeof (*pb1));
+ memmove (x, pb2, sizeof (*pb3));
+ memmove (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) &b, sizeof (&b));
+ memmove (x, (char *) &b, sizeof (&b));
+ memmove (x, &b, sizeof (&b) + 0);
+ memmove (x, &b, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ z += memcmp (&b, x, sizeof b);
+ z += memcmp (&b, x, sizeof (b));
+ z += memcmp (&b, x, sizeof (struct B));
+ z += memcmp (&b, x, sizeof (const struct B));
+ z += memcmp (&b, x, sizeof (volatile struct B));
+ z += memcmp (&b, x, sizeof (volatile const struct B));
+ z += memcmp (&b, x, sizeof (TB));
+ z += memcmp (&b, x, sizeof (__typeof (*&b)));
+ z += memcmp (pb1, x, sizeof (*pb1));
+ z += memcmp (pb2, x, sizeof (*pb3));
+ z += memcmp (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) &b, x, sizeof (&b));
+ z += memcmp ((char *) &b, x, sizeof (&b));
+ z += memcmp (&b, x, sizeof (&b) + 0);
+ z += memcmp (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ z += memcmp (x, &b, sizeof b);
+ z += memcmp (x, &b, sizeof (b));
+ z += memcmp (x, &b, sizeof (struct B));
+ z += memcmp (x, &b, sizeof (const struct B));
+ z += memcmp (x, &b, sizeof (volatile struct B));
+ z += memcmp (x, &b, sizeof (volatile const struct B));
+ z += memcmp (x, &b, sizeof (TB));
+ z += memcmp (x, &b, sizeof (__typeof (*&b)));
+ z += memcmp (x, pb1, sizeof (*pb1));
+ z += memcmp (x, pb2, sizeof (*pb3));
+ z += memcmp (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) &b, sizeof (&b));
+ z += memcmp (x, (char *) &b, sizeof (&b));
+ z += memcmp (x, &b, sizeof (&b) + 0);
+ z += memcmp (x, &b, 0 + sizeof (&b));
+
+ return z;
+}
+
+int
+f3 (void *x, char *y, int z, X w)
+{
+ unsigned char *y1 = (unsigned char *) __builtin_alloca (z + 16);
+ char buf1[7];
+ signed char buf2[z + 32];
+ long buf3[17];
+ int *buf4[9];
+ signed char *y2 = buf2;
+ char c;
+ char *y3;
+ memset (y, 0, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (y1, 0, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (y2, 0, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (&c, 0, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (w, 0, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memcpy (y, x, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (w, x, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memcpy (x, y, sizeof (y)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, w, sizeof w); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+
+ memmove (y, x, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (w, x, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memmove (x, y, sizeof (y)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, w, sizeof w); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+
+ z += memcmp (y, x, sizeof (y)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (w, x, sizeof w); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+
+ z += memcmp (x, y, sizeof (y)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, w, sizeof w); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+
+ // These are correct, no warning.
+ memset (y, 0, sizeof (*y));
+ memset (y1, 0, sizeof (*y2));
+ memset (buf1, 0, sizeof buf1);
+ memset (buf3, 0, sizeof (buf3));
+ memset (&buf3[0], 0, sizeof (buf3));
+ memset (&buf4[0], 0, sizeof (buf4));
+ memset (w, 0, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) y, 0, sizeof (y));
+ memset ((char *) y1, 0, sizeof (y2));
+ memset (y, 0, sizeof (y) + 0);
+ memset (y1, 0, 0 + sizeof (y2));
+ memset ((void *) &c, 0, sizeof (&c));
+ memset ((signed char *) &c, 0, sizeof (&c));
+ memset (&c, 0, sizeof (&c) + 0);
+ memset (&c, 0, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memcpy (y, x, sizeof (*y));
+ memcpy (y1, x, sizeof (*y2));
+ memcpy (buf1, x, sizeof buf1);
+ memcpy (buf3, x, sizeof (buf3));
+ memcpy (&buf3[0], x, sizeof (buf3));
+ memcpy (&buf4[0], x, sizeof (buf4));
+ memcpy (&y3, y, sizeof (y3));
+ memcpy ((char *) &y3, y, sizeof (y3));
+ memcpy (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) y, x, sizeof (y));
+ memcpy ((char *) y1, x, sizeof (y2));
+ memcpy (y, x, sizeof (y) + 0);
+ memcpy (y1, x, 0 + sizeof (y2));
+ memcpy ((void *) &c, x, sizeof (&c));
+ memcpy ((signed char *) &c, x, sizeof (&c));
+ memcpy (&c, x, sizeof (&c) + 0);
+ memcpy (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memcpy (x, y, sizeof (*y));
+ memcpy (x, y1, sizeof (*y2));
+ memcpy (x, buf1, sizeof buf1);
+ memcpy (x, buf3, sizeof (buf3));
+ memcpy (x, &buf3[0], sizeof (buf3));
+ memcpy (x, &buf4[0], sizeof (buf4));
+ memcpy (y, &y3, sizeof (y3));
+ memcpy (y, (char *) &y3, sizeof (y3));
+ memcpy (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) y, sizeof (y));
+ memcpy (x, (char *) y1, sizeof (y2));
+ memcpy (x, y, sizeof (y) + 0);
+ memcpy (x, y1, 0 + sizeof (y2));
+ memcpy (x, (void *) &c, sizeof (&c));
+ memcpy (x, (signed char *) &c, sizeof (&c));
+ memcpy (x, &c, sizeof (&c) + 0);
+ memcpy (x, &c, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memmove (y, x, sizeof (*y));
+ memmove (y1, x, sizeof (*y2));
+ memmove (buf1, x, sizeof buf1);
+ memmove (buf3, x, sizeof (buf3));
+ memmove (&buf3[0], x, sizeof (buf3));
+ memmove (&buf4[0], x, sizeof (buf4));
+ memmove (&y3, y, sizeof (y3));
+ memmove ((char *) &y3, y, sizeof (y3));
+ memmove (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) y, x, sizeof (y));
+ memmove ((char *) y1, x, sizeof (y2));
+ memmove (y, x, sizeof (y) + 0);
+ memmove (y1, x, 0 + sizeof (y2));
+ memmove ((void *) &c, x, sizeof (&c));
+ memmove ((signed char *) &c, x, sizeof (&c));
+ memmove (&c, x, sizeof (&c) + 0);
+ memmove (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memmove (x, y, sizeof (*y));
+ memmove (x, y1, sizeof (*y2));
+ memmove (x, buf1, sizeof buf1);
+ memmove (x, buf3, sizeof (buf3));
+ memmove (x, &buf3[0], sizeof (buf3));
+ memmove (x, &buf4[0], sizeof (buf4));
+ memmove (y, &y3, sizeof (y3));
+ memmove (y, (char *) &y3, sizeof (y3));
+ memmove (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) y, sizeof (y));
+ memmove (x, (char *) y1, sizeof (y2));
+ memmove (x, y, sizeof (y) + 0);
+ memmove (x, y1, 0 + sizeof (y2));
+ memmove (x, (void *) &c, sizeof (&c));
+ memmove (x, (signed char *) &c, sizeof (&c));
+ memmove (x, &c, sizeof (&c) + 0);
+ memmove (x, &c, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ z += memcmp (y, x, sizeof (*y));
+ z += memcmp (y1, x, sizeof (*y2));
+ z += memcmp (buf1, x, sizeof buf1);
+ z += memcmp (buf3, x, sizeof (buf3));
+ z += memcmp (&buf3[0], x, sizeof (buf3));
+ z += memcmp (&buf4[0], x, sizeof (buf4));
+ z += memcmp (&y3, y, sizeof (y3));
+ z += memcmp ((char *) &y3, y, sizeof (y3));
+ z += memcmp (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) y, x, sizeof (y));
+ z += memcmp ((char *) y1, x, sizeof (y2));
+ z += memcmp (y, x, sizeof (y) + 0);
+ z += memcmp (y1, x, 0 + sizeof (y2));
+ z += memcmp ((void *) &c, x, sizeof (&c));
+ z += memcmp ((signed char *) &c, x, sizeof (&c));
+ z += memcmp (&c, x, sizeof (&c) + 0);
+ z += memcmp (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ z += memcmp (x, y, sizeof (*y));
+ z += memcmp (x, y1, sizeof (*y2));
+ z += memcmp (x, buf1, sizeof buf1);
+ z += memcmp (x, buf3, sizeof (buf3));
+ z += memcmp (x, &buf3[0], sizeof (buf3));
+ z += memcmp (x, &buf4[0], sizeof (buf4));
+ z += memcmp (y, &y3, sizeof (y3));
+ z += memcmp (y, (char *) &y3, sizeof (y3));
+ z += memcmp (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) y, sizeof (y));
+ z += memcmp (x, (char *) y1, sizeof (y2));
+ z += memcmp (x, y, sizeof (y) + 0);
+ z += memcmp (x, y1, 0 + sizeof (y2));
+ z += memcmp (x, (void *) &c, sizeof (&c));
+ z += memcmp (x, (signed char *) &c, sizeof (&c));
+ z += memcmp (x, &c, sizeof (&c) + 0);
+ z += memcmp (x, &c, 0 + sizeof (&c));
+
+ return z;
+}
+
+int
+f4 (char *x, char **y, int z, char w[64])
+{
+ const char *s1 = "foobarbaz";
+ const char *s2 = "abcde12345678";
+ strncpy (x, s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ strncat (x, s2, sizeof (s2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ stpncpy (x, s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ y[0] = strndup (s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ z += strncmp (s1, s2, sizeof (s1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += strncmp (s1, s2, sizeof (s2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += strncasecmp (s1, s2, sizeof (s1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += strncasecmp (s1, s2, sizeof (s2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+
+ strncpy (w, s1, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ strncat (w, s2, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ stpncpy (w, s1, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+
+ // These are correct, no warning.
+ const char s3[] = "foobarbaz";
+ const char s4[] = "abcde12345678";
+ strncpy (x, s3, sizeof (s3));
+ strncat (x, s4, sizeof (s4));
+ stpncpy (x, s3, sizeof (s3));
+ y[1] = strndup (s3, sizeof (s3));
+ z += strncmp (s3, s4, sizeof (s3));
+ z += strncmp (s3, s4, sizeof (s4));
+ z += strncasecmp (s3, s4, sizeof (s3));
+ z += strncasecmp (s3, s4, sizeof (s4));
+
+ return z;
+}
+
+// { dg-prune-output "\[\n\r\]*will always overflow\[\n\r\]*" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess2.C
new file mode 100644
index 000000000..9e2805d2b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/Wsizeof-pointer-memaccess2.C
@@ -0,0 +1,730 @@
+// Test -Wsizeof-pointer-memaccess warnings.
+// { dg-do compile }
+// { dg-options "-Wall" }
+// Test just twice, once with -O0 non-fortified, once with -O2 fortified.
+// { dg-skip-if "" { *-*-* } { "*" } { "-O0" "-O2" } }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+
+extern "C" {
+
+typedef __SIZE_TYPE__ size_t;
+extern void *memset (void *, int, size_t);
+extern void *memcpy (void *__restrict, const void *__restrict, size_t);
+extern void *memmove (void *__restrict, const void *__restrict, size_t);
+extern int memcmp (const void *, const void *, size_t);
+extern char *strncpy (char *__restrict, const char *__restrict, size_t);
+extern char *strncat (char *__restrict, const char *__restrict, size_t);
+extern char *stpncpy (char *__restrict, const char *__restrict, size_t);
+extern char *strndup (const char *, size_t);
+extern int strncmp (const char *, const char *, size_t);
+extern int strncasecmp (const char *, const char *, size_t);
+
+#ifdef __OPTIMIZE__
+# define bos(ptr) __builtin_object_size (ptr, 1)
+# define bos0(ptr) __builtin_object_size (ptr, 0)
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memset (void *dest, int c, size_t len)
+{
+ return __builtin___memset_chk (dest, c, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memcpy (void *__restrict dest, const void *__restrict src, size_t len)
+{
+ return __builtin___memcpy_chk (dest, src, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline void *
+memmove (void *dest, const void *src, size_t len)
+{
+ return __builtin___memmove_chk (dest, src, len, bos0 (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+strncpy (char *__restrict dest, const char *__restrict src, size_t len)
+{
+ return __builtin___strncpy_chk (dest, src, len, bos (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+strncat (char *dest, const char *src, size_t len)
+{
+ return __builtin___strncat_chk (dest, src, len, bos (dest));
+}
+
+__attribute__((__always_inline__, __gnu_inline__, __artificial__))
+extern inline char *
+stpncpy (char *__restrict dest, const char *__restrict src, size_t len)
+{
+ return __builtin___stpncpy_chk (dest, src, len, bos (dest));
+}
+#endif
+
+}
+
+struct A { short a, b; int c, d; long e, f; };
+typedef struct A TA;
+typedef struct A *PA;
+typedef TA *PTA;
+struct B {};
+typedef struct B TB;
+typedef struct B *PB;
+typedef TB *PTB;
+typedef int X[3][3][3];
+
+template <int N>
+int
+f1 (void *x, int z)
+{
+ struct A a, *pa1 = &a;
+ TA *pa2 = &a;
+ PA pa3 = &a;
+ PTA pa4 = &a;
+ memset (&a, 0, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (pa1, 0, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa2, 0, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa3, 0, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa4, 0, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pa1, 0, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa2, 0, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa3, 0, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pa4, 0, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pa1, x, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pa4, x, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pa1, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pa4, sizeof (__typeof (pa4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pa1, x, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pa4, x, sizeof (__typeof (pa4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pa1, sizeof (struct A *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pa4, sizeof (__typeof (pa4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (&a, x, sizeof (&a)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (pa1, x, sizeof (pa1)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa2, x, sizeof pa2); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa3, x, sizeof (pa3)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa4, x, sizeof pa4); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pa1, x, sizeof (struct A *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pa2, x, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pa3, x, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (x, &a, sizeof (&a)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, pa1, sizeof (pa1)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa2, sizeof pa2); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa3, sizeof (pa3)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa4, sizeof pa4); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pa1, sizeof (struct A *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pa2, sizeof (PTA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pa3, sizeof (PA)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+
+ // These are correct, no warning.
+ memset (&a, 0, sizeof a);
+ memset (&a, 0, sizeof (a));
+ memset (&a, 0, sizeof (struct A));
+ memset (&a, 0, sizeof (const struct A));
+ memset (&a, 0, sizeof (volatile struct A));
+ memset (&a, 0, sizeof (volatile const struct A));
+ memset (&a, 0, sizeof (TA));
+ memset (&a, 0, sizeof (__typeof (*&a)));
+ memset (pa1, 0, sizeof (*pa1));
+ memset (pa2, 0, sizeof (*pa3));
+ memset (pa3, 0, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) &a, 0, sizeof (&a));
+ memset ((char *) &a, 0, sizeof (&a));
+ memset (&a, 0, sizeof (&a) + 0);
+ memset (&a, 0, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memcpy (&a, x, sizeof a);
+ memcpy (&a, x, sizeof (a));
+ memcpy (&a, x, sizeof (struct A));
+ memcpy (&a, x, sizeof (const struct A));
+ memcpy (&a, x, sizeof (volatile struct A));
+ memcpy (&a, x, sizeof (volatile const struct A));
+ memcpy (&a, x, sizeof (TA));
+ memcpy (&a, x, sizeof (__typeof (*&a)));
+ memcpy (pa1, x, sizeof (*pa1));
+ memcpy (pa2, x, sizeof (*pa3));
+ memcpy (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) &a, x, sizeof (&a));
+ memcpy ((char *) &a, x, sizeof (&a));
+ memcpy (&a, x, sizeof (&a) + 0);
+ memcpy (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memcpy (x, &a, sizeof a);
+ memcpy (x, &a, sizeof (a));
+ memcpy (x, &a, sizeof (struct A));
+ memcpy (x, &a, sizeof (const struct A));
+ memcpy (x, &a, sizeof (volatile struct A));
+ memcpy (x, &a, sizeof (volatile const struct A));
+ memcpy (x, &a, sizeof (TA));
+ memcpy (x, &a, sizeof (__typeof (*&a)));
+ memcpy (x, pa1, sizeof (*pa1));
+ memcpy (x, pa2, sizeof (*pa3));
+ memcpy (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) &a, sizeof (&a));
+ memcpy (x, (char *) &a, sizeof (&a));
+ memcpy (x, &a, sizeof (&a) + 0);
+ memcpy (x, &a, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memmove (&a, x, sizeof a);
+ memmove (&a, x, sizeof (a));
+ memmove (&a, x, sizeof (struct A));
+ memmove (&a, x, sizeof (const struct A));
+ memmove (&a, x, sizeof (volatile struct A));
+ memmove (&a, x, sizeof (volatile const struct A));
+ memmove (&a, x, sizeof (TA));
+ memmove (&a, x, sizeof (__typeof (*&a)));
+ memmove (pa1, x, sizeof (*pa1));
+ memmove (pa2, x, sizeof (*pa3));
+ memmove (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) &a, x, sizeof (&a));
+ memmove ((char *) &a, x, sizeof (&a));
+ memmove (&a, x, sizeof (&a) + 0);
+ memmove (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ memmove (x, &a, sizeof a);
+ memmove (x, &a, sizeof (a));
+ memmove (x, &a, sizeof (struct A));
+ memmove (x, &a, sizeof (const struct A));
+ memmove (x, &a, sizeof (volatile struct A));
+ memmove (x, &a, sizeof (volatile const struct A));
+ memmove (x, &a, sizeof (TA));
+ memmove (x, &a, sizeof (__typeof (*&a)));
+ memmove (x, pa1, sizeof (*pa1));
+ memmove (x, pa2, sizeof (*pa3));
+ memmove (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) &a, sizeof (&a));
+ memmove (x, (char *) &a, sizeof (&a));
+ memmove (x, &a, sizeof (&a) + 0);
+ memmove (x, &a, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ z += memcmp (&a, x, sizeof a);
+ z += memcmp (&a, x, sizeof (a));
+ z += memcmp (&a, x, sizeof (struct A));
+ z += memcmp (&a, x, sizeof (const struct A));
+ z += memcmp (&a, x, sizeof (volatile struct A));
+ z += memcmp (&a, x, sizeof (volatile const struct A));
+ z += memcmp (&a, x, sizeof (TA));
+ z += memcmp (&a, x, sizeof (__typeof (*&a)));
+ z += memcmp (pa1, x, sizeof (*pa1));
+ z += memcmp (pa2, x, sizeof (*pa3));
+ z += memcmp (pa3, x, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) &a, x, sizeof (&a));
+ z += memcmp ((char *) &a, x, sizeof (&a));
+ z += memcmp (&a, x, sizeof (&a) + 0);
+ z += memcmp (&a, x, 0 + sizeof (&a));
+
+ // These are correct, no warning.
+ z += memcmp (x, &a, sizeof a);
+ z += memcmp (x, &a, sizeof (a));
+ z += memcmp (x, &a, sizeof (struct A));
+ z += memcmp (x, &a, sizeof (const struct A));
+ z += memcmp (x, &a, sizeof (volatile struct A));
+ z += memcmp (x, &a, sizeof (volatile const struct A));
+ z += memcmp (x, &a, sizeof (TA));
+ z += memcmp (x, &a, sizeof (__typeof (*&a)));
+ z += memcmp (x, pa1, sizeof (*pa1));
+ z += memcmp (x, pa2, sizeof (*pa3));
+ z += memcmp (x, pa3, sizeof (__typeof (*pa3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) &a, sizeof (&a));
+ z += memcmp (x, (char *) &a, sizeof (&a));
+ z += memcmp (x, &a, sizeof (&a) + 0);
+ z += memcmp (x, &a, 0 + sizeof (&a));
+
+ return z;
+}
+
+template <int N>
+int
+f2 (void *x, int z)
+{
+ struct B b, *pb1 = &b;
+ TB *pb2 = &b;
+ PB pb3 = &b;
+ PTB pb4 = &b;
+ memset (&b, 0, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (pb1, 0, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb2, 0, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb3, 0, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb4, 0, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memset (pb1, 0, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb2, 0, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb3, 0, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memset (pb4, 0, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memcpy (pb1, x, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memcpy (pb4, x, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memcpy (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memcpy (x, pb1, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memcpy (x, pb4, sizeof (__typeof (pb4))); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+ memmove (pb1, x, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+ memmove (pb4, x, sizeof (__typeof (pb4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the destination; expected \[^\n\r\]* or an explicit length" }
+
+ memmove (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+ memmove (x, pb1, sizeof (struct B *)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+ memmove (x, pb4, sizeof (__typeof (pb4)));// { dg-warning "call is the same pointer type \[^\n\r\]* as the source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (&b, x, sizeof (&b)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (pb1, x, sizeof (pb1)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb2, x, sizeof pb2); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb3, x, sizeof (pb3)); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb4, x, sizeof pb4); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+ z += memcmp (pb1, x, sizeof (struct B *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pb2, x, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (pb3, x, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the first source; expected \[^\n\r\]* or an explicit length" }
+
+ z += memcmp (x, &b, sizeof (&b)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, pb1, sizeof (pb1)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb2, sizeof pb2); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb3, sizeof (pb3)); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb4, sizeof pb4); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+ z += memcmp (x, pb1, sizeof (struct B *));// { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pb2, sizeof (PTB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+ z += memcmp (x, pb3, sizeof (PB)); // { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" }
+
+ // These are correct, no warning.
+ memset (&b, 0, sizeof b);
+ memset (&b, 0, sizeof (b));
+ memset (&b, 0, sizeof (struct B));
+ memset (&b, 0, sizeof (const struct B));
+ memset (&b, 0, sizeof (volatile struct B));
+ memset (&b, 0, sizeof (volatile const struct B));
+ memset (&b, 0, sizeof (TB));
+ memset (&b, 0, sizeof (__typeof (*&b)));
+ memset (pb1, 0, sizeof (*pb1));
+ memset (pb2, 0, sizeof (*pb3));
+ memset (pb3, 0, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) &b, 0, sizeof (&b));
+ memset ((char *) &b, 0, sizeof (&b));
+ memset (&b, 0, sizeof (&b) + 0);
+ memset (&b, 0, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memcpy (&b, x, sizeof b);
+ memcpy (&b, x, sizeof (b));
+ memcpy (&b, x, sizeof (struct B));
+ memcpy (&b, x, sizeof (const struct B));
+ memcpy (&b, x, sizeof (volatile struct B));
+ memcpy (&b, x, sizeof (volatile const struct B));
+ memcpy (&b, x, sizeof (TB));
+ memcpy (&b, x, sizeof (__typeof (*&b)));
+ memcpy (pb1, x, sizeof (*pb1));
+ memcpy (pb2, x, sizeof (*pb3));
+ memcpy (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) &b, x, sizeof (&b));
+ memcpy ((char *) &b, x, sizeof (&b));
+ memcpy (&b, x, sizeof (&b) + 0);
+ memcpy (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memcpy (x, &b, sizeof b);
+ memcpy (x, &b, sizeof (b));
+ memcpy (x, &b, sizeof (struct B));
+ memcpy (x, &b, sizeof (const struct B));
+ memcpy (x, &b, sizeof (volatile struct B));
+ memcpy (x, &b, sizeof (volatile const struct B));
+ memcpy (x, &b, sizeof (TB));
+ memcpy (x, &b, sizeof (__typeof (*&b)));
+ memcpy (x, pb1, sizeof (*pb1));
+ memcpy (x, pb2, sizeof (*pb3));
+ memcpy (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) &b, sizeof (&b));
+ memcpy (x, (char *) &b, sizeof (&b));
+ memcpy (x, &b, sizeof (&b) + 0);
+ memcpy (x, &b, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memmove (&b, x, sizeof b);
+ memmove (&b, x, sizeof (b));
+ memmove (&b, x, sizeof (struct B));
+ memmove (&b, x, sizeof (const struct B));
+ memmove (&b, x, sizeof (volatile struct B));
+ memmove (&b, x, sizeof (volatile const struct B));
+ memmove (&b, x, sizeof (TB));
+ memmove (&b, x, sizeof (__typeof (*&b)));
+ memmove (pb1, x, sizeof (*pb1));
+ memmove (pb2, x, sizeof (*pb3));
+ memmove (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) &b, x, sizeof (&b));
+ memmove ((char *) &b, x, sizeof (&b));
+ memmove (&b, x, sizeof (&b) + 0);
+ memmove (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ memmove (x, &b, sizeof b);
+ memmove (x, &b, sizeof (b));
+ memmove (x, &b, sizeof (struct B));
+ memmove (x, &b, sizeof (const struct B));
+ memmove (x, &b, sizeof (volatile struct B));
+ memmove (x, &b, sizeof (volatile const struct B));
+ memmove (x, &b, sizeof (TB));
+ memmove (x, &b, sizeof (__typeof (*&b)));
+ memmove (x, pb1, sizeof (*pb1));
+ memmove (x, pb2, sizeof (*pb3));
+ memmove (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) &b, sizeof (&b));
+ memmove (x, (char *) &b, sizeof (&b));
+ memmove (x, &b, sizeof (&b) + 0);
+ memmove (x, &b, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ z += memcmp (&b, x, sizeof b);
+ z += memcmp (&b, x, sizeof (b));
+ z += memcmp (&b, x, sizeof (struct B));
+ z += memcmp (&b, x, sizeof (const struct B));
+ z += memcmp (&b, x, sizeof (volatile struct B));
+ z += memcmp (&b, x, sizeof (volatile const struct B));
+ z += memcmp (&b, x, sizeof (TB));
+ z += memcmp (&b, x, sizeof (__typeof (*&b)));
+ z += memcmp (pb1, x, sizeof (*pb1));
+ z += memcmp (pb2, x, sizeof (*pb3));
+ z += memcmp (pb3, x, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) &b, x, sizeof (&b));
+ z += memcmp ((char *) &b, x, sizeof (&b));
+ z += memcmp (&b, x, sizeof (&b) + 0);
+ z += memcmp (&b, x, 0 + sizeof (&b));
+
+ // These are correct, no warning.
+ z += memcmp (x, &b, sizeof b);
+ z += memcmp (x, &b, sizeof (b));
+ z += memcmp (x, &b, sizeof (struct B));
+ z += memcmp (x, &b, sizeof (const struct B));
+ z += memcmp (x, &b, sizeof (volatile struct B));
+ z += memcmp (x, &b, sizeof (volatile const struct B));
+ z += memcmp (x, &b, sizeof (TB));
+ z += memcmp (x, &b, sizeof (__typeof (*&b)));
+ z += memcmp (x, pb1, sizeof (*pb1));
+ z += memcmp (x, pb2, sizeof (*pb3));
+ z += memcmp (x, pb3, sizeof (__typeof (*pb3)));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) &b, sizeof (&b));
+ z += memcmp (x, (char *) &b, sizeof (&b));
+ z += memcmp (x, &b, sizeof (&b) + 0);
+ z += memcmp (x, &b, 0 + sizeof (&b));
+
+ return z;
+}
+
+template <int N>
+int
+f3 (void *x, char *y, int z, X w)
+{
+ unsigned char *y1 = (unsigned char *) __builtin_alloca (z + 16);
+ char buf1[7];
+ signed char buf2[z + 32];
+ long buf3[17];
+ int *buf4[9];
+ signed char *y2 = buf2;
+ char c;
+ char *y3;
+ memset (y, 0, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (y1, 0, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (y2, 0, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memset (&c, 0, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memset (w, 0, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memcpy (y, x, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memcpy (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memcpy (w, x, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memcpy (x, y, sizeof (y)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memcpy (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memcpy (x, w, sizeof w); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+
+ memmove (y, x, sizeof (y)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ memmove (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the destination; did you mean to remove the addressof" }
+ memmove (w, x, sizeof w); // { dg-warning "call is the same expression as the destination; did you mean to dereference it" }
+
+ memmove (x, y, sizeof (y)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ memmove (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the source; did you mean to remove the addressof" }
+ memmove (x, w, sizeof w); // { dg-warning "call is the same expression as the source; did you mean to dereference it" }
+
+ z += memcmp (y, x, sizeof (y)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (y1, x, sizeof (y1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (y2, x, sizeof (y2)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += memcmp (&c, x, sizeof (&c)); // { dg-warning "call is the same expression as the first source; did you mean to remove the addressof" }
+ z += memcmp (w, x, sizeof w); // { dg-warning "call is the same expression as the first source; did you mean to dereference it" }
+
+ z += memcmp (x, y, sizeof (y)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, y1, sizeof (y1)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, y2, sizeof (y2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += memcmp (x, &c, sizeof (&c)); // { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" }
+ z += memcmp (x, w, sizeof w); // { dg-warning "call is the same expression as the second source; did you mean to dereference it" }
+
+ // These are correct, no warning.
+ memset (y, 0, sizeof (*y));
+ memset (y1, 0, sizeof (*y2));
+ memset (buf1, 0, sizeof buf1);
+ memset (buf3, 0, sizeof (buf3));
+ memset (&buf3[0], 0, sizeof (buf3));
+ memset (&buf4[0], 0, sizeof (buf4));
+ memset (w, 0, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memset ((void *) y, 0, sizeof (y));
+ memset ((char *) y1, 0, sizeof (y2));
+ memset (y, 0, sizeof (y) + 0);
+ memset (y1, 0, 0 + sizeof (y2));
+ memset ((void *) &c, 0, sizeof (&c));
+ memset ((signed char *) &c, 0, sizeof (&c));
+ memset (&c, 0, sizeof (&c) + 0);
+ memset (&c, 0, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memcpy (y, x, sizeof (*y));
+ memcpy (y1, x, sizeof (*y2));
+ memcpy (buf1, x, sizeof buf1);
+ memcpy (buf3, x, sizeof (buf3));
+ memcpy (&buf3[0], x, sizeof (buf3));
+ memcpy (&buf4[0], x, sizeof (buf4));
+ memcpy (&y3, y, sizeof (y3));
+ memcpy ((char *) &y3, y, sizeof (y3));
+ memcpy (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy ((void *) y, x, sizeof (y));
+ memcpy ((char *) y1, x, sizeof (y2));
+ memcpy (y, x, sizeof (y) + 0);
+ memcpy (y1, x, 0 + sizeof (y2));
+ memcpy ((void *) &c, x, sizeof (&c));
+ memcpy ((signed char *) &c, x, sizeof (&c));
+ memcpy (&c, x, sizeof (&c) + 0);
+ memcpy (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memcpy (x, y, sizeof (*y));
+ memcpy (x, y1, sizeof (*y2));
+ memcpy (x, buf1, sizeof buf1);
+ memcpy (x, buf3, sizeof (buf3));
+ memcpy (x, &buf3[0], sizeof (buf3));
+ memcpy (x, &buf4[0], sizeof (buf4));
+ memcpy (y, &y3, sizeof (y3));
+ memcpy (y, (char *) &y3, sizeof (y3));
+ memcpy (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memcpy (x, (void *) y, sizeof (y));
+ memcpy (x, (char *) y1, sizeof (y2));
+ memcpy (x, y, sizeof (y) + 0);
+ memcpy (x, y1, 0 + sizeof (y2));
+ memcpy (x, (void *) &c, sizeof (&c));
+ memcpy (x, (signed char *) &c, sizeof (&c));
+ memcpy (x, &c, sizeof (&c) + 0);
+ memcpy (x, &c, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memmove (y, x, sizeof (*y));
+ memmove (y1, x, sizeof (*y2));
+ memmove (buf1, x, sizeof buf1);
+ memmove (buf3, x, sizeof (buf3));
+ memmove (&buf3[0], x, sizeof (buf3));
+ memmove (&buf4[0], x, sizeof (buf4));
+ memmove (&y3, y, sizeof (y3));
+ memmove ((char *) &y3, y, sizeof (y3));
+ memmove (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memmove ((void *) y, x, sizeof (y));
+ memmove ((char *) y1, x, sizeof (y2));
+ memmove (y, x, sizeof (y) + 0);
+ memmove (y1, x, 0 + sizeof (y2));
+ memmove ((void *) &c, x, sizeof (&c));
+ memmove ((signed char *) &c, x, sizeof (&c));
+ memmove (&c, x, sizeof (&c) + 0);
+ memmove (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ memmove (x, y, sizeof (*y));
+ memmove (x, y1, sizeof (*y2));
+ memmove (x, buf1, sizeof buf1);
+ memmove (x, buf3, sizeof (buf3));
+ memmove (x, &buf3[0], sizeof (buf3));
+ memmove (x, &buf4[0], sizeof (buf4));
+ memmove (y, &y3, sizeof (y3));
+ memmove (y, (char *) &y3, sizeof (y3));
+ memmove (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ memmove (x, (void *) y, sizeof (y));
+ memmove (x, (char *) y1, sizeof (y2));
+ memmove (x, y, sizeof (y) + 0);
+ memmove (x, y1, 0 + sizeof (y2));
+ memmove (x, (void *) &c, sizeof (&c));
+ memmove (x, (signed char *) &c, sizeof (&c));
+ memmove (x, &c, sizeof (&c) + 0);
+ memmove (x, &c, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ z += memcmp (y, x, sizeof (*y));
+ z += memcmp (y1, x, sizeof (*y2));
+ z += memcmp (buf1, x, sizeof buf1);
+ z += memcmp (buf3, x, sizeof (buf3));
+ z += memcmp (&buf3[0], x, sizeof (buf3));
+ z += memcmp (&buf4[0], x, sizeof (buf4));
+ z += memcmp (&y3, y, sizeof (y3));
+ z += memcmp ((char *) &y3, y, sizeof (y3));
+ z += memcmp (w, x, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp ((void *) y, x, sizeof (y));
+ z += memcmp ((char *) y1, x, sizeof (y2));
+ z += memcmp (y, x, sizeof (y) + 0);
+ z += memcmp (y1, x, 0 + sizeof (y2));
+ z += memcmp ((void *) &c, x, sizeof (&c));
+ z += memcmp ((signed char *) &c, x, sizeof (&c));
+ z += memcmp (&c, x, sizeof (&c) + 0);
+ z += memcmp (&c, x, 0 + sizeof (&c));
+
+ // These are correct, no warning.
+ z += memcmp (x, y, sizeof (*y));
+ z += memcmp (x, y1, sizeof (*y2));
+ z += memcmp (x, buf1, sizeof buf1);
+ z += memcmp (x, buf3, sizeof (buf3));
+ z += memcmp (x, &buf3[0], sizeof (buf3));
+ z += memcmp (x, &buf4[0], sizeof (buf4));
+ z += memcmp (y, &y3, sizeof (y3));
+ z += memcmp (y, (char *) &y3, sizeof (y3));
+ z += memcmp (x, w, sizeof (X));
+ // These are probably broken, but obfuscated, no warning.
+ z += memcmp (x, (void *) y, sizeof (y));
+ z += memcmp (x, (char *) y1, sizeof (y2));
+ z += memcmp (x, y, sizeof (y) + 0);
+ z += memcmp (x, y1, 0 + sizeof (y2));
+ z += memcmp (x, (void *) &c, sizeof (&c));
+ z += memcmp (x, (signed char *) &c, sizeof (&c));
+ z += memcmp (x, &c, sizeof (&c) + 0);
+ z += memcmp (x, &c, 0 + sizeof (&c));
+
+ return z;
+}
+
+template <int N>
+int
+f4 (char *x, char **y, int z, char w[64])
+{
+ const char *s1 = "foobarbaz";
+ const char *s2 = "abcde12345678";
+ strncpy (x, s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ strncat (x, s2, sizeof (s2)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ stpncpy (x, s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ y[0] = strndup (s1, sizeof (s1)); // { dg-warning "call is the same expression as the source; did you mean to provide an explicit length" }
+ z += strncmp (s1, s2, sizeof (s1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += strncmp (s1, s2, sizeof (s2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+ z += strncasecmp (s1, s2, sizeof (s1)); // { dg-warning "call is the same expression as the first source; did you mean to provide an explicit length" }
+ z += strncasecmp (s1, s2, sizeof (s2)); // { dg-warning "call is the same expression as the second source; did you mean to provide an explicit length" }
+
+ strncpy (w, s1, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ strncat (w, s2, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+ stpncpy (w, s1, sizeof (w)); // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length" }
+
+ // These are correct, no warning.
+ const char s3[] = "foobarbaz";
+ const char s4[] = "abcde12345678";
+ strncpy (x, s3, sizeof (s3));
+ strncat (x, s4, sizeof (s4));
+ stpncpy (x, s3, sizeof (s3));
+ y[1] = strndup (s3, sizeof (s3));
+ z += strncmp (s3, s4, sizeof (s3));
+ z += strncmp (s3, s4, sizeof (s4));
+ z += strncasecmp (s3, s4, sizeof (s3));
+ z += strncasecmp (s3, s4, sizeof (s4));
+
+ return z;
+}
+
+int
+f (void *x, char *y, int z, X w, char **u, char v[64])
+{
+ z += f1<0> (x, z);
+ z += f2<0> (x, z);
+ z += f3<0> (x, y, z, w);
+ z += f4<0> (y, u, z, v);
+ return z;
+}
+
+// { dg-prune-output "\[\n\r\]*will always overflow\[\n\r\]*" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/builtin-location.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/builtin-location.C
new file mode 100644
index 000000000..cad53de4b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/builtin-location.C
@@ -0,0 +1,31 @@
+// { dg-do run }
+
+#include <cstring>
+
+const char *gfile;
+const char *gfn;
+int gline;
+
+void bar (const char *file = __builtin_FILE (),
+ const char *function = __builtin_FUNCTION (),
+ int line = __builtin_LINE ())
+{
+ gfile = file;
+ gfn = function;
+ gline = line;
+}
+
+extern "C" void abort (void);
+
+int main()
+{
+ int here;
+ bar (); here = __LINE__;
+ if (std::strcmp (gfn, __FUNCTION__) != 0)
+ abort ();
+ if (std::strcmp (gfile, __FILE__) != 0)
+ abort ();
+ if (gline != here)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/covariant-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/covariant-1.C
new file mode 100644
index 000000000..9f1fd0a52
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/covariant-1.C
@@ -0,0 +1,33 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+class A {
+public:
+ virtual A* getThis() { return this; }
+};
+
+class B {
+int a;
+public:
+ virtual B* getThis() { return this; }
+};
+
+class AB : public A, public B {
+public:
+ virtual AB* getThis() { return this; }
+};
+
+int main ()
+{
+ AB ab;
+
+ A* a = &ab;
+ B* b = &ab;
+
+ if (a->getThis() != a
+ || b->getThis() != b)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C
new file mode 100644
index 000000000..2d755ec8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C
@@ -0,0 +1,30 @@
+/* Test whether the __builtin__CFStringMakeConstantString
+ "function" generates compile-time objects with the correct layout. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-mconstant-cfstrings" } */
+
+typedef const struct __CFString *CFStringRef;
+
+#ifdef __CONSTANT_CFSTRINGS__
+#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR))
+#else
+#error __CONSTANT_CFSTRINGS__ not defined
+#endif
+
+extern int cond;
+extern const char *func(void);
+
+CFStringRef s0 = CFSTR("Hello" "there");
+
+void foo(void) {
+ const CFStringRef s1 = CFSTR("Str1");
+
+ s0 = s1;
+}
+
+/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+4\n" { target { *-*-darwin* && { ! lp64 } } } } } */
+/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+10\n" { target { *-*-darwin* && { ! lp64 } } } } } */
+/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t4\n" { target { *-*-darwin* && { lp64 } } } } } */
+/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t10\n" { target { *-*-darwin* && { lp64 } } } } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/dg-torture.exp b/gcc-4.9/gcc/testsuite/g++.dg/torture/dg-torture.exp
new file mode 100644
index 000000000..7525e0408
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/dg-torture.exp
@@ -0,0 +1,7 @@
+# This harness is for tests that should be run at all optimisation levels.
+
+load_lib g++-dg.exp
+
+dg-init
+gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C $srcdir/c-c++-common/torture/*.c]] ""
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/ipa-cp-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/ipa-cp-1.C
new file mode 100644
index 000000000..37c046d87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/ipa-cp-1.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+// With IPA-CP, this caused a problem on darwin, where
+// _M_reset is being cloned, it was still being marked
+// as weak and then we had to change the calls to the
+// newly marked function for the non throwing behavior.
+
+int& f(int&);
+inline void _M_reset(int &_M_vbp) throw()
+{
+ f(_M_vbp);
+}
+extern int _S_last_request;
+void _M_allocate_single_object() throw()
+{
+ _M_reset(_S_last_request);
+ _M_reset(_S_last_request);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr27218.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr27218.C
new file mode 100644
index 000000000..b1e18dd33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr27218.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct Vector
+{
+ double _x, _y;
+};
+typedef Vector Point;
+Vector d;
+static inline Vector f(void)
+{
+ return d;
+}
+void add_duck (void)
+{
+ new Point (f());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30252.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30252.C
new file mode 100644
index 000000000..aabf88f51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30252.C
@@ -0,0 +1,226 @@
+/* { dg-do run } */
+/* { dg-options "-fstrict-aliasing" } */
+
+extern "C" void abort (void);
+namespace sigc {
+ template <class T_type>
+ struct type_trait
+ {
+ typedef T_type& pass;
+ typedef const T_type& take;
+ typedef T_type* pointer;
+ };
+ template <class T_base, class T_derived>
+ struct is_base_and_derived
+ {
+ struct big {
+ char memory[64];
+ };
+ static big is_base_class_(...);
+ static char is_base_class_(typename type_trait<T_base>::pointer);
+ static const bool value =
+ sizeof(is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) ==
+ sizeof(char);
+ };
+ struct nil;
+ struct functor_base {};
+ template <class T_functor, bool I_derives_functor_base=is_base_and_derived<functor_base,T_functor>::value>
+ struct functor_trait
+ {
+ };
+ template <class T_functor>
+ struct functor_trait<T_functor,true>
+ {
+ typedef typename T_functor::result_type result_type;
+ typedef T_functor functor_type;
+ };
+ template <class T_arg1, class T_return>
+ class pointer_functor1 : public functor_base
+ {
+ typedef T_return (*function_type)(T_arg1);
+ function_type func_ptr_;
+ public:
+ typedef T_return result_type;
+ explicit pointer_functor1(function_type _A_func): func_ptr_(_A_func) {}
+ T_return operator()(typename type_trait<T_arg1>::take _A_a1) const
+ { return func_ptr_(_A_a1); }
+ };
+ template <class T_arg1, class T_return>
+ inline pointer_functor1<T_arg1, T_return>
+ ptr_fun1(T_return (*_A_func)(T_arg1))
+ { return pointer_functor1<T_arg1, T_return>(_A_func); }
+ struct adaptor_base : public functor_base {};
+ template <class T_functor,
+ class T_arg1=void,
+ bool I_derives_adaptor_base=is_base_and_derived<adaptor_base,T_functor>::value>
+ struct deduce_result_type
+ { typedef typename functor_trait<T_functor>::result_type type; };
+ template <class T_functor>
+ struct adaptor_functor : public adaptor_base
+ {
+ template <class T_arg1=void>
+ struct deduce_result_type
+ { typedef typename sigc::deduce_result_type<T_functor, T_arg1>::type type; };
+ typedef typename functor_trait<T_functor>::result_type result_type;
+ result_type
+ operator()() const;
+ template <class T_arg1>
+ typename deduce_result_type<T_arg1>::type
+ operator()(T_arg1 _A_arg1) const
+ { return functor_(_A_arg1); }
+ explicit adaptor_functor(const T_functor& _A_functor)
+ : functor_(_A_functor)
+ {}
+ mutable T_functor functor_;
+ };
+ template <class T_functor>
+ typename adaptor_functor<T_functor>::result_type
+ adaptor_functor<T_functor>::operator()() const
+ { return functor_(); }
+ template <class T_functor, bool I_isadaptor = is_base_and_derived<adaptor_base, T_functor>::value> struct adaptor_trait;
+ template <class T_functor>
+ struct adaptor_trait<T_functor, true>
+ {
+ typedef T_functor adaptor_type;
+ };
+ template <class T_functor>
+ struct adaptor_trait<T_functor, false>
+ {
+ typedef typename functor_trait<T_functor>::functor_type functor_type;
+ typedef adaptor_functor<functor_type> adaptor_type;
+ };
+ template <class T_functor>
+ struct adapts : public adaptor_base
+ {
+ typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type;
+ explicit adapts(const T_functor& _A_functor)
+ : functor_(_A_functor)
+ {}
+ mutable adaptor_type functor_;
+ };
+ template <class T_type>
+ struct reference_wrapper
+ {
+ };
+ template <class T_type>
+ struct unwrap_reference
+ {
+ typedef T_type type;
+ };
+ template <class T_type>
+ class bound_argument
+ {
+ public:
+ bound_argument(const T_type& _A_argument)
+ : visited_(_A_argument)
+ {}
+ inline T_type& invoke()
+ { return visited_; }
+ T_type visited_;
+ };
+ template <class T_wrapped>
+ class bound_argument< reference_wrapper<T_wrapped> >
+ {
+ };
+ template <int I_location, class T_functor, class T_type1=nil>
+ struct bind_functor;
+ template <class T_functor, class T_type1>
+ struct bind_functor<-1, T_functor, T_type1> : public adapts<T_functor>
+ {
+ typedef typename adapts<T_functor>::adaptor_type adaptor_type;
+ typedef typename adaptor_type::result_type result_type;
+ result_type
+ operator()()
+ {
+ return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_type1>::type>::pass> (bound1_.invoke());
+ }
+ bind_functor(typename type_trait<T_functor>::take _A_func, typename type_trait<T_type1>::take _A_bound1)
+ : adapts<T_functor>(_A_func), bound1_(_A_bound1)
+ {}
+ bound_argument<T_type1> bound1_;
+ };
+ template <class T_type1, class T_functor>
+ inline bind_functor<-1, T_functor,
+ T_type1>
+ bind(const T_functor& _A_func, T_type1 _A_b1)
+ { return bind_functor<-1, T_functor,
+ T_type1>
+ (_A_func, _A_b1);
+ }
+ namespace internal {
+ struct slot_rep;
+ typedef void* (*hook)(slot_rep *);
+ struct slot_rep
+ {
+ hook call_;
+ };
+ }
+ class slot_base : public functor_base
+ {
+ public:
+ typedef internal::slot_rep rep_type;
+ explicit slot_base(rep_type* rep)
+ : rep_(rep)
+ {
+ }
+ mutable rep_type *rep_;
+ };
+ namespace internal {
+ template <class T_functor>
+ struct typed_slot_rep : public slot_rep
+ {
+ typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type;
+ adaptor_type functor_;
+ inline typed_slot_rep(const T_functor& functor)
+ : functor_(functor)
+ {
+ }
+ };
+ template<class T_functor>
+ struct slot_call0
+ {
+ static void *call_it(slot_rep* rep)
+ {
+ typedef typed_slot_rep<T_functor> typed_slot;
+ typed_slot *typed_rep = static_cast<typed_slot*>(rep);
+ return (typed_rep->functor_)();
+ }
+ static hook address()
+ {
+ return &call_it;
+ }
+ };
+ }
+
+ class slot0 : public slot_base
+ {
+ public:
+ typedef void * (*call_type)(rep_type*);
+ inline void *operator()() const
+ {
+ return slot_base::rep_->call_ (slot_base::rep_);
+ }
+ template <class T_functor>
+ slot0(const T_functor& _A_func)
+ : slot_base(new internal::typed_slot_rep<T_functor>(_A_func))
+ {
+ slot_base::rep_->call_ = internal::slot_call0<T_functor>::address();
+ }
+ };
+}
+struct A
+{
+ static void *foo (void *p) { return p; }
+ typedef sigc::slot0 C;
+ C bar();
+};
+A::C A::bar ()
+{
+ return sigc::bind (sigc::ptr_fun1 (&A::foo), (void*)0);
+}
+int main (void)
+{
+ A a;
+ if (a.bar ()() != 0)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30567.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30567.C
new file mode 100644
index 000000000..389daf357
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr30567.C
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+
+template <typename T>
+struct const_ref
+{
+ const T* begin;
+ const_ref(const T* b) : begin(b) {}
+};
+
+template <typename T>
+T sum(const_ref<T> const& a)
+{
+ T result = 0;
+ for(unsigned i=0;i<1;i++) result += a.begin[i];
+ return result;
+}
+
+struct tiny_plain
+{
+ int elems[2];
+ tiny_plain() { elems[0]=1; }
+};
+
+struct vec3 : tiny_plain {};
+
+struct mat3
+{
+ int type() const { return sum(const_ref<int>(vec3().elems)) == 1; }
+};
+
+int main() { return mat3().type() ? 0 : 1; }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-1.C
new file mode 100644
index 000000000..cb11b2148
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-1.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+static int get_record (void);
+void f(void);
+int g(void);
+static int get_record (void)
+{
+ int result;
+ try
+ {
+ result = g();
+ f();
+ }
+ catch (const int &) { }
+ return result;
+}
+int NAV_get_record ( )
+{
+ int result;
+ for (;;)
+ if (get_record ())
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-2.C
new file mode 100644
index 000000000..a14ef3798
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31081-2.C
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+
+class CString
+{
+public:
+ CString();
+ ~CString() { operator delete(_rep); }
+ operator const char*() const { return _rep; }
+private:
+ CString(char* cstr);
+ char* _rep;
+};
+
+class String
+{
+public:
+
+ String();
+ String(const char* str);
+ ~String();
+ CString getCString() const;
+};
+
+int is_absolute_path(const char *path);
+
+inline void getAbsolutePath(
+ const char* path,
+ const String& filename)
+{
+ (!is_absolute_path(filename.getCString()) && path);
+ return;
+}
+
+int foo(int &value);
+
+int main(int argc, char** argv)
+{
+ int repeatTestCount = 0;
+ if (foo(repeatTestCount))
+ {
+ repeatTestCount = 1;
+ }
+ for (int numTests = 1; numTests <= repeatTestCount; numTests++)
+ {
+ getAbsolutePath("blah", "blah");
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31579.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31579.C
new file mode 100644
index 000000000..131532e63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31579.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+// middle-end/31579
+// Expand was crashing while expanding the tree for the initializer
+
+struct Industry {
+ unsigned char produced_cargo[2];
+};
+unsigned int a = (((__SIZE_TYPE__)&reinterpret_cast<const volatile
+char&>((((Industry*)(char*)8)->produced_cargo[0]))) - 8);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31863.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31863.C
new file mode 100644
index 000000000..f10ad5f01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr31863.C
@@ -0,0 +1,778 @@
+/* { dg-do link } */
+/* { dg-timeout-factor 2.0 } */
+/* { dg-skip-if "Program too big" { "avr-*-*" } { "*" } { "" } } */
+
+namespace Loki
+{
+ class NullType {};
+ template <class T, class U>
+ struct Typelist
+ {
+ typedef T Head;
+ typedef U Tail;
+ };
+
+
+
+ namespace TL
+ {
+ template
+ <
+ typename T1 = NullType, typename T2 = NullType, typename T3 =
+NullType,
+ typename T4 = NullType, typename T5 = NullType, typename T6 =
+NullType,
+ typename T7 = NullType, typename T8 = NullType, typename T9 =
+NullType,
+ typename T10 = NullType, typename T11 = NullType, typename T12
+= NullType,
+ typename T13 = NullType, typename T14 = NullType, typename T15
+= NullType,
+ typename T16 = NullType, typename T17 = NullType, typename T18
+= NullType,
+ typename T19 = NullType, typename T20 = NullType, typename T21
+= NullType,
+ typename T22 = NullType, typename T23 = NullType, typename T24
+= NullType,
+ typename T25 = NullType, typename T26 = NullType, typename T27
+= NullType,
+ typename T28 = NullType, typename T29 = NullType, typename T30
+= NullType,
+ typename T31 = NullType, typename T32 = NullType, typename T33
+= NullType,
+ typename T34 = NullType, typename T35 = NullType, typename T36
+= NullType,
+ typename T37 = NullType, typename T38 = NullType, typename T39
+= NullType,
+ typename T40 = NullType
+ >
+ struct MakeTypelist
+ {
+ private:
+ typedef typename MakeTypelist
+ <
+ T2 , T3 , T4 ,
+ T5 , T6 , T7 ,
+ T8 , T9 , T10,
+ T11, T12, T13,
+ T14, T15, T16,
+ T17, T18, T19,
+ T20, T21, T22,
+ T23, T24, T25,
+ T26, T27, T28,
+ T29, T30, T31,
+ T32, T33, T34,
+ T35, T36, T37,
+ T38, T39, T40
+ >
+ ::Result TailResult;
+
+ public:
+ typedef Typelist<T1, TailResult> Result;
+ };
+
+ template<>
+ struct MakeTypelist<>
+ {
+ typedef NullType Result;
+ };
+
+ }
+}
+template <class Key>
+class Factory;
+
+template <class Key, bool iW>
+struct Context
+{
+ typedef Key KeyType;
+ enum
+ {
+ isWrite = iW
+ };
+};
+
+namespace detail
+{
+
+template <class Key, bool isWrite>
+class CreatorUnitBaseImpl
+{
+public:
+ typedef Context<Key, isWrite> Context_;
+private:
+ typedef void*(CreatorUnitBaseImpl::*CreateFun)(Context_&, unsigned&, const
+Key&);
+ CreateFun createFun_;
+
+protected:
+ virtual void* createUninitialized () = 0;
+ template <class Value>
+ void* createImpl (Context_& ctx, unsigned& ver, const Key& k)
+ {
+ return createUninitialized();
+ }
+private:
+ CreatorUnitBaseImpl();
+public:
+ template <class Value>
+ CreatorUnitBaseImpl (Value*) :
+ createFun_( &CreatorUnitBaseImpl::template createImpl<Value> )
+ {
+ }
+
+ virtual ~CreatorUnitBaseImpl () {}
+
+ CreatorUnitBaseImpl(const CreatorUnitBaseImpl& s)
+ : createFun_(s.createFun_)
+ {
+ }
+
+ CreatorUnitBaseImpl& operator=(const CreatorUnitBaseImpl& s)
+ {
+ createFun_ = s.createFun_;
+ return *this;
+ }
+ void* create (Context_& ctx, unsigned& ver, const Key& k)
+ {
+ return (this->*createFun_)(ctx, ver, k);
+ }
+};
+
+template <class Key>
+class Creator : protected CreatorUnitBaseImpl<Key, true>, protected
+CreatorUnitBaseImpl<Key, false>
+{
+public:
+ typedef void* (*CreatorFun) ();
+
+private:
+ CreatorFun fun_;
+protected:
+ virtual void* createUninitialized ()
+ {
+ if (fun_)
+ return (*fun_)();
+ return 0;
+ }
+private:
+ Creator ();
+public:
+ template <class Value>
+ Creator (CreatorFun f, Value*) :
+ CreatorUnitBaseImpl<Key, true>((Value*)0),
+ CreatorUnitBaseImpl<Key, false>((Value*)0),
+ fun_(f)
+ {
+ }
+
+ Creator(const Creator& s) :
+ CreatorUnitBaseImpl<Key, true>(s),
+ CreatorUnitBaseImpl<Key, false>(s),
+ fun_(s.fun_)
+ {
+
+ }
+
+ Creator& operator=(const Creator& s)
+ {
+ CreatorUnitBaseImpl<Key, true>::operator=(s);
+ CreatorUnitBaseImpl<Key, false>::operator=(s);
+ fun_ = s.fun_;
+ return *this;
+ }
+
+ virtual ~Creator ()
+ {
+ }
+
+ template <class Context>
+ void* createObject (Context& ctx, unsigned& ver, const Key& k)
+ {
+ void* r = CreatorUnitBaseImpl<Key, Context::isWrite>::create(ctx, ver,
+k);
+ return r;
+ }
+};
+
+}
+
+template <class Key>
+class Factory
+{
+public:
+ typedef Key KeyType;
+ typedef void* (*CreatorFun) ();
+ typedef detail::Creator<Key> Creator;
+public:
+ Factory () {}
+ ~Factory () {}
+
+ template <class Value>
+ bool registerCreator (const Key& k, CreatorFun fun)
+ {
+ return true;
+ }
+ template <class Context>
+ void* createObject (const Key& k, Context& ctx, unsigned& ver)
+ {
+ return 0;
+ }
+};
+
+template <class Key, class Base, Key key>
+struct ClassSpec
+{
+ typedef Key KeyType;
+ typedef Base BaseType;
+ enum {KeyValue = key};
+};
+
+template <class Key, class T>
+class Serializer;
+
+template <class Key, class Base, Key key>
+class Serializer<Key, ClassSpec <Key, Base, key> >
+ : public virtual Factory<Key>
+{
+ typedef Key KeyType;
+ typedef Base BaseType;
+ enum {KeyValue = key};
+ typedef Factory<Key> Inherited;
+ typedef Serializer<Key, ClassSpec< Key, Base, key > > SelfType;
+
+ static void* create ()
+ {
+ return (void*) (new BaseType);
+ }
+public:
+ Serializer()
+ {
+ Inherited::template registerCreator<BaseType>(
+ KeyValue,
+ &SelfType::create);
+ }
+};
+
+template <class Key, class Head>
+class Serializer<Key, Loki::Typelist<Head, Loki::NullType> >:
+ public Serializer<Key, Head>
+{
+};
+
+template <class Key, class Head, class Tail>
+class Serializer<Key, Loki::Typelist<Head, Tail> >:
+ public virtual Serializer<Key, Head>,
+ public virtual Serializer<Key, Tail>
+{
+};
+
+template <class Key>
+class Serializer<Key, Loki::NullType> : public virtual Factory<Key>
+{
+};
+
+
+
+
+typedef unsigned KeyType;
+
+
+
+typedef Factory<KeyType> FactoryType;
+
+typedef KeyType Key;
+
+struct A001
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 1; }
+ static const char* className () {return "A001";}
+};
+
+struct A002
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 2; }
+ static const char* className () {return "A002";}
+};
+
+struct A003
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 3; }
+ static const char* className () {return "A003";}
+};
+
+struct A004
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 4; }
+ static const char* className () {return "A004";}
+};
+
+struct A005
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 5; }
+ static const char* className () {return "A005";}
+};
+
+struct A006
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 6; }
+ static const char* className () {return "A006";}
+};
+
+struct A007
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 7; }
+ static const char* className () {return "A007";}
+};
+
+struct A008
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 8; }
+ static const char* className () {return "A008";}
+};
+
+struct A009
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 9; }
+ static const char* className () {return "A009";}
+};
+
+struct A010
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 10; }
+ static const char* className () {return "A010";}
+};
+
+struct A011
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 11; }
+ static const char* className () {return "A011";}
+};
+
+struct A012
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 12; }
+ static const char* className () {return "A012";}
+};
+
+struct A013
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 13; }
+ static const char* className () {return "A013";}
+};
+
+struct A014
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 14; }
+ static const char* className () {return "A014";}
+};
+
+struct A015
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 15; }
+ static const char* className () {return "A015";}
+};
+
+struct A016
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 16; }
+ static const char* className () {return "A016";}
+};
+
+struct A017
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 17; }
+ static const char* className () {return "A017";}
+};
+
+struct A018
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 18; }
+ static const char* className () {return "A018";}
+};
+
+struct A019
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 19; }
+ static const char* className () {return "A019";}
+};
+
+struct A020
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 20; }
+ static const char* className () {return "A020";}
+};
+
+struct A021
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 21; }
+ static const char* className () {return "A021";}
+};
+
+struct A022
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 22; }
+ static const char* className () {return "A022";}
+};
+
+struct A023
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 23; }
+ static const char* className () {return "A023";}
+};
+
+struct A024
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 24; }
+ static const char* className () {return "A024";}
+};
+
+struct A025
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 25; }
+ static const char* className () {return "A025";}
+};
+
+struct A026
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 26; }
+ static const char* className () {return "A026";}
+};
+
+struct A027
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 27; }
+ static const char* className () {return "A027";}
+};
+
+struct A028
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 28; }
+ static const char* className () {return "A028";}
+};
+
+struct A029
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 29; }
+ static const char* className () {return "A029";}
+};
+
+struct A030
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 30; }
+ static const char* className () {return "A030";}
+};
+
+struct A031
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 31; }
+ static const char* className () {return "A031";}
+};
+
+struct A032
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 32; }
+ static const char* className () {return "A032";}
+};
+
+struct A033
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 33; }
+ static const char* className () {return "A033";}
+};
+
+struct A034
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 34; }
+ static const char* className () {return "A034";}
+};
+
+struct A035
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 35; }
+ static const char* className () {return "A035";}
+};
+
+struct A036
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 36; }
+ static const char* className () {return "A036";}
+};
+
+struct A037
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 37; }
+ static const char* className () {return "A037";}
+};
+
+struct A038
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 38; }
+ static const char* className () {return "A038";}
+};
+
+struct A039
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 39; }
+ static const char* className () {return "A039";}
+};
+
+struct A040
+{
+ template <class Context>
+ bool serialize(Context& ctx, unsigned& ver)
+ {
+ return true;
+ }
+ static Key classId() { return 40; }
+ static const char* className () {return "A040";}
+};
+
+Factory<Key>& getInstance()
+{
+ static Serializer<Key,
+ Loki::TL::MakeTypelist<
+ ClassSpec<Key, A001, 1>,
+ ClassSpec<Key, A002, 2>,
+ ClassSpec<Key, A003, 3>,
+ ClassSpec<Key, A004, 4>,
+ ClassSpec<Key, A005, 5>,
+ ClassSpec<Key, A006, 6>,
+ ClassSpec<Key, A007, 7>,
+ ClassSpec<Key, A008, 8>,
+ ClassSpec<Key, A009, 9>,
+ ClassSpec<Key, A010, 10>,
+ ClassSpec<Key, A011, 11>,
+ ClassSpec<Key, A012, 12>,
+ ClassSpec<Key, A013, 13>,
+ ClassSpec<Key, A014, 14>,
+ ClassSpec<Key, A015, 15>,
+ ClassSpec<Key, A016, 16>,
+ ClassSpec<Key, A017, 17>,
+ ClassSpec<Key, A018, 18>,
+ ClassSpec<Key, A019, 19>,
+ ClassSpec<Key, A020, 20>,
+ ClassSpec<Key, A021, 21>,
+ ClassSpec<Key, A022, 22>,
+ ClassSpec<Key, A023, 23>,
+ ClassSpec<Key, A024, 24>,
+ ClassSpec<Key, A025, 25>,
+ ClassSpec<Key, A026, 26>,
+ ClassSpec<Key, A027, 27>,
+ ClassSpec<Key, A028, 28>,
+ ClassSpec<Key, A029, 29>,
+ ClassSpec<Key, A030, 30>,
+ ClassSpec<Key, A031, 31>,
+ ClassSpec<Key, A032, 32>,
+ ClassSpec<Key, A033, 33>,
+ ClassSpec<Key, A034, 34>,
+ ClassSpec<Key, A035, 35>,
+ ClassSpec<Key, A036, 36>,
+ ClassSpec<Key, A037, 37>,
+ ClassSpec<Key, A038, 38>,
+ ClassSpec<Key, A039, 39>,
+ ClassSpec<Key, A040, 40>
+ >::Result
+ > instance;
+ return instance;
+}
+
+int main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32304.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32304.C
new file mode 100644
index 000000000..236d00b97
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32304.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+struct S {
+ S() {}
+};
+S f() {
+ static S s;
+ return s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32563.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32563.C
new file mode 100644
index 000000000..d536b3faa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32563.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+struct A
+{
+ char c[1];
+} a;
+
+const __SIZE_TYPE__ i = (__SIZE_TYPE__)&a.c[0] - 1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32950.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32950.C
new file mode 100644
index 000000000..8d64296e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr32950.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+struct A
+{
+ __complex__ double c;
+};
+
+struct B
+{
+ A a;
+ B(A x) : a(x) {}
+ void foo();
+};
+
+void bar()
+{
+ B b = A();
+ B(b).foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33134.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33134.C
new file mode 100644
index 000000000..43482c7fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33134.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* Used to crash in VRP. */
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+class FXObject;
+class FXStream
+{
+ public:FXStream (const FXObject *cont = __null);
+ FXStream & operator<< (const unsigned char &v);
+};
+
+bool fxsaveGIF (FXStream &store)
+{
+ int bitsperpixel;
+ unsigned char c1;
+ c1 = 0x80;
+ c1 |= (bitsperpixel - 1) << 4;
+ store << c1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33340.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33340.C
new file mode 100644
index 000000000..bac882156
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33340.C
@@ -0,0 +1,27 @@
+void* operator new(__SIZE_TYPE__, void* __p) { }
+
+struct auto_ptr {
+ int* p;
+ ~auto_ptr() { delete p; }
+};
+
+typedef void* T;
+struct vector {
+ void push_back(const T& __x) {
+ ::new(0) T(__x);
+ insert(__x);
+ }
+ void insert(const T& __x);
+} v;
+
+void g();
+void f() {
+ auto_ptr ap;
+ if (ap.p) {
+ ap.p = new int();
+ }
+ g();
+ int* tmp = ap.p;
+ ap.p = 0;
+ v.push_back(tmp);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33572.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33572.C
new file mode 100644
index 000000000..91cd073fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33572.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+#include <vector>
+#include <memory>
+
+struct Foo { virtual void f() {} };
+
+int main(int argc, char**)
+{
+ std::auto_ptr<Foo> foo;
+ if (argc >= 0) {
+ foo.reset(new Foo());
+ } else {
+ std::vector<int> v;
+ }
+ Foo* p = foo.release();
+ p->f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-1.C
new file mode 100644
index 000000000..eea89f421
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+struct base { void somemethod() {} };
+struct derived : public base { };
+
+struct smartpointer
+{
+ ~smartpointer() { }
+ operator derived*() const
+ {
+ return 0;
+ }
+};
+typedef void ( derived::* methodptr_type )();
+methodptr_type getmemberptr()
+{
+ return &derived::somemethod;
+}
+void somefunction()
+{
+ smartpointer pObj;
+ ( pObj->*getmemberptr() )();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-2.C
new file mode 100644
index 000000000..325892bc6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33589-2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+void f(void*) throw();
+
+void somefunction()
+{
+try {
+ void (*g)(void*) = (void (*)(void*))f;
+ void (*g2)(int*) = (void (*)(int*))g;
+ g2(0);
+} catch (...)
+{throw;}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33627.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33627.C
new file mode 100644
index 000000000..a14e34551
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33627.C
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+
+typedef unsigned int UT_uint32;
+typedef UT_uint32 PT_DocPosition;
+typedef UT_uint32 PT_BlockOffset;
+typedef enum _PTStruxType { PTX_Block } PTStruxType;
+typedef UT_uint32 PL_ListenerId;
+typedef const void * PL_StruxFmtHandle;
+class PX_ChangeRecord;
+class pf_Frag {
+ public:
+ typedef enum _PFType { PFT_Object } PFType;
+ inline PFType getType(void) const { }
+ inline pf_Frag * getNext(void) const { }
+ PT_DocPosition getPos(void) const { }
+};
+class pf_Fragments {
+ public:
+ pf_Frag * getFirst() const;
+};
+class pt_PieceTable {
+ bool getStruxOfTypeFromPosition(PL_ListenerId listenerId, PT_DocPosition docPos, PTStruxType pts, PL_StruxFmtHandle * psfh) const;
+ bool _tellAndMaybeAddListener(PL_ListenerId listenerId, bool bAdd);
+ pf_Fragments m_fragments;
+};
+class pf_Frag_Object : public pf_Frag
+{
+ public:
+ virtual bool createSpecialChangeRecord(PX_ChangeRecord ** ppcr, PT_DocPosition dpos, PT_BlockOffset blockOffset) const;
+};
+bool pt_PieceTable::_tellAndMaybeAddListener(PL_ListenerId listenerId, bool bAdd)
+{
+ PL_StruxFmtHandle sfh = 0;
+ PT_DocPosition sum = 0;
+ UT_uint32 blockOffset = 0;
+ for (pf_Frag * pf = m_fragments.getFirst(); (pf); pf=pf->getNext())
+ {
+ pf_Frag_Object * pfo = static_cast<pf_Frag_Object *> (pf);
+ PX_ChangeRecord * pcr = __null;
+ bool bStatus1 = false;
+ if(sfh != __null) {
+ bStatus1 = pfo->createSpecialChangeRecord(&pcr,sum,blockOffset);
+ if (!(bStatus1))
+ return (false);
+ }
+ else
+ {
+ PT_DocPosition pos = pf->getPos();
+ getStruxOfTypeFromPosition(listenerId,pos,PTX_Block,&sfh);
+ bStatus1 = pfo->createSpecialChangeRecord(&pcr,pos,blockOffset);
+ if (!(bStatus1))
+ return (false);
+ }
+ if (!(bStatus1))
+ return (false);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33735.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33735.C
new file mode 100644
index 000000000..0a90745b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33735.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+#include <string>
+typedef struct _ts { } PyThreadState;
+PyThreadState * Py_NewInterpreter(void);
+void Py_EndInterpreter(PyThreadState *);
+class ApplicationError {
+public:
+ ApplicationError(std::string errormsg) : errormsg(errormsg) { }
+ std::string errormsg;
+};
+void run()
+{
+ PyThreadState *py_state=__null;
+ try {
+ if (!(py_state=Py_NewInterpreter()))
+ throw ApplicationError("error");
+ }
+ catch(ApplicationError e) {
+ Py_EndInterpreter(py_state);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33819.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33819.C
new file mode 100644
index 000000000..a2f868dae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33819.C
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+class s
+{
+public:
+ s(long long aa) : a(aa), i1(0) { }
+ long long id() const { return (this->a << 16) >> 16; }
+ bool operator< (s sv) { return this->a < sv.id(); }
+private:
+ long long a : 48;
+ int i1 : 16;
+};
+s g(1);
+extern "C" void abort (void);
+int
+main(int, char**)
+{
+ if (g < (1LL << 38) - 1)
+ return 0;
+ abort ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-1.C
new file mode 100644
index 000000000..2f17d9583
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-1.C
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+struct S { unsigned int i : 24; } x;
+void __attribute__((noinline)) test1()
+{
+ if (--x.i != 0x00ffffff)
+ abort ();
+ if (x.i != 0x00ffffff)
+ abort ();
+}
+void __attribute__((noinline)) test2()
+{
+ if (x.i-- != 0)
+ abort ();
+ if (x.i != 0x00ffffff)
+ abort ();
+}
+void __attribute__((noinline)) test3()
+{
+ if (++x.i != 0)
+ abort ();
+ if (x.i != 0)
+ abort ();
+}
+void __attribute__((noinline)) test4()
+{
+ if (x.i++ != 0x00ffffff)
+ abort ();
+ if (x.i != 0)
+ abort ();
+}
+int main()
+{
+ x.i = 0;
+ test1();
+ x.i = 0;
+ test2();
+ x.i = 0x00ffffff;
+ test3();
+ x.i = 0x00ffffff;
+ test4();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-2.C
new file mode 100644
index 000000000..f64cfad96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-2.C
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+
+extern "C" void abort() __attribute__ ((noreturn));
+
+struct s
+{
+ unsigned long long f1 : 40;
+ unsigned int f2 : 24;
+} sv;
+
+int main()
+{
+ int f2;
+ sv.f2 = (1 << 24) - 1;
+ __asm__ volatile ("" : : : "memory");
+ ++sv.f2;
+ f2 = sv.f2;
+ if (f2 != 0)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-3.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-3.C
new file mode 100644
index 000000000..b4b883fba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr33887-3.C
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+
+struct s
+{
+ unsigned long long f1 : 40;
+ unsigned int f2 : 24;
+};
+
+s sv;
+
+void __attribute__((noinline)) foo(unsigned int i)
+{
+ unsigned int tmp;
+ sv.f2 = i;
+ tmp = sv.f2;
+ if (tmp != 0)
+ abort ();
+}
+
+int main()
+{
+ foo (0xff000000u);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34099.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34099.C
new file mode 100644
index 000000000..49fa9cac1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34099.C
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+
+#include <complex>
+
+typedef std::complex<double> NumType;
+
+void
+multiply(NumType a, NumType b, unsigned ac, NumType &ab)
+{
+ NumType s;
+ for (unsigned j=0; j<ac; j++)
+ s = a * b;
+ ab = s;
+}
+extern "C" void abort (void);
+int main()
+{
+ NumType a(1,2), b(3,-2), c;
+ multiply(a, b, 1, c);
+ if (c.real() != 7
+ || c.imag() != 4)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34222.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34222.C
new file mode 100644
index 000000000..130896dc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34222.C
@@ -0,0 +1,65 @@
+/* { dg-do compile } */
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _CharT> struct char_traits;
+ }
+__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ typedef ptrdiff_t streamsize;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> > class basic_ifstream;
+ typedef basic_ifstream<char> ifstream;
+ class ios_base {
+ };
+ }
+template<class T> class Vector4 {
+ public:
+ inline Vector4();
+ inline Vector4(T, T, T, T);
+ T x, y, z, w;
+ };
+template<class T> class Matrix4 {
+ public:
+ Matrix4(const Vector4<T>&, const Vector4<T>&, const Vector4<T>&, const Vector4<T>&);
+ Matrix4(const Matrix4<T>& m);
+ Vector4<T> r[4];
+ };
+typedef Vector4<float> Vec4f;
+typedef Matrix4<float> Mat4f;
+template<class T> Vector4<T>::Vector4() : x(0), y(0), z(0), w(0) {
+ }
+template<class T> Vector4<T>::Vector4(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w) {
+ }
+template<class T> Matrix4<T>::Matrix4(const Vector4<T>& v0, const Vector4<T>& v1, const Vector4<T>& v2, const Vector4<T>& v3) {
+ }
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT, typename _Traits> class basic_ios : public ios_base {
+ };
+ template<typename _CharT, typename _Traits> class basic_istream : virtual public basic_ios<_CharT, _Traits> {
+ public:
+ typedef _CharT char_type;
+ typedef basic_istream<_CharT, _Traits> __istream_type;
+ __istream_type& read(char_type* __s, streamsize __n);
+ };
+ template<typename _CharT, typename _Traits> class basic_ifstream : public basic_istream<_CharT, _Traits> {
+ };
+ }
+using namespace std;
+static float readFloat(ifstream& in) {
+ float f;
+ in.read((char*) &f, sizeof(float));
+ }
+Mat4f readMeshMatrix(ifstream& in, int nBytes) {
+ float m00 = readFloat(in);
+ float m01 = readFloat(in);
+ float m02 = readFloat(in);
+ float m10 = readFloat(in);
+ float m11 = readFloat(in);
+ float m12 = readFloat(in);
+ float m20 = readFloat(in);
+ float m21 = readFloat(in);
+ float m22 = readFloat(in);
+ float m30 = readFloat(in);
+ float m31 = readFloat(in);
+ float m32 = readFloat(in);
+ return Mat4f(Vec4f(m00, m01, m02, 0), Vec4f(m10, m11, m12, 0), Vec4f(m20, m21, m22, 0), Vec4f(m30, m31, m32, 1));
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34235.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34235.C
new file mode 100644
index 000000000..5f05841c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34235.C
@@ -0,0 +1,11 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+int main()
+{
+ short x = -1;
+ unsigned int c = ((unsigned int)x) >> 1;
+ if (c != 0x7fffffff)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34241.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34241.C
new file mode 100644
index 000000000..70f186c5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34241.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+inline void *operator new (__SIZE_TYPE__, void *__p) throw ()
+{
+ return __p;
+}
+struct A
+{
+ A(int, double);
+ inline explicit A (int pattern, bool cs)
+ {
+ new (this) A (pattern, double(cs));
+ }
+};
+A test ()
+{
+ const A a (42, true);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34641.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34641.C
new file mode 100644
index 000000000..0cf507762
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34641.C
@@ -0,0 +1,177 @@
+// { dg-do compile }
+// { dg-require-effective-target fpic }
+// { dg-require-visibility "" }
+// { dg-options "-fPIC" }
+
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *
+malloc (size_t __size)
+throw () __attribute__ ((__malloc__));
+ namespace std __attribute__ ((__visibility__ ("default")))
+{
+ using::size_t;
+}
+inline void *operator
+new (std::size_t, void *__p)
+throw ()
+{
+ return __p;
+}
+template < class _T1, class _T2 > struct pair
+{
+ _T1 first;
+ _T2 second;
+ pair (const _T1 & __a, const _T2 & __b):first (__a), second (__b)
+ {
+ }
+ template < class _U1, class _U2 >
+ pair (const pair < _U1, _U2 > &__p):first (__p.first), second (__p.second)
+ {
+ }
+};
+
+template < class _T1, class _T2 >
+ inline pair < _T1, _T2 > make_pair (_T1 __x, _T2 __y)
+{
+ return pair < _T1, _T2 > (__x, __y);
+}
+template < typename _Tp > inline const _Tp &
+max (const _Tp & __a, const _Tp & __b)
+{
+}
+typedef unsigned short int uint16_t;
+typedef unsigned long int uintptr_t;
+typedef uint16_t UChar;
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ struct __numeric_limits_base
+ {
+ };
+ template < typename _Tp > struct numeric_limits:public __numeric_limits_base
+ {
+ static _Tp max () throw ()
+ {
+ }
+ };
+}
+
+template < typename T > class VectorBufferBase
+{
+public:
+ void allocateBuffer (size_t newCapacity)
+ {
+ if (newCapacity > std::numeric_limits < size_t >::max () / sizeof (T))
+ *(int *) (uintptr_t) 0xbbadbeef = 0;
+ }
+};
+
+template < typename T, size_t inlineCapacity > class VectorBuffer;
+template < typename T > class VectorBuffer < T, 0 >:private VectorBufferBase <
+ T >
+{
+public:
+ typedef VectorBufferBase < T > Base;
+ using Base::allocateBuffer;
+};
+
+template < typename T, size_t inlineCapacity = 0 > class Vector
+{
+ typedef VectorBuffer < T, inlineCapacity > Impl;
+public:
+ typedef T *iterator;
+ size_t size () const
+ {
+ return m_size;
+ }
+ size_t capacity () const
+ {
+ }
+ iterator begin ()
+ {
+ }
+ iterator end ()
+ {
+ return begin () + m_size;
+ }
+ void shrink (size_t size);
+ void reserveCapacity (size_t newCapacity);
+ void clear ()
+ {
+ shrink (0);
+ }
+ template < typename U > void append (const U &);
+ void expandCapacity (size_t newMinCapacity);
+ template < typename U > U * expandCapacity (size_t newMinCapacity, U *);
+ size_t m_size;
+ Impl m_impl;
+};
+template < typename T, size_t inlineCapacity >
+ void Vector < T, inlineCapacity >::expandCapacity (size_t newMinCapacity)
+{
+ reserveCapacity (max
+ (newMinCapacity,
+ max (static_cast < size_t > (16),
+ capacity () + capacity () / 4 + 1)));
+}
+
+template < typename T, size_t inlineCapacity >
+ template < typename U >
+ inline U * Vector < T,
+ inlineCapacity >::expandCapacity (size_t newMinCapacity, U * ptr)
+{
+ expandCapacity (newMinCapacity);
+}
+template < typename T, size_t inlineCapacity >
+ void Vector < T, inlineCapacity >::reserveCapacity (size_t newCapacity)
+{
+ m_impl.allocateBuffer (newCapacity);
+}
+template < typename T, size_t inlineCapacity >
+ template < typename U >
+ inline void Vector < T, inlineCapacity >::append (const U & val)
+{
+ const U *ptr = &val;
+ if (size () == capacity ())
+ ptr = expandCapacity (size () + 1, ptr);
+ new (end ())T (*ptr);
+}
+
+class Range;
+class TextIterator
+{
+public:
+ explicit TextIterator (const Range *,
+ bool emitCharactersBetweenAllVisiblePositions =
+ false);
+ bool atEnd () const
+ {
+ }
+ void advance ();
+ int length () const
+ {
+ }
+};
+UChar *
+plainTextToMallocAllocatedBuffer (const Range * r, unsigned &bufferLength)
+{
+ static const unsigned cMaxSegmentSize = 1 << 16;
+ typedef pair < UChar *, unsigned >TextSegment;
+ Vector < TextSegment > *textSegments = 0;
+ Vector < UChar > textBuffer;
+ for (TextIterator it (r); !it.atEnd (); it.advance ())
+ {
+ if (textBuffer.size ()
+ && textBuffer.size () + it.length () > cMaxSegmentSize)
+ {
+ UChar *newSegmentBuffer =
+ static_cast <
+ UChar * >(malloc (textBuffer.size () * sizeof (UChar)));
+ if (!textSegments)
+ textSegments = new Vector < TextSegment >;
+ textSegments->
+ append (make_pair (newSegmentBuffer, textBuffer.size ()));
+ textBuffer.clear ();
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34651.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34651.C
new file mode 100644
index 000000000..2fce4d7a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34651.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+typedef bool Bool;
+struct CString {
+ CString (const char * =__null);
+ CString & operator += (const CString &);
+};
+struct THotKey {
+ short Key;
+ Bool Control;
+ Bool Shift;
+ Bool Alt;
+};
+THotKey m_HotKey;
+THotKey GetHotKey () { return m_HotKey; }
+void Serialize ()
+{
+ THotKey inHotKey (GetHotKey());
+ CString outCombinaison (inHotKey.Control
+ ? ((inHotKey.Alt || inHotKey.Shift)
+ ? "ctrl+" : "ctrl")
+ : __null);
+ outCombinaison += inHotKey.Alt ? inHotKey.Shift ? "alt+" : "alt" : "";
+ outCombinaison += inHotKey.Shift ? "shift" : "";
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34850.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34850.C
new file mode 100644
index 000000000..c33dbfb5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34850.C
@@ -0,0 +1,76 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
+/* { dg-options "-ffat-lto-objects" } */
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef uint8_t byte;
+typedef uint32_t u32bit;
+__extension__ typedef __SIZE_TYPE__ size_t;
+extern "C" {
+ extern void __warn_memset_zero_len (void) __attribute__((__warning__ ("")));
+ extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__))
+ void * memset (void *__dest, int __ch, size_t __len) throw () {
+ if (__builtin_constant_p (__len) && __len == 0)
+ __warn_memset_zero_len (); /* { dg-warning "declared with attribute warning" } */
+ }
+}
+inline void clear_mem(void* ptr, u32bit n) {
+ memset(ptr, 0, n);
+}
+template<typename T> class MemoryRegion {
+public:
+ u32bit size() const {
+ }
+ const T* begin() const {
+ }
+ void set(const T in[], u32bit n) {
+ create(n);
+ }
+ void set(const MemoryRegion<T>& in) {
+ set(in.begin(), in.size());
+ }
+ void clear() {
+ clear_mem(buf, allocated);
+ }
+ void create(u32bit);
+ MemoryRegion() {
+ used = allocated = 0;
+ }
+ mutable T* buf;
+ mutable u32bit used;
+ mutable u32bit allocated;
+};
+template<typename T> void MemoryRegion<T>::create(u32bit n) {
+ if(n <= allocated) {
+ clear();
+ }
+}
+template<typename T> class SecureVector : public MemoryRegion<T> {
+public:
+ SecureVector<T>& operator=(const MemoryRegion<T>& in) {
+ if(this != &in) this->set(in);
+ }
+};
+class OctetString {
+public:
+ SecureVector<byte> bits_of() const {
+ }
+ OctetString& operator^=(const OctetString&);
+ void change(const MemoryRegion<byte>& in) {
+ bits = in;
+ }
+ OctetString(const MemoryRegion<byte>& in) {
+ change(in);
+ }
+ SecureVector<byte> bits;
+};
+OctetString& OctetString::operator^=(const OctetString& k) {
+ if(&k == this) {
+ bits.clear();
+ }
+}
+bool __attribute__((flatten))
+operator==(const OctetString& s1, const OctetString& s2) {
+ return (s1.bits_of() == s2.bits_of());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34953.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34953.C
new file mode 100644
index 000000000..5d7b38c92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr34953.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+void B_CLEAR(void* ret);
+void B_NeverReturns(void* ret) __attribute__((noreturn));
+
+int main()
+{
+ const struct AutoErrPop { ~AutoErrPop() { } } AutoErrPopper = { };
+ B_NeverReturns(0);
+}
+
+void B_NeverReturns(void* ret)
+{
+ B_CLEAR(ret); /* Never returns (does a setjmp/goto) */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-1.C
new file mode 100644
index 000000000..1704c2226
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-1.C
@@ -0,0 +1,69 @@
+typedef __SIZE_TYPE__ size_t;
+template<typename _Iterator, typename _Container> class __normal_iterator {
+public:
+ const _Iterator& base() const;
+};
+template<typename _BI1, typename _BI2> inline
+void copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) {
+ while (__first != __last) *--__result = *--__last;
+}
+template<typename _Tp> struct _Vector_base {
+ struct _Vector_impl { _Tp* _M_finish; };
+ _Vector_impl _M_impl;
+};
+template<typename _Tp > class vector : protected _Vector_base<_Tp> {
+ typedef vector<_Tp> vector_type;
+ typedef _Tp * pointer;
+ typedef _Tp & reference;
+ typedef __normal_iterator<pointer, vector_type> iterator;
+ typedef size_t size_type;
+public:
+ iterator end();
+ void resize(size_type __new_size) { insert(end(), __new_size); }
+ reference operator[](size_type __n);
+ void insert(iterator __position, size_type __n)
+ {
+ pointer __old_finish(this->_M_impl._M_finish);
+ copy_backward(__position.base(), __old_finish - __n, __old_finish);
+ }
+};
+struct A {
+ virtual ~A ();
+ void incRef ();
+ void decRef ();
+};
+struct C : public A {
+ static C *alloc ();
+};
+template <class T> struct B {
+ B () : ptr (T::alloc ()) { }
+ B (T *a_ptr) : ptr (a_ptr) { }
+ ~B () { decRef (); }
+ B& operator= (const B<T>& a) { if (a.get () != this->get ()) { decRef ();
+incRef (); } }
+ template<class U> operator B<U> () const { return B<U> (ptr); }
+ T* operator-> () const { }
+ T* get () const { return ptr; }
+ void decRef () const { if (ptr != 0) ptr->decRef (); }
+ void incRef () const { if (ptr != 0) ptr->incRef (); }
+ T *ptr;
+};
+struct D : public C {
+ template <class T> inline void foo (const B<T> & x) { d.resize (1); d[0] = x;
+}
+ vector<B <C> > d;
+};
+struct E : public C {
+ static E *alloc ();
+};
+struct F : public D {
+ static F *alloc ();
+};
+void foo (vector<B<D> > & x) {
+ for (int i = 0; i < 2; ++i)
+ {
+ B<F> l;
+ B<E> m;
+ l->foo (m);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-2.C
new file mode 100644
index 000000000..463cad7f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35164-2.C
@@ -0,0 +1,27 @@
+struct __shared_count {
+ __shared_count() { _M_pi = new int; }
+ int * _M_pi;
+};
+template<typename _Tp>
+class __shared_ptr {
+public:
+ __shared_ptr(_Tp* __p);
+ void reset(int * __p) {
+ __shared_ptr(__p).swap(*this);
+ }
+ void swap(__shared_ptr<_Tp>& __other) {
+ __other._M_refcount._M_pi = _M_refcount._M_pi;
+ }
+ __shared_count _M_refcount;
+};
+template<typename _Tp> class shared_ptr : public __shared_ptr<_Tp> {};
+int main() {
+ for (shared_ptr<int> *iter;;)
+ {
+ try {
+ (iter++)->reset(new int);
+ }
+ catch (...) {
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35400.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35400.C
new file mode 100644
index 000000000..021135df8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35400.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wtype-limits" } */
+
+struct A
+{
+ A();
+ ~A();
+};
+
+void foo()
+{
+ A x[1];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35526.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35526.C
new file mode 100644
index 000000000..2d745b50e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35526.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+// { dg-options "-fpermissive" }
+// { dg-prune-output "narrowing" }
+
+extern void *memcpy (void *__dest, __const void *__src, __SIZE_TYPE__ __n);
+
+char internal_crash_read_ip[] = { 0xb8 };
+
+struct u_internal_crash_read_t
+{
+ char ip[sizeof (internal_crash_read_ip)];
+}
+u_internal_crash_read;
+
+void
+gSignalHandler (int psignalNr, int pinfo, int pctx)
+{
+ memcpy (u_internal_crash_read.ip, internal_crash_read_ip,
+ sizeof (internal_crash_read_ip));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35634.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35634.C
new file mode 100644
index 000000000..3c888ad43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr35634.C
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+void foo (int i)
+{
+ static int n;
+ if (i < -128 || i > 127)
+ abort ();
+ if (++n > 1000)
+ exit (0);
+}
+
+int main ()
+{
+ signed char c;
+ for (c = 0; ; c++) foo (c);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36191.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36191.C
new file mode 100644
index 000000000..175707d1b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36191.C
@@ -0,0 +1,17 @@
+// PR c++/36191
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions" }
+// { dg-skip-if "Frame pointer required for unwind tables" { m68k*-*-* fido*-*-* } "-fomit-frame-pointer" "" }
+
+__complex__ double
+foo (__complex__ double x, double y)
+{
+ try
+ {
+ return x / y;
+ }
+ catch (char *s)
+ {
+ return x;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36444.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36444.C
new file mode 100644
index 000000000..ae639e25d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36444.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-msse" { target { i?86-*-* x86_64-*-* } } } */
+#define vector __attribute__((vector_size(16) ))
+struct struct1 {
+ union {} vmx;
+ struct struct2 {
+ struct2(const struct2& r) {}
+ } w;
+} __attribute__((aligned(16)));
+struct struct3 {
+ vector float vmx;
+ operator const struct1& () const{
+ return *reinterpret_cast<const struct1*>(this);
+ }
+};
+struct3 func3( struct3 V1);
+struct3 func2( void );
+void func1( ) {
+ struct1 vVec = func2() ;
+ func3 ( (struct3&)vVec );
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36445.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36445.C
new file mode 100644
index 000000000..56642e9ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36445.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-msse" { target { i?86-*-* x86_64-*-* } } } */
+// This used to fail as we would try to expand a VCE where one side had
+// a mode of BLKmode and the other side was a vector mode.
+#define vector __attribute__((vector_size(16) ))
+struct struct1 {
+ union { float a[3]; } vmx;
+ struct struct2 {
+ struct2(const struct2& r) {}
+ } w;
+} __attribute__((aligned(16)));
+struct struct3 {
+ vector float vmx;
+ operator const struct1& () const{
+ return *reinterpret_cast<const struct1*>(this);
+ }
+};
+struct3 func3( struct3 V1);
+struct3 func2( void );
+void func1( ) {
+ struct1 vVec = func2() ;
+ func3 ( (struct3&)vVec );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36745.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36745.C
new file mode 100644
index 000000000..53845aaa7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36745.C
@@ -0,0 +1,122 @@
+/* PR target/36745 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fPIC" } */
+/* { dg-require-effective-target fpic } */
+
+typedef __SIZE_TYPE__ size_t;
+class QBasicAtomicInt
+{
+public:
+ int _q_value;
+ inline bool operator== (int value) const
+ {
+ }
+ bool ref ();
+ bool deref ();
+};
+inline bool
+QBasicAtomicInt::ref ()
+{
+ __asm__ ("": "=m" (_q_value): :);
+ return true;
+}
+
+namespace std
+{
+ using::size_t;
+}
+extern "C++"
+{
+ inline void *operator new (std::size_t, void *__p)
+ {
+ return __p;
+ }
+}
+struct QMapData
+{
+ QBasicAtomicInt ref;
+ static QMapData shared_null;
+};
+template < class Key, class T > class QMap
+{
+ QMapData *d;
+public: inline QMap ():d (&QMapData::shared_null)
+ {
+ }
+ inline ~ QMap ()
+ {
+ if (!d->ref.deref ())
+ freeData (d);
+ }
+ void freeData (QMapData * d);
+};
+struct QVectorData
+{
+ QBasicAtomicInt ref;
+ static QVectorData shared_null;
+};
+template < typename T > struct QVectorTypedData
+{
+ QBasicAtomicInt ref;
+};
+template < typename T > class QVector
+{
+ union
+ {
+ QVectorData *p;
+ QVectorTypedData < T > *d;
+ };
+public: inline QVector ():p (&QVectorData::shared_null)
+ {
+ d->ref.ref ();
+ }
+ inline void detach ()
+ {
+ if (d->ref == 1)
+ detach_helper ();
+ }
+ inline T *data ()
+ {
+ detach ();
+ }
+ T & operator[](int i);
+ void detach_helper ();
+ void realloc ();
+};
+template < typename T > void QVector < T >::detach_helper ()
+{
+ realloc ();
+}
+
+template < typename T > inline T & QVector < T >::operator[](int i)
+{
+ return data ()[i];
+}
+template < typename T > void QVector < T >::realloc ()
+{
+ T *j, *i;
+ i->~T ();
+ while (j-- == i)
+ new (j) T;
+}
+
+void
+mergeInto (QVector < int >*a)
+{
+};
+struct QRegExpAutomatonState
+{
+ QVector < int >outs;
+ QMap < int, int >reenter;
+ QMap < int, int >anchors;
+};
+class QRegExpEngine
+{
+ void addCatTransitions ();
+ QVector < QRegExpAutomatonState > s;
+};
+void
+QRegExpEngine::addCatTransitions ()
+{
+ mergeInto (&s[2].outs);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36826.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36826.C
new file mode 100644
index 000000000..436220ba8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36826.C
@@ -0,0 +1,166 @@
+template <class T> T CoinMax(register const T x1, register const T x2);
+template <class T> T CoinMin(register const T x1, register const T x2);
+class CoinIndexedVector;
+class ClpModel {
+protected:
+ double objectiveScale_;
+ double rhsScale_;
+ int numberRows_;
+ int numberColumns_;
+ double * rowActivity_;
+ double * columnActivity_;
+ double * dual_;
+ double * reducedCost_;
+ double* rowLower_;
+ double* rowUpper_;
+ double * rowObjective_;
+ double * columnLower_;
+ double * columnUpper_;
+ double * rowScale_;
+ double * columnScale_;
+ double * inverseRowScale_;
+ double * inverseColumnScale_;
+ int problemStatus_;
+ int secondaryStatus_;
+};
+class ClpSimplex : public ClpModel {
+ void deleteRim(int getRidOfFactorizationData=2);
+ double upperOut_;
+ double dualTolerance_;
+ double primalTolerance_;
+ double * rowLowerWork_;
+ double * columnLowerWork_;
+ double * rowUpperWork_;
+ double * columnUpperWork_;
+ double * rowObjectiveWork_;
+ CoinIndexedVector * columnArray_[6];
+ double * reducedCostWork_;
+ double * rowActivityWork_;
+ double * columnActivityWork_;
+ ClpSimplex * auxiliaryModel_;
+};
+class CoinIndexedVector {
+public:
+ void clear();
+};
+void ClpSimplex::deleteRim(int getRidOfFactorizationData)
+{
+ int numberRows=numberRows_;
+ int numberColumns=numberColumns_;
+ int i;
+ int numberPrimalScaled=0;
+ int numberPrimalUnscaled=0;
+ int numberDualScaled=0;
+ int numberDualUnscaled=0;
+ double scaleC = 1.0/objectiveScale_;
+ double scaleR = 1.0/rhsScale_;
+ if (!inverseColumnScale_) {
+ for (i=0; i<numberColumns; i++)
+ {
+ double scaleFactor = columnScale_[i];
+ double valueScaled = columnActivityWork_[i];
+ double lowerScaled = columnLowerWork_[i];
+ double upperScaled = columnUpperWork_[i];
+ if (lowerScaled>-1.0e20||upperScaled<1.0e20) {
+ if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_)
+ numberPrimalScaled++;
+ else
+ upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled));
+ }
+ columnActivity_[i] = valueScaled*scaleFactor*scaleR;
+ double value = columnActivity_[i];
+ if (value<columnLower_[i]-primalTolerance_)
+ numberPrimalUnscaled++;
+ else if (value>columnUpper_[i]+primalTolerance_)
+ numberPrimalUnscaled++;
+ double valueScaledDual = reducedCostWork_[i];
+ if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_)
+ numberDualScaled++;
+ if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_)
+ numberDualScaled++;
+ reducedCost_[i] = (valueScaledDual*scaleC)/scaleFactor;
+ double valueDual = reducedCost_[i];
+ if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_)
+ numberDualUnscaled++;
+ if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_)
+ numberDualUnscaled++;
+ }
+ for (i=0; i<numberRows; i++)
+ {
+ double scaleFactor = rowScale_[i];
+ double valueScaled = rowActivityWork_[i];
+ double lowerScaled = rowLowerWork_[i];
+ double upperScaled = rowUpperWork_[i];
+ if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
+ rowActivity_[i] = (valueScaled*scaleR)/scaleFactor;
+ double value = rowActivity_[i];
+ if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
+ else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
+ double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
+ ;
+ if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
+ if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
+ dual_[i] *= scaleFactor*scaleC;
+ double valueDual = dual_[i];
+ if (rowObjective_) valueDual += rowObjective_[i];
+ if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
+ if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
+ }
+ }
+ const double * inverseScale = inverseColumnScale_;
+ for (i=0; i<numberColumns; i++)
+ {
+ double scaleFactor = columnScale_[i];
+ double valueScaled = columnActivityWork_[i];
+ double lowerScaled = columnLowerWork_[i];
+ double upperScaled = columnUpperWork_[i];
+ if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
+ columnActivity_[i] = valueScaled*scaleFactor*scaleR;
+ double value = columnActivity_[i];
+ if (value<columnLower_[i]-primalTolerance_) numberPrimalUnscaled++;
+ else if (value>columnUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
+ double valueScaledDual = reducedCostWork_[i];
+ if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
+ if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
+ reducedCost_[i] = (valueScaledDual*scaleC)*inverseScale[i];
+ double valueDual = reducedCost_[i];
+ if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
+ if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
+ }
+ inverseScale = inverseRowScale_;
+ for (i=0; i<numberRows; i++)
+ {
+ double scaleFactor = rowScale_[i];
+ double valueScaled = rowActivityWork_[i];
+ double lowerScaled = rowLowerWork_[i];
+ double upperScaled = rowUpperWork_[i];
+ if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); }
+ rowActivity_[i] = (valueScaled*scaleR)*inverseScale[i];
+ double value = rowActivity_[i];
+ if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++;
+ else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++;
+ double valueScaledDual = dual_[i]+rowObjectiveWork_[i];
+ ;
+ if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++;
+ if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++;
+ dual_[i] *= scaleFactor*scaleC;
+ double valueDual = dual_[i];
+ if (rowObjective_) valueDual += rowObjective_[i];
+ if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++;
+ if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++;
+ }
+ if (numberPrimalUnscaled) {
+ if (numberDualUnscaled)
+ secondaryStatus_=4;
+ else
+ secondaryStatus_=2;
+ }
+ if (numberDualUnscaled)
+ secondaryStatus_=3;
+ int iRow,iColumn;
+ for (iRow=0; iRow<4; iRow++)
+ ;
+ for (iColumn=0; iColumn<2; iColumn++)
+ if (columnArray_[iColumn])
+ columnArray_[iColumn]->clear();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36960.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36960.C
new file mode 100644
index 000000000..280a6755d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr36960.C
@@ -0,0 +1,22 @@
+// { dg-do run }
+
+struct Lower {
+ const int& ref;
+ Lower(const int& ref) : ref(ref) { }
+};
+struct Middle : public virtual Lower {
+ Middle(const int& ref) : Lower(ref) { }
+};
+struct Upper : public Middle {
+ Upper(const int& ref) : Lower(ref), Middle(ref) { }
+ int get() { return ref; }
+};
+extern "C" void abort (void);
+int main()
+{
+ int i = 0;
+ Upper upper(i);
+ if (upper.get() != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-1.C
new file mode 100644
index 000000000..ea65226f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-1.C
@@ -0,0 +1,83 @@
+// PR c++/37146
+// { dg-do run }
+
+extern "C" void abort ();
+int a, b;
+struct A { int i:8; int j:8; int k:16; int l:32; } c;
+
+void
+f1 (int x, int y)
+{
+ (x ? a : b) = y;
+}
+
+void
+f2 (int x, int y)
+{
+ (x ? c.i : c.j) = y;
+}
+
+void
+f3 (int x, int y)
+{
+ (x ? c.i : a) = y;
+}
+
+void
+f4 (int x, int y)
+{
+ (x ? c.i : c.k) = y;
+}
+
+void
+f5 (int x, int y)
+{
+ (x ? c.l : b) = y;
+}
+
+#define CHECK(var, exp) \
+ do \
+ { \
+ if (var != exp) \
+ abort (); \
+ var = -1; \
+ if (a != -1 \
+ || b != -1 \
+ || c.i != -1 \
+ || c.j != -1 \
+ || c.k != -1 \
+ || c.l != -1) \
+ abort (); \
+ } \
+ while (0)
+
+int
+main ()
+{
+ a = -1;
+ b = -1;
+ c.i = -1;
+ c.j = -1;
+ c.k = -1;
+ c.l = -1;
+ f1 (1, 264);
+ CHECK (a, 264);
+ f1 (0, 264);
+ CHECK (b, 264);
+ f2 (1, 112);
+ CHECK (c.i, 112);
+ f2 (0, 112);
+ CHECK (c.j, 112);
+ f3 (1, 26);
+ CHECK (c.i, 26);
+ f3 (0, 26);
+ CHECK (a, 26);
+ f4 (1, 107);
+ CHECK (c.i, 107);
+ f4 (0, 107);
+ CHECK (c.k, 107);
+ f5 (1, 95);
+ CHECK (c.l, 95);
+ f5 (0, 95);
+ CHECK (b, 95);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-2.C
new file mode 100644
index 000000000..2a5417694
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37146-2.C
@@ -0,0 +1,67 @@
+// PR c++/37146
+// { dg-do run }
+
+extern "C" void abort ();
+int a, b;
+struct A { int i:8; int j:8; int k:16; int l:32; } c;
+
+int
+f1 (int x)
+{
+ return x ? a : b;
+}
+
+int
+f2 (int x)
+{
+ return x ? c.i : c.j;
+}
+
+int
+f3 (int x)
+{
+ return x ? c.i : a;
+}
+
+int
+f4 (int x)
+{
+ return x ? c.i : c.k;
+}
+
+int
+f5 (int x)
+{
+ return x ? c.l : b;
+}
+
+int
+main ()
+{
+ a = 17;
+ b = 18;
+ c.i = 19;
+ c.j = 20;
+ c.k = 21;
+ c.l = 22;
+ if (f1 (1) != a)
+ abort ();
+ if (f1 (0) != b)
+ abort ();
+ if (f2 (1) != c.i)
+ abort ();
+ if (f2 (0) != c.j)
+ abort ();
+ if (f3 (1) != c.i)
+ abort ();
+ if (f3 (0) != a)
+ abort ();
+ if (f4 (1) != c.i)
+ abort ();
+ if (f4 (0) != c.k)
+ abort ();
+ if (f5 (1) != c.l)
+ abort ();
+ if (f5 (0) != b)
+ abort ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37343.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37343.C
new file mode 100644
index 000000000..c4614f39f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37343.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+typedef enum RW { rwBitmapGrey, rwBitmapGrey16 } RW;
+void FindDepth(RW);
+void ParseDumpBitmap(RW kind, int maxfiles)
+{
+ static const RW normalTypes[] = { };
+ const RW *bitmapTypes;
+ int i;
+ switch (kind) {
+ case rwBitmapGrey:
+ case rwBitmapGrey16:
+ bitmapTypes = &kind;
+ break;
+ default:
+ bitmapTypes = normalTypes;
+ }
+ for (i = 0; i < maxfiles; i++)
+ FindDepth(bitmapTypes[i]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37345.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37345.C
new file mode 100644
index 000000000..5b49f5306
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37345.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+class EbmlElement {
+ virtual EbmlElement * Clone() const;
+};
+class KaxTracks : public EbmlElement {
+public:
+ EbmlElement * Clone() const {
+ return new KaxTracks(*this);
+ }
+};
+KaxTracks kax_tracks;
+void finish_file(void)
+{
+ kax_tracks.Clone();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37354.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37354.C
new file mode 100644
index 000000000..acdf29110
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37354.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+class GenericClass;
+struct AlsaDriver
+{
+ virtual int _read (unsigned nframes);
+};
+typedef void (GenericClass::*GenericMemFuncType) ();
+GenericMemFuncType m_pFunction;
+void AlsaDriver1 ()
+{
+ m_pFunction = reinterpret_cast < GenericMemFuncType > (&AlsaDriver::_read);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37421.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37421.C
new file mode 100644
index 000000000..4b8447eac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37421.C
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+#include <string.h>
+
+inline int
+bci (const float &source)
+{
+ int dest;
+ memcpy (&dest, &source, sizeof (dest));
+ return dest;
+}
+
+inline float
+bcf (const int &source)
+{
+ float dest;
+ memcpy (&dest, &source, sizeof (dest));
+ return dest;
+}
+
+float
+Foo ()
+{
+ const int foo = bci (0.0f);
+ int bar = foo;
+ const int baz = foo & 1;
+ if (!baz && (foo & 2))
+ bar = 0;
+ return bcf (bar);
+}
+
+int
+main ()
+{
+ printf ("Foo() = %f\n", Foo());
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37456.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37456.C
new file mode 100644
index 000000000..cf2021be2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37456.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+int zot(int);
+struct bar {
+ ~bar() { }
+};
+int x;
+void doit(int a, int b, int c)
+{
+ bar pn;
+ int b1 = zot(a) * c;
+ int b2 = zot(b) * c;
+ x = b1 + b2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37716.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37716.C
new file mode 100644
index 000000000..13b98d68a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37716.C
@@ -0,0 +1,56 @@
+// PR tree-optimization/37716
+// { dg-do compile }
+
+struct A
+{
+ struct B
+ {
+ int a, b, c, d;
+ void *e[1];
+ };
+ B *d;
+ inline void **f1 (int i) const
+ {
+ return d->e + d->c + i;
+ }
+};
+
+template <typename T>
+struct C
+{
+ struct D
+ {
+ void *v;
+ inline T & f3 ()
+ {
+ return *reinterpret_cast <T *> (this);
+ }
+ };
+ union
+ {
+ A p;
+ A::B *d;
+ };
+ T & operator[](int i)
+ {
+ if (d->a != 1)
+ f2 ();
+ return reinterpret_cast <D *> (p.f1 (i))->f3 ();
+ }
+ void f2 ();
+ void f3 (int i, const T & t);
+};
+
+class E
+{
+ int e, f;
+};
+
+C <E> c;
+
+void
+foo (int x)
+{
+ E e = c[x];
+ c.f3 (x, e);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37922.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37922.C
new file mode 100644
index 000000000..a7d05ab0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr37922.C
@@ -0,0 +1,502 @@
+// { dg-do run }
+// { dg-options "-fpic" { target fpic } }
+
+typedef __SIZE_TYPE__ size_t;
+
+template <typename NumType>
+inline
+NumType
+absolute(NumType const& x)
+{
+ if (x < NumType(0)) return -x;
+ return x;
+}
+
+class trivial_accessor
+{
+ public:
+ typedef size_t index_type;
+ struct index_value_type {};
+
+ trivial_accessor() : size_(0) {}
+
+ trivial_accessor(size_t const& n) : size_(n) {}
+
+ size_t size_1d() const { return size_; }
+
+ protected:
+ size_t size_;
+};
+
+namespace N0
+{
+ template <typename ElementType,
+ typename AccessorType = trivial_accessor>
+ class const_ref
+ {
+ public:
+ typedef ElementType value_type;
+ typedef size_t size_type;
+
+ typedef AccessorType accessor_type;
+ typedef typename accessor_type::index_type index_type;
+ typedef typename accessor_type::index_value_type index_value_type;
+
+ const_ref() {}
+
+ const_ref(const ElementType* begin, accessor_type const& accessor)
+ : begin_(begin), accessor_(accessor)
+ {
+ init();
+ }
+
+ const_ref(const ElementType* begin, index_value_type const& n0)
+ : begin_(begin), accessor_(n0)
+ {
+ init();
+ }
+
+ const_ref(const ElementType* begin, index_value_type const& n0,
+ index_value_type const& n1)
+ : begin_(begin), accessor_(n0, n1)
+ {
+ init();
+ }
+
+ const_ref(const ElementType* begin, index_value_type const& n0,
+ index_value_type const& n1,
+ index_value_type const& n2)
+ : begin_(begin), accessor_(n0, n1, n2)
+ {
+ init();
+ }
+
+ accessor_type const& accessor() const { return accessor_; }
+ size_type size() const { return size_; }
+
+ const ElementType* begin() const { return begin_; }
+ const ElementType* end() const { return end_; }
+
+ ElementType const&
+ operator[](size_type i) const { return begin_[i]; }
+
+ const_ref<ElementType>
+ as_1d() const
+ {
+ return const_ref<ElementType>(begin_, size_);
+ }
+
+ protected:
+ void
+ init()
+ {
+ size_ = accessor_.size_1d();
+ end_ = begin_ + size_;
+ }
+
+ const ElementType* begin_;
+ accessor_type accessor_;
+ size_type size_;
+ const ElementType* end_;
+ };
+}
+
+template <typename ElementType,
+ typename AccessorType = trivial_accessor>
+class ref : public N0::const_ref<ElementType, AccessorType>
+{
+ public:
+ typedef ElementType value_type;
+ typedef size_t size_type;
+
+ typedef N0::const_ref<ElementType, AccessorType> base_class;
+ typedef AccessorType accessor_type;
+ typedef typename accessor_type::index_type index_type;
+
+ ref() {}
+
+ ElementType*
+ begin() const { return const_cast<ElementType*>(this->begin_); }
+
+ ElementType*
+ end() const { return const_cast<ElementType*>(this->end_); }
+
+ ElementType&
+ operator[](size_type i) const { return begin()[i]; }
+};
+
+namespace N1 {
+ template <typename ElementType, size_t N>
+ class tiny_plain
+ {
+ public:
+ typedef ElementType value_type;
+ typedef size_t size_type;
+
+ static const size_t fixed_size=N;
+
+ ElementType elems[N];
+
+ tiny_plain() {}
+
+ static size_type size() { return N; }
+
+ ElementType* begin() { return elems; }
+ const ElementType* begin() const { return elems; }
+ ElementType* end() { return elems+N; }
+ const ElementType* end() const { return elems+N; }
+ ElementType& operator[](size_type i) { return elems[i]; }
+ ElementType const& operator[](size_type i) const { return elems[i]; }
+ };
+
+ template <typename ElementType, size_t N>
+ class tiny : public tiny_plain<ElementType, N>
+ {
+ public:
+ typedef ElementType value_type;
+ typedef size_t size_type;
+
+ typedef tiny_plain<ElementType, N> base_class;
+
+ tiny() {}
+ };
+}
+
+template <typename NumType>
+class mat3 : public N1::tiny_plain<NumType, 9>
+{
+ public:
+ typedef typename N1::tiny_plain<NumType, 9> base_type;
+
+ mat3() {}
+ mat3(NumType const& e00, NumType const& e01, NumType const& e02,
+ NumType const& e10, NumType const& e11, NumType const& e12,
+ NumType const& e20, NumType const& e21, NumType const& e22)
+ : base_type(e00, e01, e02, e10, e11, e12, e20, e21, e22)
+ {}
+ mat3(base_type const& a)
+ : base_type(a)
+ {}
+
+ NumType const&
+ operator()(size_t r, size_t c) const
+ {
+ return this->elems[r * 3 + c];
+ }
+ NumType&
+ operator()(size_t r, size_t c)
+ {
+ return this->elems[r * 3 + c];
+ }
+
+ NumType
+ trace() const
+ {
+ mat3 const& m = *this;
+ return m[0] + m[4] + m[8];
+ }
+
+ NumType
+ determinant() const
+ {
+ mat3 const& m = *this;
+ return m[0] * (m[4] * m[8] - m[5] * m[7])
+ - m[1] * (m[3] * m[8] - m[5] * m[6])
+ + m[2] * (m[3] * m[7] - m[4] * m[6]);
+ }
+};
+
+template <typename NumType>
+inline
+mat3<NumType>
+operator-(mat3<NumType> const& v)
+{
+ mat3<NumType> result;
+ for(size_t i=0;i<9;i++) {
+ result[i] = -v[i];
+ }
+ return result;
+}
+
+class mat_grid : public N1::tiny<size_t, 2>
+{
+ public:
+ typedef N1::tiny<size_t, 2> index_type;
+ typedef index_type::value_type index_value_type;
+
+ mat_grid() { this->elems[0]=0; this->elems[1]=0; }
+
+ mat_grid(index_type const& n) : index_type(n) {}
+
+ mat_grid(index_value_type const& n0, index_value_type const& n1)
+ { this->elems[0]=n0; this->elems[1]=n1; }
+
+ size_t size_1d() const { return elems[0] * elems[1]; }
+
+ size_t
+ operator()(index_value_type const& r, index_value_type const& c) const
+ {
+ return r * elems[1] + c;
+ }
+};
+
+template <typename NumType, typename AccessorType = mat_grid>
+class mat_const_ref : public N0::const_ref<NumType, AccessorType>
+{
+ public:
+ typedef AccessorType accessor_type;
+ typedef typename N0::const_ref<NumType, AccessorType> base_type;
+ typedef typename accessor_type::index_value_type index_value_type;
+
+ mat_const_ref() {}
+
+ mat_const_ref(const NumType* begin, accessor_type const& grid)
+ : base_type(begin, grid)
+ {}
+
+ mat_const_ref(const NumType* begin, index_value_type const& n_rows,
+ index_value_type const& n_columns)
+ : base_type(begin, accessor_type(n_rows, n_columns))
+ {}
+
+ accessor_type
+ grid() const { return this->accessor(); }
+
+ index_value_type const&
+ n_rows() const { return this->accessor()[0]; }
+
+ index_value_type const&
+ n_columns() const { return this->accessor()[1]; }
+
+ NumType const&
+ operator()(index_value_type const& r, index_value_type const& c) const
+ {
+ return this->begin()[this->accessor()(r, c)];
+ }
+};
+
+template <typename NumType, typename AccessorType = mat_grid>
+class mat_ref : public mat_const_ref<NumType, AccessorType>
+{
+ public:
+ typedef AccessorType accessor_type;
+ typedef mat_const_ref<NumType, AccessorType> base_type;
+ typedef typename accessor_type::index_value_type index_value_type;
+
+ mat_ref() {}
+
+ mat_ref(NumType* begin, accessor_type const& grid)
+ : base_type(begin, grid)
+ {}
+
+ mat_ref(NumType* begin, index_value_type n_rows,
+ index_value_type n_columns)
+ : base_type(begin, accessor_type(n_rows, n_columns))
+ {}
+
+ NumType*
+ begin() const { return const_cast<NumType*>(this->begin_); }
+
+ NumType*
+ end() const { return const_cast<NumType*>(this->end_); }
+
+ NumType&
+ operator[](index_value_type const& i) const { return begin()[i]; }
+
+ NumType&
+ operator()(index_value_type const& r, index_value_type const& c) const
+ {
+ return this->begin()[this->accessor()(r, c)];
+ }
+};
+
+ template <typename AnyType>
+ inline void
+ swap(AnyType* a, AnyType* b, size_t n)
+ {
+ for(size_t i=0;i<n;i++) {
+ AnyType t = a[i]; a[i] = b[i]; b[i] = t;
+ }
+ }
+
+template <typename IntType>
+size_t
+form_t(mat_ref<IntType>& m,
+ mat_ref<IntType> const& t)
+{
+ typedef size_t size_t;
+ size_t mr = m.n_rows();
+ size_t mc = m.n_columns();
+ size_t tc = t.n_columns();
+ if (tc) {
+ }
+ size_t i, j;
+ for (i = j = 0; i < mr && j < mc;) {
+ size_t k = i; while (k < mr && m(k,j) == 0) k++;
+ if (k == mr)
+ j++;
+ else {
+ if (i != k) {
+ swap(&m(i,0), &m(k,0), mc);
+ if (tc) swap(&t(i,0), &t(k,0), tc);
+ }
+ for (k++; k < mr; k++) {
+ IntType a = absolute(m(k, j));
+ if (a != 0 && a < absolute(m(i,j))) {
+ swap(&m(i,0), &m(k,0), mc);
+ if (tc) swap(&t(i,0), &t(k,0), tc);
+ }
+ }
+ if (m(i,j) < 0) {
+ for(size_t ic=0;ic<mc;ic++) m(i,ic) *= -1;
+ if (tc) for(size_t ic=0;ic<tc;ic++) t(i,ic) *= -1;
+ }
+ bool cleared = true;
+ for (k = i+1; k < mr; k++) {
+ IntType a = m(k,j) / m(i,j);
+ if (a != 0) {
+ for(size_t ic=0;ic<mc;ic++) m(k,ic) -= a * m(i,ic);
+ if (tc) for(size_t ic=0;ic<tc;ic++) t(k,ic) -= a * t(i,ic);
+ }
+ if (m(k,j) != 0) cleared = false;
+ }
+ if (cleared) { i++; j++; }
+ }
+ }
+ m = mat_ref<IntType>(m.begin(), i, mc);
+ return i;
+}
+
+template <typename IntType>
+size_t
+form(mat_ref<IntType>& m)
+{
+ mat_ref<IntType> t(0,0,0);
+ return form_t(m, t);
+}
+
+typedef mat3<int> sg_mat3;
+
+class rot_mx
+{
+ public:
+ explicit
+ rot_mx(sg_mat3 const& m, int denominator=1)
+ : num_(m), den_(denominator)
+ {}
+
+ sg_mat3 const&
+ num() const { return num_; }
+ sg_mat3&
+ num() { return num_; }
+
+ int const&
+ operator[](size_t i) const { return num_[i]; }
+ int&
+ operator[](size_t i) { return num_[i]; }
+
+ int
+ const& operator()(int r, int c) const { return num_(r, c); }
+ int&
+ operator()(int r, int c) { return num_(r, c); }
+
+ int const&
+ den() const { return den_; }
+ int&
+ den() { return den_; }
+
+ rot_mx
+ minus_unit_mx() const
+ {
+ rot_mx result(*this);
+ for (size_t i=0;i<9;i+=4) result[i] -= den_;
+ return result;
+ }
+
+ rot_mx
+ operator-() const { return rot_mx(-num_, den_); }
+
+ int
+ type() const;
+
+ int
+ order(int type=0) const;
+
+ private:
+ sg_mat3 num_;
+ int den_;
+};
+
+class rot_mx_info
+{
+ public:
+ rot_mx_info(rot_mx const& r);
+
+ int type() const { return type_; }
+
+ private:
+ int type_;
+};
+
+int rot_mx::type() const
+{
+ int det = num_.determinant();
+ if (det == -1 || det == 1) {
+ switch (num_.trace()) {
+ case -3: return -1;
+ case -2: return -6;
+ case -1: if (det == -1) return -4;
+ else return 2;
+ case 0: if (det == -1) return -3;
+ else return 3;
+ case 1: if (det == -1) return -2;
+ else return 4;
+ case 2: return 6;
+ case 3: return 1;
+ }
+ }
+ return 0;
+}
+
+int rot_mx::order(int type) const
+{
+ if (type == 0) type = rot_mx::type();
+ if (type > 0) return type;
+ if (type % 2) return -type * 2;
+ return -type;
+}
+
+rot_mx_info::rot_mx_info(rot_mx const& r)
+: type_(r.type())
+{
+ if (type_ == 0) {
+ return;
+ }
+ rot_mx proper_r = r;
+ int proper_order = type_;
+ // THE PROBLEM IS AROUND HERE
+ if (proper_order < 0) {
+ proper_order *= -1;
+ proper_r = -proper_r; // THIS FAILS ...
+ }
+ if (proper_order > 1) {
+ rot_mx rmi = proper_r.minus_unit_mx(); // ... THEREFORE WRONG HERE
+ mat_ref<int> re_mx(rmi.num().begin(), 3, 3);
+ if (form(re_mx) != 2) {
+ type_ = 0;
+ }
+ }
+}
+
+int main()
+{
+ N1::tiny<int, 9> e;
+ e[0] = 1; e[1] = 0; e[2] = 0;
+ e[3] = 0; e[4] = -1; e[5] = 0;
+ e[6] = 0; e[7] = 0; e[8] = 1;
+ rot_mx r(e);
+ rot_mx_info ri(r);
+ if (ri.type() != -2)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38565.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38565.C
new file mode 100644
index 000000000..7216b1c67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38565.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// Ignore warning on some powerpc-linux configurations.
+// { dg-prune-output "non-standard ABI extension" }
+// { dg-prune-output "changes the ABI" }
+#define vector __attribute__((vector_size(16) ))
+vector unsigned int f(int a)
+{
+ vector unsigned int mask = a ? (vector unsigned int){ 0x80000000, 0x80000000,
+0x80000000, 0x80000000 } : (vector unsigned int){0};
+ return mask;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38705.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38705.C
new file mode 100644
index 000000000..8058d3a39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38705.C
@@ -0,0 +1,27 @@
+// PR c++/38705
+// { dg-do compile }
+
+typedef int T;
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *memcpy (void *, const void *, size_t);
+
+void
+foo (char *p, const int q)
+{
+ memcpy (p, &q, sizeof (int));
+}
+
+struct S
+{
+ T t;
+ int u;
+ int bar () const;
+ template <class T> void foo (const T &x) const {}
+};
+
+int
+S::bar () const
+{
+ foo (u);
+ foo (t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38745.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38745.C
new file mode 100644
index 000000000..4ad9d85fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38745.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+
+union u_u16
+{
+ unsigned short v;
+ struct
+ {
+ unsigned char lo8, hi8;
+ } __attribute__ ((__may_alias__)) u;
+} __attribute__ ((__may_alias__));
+union u_u32
+{
+ unsigned int v;
+ struct
+ {
+ u_u16 lo16, hi16;
+ } u;
+} __attribute__ ((__may_alias__));
+union u_u64
+{
+ struct
+ {
+ u_u32 lo32, hi32;
+ } u;
+};
+struct Record
+{
+};
+long long
+UnpackFullKey (Record & rec, const char *&p)
+{
+ long long c64 = 0;
+ (*(u_u16 *) & (*(u_u32 *) & ( *(u_u64*)&c64).u.lo32.v).u.lo16.v).u.hi8 = 1;
+ return c64;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38747.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38747.C
new file mode 100644
index 000000000..0f18a2f22
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38747.C
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; }
+
+int __attribute__((noinline))
+foo(void)
+{
+ float f = 0;
+ int *i = new (&f) int (1);
+ return *(int *)&f;
+}
+
+int main()
+{
+ if (foo() != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38811.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38811.C
new file mode 100644
index 000000000..e9b304da6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr38811.C
@@ -0,0 +1,73 @@
+/* { dg-do compile } */
+
+typedef unsigned long ULONG;
+void iwos_ErrorMessage(long error, const char * const file_name,
+ ULONG line_num, const char * const message);
+class AbcA2d {
+public:
+ double x;
+ double y;
+ ~AbcA2d() { }
+};
+enum AbcZyParamType { ABC_SP_1 };
+class AbcExtent2d {
+ AbcA2d m_vMin;
+ AbcA2d m_vMax;
+public:
+ AbcExtent2d(const AbcA2d & rMin, const AbcA2d & rMax);
+ AbcA2d ClampPoint2d(const AbcA2d & rPoint) const;
+ AbcA2d GetMax() const { return m_vMax; }
+ AbcA2d GetMin() const { }
+ AbcA2d Evaluate(double dNormalizedX, double dNormalizedY) const;
+};
+inline AbcExtent2d::AbcExtent2d(const AbcA2d & rMin, const AbcA2d & rMax)
+{
+ if (rMin.x > rMax.x || rMin.y > rMax.y)
+ {
+ long sErr = (1007);
+ if (sErr != 1000)
+ iwos_ErrorMessage(sErr,(const char * const)__null,
+ 0,(const char * const)__null);
+ }
+ else
+ {
+ m_vMin = rMin;
+ m_vMax = rMax;
+ }
+}
+inline AbcA2d AbcExtent2d::ClampPoint2d(const AbcA2d & rPoint) const
+{
+ AbcA2d sRet = rPoint;
+ if (rPoint.x < m_vMin.x)
+ sRet.x = m_vMin.x;
+ return sRet;
+}
+inline AbcA2d AbcExtent2d::Evaluate(double dNormalizedX, double dNormalizedY)
+const
+{
+ AbcA2d sRet;
+ sRet.x = m_vMin.x + dNormalizedX * (m_vMax.x - m_vMin.x);
+ sRet.y = m_vMin.y + dNormalizedY * (m_vMax.y - m_vMin.y);
+ return ClampPoint2d(sRet);
+}
+class AbcAbcdTracer {
+ AbcExtent2d m_vUVDomain;
+ virtual long TestIsoAbcde(AbcZyParamType eZyParam, double dParam,
+ int & rbZyxIsSolution);
+ virtual int DoesPointLieOnAbcde(AbcA2d & rUV, int bRefinePoint) const;
+};
+long AbcAbcdTracer::TestIsoAbcde(AbcZyParamType eZyParam, double dParam,
+ int & rbZyxIsSolution)
+{
+ AbcA2d sUV1(m_vUVDomain.GetMin());
+ AbcA2d sUV2(m_vUVDomain.GetMax());
+ AbcExtent2d sUVIso(sUV1,sUV2);
+ for (ULONG i=0; i<10; i++)
+ {
+ double dT = i / (10 -1.0);
+ AbcA2d sUV = sUVIso.Evaluate(dT,dT);
+ if (!DoesPointLieOnAbcde(sUV,0))
+ ;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39002.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39002.C
new file mode 100644
index 000000000..534d91dfa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39002.C
@@ -0,0 +1,88 @@
+// PR target/39002
+// { dg-do run }
+
+struct S
+{
+ double x;
+ double y;
+ double z;
+};
+
+double foo (S *, S *);
+void bar (S *, S *, S *, double &, double &, double &);
+
+double
+foo (S *a1, S *a2)
+{
+ return __builtin_sqrt ((a1->x - a2->x) * (a1->x - a2->x)
+ + (a1->y - a2->y) * (a1->y - a2->y)
+ + (a1->z - a2->z) * (a1->z - a2->z));
+}
+
+void
+bar (S *p, S *q, S *r, double &x, double &y, double &z)
+{
+ if (foo (p, q) == 0.0)
+ {
+ x = r->x;
+ y = r->y;
+ z = r->z;
+ return;
+ }
+ if (foo (p, r) == 0.0)
+ {
+ x = r->x;
+ y = r->y;
+ z = r->z;
+ return;
+ }
+ if (foo (q, r) == 0.0)
+ {
+ x = r->x;
+ y = r->y;
+ z = r->z;
+ return;
+ }
+
+ double a1, b1, c1, d1, e1;
+ double dx, dy, dz, dw, dv;
+
+ a1 = q->x - p->x;
+ b1 = q->y - p->y;
+ c1 = q->z - p->z;
+ e1 = __builtin_sqrt (a1 * a1 + b1 * b1 + c1 * c1);
+ a1 = a1 / e1;
+ b1 = b1 / e1;
+ c1 = c1 / e1;
+ dx = p->x - r->x;
+ dy = p->y - r->y;
+ dz = p->z - r->z;
+ dw = dx * dx + dy * dy + dz * dz;
+ dv = 2.0 * dx * a1 + 2.0 * dy * b1 + 2.0 * dz * c1;
+ d1 = -dv / 2.0;
+ x = p->x + (a1 * d1);
+ y = p->y + (b1 * d1);
+ z = p->z + (c1 * d1);
+ return;
+}
+
+int
+main (void)
+{
+ S a, b, c, d, *p, *q, *r;
+
+ p = &a;
+ q = &b;
+ r = &c;
+ a.x = 0.0;
+ a.y = 0.0;
+ a.z = 0.0;
+ b.x = 1.0;
+ b.y = 0.0;
+ b.z = 0.0;
+ c.x = 0.0;
+ c.y = 1.0;
+ c.z = 0.0;
+ bar (p, q, r, d.x, d.y, d.z);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39259.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39259.C
new file mode 100644
index 000000000..256181fa6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39259.C
@@ -0,0 +1,40 @@
+// PR tree-optimization/39259
+// { dg-do compile }
+// { dg-options "-O2" }
+
+
+extern "C" int __mysetjmp () __attribute__ ((__returns_twice__));
+
+class TContStatus {};
+
+class TContEvent
+{
+public:
+ inline void Execute () throw();
+};
+
+class TCont
+{
+public:
+ TContStatus ReadD (void* buf, int deadline)
+ {
+ TContEvent event;
+ event.Execute ();
+ return TContStatus();
+ }
+ TContStatus ReadI (void *buf)
+ {
+ return ReadD (buf, 1);
+ }
+};
+
+void TContEvent::Execute () throw ()
+{
+ __mysetjmp();
+}
+
+void Broken (TCont *mCont)
+{
+ mCont->ReadI(0);
+ mCont->ReadI(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39362.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39362.C
new file mode 100644
index 000000000..554f9d06b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39362.C
@@ -0,0 +1,105 @@
+/* { dg-do compile } */
+
+void *fastMalloc (int n);
+void fastFree (void *p);
+template <class T> struct C
+{
+ void deref () { delete static_cast <T *>(this); }
+};
+template <typename T>
+struct D
+{
+ D (T *ptr) : m_ptr (ptr) { }
+ ~D () { if (T * ptr = m_ptr) ptr->deref (); }
+ T *operator-> () const;
+ T *m_ptr;
+ typedef T *UnspecifiedBoolType;
+ operator UnspecifiedBoolType () const;
+};
+template <typename T> struct E
+{
+ static void destruct (T * begin, T * end)
+ {
+ for (T * cur = begin; cur != end; ++cur)
+ cur->~T ();
+ }
+};
+template <typename T> class F;
+template <typename T> struct G
+{
+ static void destruct (T * begin, T * end)
+ {
+ E <T>::destruct (begin, end);
+ }
+ static void uninitializedFill (T * dst, T * dstEnd, const T & val)
+ {
+ F<T>::uninitializedFill (dst, dstEnd, val);
+ }
+};
+template <typename T> struct H
+{
+ void allocateBuffer (int newCapacity)
+ {
+ m_buffer = static_cast <T *>(fastMalloc (newCapacity * sizeof (T)));
+ }
+ void deallocateBuffer (T * bufferToDeallocate)
+ {
+ if (m_buffer == bufferToDeallocate)
+ fastFree (bufferToDeallocate);
+ }
+ T *buffer () { }
+ int capacity () const { }
+ T *m_buffer;
+};
+template <typename T, int cap> class I;
+template <typename T> struct I <T, 0> : H <T>
+{
+ I (int capacity) { allocateBuffer (capacity); }
+ ~I () { this->deallocateBuffer (buffer ()); }
+ using H <T>::allocateBuffer;
+ H <T>::buffer; // { dg-warning "deprecated" }
+};
+template <typename T, int cap = 0> struct J
+{
+ typedef T *iterator;
+ ~J () { if (m_size) shrink (0); }
+ J (const J &);
+ int capacity () const { m_buffer.capacity (); }
+ T & operator[](int i) { }
+ iterator begin () { }
+ iterator end () { return begin () + m_size; }
+ void shrink (int size);
+ template <typename U> void append (const U &);
+ int m_size;
+ I <T, cap> m_buffer;
+};
+template <typename T, int cap>
+J <T, cap>::J (const J & other) : m_buffer (other.capacity ())
+{
+}
+template <typename T, int cap>
+void J <T, cap>::shrink (int size)
+{
+ G <T>::destruct (begin () + size, end ());
+ m_size = size;
+}
+struct A : public C <A>
+{
+ virtual ~A ();
+ typedef J <D <A> > B;
+ virtual A *firstChild () const;
+ virtual A *nextSibling () const;
+ virtual const B & children (int length);
+ B m_children;
+};
+const A::B &
+A::children (int length)
+{
+ for (D <A> obj = firstChild (); obj; obj = obj->nextSibling ())
+ {
+ B children = obj->children (2);
+ for (unsigned i = 0; i <length; ++i)
+ m_children.append (children[i]);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39417.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39417.C
new file mode 100644
index 000000000..b7bbb88b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39417.C
@@ -0,0 +1,56 @@
+// { dg-do run }
+
+#include <vector>
+
+std::vector <int>
+sequence(int l, int n)
+{
+ std::vector <int> ret;
+ for(int i=n;i<=100;i++)
+ {
+ if(i%2==0)
+ {
+ if(l%i==i/2)
+ {
+ int init =l/i-i/2+1;
+ if(init>=0)
+ {
+ for(int j=0;j<i;j++)
+ {
+ ret.push_back(init);
+ init ++;
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(l%i==0)
+ {
+ int init =l/i-i/2;
+ if(init>=0)
+ {
+ for(int j=0;j<i;j++)
+ {
+ ret.push_back(init);
+ init ++;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return ret;
+}
+extern "C" void abort (void);
+int main()
+{
+ std::vector<int> res = sequence(18, 2);
+ if (res.size () != 3
+ || res[0] != 5
+ || res[1] != 6
+ || res[2] != 7)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39678.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39678.C
new file mode 100644
index 000000000..a7c120ad4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39678.C
@@ -0,0 +1,26 @@
+/* PR target/39678 */
+/* { dg-do run } */
+/* { dg-options "-Wno-psabi" } */
+struct Y {};
+struct X {
+ struct Y y;
+ __complex__ float val;
+};
+
+struct X __attribute__((noinline))
+foo (float *p)
+{
+ struct X x;
+ __real x.val = p[0];
+ __imag x.val = p[1];
+ return x;
+}
+extern "C" void abort (void);
+float a[2] = { 3., -2. };
+int main()
+{
+ struct X x = foo(a);
+ if (__real x.val != 3. || __imag x.val != -2.)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39713.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39713.C
new file mode 100644
index 000000000..4ff72d1a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39713.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+template <typename To, typename From>
+static inline To
+bitwise_cast (From from)
+{
+ union
+ {
+ From f;
+ To t;
+ } u;
+ u.f = from;
+ return u.t;
+}
+
+extern void foo (unsigned char *);
+
+double
+bar ()
+{
+ unsigned char b[sizeof (unsigned long long)];
+ foo (b);
+ return bitwise_cast<double> (*(unsigned long long *) b);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39732.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39732.C
new file mode 100644
index 000000000..4b3975b8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39732.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-profiling "-fprofile-generate" } */
+/* { dg-options "-fprofile-generate" } */
+
+template<class _CharT> struct char_traits;
+template<typename _OI>
+_OI __copy_move_a2(_OI __result);
+template<typename _OI> inline _OI
+copy(_OI __result)
+{
+ return __copy_move_a2 (__result);
+}
+template<typename _CharT, typename _Traits>
+class basic_ostream { };
+template<typename _Tp, typename _CharT = char, typename _Traits = char_traits<_CharT> >
+class ostream_iterator {
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+ ostream_type* _M_stream;
+ const _CharT* _M_string;
+public:
+ ostream_iterator(ostream_type& __s, const _CharT* __c)
+ : _M_stream(&__s), _M_string(__c) { }
+ ostream_iterator(const ostream_iterator& __obj)
+ : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { }
+};
+int f(void)
+{
+ basic_ostream<char, char_traits<char> > os;
+ copy(ostream_iterator<const int>(os, ","));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39764.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39764.C
new file mode 100644
index 000000000..a89013313
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr39764.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+class A;
+class B { };
+extern const double NaN;
+B foo(A* exec, double d);
+inline B baz(A* a) {
+ return foo(a, NaN);
+}
+B bar(A* a) {
+ return baz(a);
+}
+extern const double NaN = (__builtin_nanf(""));
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40081.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40081.C
new file mode 100644
index 000000000..e65c5a843
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40081.C
@@ -0,0 +1,16 @@
+struct Atomic_t {
+ Atomic_t(int i) : val(i) { }
+ volatile int val;
+};
+class RefCount {
+public:
+ RefCount(Atomic_t c) : m_count(c) { }
+ Atomic_t m_count;
+};
+class IntrusiveCountableBase {
+ RefCount m_useCount;
+protected:
+ IntrusiveCountableBase();
+};
+IntrusiveCountableBase::IntrusiveCountableBase() : m_useCount(0) { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40102.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40102.C
new file mode 100644
index 000000000..49f56b5bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40102.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+bool foo0(int) { return true; }
+
+bool foo1();
+
+struct A
+{
+ A();
+ ~A();
+
+ template<typename T> void bar1(T f)
+ {
+ if (f(0))
+ foo1();
+ }
+
+ template<typename T> void bar2(T);
+};
+
+template<typename T> void A::bar2(T f)
+{
+ A a, b[1], *p;
+
+ while (foo1())
+ {
+ if (p)
+ ++p;
+ if (p && foo1())
+ bar1(f);
+ if (p)
+ ++p;
+ }
+
+ if (foo1())
+ bar1(f);
+}
+
+void baz()
+{
+ A().bar2(foo0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40321.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40321.C
new file mode 100644
index 000000000..917743109
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40321.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+struct VectorD2
+{
+ VectorD2() : x(0), y(0) { }
+ VectorD2(int _x, int _y) : x(_x), y(_y) { }
+ int x, y;
+ int GetLength2() const { return x*x + y*y; };
+ VectorD2 operator+(const VectorD2 vec) const {
+ return VectorD2(x+vec.x,y+vec.y);
+ }
+};
+struct Shape
+{
+ enum Type { ST_RECT, ST_CIRCLE } type;
+ VectorD2 pos;
+ VectorD2 radius;
+ bool CollisionWith(const Shape& s) const;
+};
+bool Shape::CollisionWith(const Shape& s) const
+{
+ if(type == ST_CIRCLE && s.type == ST_RECT)
+ return s.CollisionWith(*this);
+ return (pos + s.pos).GetLength2() < (radius + s.radius).GetLength2();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40323.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40323.C
new file mode 100644
index 000000000..c7ffcb5d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40323.C
@@ -0,0 +1,68 @@
+/* Testcase for PR 40323. */
+/* { dg-do compile } */
+/* { dg-options "-fno-early-inlining" } */
+/* { dg-add-options bind_pic_locally } */
+
+extern void do_something (const char *, int);
+
+class Parent
+{
+private:
+ const char *data;
+
+public:
+ Parent (const char *d) : data(d)
+ {}
+
+ int funcOne (int delim) const;
+};
+
+class AnotherParent
+{
+private:
+ double d;
+public:
+ AnotherParent (void) : d(0)
+ {}
+};
+
+
+class Child : public AnotherParent, Parent
+{
+private:
+ int zzz;
+public:
+ Child (const char *d) : Parent(d)
+ {}
+};
+
+
+int Parent::funcOne (int delim) const
+{
+ int i;
+ for (i = 0; i < delim; i++)
+ do_something(data, i);
+
+ return 1;
+}
+
+int docalling (int (Child::* f)(int delim) const)
+{
+ Child S ("muhehehe");
+
+ return (S.*f)(4);
+}
+
+typedef int (Parent::* my_mp_type)(int delim);
+
+int main (int argc, char *argv[])
+{
+ int i;
+ int (Parent::* f)(int ) const;
+ int (Child::* g)(int ) const;
+
+ f = &Parent::funcOne;
+ g = (int (Child::* )(int) const) f;
+ i = docalling (g);
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40335.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40335.C
new file mode 100644
index 000000000..14ea95d40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40335.C
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+int
+main (void)
+{
+ int i = -1;
+ switch ((signed char) i)
+ {
+ case 255: /* { dg-bogus "exceeds maximum value" "" { xfail *-*-* } } */
+ abort ();
+ default:
+ break;
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40388.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40388.C
new file mode 100644
index 000000000..63fbbfba5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40388.C
@@ -0,0 +1,21 @@
+void foo();
+
+struct A
+{
+ ~A()
+ {
+ try
+ {
+ foo();
+ foo();
+ }
+ catch (...)
+ {
+ }
+ }
+};
+
+void bar()
+{
+ A a1, a2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40389.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40389.C
new file mode 100644
index 000000000..e3ceb1238
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40389.C
@@ -0,0 +1,84 @@
+/* { dg-do run } */
+
+template <typename V> struct S
+{
+ V *f, *l;
+ __attribute__ ((noinline)) S (void) { f = 0, l = 0; }
+ void foo (V *x)
+ {
+ if (x->p != 0)
+ x->p->n = x->n;
+ else
+ f = x->n;
+ if (x->n != 0)
+ x->n->p = x->p;
+ else
+ l = x->p;
+ }
+ __attribute__ ((noinline)) void bar (V *x)
+ {
+ x->n = 0;
+ x->p = l;
+ if (l != 0)
+ l->n = x;
+ else
+ f = x;
+ l = x;
+ }
+};
+
+struct H;
+
+struct A
+{
+ S <H> k;
+};
+
+struct H
+{
+ A *a;
+ H *p, *n;
+ __attribute__ ((noinline)) H (void) { p = 0, n = 0, a = 0; }
+ __attribute__ ((noinline)) H (A *b) : a (b)
+ {
+ p = 0;
+ n = 0;
+ if (a != 0)
+ a->k.bar (this);
+ }
+ __attribute__ ((noinline)) H (const H &h) : a (h.a)
+ {
+ p = 0;
+ n = 0;
+ if (a != 0)
+ a->k.bar (this);
+ }
+ ~H (void) { if (a != 0) a->k.foo (this); }
+ H &operator= (const H &o)
+ {
+ if (a != 0 || &o == this)
+ __builtin_abort ();
+ a = o.a;
+ if (a != 0)
+ a->k.bar (this);
+ return *this;
+ }
+};
+
+__attribute__ ((noinline))
+H baz (void)
+{
+ return H (new A);
+}
+
+H g;
+
+int
+main (void)
+{
+ g = baz ();
+ if (g.a->k.f != &g)
+ __builtin_abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40460.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40460.C
new file mode 100644
index 000000000..1d54df72b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40460.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+void bar(int);
+void foo(void)
+{
+ for (int i = 0; i<1; ++i)
+ bar (i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40492.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40492.C
new file mode 100644
index 000000000..cab9426d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40492.C
@@ -0,0 +1,26 @@
+typedef unsigned short ushort;
+class QChar {
+public:
+ QChar( const QChar& c );
+ ushort ucs;
+};
+inline QChar::QChar( const QChar& c ) : ucs( c.ucs ) { };
+class QString { };
+class KoAutoFormat {
+public:
+ struct TypographicQuotes { QChar begin, end; };
+ TypographicQuotes getConfigTypographicDoubleQuotes() const {
+ return m_typographicDoubleQuotes;
+ }
+ TypographicQuotes m_typographicDoubleQuotes;
+};
+class KoAutoFormatDia {
+ QChar oDoubleBegin, oDoubleEnd;
+ KoAutoFormat * m_docAutoFormat;
+ bool noSignal;
+ void changeAutoformatLanguage(void);
+};
+void KoAutoFormatDia::changeAutoformatLanguage(void)
+{
+ oDoubleEnd= m_docAutoFormat->getConfigTypographicDoubleQuotes().end;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40642.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40642.C
new file mode 100644
index 000000000..771c83717
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40642.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+/* { dg-require-profiling "-fprofile-generate" } */
+// { dg-options "-fprofile-generate" }
+
+// GCC used to ICE with some EH edge missing.
+
+inline void* operator new(__SIZE_TYPE__, void* p) throw() { return p; }
+inline void operator delete (void*, void*) throw() { }
+
+template<typename T> void foo(void* p, T t)
+{
+ new(p) T(t);
+}
+
+void bar();
+
+template<typename T> struct A
+{
+ T* p;
+
+ A() { try { foo(p, T()); } catch(...) {} }
+
+ A(const A&) { try { bar(); } catch(...) { throw; } }
+};
+
+A<A<int> > a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40834.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40834.C
new file mode 100644
index 000000000..67d302853
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40834.C
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+class XalanDOMString
+{
+public:
+ int y;
+};
+
+class XObject
+{
+public:
+ const XalanDOMString& str() const { return x; }
+ XalanDOMString x;
+};
+
+class XObjectPtr
+{
+public:
+ XObjectPtr(const XObjectPtr& theSource)
+ {
+ m_xobjectPtr = theSource.m_xobjectPtr;
+ }
+ const XObject* operator->() const
+ {
+ return m_xobjectPtr;
+ };
+ XObjectPtr(XObject *p) { m_xobjectPtr = p; }
+ XObject* m_xobjectPtr;
+};
+
+class FunctionSubstringBefore
+{
+public:
+ int execute( const XObjectPtr arg1) const
+ {
+ const XalanDOMString& theFirstString = arg1->str();
+ return theFirstString.y;
+ }
+};
+
+int
+main ()
+{
+ XObject x;
+ XObjectPtr y (&x);
+ x.x.y = -1;
+ FunctionSubstringBefore z;
+ if (z.execute (y) != -1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40924.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40924.C
new file mode 100644
index 000000000..9140da3ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40924.C
@@ -0,0 +1,111 @@
+// PR rtl-optimization/40924
+// { dg-do run }
+
+extern "C" void abort (void);
+
+#define MAY_ALIAS __attribute__((__may_alias__))
+
+typedef struct { float v[2]; } floata;
+typedef struct { int v[2]; } inta;
+
+typedef unsigned int uint MAY_ALIAS;
+typedef signed int sint MAY_ALIAS;
+typedef float flt MAY_ALIAS;
+
+static inline unsigned short
+less_than (inta a, inta b)
+{
+ unsigned short r = 0;
+ const uint *p1 = (const uint *) &a;
+ const uint *p2 = (const uint *) &b;
+ for (int i=0; i < 2; i++)
+ if (p1[i] < p2[i]) r |= (1 << i);
+ return r;
+}
+
+static inline inta
+multiply (inta b, inta c)
+{
+ inta r;
+ sint *p3 = (sint *) &c;
+ for (int i=0; i < 2; i++)
+ r.v[i] = (int) (b.v[i] * p3[i] & 0xFFFFFFFF);
+ return r;
+}
+
+static inline floata
+gather (inta indexes, const void *baseAddr)
+{
+ floata r;
+
+ sint *idx = (sint *) &indexes;
+ flt *src = (flt *) baseAddr;
+ for (int i=0; i < 2; i++)
+ r.v[i] = *(src + idx[i]);
+ return r;
+}
+
+static inline inta
+add (const inta &b, const inta &c)
+{
+ inta result;
+ sint *r = (sint *) &result;
+
+ for (int i=0; i < 2; i++)
+ r[i] = b.v[i] + c.v[i];
+ return result;
+}
+
+struct uintv
+{
+ inta data;
+ inline uintv () { data.v[0] = 0; data.v[1] = 1; }
+ inline uintv (unsigned int a)
+ {
+ for (int i=0; i < 2; i++)
+ *(uint *) &data.v[i] = a;
+ }
+ inline uintv (inta x) : data (x) {}
+ inline uintv operator* (const uintv &x) const
+ { return multiply (data, x.data); }
+ inline uintv operator+ (const uintv &x) const
+ { return uintv (add (data, x.data)); }
+ inline unsigned short operator< (const uintv &x) const
+ { return less_than (data, x.data); }
+};
+
+struct floatv
+{
+ floata data;
+ explicit inline floatv (const uintv &x)
+ {
+ uint *p2 = (uint *) &x.data;
+ for (int i=0; i < 2; i++)
+ data.v[i] = p2[i];
+ }
+ inline floatv (const float *array, const uintv &indexes)
+ {
+ const uintv &offsets = indexes * uintv (1);
+ data = gather (offsets.data, array);
+ }
+ unsigned short operator== (const floatv &x) const
+ {
+ unsigned short r = 0;
+ for (int i=0; i < 2; i++)
+ if (data.v[i] == x.data.v[i]) r |= (1 << i);
+ return r;
+ }
+};
+
+int
+main ()
+{
+ const float array[2] = { 2, 3 };
+ for (uintv i; (i < 2) == 3; i = i + 2)
+ {
+ const floatv ii (i + 2);
+ floatv a (array, i);
+ if ((a == ii) != 3)
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40991.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40991.C
new file mode 100644
index 000000000..c04ef9e7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr40991.C
@@ -0,0 +1,113 @@
+// { dg-do compile { target c++11 } }
+
+typedef __SIZE_TYPE__ size_t;
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ using ::size_t;
+ void __throw_bad_function_call() __attribute__((__noreturn__));
+}
+inline void* operator new(std::size_t, void* __p) throw() {
+ return __p;
+}
+namespace std {
+ class type_info {
+ public:
+ bool operator==(const type_info& __arg) const { }
+ };
+ namespace tr1 {
+ template<typename _Tp, _Tp __v> struct integral_constant { };
+ typedef integral_constant<bool, true> true_type;
+ template<typename _Res, typename... _ArgTypes>
+ struct _Maybe_unary_or_binary_function { };
+ class _Undefined_class;
+ union _Nocopy_types {
+ void (_Undefined_class::*_M_member_pointer)();
+ };
+ union _Any_data {
+ void* _M_access() {
+ return &_M_pod_data[0];
+ }
+ char _M_pod_data[sizeof(_Nocopy_types)];
+ };
+ enum _Manager_operation { __get_type_info, __get_functor_ptr, __clone_functor, __destroy_functor };
+ template<typename _Tp> struct _Simple_type_wrapper {
+ _Simple_type_wrapper(_Tp __value) : __value(__value) { }
+ _Tp __value;
+ };
+ template<typename _Signature> class function;
+ class _Function_base {
+ public:
+ static const std::size_t _M_max_size = sizeof(_Nocopy_types);
+ static const std::size_t _M_max_align = __alignof__(_Nocopy_types);
+ template<typename _Functor> class _Base_manager {
+ static const bool __stored_locally = (sizeof(_Functor) <= _M_max_size && __alignof__(_Functor) <= _M_max_align && (_M_max_align % __alignof__(_Functor) == 0));
+ typedef integral_constant<bool, __stored_locally> _Local_storage;
+ public:
+ static bool _M_manager(_Any_data& __dest, const _Any_data& __source, _Manager_operation __op) { }
+ static void _M_init_functor(_Any_data& __functor, const _Functor& __f) {
+ _M_init_functor(__functor, __f, _Local_storage());
+ }
+ template<typename _Class, typename _Tp> static bool _M_not_empty_function(_Tp _Class::* const& __mp) {
+ return __mp;
+ }
+ static void _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) {
+ new (__functor._M_access()) _Functor(__f);
+ }
+ };
+ ~_Function_base() {
+ if (_M_manager) _M_manager(_M_functor, _M_functor, __destroy_functor);
+ }
+ bool _M_empty() const {
+ return !_M_manager;
+ }
+ typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, _Manager_operation);
+ _Any_data _M_functor;
+ _Manager_type _M_manager;
+ };
+ template<typename _Signature, typename _Functor> class _Function_handler;
+ template<typename _Class, typename _Member, typename _Res, typename... _ArgTypes> class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> : public _Function_handler<void(_ArgTypes...), _Member _Class::*> {
+ public:
+ static _Res _M_invoke(const _Any_data& __functor, _ArgTypes... __args) { }
+ };
+ template<typename _Class, typename _Member, typename... _ArgTypes> class _Function_handler<void(_ArgTypes...), _Member _Class::*> : public _Function_base::_Base_manager< _Simple_type_wrapper< _Member _Class::* > > { };
+ template<typename _Res, typename... _ArgTypes> class function<_Res(_ArgTypes...)> : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base {
+ typedef _Res _Signature_type(_ArgTypes...);
+ struct _Useless { };
+ public:
+ template<typename _Functor> function(_Functor __f, _Useless = _Useless());
+ _Res operator()(_ArgTypes... __args) const;
+ const type_info& target_type() const;
+ typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...);
+ _Invoker_type _M_invoker;
+ };
+ template<typename _Res, typename... _ArgTypes> template<typename _Functor> function<_Res(_ArgTypes...)>:: function(_Functor __f, _Useless) : _Function_base() {
+ typedef _Function_handler<_Signature_type, _Functor> _My_handler;
+ if (_My_handler::_M_not_empty_function(__f)) {
+ _M_invoker = &_My_handler::_M_invoke;
+ _M_manager = &_My_handler::_M_manager;
+ _My_handler::_M_init_functor(_M_functor, __f);
+ }
+ }
+ template<typename _Res, typename... _ArgTypes> _Res function<_Res(_ArgTypes...)>:: operator()(_ArgTypes... __args) const {
+ if (_M_empty()) {
+ __throw_bad_function_call();
+ }
+ return _M_invoker(_M_functor, __args...);
+ }
+ template<typename _Res, typename... _ArgTypes> const type_info& function<_Res(_ArgTypes...)>:: target_type() const {
+ if (_M_manager) {
+ _Any_data __typeinfo_result;
+ _M_manager(__typeinfo_result, _M_functor, __get_type_info);
+ }
+ }
+ }
+}
+struct X {
+ int bar;
+};
+void test05() {
+ using std::tr1::function;
+ X x;
+ function<int(X&)> frm(&X::bar);
+ frm(x) == 17;
+ typeid(int X::*) == frm.target_type();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41144.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41144.C
new file mode 100644
index 000000000..64dc117d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41144.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+struct rgba8;
+template<class ColorT> class span_gouraud {
+public:
+ struct coord_type { };
+ coord_type m_coord[3];
+};
+template<class ColorT> class span_gouraud_rgba : public span_gouraud<ColorT>
+{
+ typedef ColorT color_type;
+ typedef span_gouraud<color_type> base_type;
+ typedef typename base_type::coord_type coord_type;
+public:
+ void prepare() {
+ coord_type coord[3];
+ }
+};
+void the_application() {
+ typedef span_gouraud_rgba<rgba8> gouraud_span_gen_type;
+ gouraud_span_gen_type span_gouraud;
+ span_gouraud.prepare();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41183.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41183.C
new file mode 100644
index 000000000..df3e30341
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41183.C
@@ -0,0 +1,30 @@
+// PR c++/41183
+// { dg-do compile }
+
+void foo (const char *);
+
+template <int *>
+struct A
+{
+ template <typename T> A (const int &, T);
+ int i;
+};
+
+template <int *X>
+template <typename T>
+A<X>::A (const int &j, T) : i(j)
+{
+ foo (0);
+ foo (0);
+ foo (__PRETTY_FUNCTION__);
+}
+
+int N;
+
+struct B
+{
+ B ();
+ A<&N> a;
+};
+
+B::B() : a(N, 0) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41186.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41186.C
new file mode 100644
index 000000000..fdfee2cd3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41186.C
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+
+struct Foo {
+ Foo() {};
+ int i;
+ short f;
+};
+struct Bar : public Foo {
+ Bar() {};
+ short b;
+};
+
+extern "C" void abort(void);
+
+int main()
+{
+ Bar b1, b2;
+ b2.i = 0;
+ b1.f = 0;
+ b1.b = 1;
+ b2.f = 1;
+ b2.b = 2;
+ static_cast<Foo&>(b1) = static_cast<Foo&>(b2);
+ if (b1.i != 0 || b1.b != 1)
+ abort ();
+ if (b1.f != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257-2.C
new file mode 100644
index 000000000..230fa5dde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257-2.C
@@ -0,0 +1,16 @@
+/* { dg-do link } */
+
+struct A
+{
+ virtual ~A();
+};
+
+struct B : virtual A
+{
+ virtual ~B() {}
+};
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257.C
new file mode 100644
index 000000000..60cfc5339
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41257.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+struct A
+{
+ virtual void foo();
+ virtual ~A();
+ int i;
+};
+
+struct B : virtual A {};
+
+struct C : B
+{
+ virtual void foo();
+};
+
+void bar()
+{
+ C().foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41273.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41273.C
new file mode 100644
index 000000000..bdce05355
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41273.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+long *H2_ipX_ener_sort;
+double H2_old_populations[2];
+double H2_total;
+
+void H2_LevelPops()
+{
+ double sum_pop = 0.;
+ long nEner = 0;
+ while( nEner < 3 && sum_pop/H2_total < 0.99999 )
+ {
+ long ip = H2_ipX_ener_sort[nEner];
+ sum_pop += H2_old_populations[ip];
+ ++nEner;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41680.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41680.C
new file mode 100644
index 000000000..7faab0d5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41680.C
@@ -0,0 +1,23 @@
+// PR target/41680
+// { dg-do compile }
+
+extern void baz (float);
+
+inline bool
+bar (float x)
+{
+ union { float f; int i; } u;
+ u.f = x;
+ return (u.i & 1);
+}
+
+void
+foo (float *x)
+{
+ for (int i = 0; i < 10; i++)
+ {
+ float f = x[i];
+ if (!bar (f))
+ baz (f);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41775.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41775.C
new file mode 100644
index 000000000..3d8548e3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr41775.C
@@ -0,0 +1,284 @@
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+
+typedef unsigned int size_t;
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Iterator > struct iterator_traits
+ {
+ };
+ template < typename _Tp > struct iterator_traits <_Tp * >
+ {
+ typedef _Tp & reference;
+ };
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ using std::iterator_traits;
+ template < typename _Iterator, typename _Container > class __normal_iterator
+ {
+ public:typedef _Iterator iterator_type;
+ typedef typename iterator_traits < _Iterator >::reference reference;
+ reference operator* () const
+ {
+ }
+ __normal_iterator operator++ (int)
+ {
+ }
+ };
+ template < typename _IteratorL, typename _IteratorR,
+ typename _Container > inline bool operator!= (const __normal_iterator <
+ _IteratorL,
+ _Container > &__lhs,
+ const __normal_iterator <
+ _IteratorR,
+ _Container > &__rhs)
+ {
+ }
+}
+
+extern "C"
+{
+ extern "C"
+ {
+ __extension__ typedef __SIZE_TYPE__ __intptr_t;
+ }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp > class new_allocator
+ {
+ public:typedef size_t size_type;
+ typedef _Tp *pointer;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef new_allocator < _Tp1 > other;
+ };
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
+ _Tp >
+ {
+ };
+}
+
+extern "C"
+{
+ typedef __intptr_t intptr_t;
+}
+namespace llvm
+{
+ template < typename NodeTy > class ilist_half_node
+ {
+ };
+template < typename NodeTy > class ilist_node:private ilist_half_node <
+ NodeTy >
+ {
+ };
+ class MachineBasicBlock;
+ class MachineOperand
+ {
+ public:enum MachineOperandType
+ {
+ }
+ Contents;
+ unsigned getReg () const
+ {
+ }
+ };
+ class TargetRegisterInfo;
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp, typename _Alloc > struct _Vector_base
+ {
+ typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
+ };
+template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:protected _Vector_base < _Tp,
+ _Alloc
+ >
+ {
+ typedef _Vector_base < _Tp, _Alloc > _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef __gnu_cxx::__normal_iterator < pointer, vector > iterator;
+ iterator begin ()
+ {
+ }
+ iterator end ()
+ {
+ }
+ };
+}
+
+namespace llvm
+{
+ class MachineFunction;
+ class MachineInstr:public ilist_node < MachineInstr >
+ {
+ public:const MachineBasicBlock *getParent () const
+ {
+ }
+ const MachineOperand & getOperand (unsigned i) const
+ {
+ }
+ bool registerDefIsDead (unsigned Reg, const TargetRegisterInfo * TRI =
+ __null) const
+ {
+ }
+ };
+ class AnalysisResolver;
+ class Pass
+ {
+ AnalysisResolver *Resolver;
+ intptr_t PassID;
+ public: explicit Pass (intptr_t pid):Resolver (0), PassID (pid)
+ {
+ }
+ explicit Pass (const void *pid):Resolver (0), PassID ((intptr_t) pid)
+ {
+ }
+ template < typename AnalysisType > AnalysisType & getAnalysis () const;
+ };
+ class FunctionPass:public Pass
+ {
+ public:explicit FunctionPass (intptr_t pid):Pass (pid)
+ {
+ }
+ explicit FunctionPass (const void *pid):Pass (pid)
+ {
+ }
+ };
+ class PassInfo
+ {
+ public:typedef Pass *(*NormalCtor_t) ();
+ private:const char *const PassName;
+ const char *const PassArgument;
+ const intptr_t PassID;
+ const bool IsCFGOnlyPass;
+ const bool IsAnalysis;
+ const bool IsAnalysisGroup;
+ NormalCtor_t NormalCtor;
+ public: PassInfo (const char *name, const char *arg, intptr_t pi, NormalCtor_t normal = 0, bool isCFGOnly = false, bool is_analysis = false):PassName (name), PassArgument (arg), PassID (pi),
+ IsCFGOnlyPass (isCFGOnly), IsAnalysis (is_analysis),
+ IsAnalysisGroup (false), NormalCtor (normal)
+ {
+ }
+ };
+ template < typename PassName > Pass * callDefaultCtor ()
+ {
+ return new PassName ();
+ }
+ template < typename passName > struct RegisterPass:public PassInfo
+ {
+ RegisterPass (const char *PassArg, const char *Name, bool CFGOnly = false, bool is_analysis = false):PassInfo (Name, PassArg, intptr_t (&passName::ID),
+ PassInfo::NormalCtor_t (callDefaultCtor < passName >), CFGOnly,
+ is_analysis)
+ {
+ }
+ };
+ template < typename T > class SmallVectorImpl
+ {
+ };
+ template < typename T,
+ unsigned N > class SmallVector:public SmallVectorImpl < T >
+ {
+ };
+ class MachineFunctionPass:public FunctionPass
+ {
+ protected:explicit MachineFunctionPass (intptr_t ID):FunctionPass (ID)
+ {
+ }
+ explicit MachineFunctionPass (void *ID):FunctionPass (ID)
+ {
+ }
+ virtual bool runOnMachineFunction (MachineFunction & MF) = 0;
+ };
+ class LiveIndex
+ {
+ private:unsigned index;
+ };
+ class VNInfo
+ {
+ };
+ struct LiveRange
+ {
+ LiveIndex start;
+ LiveIndex end;
+ VNInfo *valno;
+ };
+ class LiveInterval
+ {
+ public:typedef SmallVector < LiveRange, 4 > Ranges;
+ bool containsOneValue () const
+ {
+ }
+ LiveRange *getLiveRangeContaining (LiveIndex Idx)
+ {
+ }
+ void removeRange (LiveIndex Start, LiveIndex End, bool RemoveDeadValNo =
+ false);
+ void removeRange (LiveRange LR, bool RemoveDeadValNo = false)
+ {
+ removeRange (LR.start, LR.end, RemoveDeadValNo);
+ }
+ };
+ class LiveIntervals:public MachineFunctionPass
+ {
+ public:static char ID;
+ LiveIndex getDefIndex (LiveIndex index)
+ {
+ }
+ LiveInterval & getInterval (unsigned reg)
+ {
+ }
+ LiveIndex getInstructionIndex (const MachineInstr * instr) const
+ {
+ }
+ };
+}
+
+using namespace llvm;
+namespace
+{
+struct __attribute__ ((visibility ("hidden"))) StrongPHIElimination:public
+ MachineFunctionPass
+ {
+ static char ID;
+ StrongPHIElimination ():MachineFunctionPass (&ID)
+ {
+ }
+ bool runOnMachineFunction (MachineFunction & Fn);
+ };
+}
+
+static RegisterPass < StrongPHIElimination > X ("strong-phi-node-elimination",
+ "Eliminate PHI nodes for register allocation, intelligently");
+bool
+StrongPHIElimination::runOnMachineFunction (MachineFunction & Fn)
+{
+ LiveIntervals & LI = getAnalysis < LiveIntervals > ();
+ std::vector < MachineInstr * >phis;
+ for (std::vector < MachineInstr * >::iterator I = phis.begin (), E =
+ phis.end (); I != E;)
+ {
+ MachineInstr *PInstr = *(I++);
+ unsigned DestReg = PInstr->getOperand (0).getReg ();
+ LiveInterval & PI = LI.getInterval (DestReg);
+ if (PInstr->registerDefIsDead (DestReg))
+ {
+ if (PI.containsOneValue ())
+ {
+ LiveIndex idx =
+ LI.getDefIndex (LI.getInstructionIndex (PInstr));
+ PI.removeRange (*PI.getLiveRangeContaining (idx), true);
+ }
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42110.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42110.C
new file mode 100644
index 000000000..c778b4f2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42110.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+bool foo();
+
+struct A
+{
+ A* fooA() { if (foo()) foo(); return this; }
+
+ virtual void barA(char);
+};
+
+template<int> struct B
+{
+ A *p, *q;
+
+ void fooB(char c) { p->fooA()->barA(c); }
+};
+
+template<int N> inline void bar(B<N> b) { b.fooB(0); }
+
+extern template void bar(B<0>);
+
+void (*f)(B<0>) = bar;
+
+void baz()
+{
+ B<0>().fooB(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42183.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42183.C
new file mode 100644
index 000000000..375b37f0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42183.C
@@ -0,0 +1,51 @@
+// { dg-do compile }
+
+class IntSize {
+public:
+ IntSize(int width, int height) : m_width(width), m_height(height) { }
+ int m_width, m_height;
+};
+class IntPoint {
+public:
+ IntPoint(int x, int y) : m_x(x), m_y(y) { }
+ int m_x, m_y;
+};
+class IntRect {
+public:
+ IntRect(int x, int y, int width, int height)
+ : m_location(IntPoint(x, y)), m_size(IntSize(width, height)) { }
+ void intersect(const IntRect&);
+ IntPoint m_location;
+ IntSize m_size;
+};
+inline IntRect intersection(const IntRect& a, const IntRect& b) {
+ IntRect c = a;
+ c.intersect(b);
+ return c;
+}
+class RenderObject {
+public:
+ int contentWidth() const { }
+ int contentHeight() const { }
+ virtual int xPos() const { }
+ virtual int yPos() const { }
+ virtual int paddingTop() const;
+ virtual int paddingLeft() const;
+ virtual int borderTop() const { }
+ virtual int borderLeft() const { }
+};
+class RenderMenuList : public RenderObject {
+ virtual IntRect controlClipRect(int tx, int ty) const;
+ RenderObject* m_innerBlock;
+};
+IntRect RenderMenuList::controlClipRect(int tx, int ty) const {
+ IntRect outerBox(tx + borderLeft() + paddingLeft(),
+ ty + borderTop() + paddingTop(),
+ contentWidth(), contentHeight());
+ IntRect innerBox(tx + m_innerBlock->xPos() + m_innerBlock->paddingLeft(),
+ ty + m_innerBlock->yPos() + m_innerBlock->paddingTop(),
+ m_innerBlock->contentWidth(),
+ m_innerBlock->contentHeight());
+ return intersection(outerBox, innerBox);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42357.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42357.C
new file mode 100644
index 000000000..1a1d64e4f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42357.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+typedef unsigned char uint8;
+typedef unsigned int uint32;
+class PixelARGB {
+public:
+ ~PixelARGB() throw() { }
+ PixelARGB (const uint32 argb_) throw() : argb (argb_) { }
+ inline __attribute__((always_inline)) uint8 getRed() const throw() {
+ return components.r;
+ }
+ union {
+ uint32 argb;
+ struct {
+ uint8 b, g, r, a;
+ } components;
+ };
+};
+class Colour {
+public:
+ Colour() throw() : argb (0) {};
+ uint8 getRed() const throw() {
+ return argb.getRed();
+ }
+ PixelARGB argb;
+};
+uint8 writeImage (void) {
+ Colour pixel;
+ pixel = Colour ();
+ return pixel.getRed();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42450.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42450.C
new file mode 100644
index 000000000..f630fa2b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42450.C
@@ -0,0 +1,112 @@
+/* { dg-do compile } */
+
+template < typename > class basic_stringstream;
+
+struct basic_string {
+ basic_string();
+};
+
+struct ios_base {
+ virtual ~ios_base();
+};
+
+class ostream:ios_base {};
+class istream:virtual ios_base {};
+
+template < typename > struct basic_iostream:public istream, ostream {
+ ~basic_iostream () {}
+};
+extern template class basic_iostream < char >;
+
+template < typename > struct basic_stringstream:public basic_iostream < char > {
+ basic_string _M_stringbuf;
+ ~basic_stringstream () {}
+};
+extern template class basic_stringstream < char >;
+
+template < typename > struct AnyMatrixBase;
+template < typename, int _Rows, int _Cols, int = _Rows, int = _Cols > class Matrix;
+template < typename > class CwiseNullaryOp;
+
+template < typename Derived > struct MatrixBase:public AnyMatrixBase < Derived > {
+ typedef CwiseNullaryOp < Derived > ConstantReturnType;
+ ConstantReturnType Constant ();
+ template < typename > Derived cast ();
+ static CwiseNullaryOp < Derived > Random (int);
+};
+
+template < typename Derived > struct AnyMatrixBase {
+ Derived derived () {}
+ Derived & derived () const {}
+};
+
+template < typename, int > struct ei_matrix_storage {};
+
+template < typename _Scalar, int, int, int _MaxRows, int _MaxCols > struct Matrix:MatrixBase < Matrix < _Scalar, _MaxRows, _MaxCols > > {
+ typedef MatrixBase < Matrix > Base;
+ ei_matrix_storage < int, _MaxCols > m_storage;
+ Matrix operator= (const Matrix other) {
+ _resize_to_match (other);
+ lazyAssign (other.derived ());
+ }
+ template < typename OtherDerived > Matrix lazyAssign (MatrixBase < OtherDerived > other) {
+ _resize_to_match (other);
+ return Base (other.derived ());
+ }
+ Matrix ();
+ template < typename OtherDerived > Matrix (const MatrixBase < OtherDerived > &other) {
+ *this = other;
+ }
+ template < typename OtherDerived > void _resize_to_match (const MatrixBase < OtherDerived > &) {
+ throw 1;
+ }
+};
+
+template < typename MatrixType > class CwiseNullaryOp:
+public MatrixBase < CwiseNullaryOp < MatrixType > > {};
+
+int f()
+{
+ bool align_cols;
+ if (align_cols) {
+ basic_stringstream<char> sstr;
+ f();
+ }
+}
+
+template < typename > struct AutoDiffScalar;
+template < typename Functor > struct AutoDiffJacobian:Functor {
+ AutoDiffJacobian (Functor);
+ typedef typename Functor::InputType InputType;
+ typedef typename Functor::ValueType ValueType;
+ typedef Matrix < int, Functor::InputsAtCompileTime, 1 > DerivativeType;
+ typedef AutoDiffScalar < DerivativeType > ActiveScalar;
+ typedef Matrix < ActiveScalar, Functor::InputsAtCompileTime, 1 > ActiveInput;
+ void operator () (InputType x, ValueType *) {
+ ActiveInput ax = x.template cast < ActiveScalar > ();
+ }
+};
+
+template < int NX, int NY > struct TestFunc1 {
+ enum {
+ InputsAtCompileTime = NX
+ };
+ typedef Matrix < float, NX, 1 > InputType;
+ typedef Matrix < float, NY, 1 > ValueType;
+ typedef Matrix < float, NY, NX > JacobianType;
+ int inputs ();
+};
+
+template < typename Func > void forward_jacobian (Func f) {
+ typename Func::InputType x = Func::InputType::Random (f.inputs ());
+ typename Func::ValueType y;
+ typename Func::JacobianType jref = jref.Constant ();
+ AutoDiffJacobian < Func > autoj (f);
+ autoj (x, &y);
+}
+
+void test_autodiff_scalar ()
+{
+ forward_jacobian (TestFunc1 < 2, 2 > ());
+ forward_jacobian (TestFunc1 < 3, 2 > ());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42462.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42462.C
new file mode 100644
index 000000000..947fa388f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42462.C
@@ -0,0 +1,47 @@
+/* { dg-do run } */
+
+#define INLINE inline __attribute__((always_inline))
+extern "C" void abort (void);
+
+template<class> struct Foo {
+ inline bool isFalse() { return false; }
+ template <bool> void f1() {}
+ template <bool> INLINE void f2() { f1<false>(); }
+ template <bool> void f3() { f2<false>(); }
+ template <bool> INLINE void f4() { f3<false>(); }
+ int exec2();
+ void execute();
+ inline void unused();
+};
+
+template<class T> inline void Foo<T>::unused() {
+ f4<true>();
+}
+
+static int counter = 0;
+
+template<class T> int Foo<T>::exec2() {
+ static void* table[2] = { &&begin, &&end };
+ if (counter++ > 10)
+ return 0;
+ goto *(table[0]);
+begin:
+ if (isFalse()) f1<false>();
+end:
+ return 1;
+}
+
+template<class T> void Foo<T>::execute() {
+ int r = 1;
+ while (r) { r = exec2(); }
+}
+
+template class Foo<int>;
+
+int main() {
+ Foo<int> c;
+ c.execute();
+ if (counter < 10)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42704.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42704.C
new file mode 100644
index 000000000..735b1e7bd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42704.C
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+
+typedef int PRInt32;
+class nsTreeRows {
+ class Subtree { };
+ enum { kMaxDepth = 32 };
+ struct Link {
+ Subtree* mParent;
+ PRInt32 mChildIndex;
+ Link& operator=(const Link& aLink) {
+ mParent = aLink.mParent;
+ mChildIndex = aLink.mChildIndex;
+ }
+ };
+ class iterator {
+ PRInt32 mTop;
+ PRInt32 mRowIndex;
+ Link mLink[kMaxDepth];
+ public:
+ iterator() : mTop(-1), mRowIndex(-1) { }
+ iterator& operator=(const iterator& aIterator);
+ };
+ Subtree* EnsureSubtreeFor(Subtree* aParent, PRInt32 aChildIndex);
+ Subtree* GetSubtreeFor(const Subtree* aParent,
+PRInt32 aChildIndex, PRInt32* aSubtreeSize = 0);
+ void InvalidateCachedRow() {
+ mLastRow = iterator();
+ }
+ iterator mLastRow;
+};
+nsTreeRows::Subtree* nsTreeRows::EnsureSubtreeFor(Subtree* aParent,
+ PRInt32 aChildIndex) {
+ Subtree* subtree = GetSubtreeFor(aParent, aChildIndex);
+ if (! subtree) {
+ InvalidateCachedRow();
+ }
+}
+nsTreeRows::iterator& nsTreeRows::iterator::operator=(const iterator&
+aIterator) {
+ mTop = aIterator.mTop;
+ for (PRInt32 i = mTop;
+ i >= 0;
+ --i) mLink[i] = aIterator.mLink[i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42714.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42714.C
new file mode 100644
index 000000000..b1b2d856e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42714.C
@@ -0,0 +1,37 @@
+struct QVectorData {
+ static QVectorData shared_null;
+};
+template <typename T> class QVector {
+ union {
+ QVectorData *d;
+ };
+public:
+ inline QVector() : d(&QVectorData::shared_null) { }
+ inline QVector(const QVector<T> &v) : d(v.d) { }
+};
+class QXmlStreamAttribute { };
+class QXmlStreamAttributes : public QVector<QXmlStreamAttribute> { };
+class __attribute__ ((visibility("default"))) Smoke {
+public:
+ union StackItem;
+ typedef StackItem* Stack;
+ typedef short Index;
+};
+class SmokeBinding { };
+namespace __smokeqt {
+ class x_QXmlStreamAttributes : public QXmlStreamAttributes {
+ SmokeBinding* _binding;
+ public:
+ static void x_11(Smoke::Stack x) {
+ x_QXmlStreamAttributes* xret = new x_QXmlStreamAttributes();
+ }
+ explicit x_QXmlStreamAttributes() : QXmlStreamAttributes() { }
+ };
+ void xcall_QXmlStreamAttributes(Smoke::Index xi, void *obj,
+ Smoke::Stack args)
+ {
+ switch(xi) {
+ case 11: x_QXmlStreamAttributes::x_11(args);
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42739.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42739.C
new file mode 100644
index 000000000..ccc05f836
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42739.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct s { ~s() { s(); } };
+
+int f()
+{
+ M:
+ s o = s();
+ f();
+ f();
+
+ L:
+ goto *(f() ? &&L : &&M);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42760.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42760.C
new file mode 100644
index 000000000..be85f7fc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42760.C
@@ -0,0 +1,46 @@
+// PR middle-end/42760
+// { dg-do compile }
+
+template <typename T>
+struct A
+{
+ static T b (T it) { return it; }
+};
+
+template <typename T, typename U>
+static U
+baz (T x, T y, U z)
+{
+ for (long n = y - x; n > 0; --n)
+ {
+ *z = *x;
+ ++z;
+ }
+};
+
+template <typename T, typename U>
+U
+bar (T x, T y, U z)
+{
+ baz (A <T>::b (x), A <T>::b (y), A <U>::b (z));
+}
+
+struct C
+{
+ __complex__ float v;
+};
+
+template <class T>
+struct B
+{
+ B (T y[]) { bar (y, y + 1, x); }
+ operator T *() { return x; }
+ T x[1];
+};
+
+B <C>
+foo ()
+{
+ C y[1];
+ return B <C> (y);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42773.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42773.C
new file mode 100644
index 000000000..478ad278a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42773.C
@@ -0,0 +1,54 @@
+// { dg-do compile }
+// { dg-options "-fno-exceptions" }
+
+typedef unsigned int uint;
+struct QShared {
+ bool deref() {
+ return !--count;
+ }
+ uint count;
+};
+template <class T> class QValueListNode {
+public:
+ QValueListNode<T>* next;
+ QValueListNode<T>* prev;
+};
+template <class T> class QValueListPrivate : public QShared {
+public:
+ typedef QValueListNode<T> Node;
+ typedef QValueListNode<T>* NodePtr;
+ QValueListPrivate();
+ void derefAndDelete() {
+ if ( deref() ) delete this;
+ }
+ ~QValueListPrivate();
+ NodePtr node;
+};
+template <class T> QValueListPrivate<T>::QValueListPrivate() {
+ node = new Node;
+ node->next = node->prev = node;
+}
+template <class T> QValueListPrivate<T>::~QValueListPrivate() {
+ NodePtr p = node->next;
+ while( p != node ) {
+ NodePtr x = p->next;
+ delete p;
+ p = x;
+ }
+}
+template <class T> class QValueList {
+public:
+ QValueList() {
+ sh = new QValueListPrivate<T>;
+ }
+ ~QValueList() {
+ sh->derefAndDelete();
+ }
+ QValueListPrivate<T>* sh;
+};
+class Cell {
+ QValueList<Cell*> obscuringCells() const;
+};
+QValueList<Cell*> Cell::obscuringCells() const {
+ QValueList<Cell*> empty;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42871.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42871.C
new file mode 100644
index 000000000..452ad9319
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42871.C
@@ -0,0 +1,40 @@
+struct C
+{
+ ~C ();
+ int c3;
+};
+
+C *b2;
+
+static void
+b1 (const C &x, unsigned b3, unsigned b4)
+{
+ unsigned i = 0;
+ for (; i < b3; i++)
+ if (i < b4)
+ {
+ b2[0].c3 = x.c3;
+ return;
+ }
+}
+
+int a ();
+
+void
+bar (unsigned b3, unsigned b4)
+{
+ C c[100];
+ for (int i = 0; i < 100; i++)
+ {
+ c[i].c3 = i;
+ for (int j = 0; j < b3; j++)
+ if (j < b4)
+ {
+ b2[0].c3 = 0;
+ break;
+ }
+ b1 (c[i], b3, b4);
+ a ();
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42883.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42883.C
new file mode 100644
index 000000000..f164c3781
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42883.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ public:
+ typedef size_t size_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ void deallocate(pointer __p, size_type) {
+ ::operator delete(__p);
+ }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public:
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+ template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+ struct _Vector_impl : public _Tp_alloc_type {
+ typename _Tp_alloc_type::pointer _M_start;
+ typename _Tp_alloc_type::pointer _M_end_of_storage;
+ };
+ ~_Vector_base() {
+ _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
+ }
+ _Vector_impl _M_impl;
+ void _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n) {
+ if (__p) _M_impl.deallocate(__p, __n);
+ }
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef size_t size_type;
+ size_type size() const {
+ }
+ reference operator[](size_type __n) {
+ }
+ };
+};
+class vtkConvexPointSet {
+public:
+ static vtkConvexPointSet *New();
+};
+void MakeInternalMesh() {
+ std::vector< int > tempFaces[2];
+ std::vector< int > firstFace;
+ int i, j, k;
+ for(i = 0; i < 1000; i++) {
+ for(int pointCount = 0; pointCount < 1000; pointCount++) {
+ for(j = 0; j < (int)tempFaces[0].size(); k++)
+ if(tempFaces[0][j] == tempFaces[1][k]) break;
+ }
+ vtkConvexPointSet::New();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42890.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42890.C
new file mode 100644
index 000000000..937367665
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr42890.C
@@ -0,0 +1,25 @@
+// PR tree-optimization/42890
+// { dg-do compile }
+
+extern "C" int puts (const char *) throw ();
+
+struct S
+{
+ const char *a;
+ const char **b;
+ S (const char *s) { a = s; b = &a; }
+ ~S () { puts (a); }
+};
+
+void
+foo (int (*fn) (const char *))
+{
+ S a ("foo");
+ fn ("bar");
+}
+
+int
+main ()
+{
+ foo (puts);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43068.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43068.C
new file mode 100644
index 000000000..524fd23ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43068.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-freorder-blocks -ftracer} */
+
+struct A {
+ virtual A *f();
+};
+struct B : virtual A {
+ virtual B *f();
+};
+B *B::f() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43257.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43257.C
new file mode 100644
index 000000000..a3e75574a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43257.C
@@ -0,0 +1,30 @@
+/* { dg-do assemble } */
+
+class A {};
+class B {};
+
+static void *func (int n)
+{
+ void *p;
+ if (p == 0) throw ::A ();
+}
+
+static void *func (int n, B const &)
+{
+ try {
+ return func (n);
+ }
+ catch (::A const &) {
+ }
+ return func (n);
+}
+
+void *f1 (int n)
+{
+ return func (n, B());
+}
+
+void *f2 (int n)
+{
+ return func (n, B());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43611.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43611.C
new file mode 100644
index 000000000..6899a6ea4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43611.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-fkeep-inline-functions" }
+
+template < typename >
+struct A {
+ void init (int);
+ A ()
+ {
+ this->init (0);
+ }
+};
+
+template < typename >
+struct B : A < int > {
+ A < int > a;
+ B () {}
+};
+
+extern template struct A < int >;
+extern template struct B < int >;
+
+B < int > b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43784.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43784.C
new file mode 100644
index 000000000..a83a6f374
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43784.C
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-fno-tree-sra" } */
+
+struct S {int x, y, makemelarge[5];};
+S __attribute__((noinline)) f (S &s) {
+ S r;
+ r.x = s.y;
+ r.y = s.x;
+ return r;
+}
+int __attribute__((noinline)) glob (int a, int b)
+{
+ S local = { a, b };
+ local = f (local);
+ return local.y;
+}
+extern "C" void abort (void);
+int main (void)
+{
+ if (glob (1, 3) != 1)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43801.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43801.C
new file mode 100644
index 000000000..3b52d4abc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43801.C
@@ -0,0 +1,22 @@
+// PR tree-optimization/43801
+// { dg-do compile }
+// { dg-options "-fipa-cp -fipa-cp-clone" }
+
+struct A
+{
+ virtual void f (int);
+};
+struct B : virtual A
+{
+ virtual void f (int i) { if (i) A::f(0); }
+};
+struct C : virtual B
+{
+ virtual void f (int) { B::f(0); }
+};
+
+void
+foo ()
+{
+ C ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_0.C
new file mode 100644
index 000000000..710f6adfe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_0.C
@@ -0,0 +1,11 @@
+struct A {
+ int *i;
+ A();
+ ~A();
+};
+
+static int x = 0;
+
+A::A() : i(&x) {}
+A::~A() {}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_1.C
new file mode 100644
index 000000000..0c943381f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43879-1_1.C
@@ -0,0 +1,48 @@
+/* { dg-do run } */
+/* { dg-options "-fipa-pta" } */
+/* { dg-additional-sources "pr43879-1_0.C" } */
+
+struct A {
+ int *i;
+ A();
+ ~A();
+};
+
+static inline int
+aa(int *a, int *b)
+{
+ (void)b;
+ return *a;
+}
+
+struct B {
+ B() : i(0) {}
+ int i;
+ B(const A &a) : i(0)
+ {
+ f(*a.i);
+ }
+ void __attribute__((noinline, noclone))
+ f(int j)
+ {
+ aa(&i, &j);
+ i = 1;
+ }
+};
+
+int
+test()
+{
+ B b1;
+ B b2 = B(A());
+ b1 = B(A());
+ if (b1.i != b2.i) __builtin_abort();
+ return 0;
+}
+
+int
+main()
+{
+ return test();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43880.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43880.C
new file mode 100644
index 000000000..bf82bc54b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43880.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+extern void xread(void *);
+class test
+{
+public:
+ test(void);
+};
+test::test(void)
+{
+ union {
+ char pngpal[1];
+ };
+ xread(pngpal);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43905.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43905.C
new file mode 100644
index 000000000..0e49a32a1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr43905.C
@@ -0,0 +1,13 @@
+extern void sf ( __const char *);
+struct Matrix{
+ int operator[](int n){
+ sf ( __PRETTY_FUNCTION__);
+ }
+ int operator[](int n)const{
+ sf ( __PRETTY_FUNCTION__);
+ }
+};
+void calcmy(Matrix const &b, Matrix &c, int k){
+ b[k];
+ c[k];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44069.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44069.C
new file mode 100644
index 000000000..99fcd173e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44069.C
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+
+template <unsigned R, unsigned C>
+class M {
+public:
+ M(const int* arr) {
+ for (unsigned long r = 0; r < R; ++r)
+ for (unsigned long c = 0; c < C; ++c)
+ m[r*C+c] = arr[r*C+c];
+ }
+ int operator()(unsigned r, unsigned c) const
+ { return m[r*C+c]; }
+private:
+ int m[R*C];
+};
+extern "C" void abort (void);
+int main()
+{
+ int vals[2][2] = { { 1, 2 }, { 5, 6 } };
+ M<2,2> m( &(vals[0][0]) );
+ if (m(1,0) != 5)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44148.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44148.C
new file mode 100644
index 000000000..a60ba9aa3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44148.C
@@ -0,0 +1,60 @@
+// PR c++/44148
+// { dg-do compile }
+// { dg-options "" }
+// { dg-options "-fpic" { target fpic } }
+
+template <typename T> struct S2
+{
+ typedef const T &t2;
+ t2 operator* () const {}
+};
+template <typename T> struct S3
+{
+ typedef S2 <T> t5;
+};
+template <typename T1, typename T2> T2 foo1 (T1 x, T2 y) { y (*x); }
+template <class T> struct S4
+{
+ T &operator* () const;
+};
+struct S7 {};
+struct S8
+{
+ typedef::S3 <S4 <S7> >::t5 t6;
+ t6 m1 () const;
+};
+template <class T> struct S9
+{
+ typedef T t3;
+ inline t3 &operator[] (unsigned int) {}
+};
+template <typename T1, typename T2, typename T3, void (&T4) (const T1 &, T3 &)> struct S10
+{
+ S10 (T2 &x, unsigned int y = 0) : u (x), v (y) {}
+ void operator () (const S4 <T1> &x) { T4 (*x, u[v++]); }
+ T2 &u;
+ unsigned int v;
+};
+struct S15;
+struct S11
+{
+ static void m3 (const S8 &, S15 &);
+};
+struct S16;
+struct S12;
+struct S13
+{
+ static void m4 (const S7 &,S16 &);
+};
+typedef S10 <S7, S12, S16, S13::m4> t10;
+struct S12: S9 <S16>
+{
+};
+struct S15
+{
+ S12 p;
+};
+void S11::m3 (const S8 &x, S15 &y)
+{
+ foo1 (x.m1 (), t10 (y.p));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44206.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44206.C
new file mode 100644
index 000000000..a1dedb450
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44206.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+template<int> struct A
+{
+ void foo(void(*)(A));
+ void bar(void(*f)(A)) { foo(f); foo(f); }
+};
+
+template<int N> inline void FOO(A<N> a)
+{
+ a.foo(0);
+}
+
+extern template void FOO(A<0>);
+
+void BAR()
+{
+ A<0> a;
+ FOO(a);
+ a.bar(FOO);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44295.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44295.C
new file mode 100644
index 000000000..8169bb0a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44295.C
@@ -0,0 +1,170 @@
+/* { dg-do compile } */
+extern "C" {
+ typedef __SIZE_TYPE__ size_t;
+ typedef struct {
+ } __sigset_t;
+ typedef union {
+ } pthread_barrierattr_t;
+ }
+ typedef unsigned short XMLCh;
+ typedef unsigned long XMLSize_t;
+ namespace xercesc_2_5 {
+ class DOMNodeList;
+ class DOMNode {
+ };
+ class DOMDocumentRange {
+ };
+ class DOMDocument: public DOMDocumentRange, public DOMNode {
+ };
+ union wait {
+ struct {
+ }
+ __wait_stopped;
+ }
+ div_t;
+ class MemoryManager;
+ class XMemory {
+ public : void* operator new(size_t size, MemoryManager* memMgr);
+ void operator delete(void* p);
+ void operator delete(void* p, MemoryManager* memMgr);
+ };
+ class XMLExcepts {
+ public : enum Codes {
+ NoError = 0 , HshTbl_ZeroModulus = 48 , HshTbl_BadHashFromKey = 49 };
+ };
+ class XMLUni {
+ };
+ }
+ namespace xercesc_2_5 {
+ class XMLException : public XMemory {
+ public:
+ virtual ~XMLException();
+ XMLException(const char* const srcFile, const unsigned int srcLine, MemoryManager* const memoryManager = 0);
+ void loadExceptText ( const XMLExcepts::Codes toLoad );
+ };
+ class XMLDeleter {
+ };
+ class XMLPlatformUtils {
+ public : static MemoryManager* fgMemoryManager;
+ static inline size_t alignPointerForNewBlockAllocation(size_t ptrSize);
+ };
+ inline size_t XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize) {
+ }
+ class HashBase : public XMemory {
+ public:
+ virtual bool equals(const void *const key1, const void *const key2) = 0;
+ virtual ~HashBase() {
+};
+ };
+ class IllegalArgumentException : public XMLException {
+ public:
+IllegalArgumentException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) {
+ loadExceptText(toThrow);
+ }
+ };
+ class RuntimeException : public XMLException {
+ public:
+RuntimeException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) {
+ loadExceptText(toThrow);
+ }
+ };
+ class MemoryManager {
+ public:
+ virtual ~MemoryManager() {
+ }
+ virtual void* allocate(size_t size) = 0;
+ };
+ template <class TElem> class BaseRefVectorOf : public XMemory {
+ BaseRefVectorOf ( const unsigned int maxElems , const bool adoptElems = true , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager );
+ virtual ~BaseRefVectorOf();
+ bool fAdoptedElems;
+ TElem** fElemList;
+ };
+ template <class TElem> BaseRefVectorOf<TElem>::BaseRefVectorOf( const unsigned int maxElems , const bool adoptElems , MemoryManager* const manager) : fAdoptedElems(adoptElems) {
+ for (unsigned int index = 0;
+ index < maxElems;
+ index++) fElemList[index] = 0;
+ }
+ template <class TElem> BaseRefVectorOf<TElem>::~BaseRefVectorOf() {
+ }
+ class XMLString {
+ public:
+ static bool equals ( const XMLCh* const str1 , const XMLCh* const str2 );
+ static void moveChars ( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count );
+ };
+ inline void XMLString::moveChars( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count) {
+ }
+ inline bool XMLString::equals( const XMLCh* const str1 , const XMLCh* const str2) {
+ const XMLCh* psz1 = str1;
+ const XMLCh* psz2 = str2;
+ if (psz1 == 0 || psz2 == 0) {
+ return true;
+ }
+ }
+ }
+ namespace xercesc_2_5 {
+ class HashPtr : public HashBase {
+ virtual bool equals(const void *const key1, const void *const key2);
+ };
+ template <class TVal> struct DOMDeepNodeListPoolTableBucketElem : public XMemory {
+ void* fKey1;
+ XMLCh* fKey2;
+ XMLCh* fKey3;
+ };
+ template <class TVal> class DOMDeepNodeListPool {
+ public:
+ DOMDeepNodeListPool ( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize = 128 );
+ TVal* getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3);
+ DOMDeepNodeListPoolTableBucketElem<TVal>* findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal);
+ bool fAdoptedElems;
+ DOMDeepNodeListPoolTableBucketElem<TVal>** fBucketList;
+ XMLSize_t fHashModulus;
+ HashBase* fHash;
+ TVal** fIdPtrs;
+ XMLSize_t fIdPtrsCount;
+ MemoryManager* fMemoryManager;
+ };
+ template <class TVal> DOMDeepNodeListPool<TVal>::DOMDeepNodeListPool( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize) : fAdoptedElems(adoptElems) , fBucketList(0) , fHash(0) , fIdPtrs(0) {
+ fHash = new (fMemoryManager) HashPtr();
+ fIdPtrs = (TVal**) fMemoryManager->allocate(fIdPtrsCount * sizeof(TVal*));
+ if (modulus == 0) throw IllegalArgumentException("./xercesc/dom/impl/bad.c", 38, XMLExcepts::HshTbl_ZeroModulus, fMemoryManager);
+ }
+ template <class TVal> TVal* DOMDeepNodeListPool<TVal>::getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3) {
+ XMLSize_t hashVal;
+ DOMDeepNodeListPoolTableBucketElem<TVal>* findIt = findBucketElem(key1, key2, key3, hashVal);
+ }
+ template <class TVal> DOMDeepNodeListPoolTableBucketElem<TVal>* DOMDeepNodeListPool<TVal>:: findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal) {
+ if (hashVal > fHashModulus) throw RuntimeException("./xercesc/dom/impl/bad.c", 64, XMLExcepts::HshTbl_BadHashFromKey, fMemoryManager);
+ DOMDeepNodeListPoolTableBucketElem<TVal>* curElem = fBucketList[hashVal];
+ if (fHash->equals(key1, curElem->fKey1) && (XMLString::equals(key2, curElem->fKey2)) && (XMLString::equals(key3, curElem->fKey3))) {
+ return curElem;
+ }
+ }
+ class DOMDeepNodeListImpl;
+ class DOMDocumentImpl: public DOMDocument {
+ DOMNodeList* getElementsByTagName(const XMLCh * tagname) const;
+ DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName);
+ DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName);
+ DOMDeepNodeListPool<DOMDeepNodeListImpl>* fNodeListPool;
+ };
+ }
+ void * operator new(size_t amt, xercesc_2_5:: DOMDocument *doc);
+ namespace xercesc_2_5 {
+ class DOMNodeList {
+ };
+ class DOMDeepNodeListImpl: public DOMNodeList {
+ };
+ DOMNodeList *DOMDocumentImpl::getElementsByTagName(const XMLCh *tagname) const {
+ return ((DOMDocumentImpl*)this)->getDeepNodeList(this,tagname);
+ }
+ DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName) {
+ if(!fNodeListPool) {
+ fNodeListPool = new (this) DOMDeepNodeListPool<DOMDeepNodeListImpl>(109, false);
+ }
+ DOMNodeList* retList = fNodeListPool->getByKey(rootNode, tagName, 0);
+ }
+ DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName) {
+ DOMNodeList* retList = fNodeListPool->getByKey(rootNode, localName, namespaceURI);
+ }
+ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44357.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44357.C
new file mode 100644
index 000000000..3380350e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44357.C
@@ -0,0 +1,228 @@
+/* { dg-do compile } */
+extern "C"
+{
+ typedef long unsigned int size_t;
+}
+namespace llvm
+{
+ namespace dont_use
+ {
+ template < typename T > double is_class_helper (...);
+ }
+ template < typename T > struct is_class
+ {
+ public:enum
+ { value = sizeof (char) == sizeof (dont_use::is_class_helper < T > (0)) };
+ };
+ template < typename T > struct isPodLike
+ {
+ static const bool value = !is_class < T >::value;
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Iterator > struct iterator_traits
+ {
+ };
+ template < typename _Tp > struct iterator_traits <_Tp * >
+ {
+ typedef _Tp value_type;
+ };
+}
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _Tp > class new_allocator
+ {
+ public:typedef size_t size_type;
+ typedef const _Tp & const_reference;
+ };
+}
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
+ _Tp >
+ {
+ public:typedef size_t size_type;
+ template < typename _Tp1 > struct rebind
+ {
+ typedef allocator < _Tp1 > other;
+ };
+ };
+ template < typename _Tp, typename _Alloc > struct _Vector_base
+ {
+ typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
+ };
+template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:protected _Vector_base < _Tp,
+ _Alloc
+ >
+ {
+ typedef _Vector_base < _Tp, _Alloc > _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
+ typedef size_t size_type;
+ size_type size () const
+ {
+ } const_reference operator[] (size_type __n) const
+ {
+ }};
+}
+
+namespace llvm
+{
+ struct LandingPadInfo;
+ class DwarfException
+ {
+ static bool PadLT (const LandingPadInfo * L, const LandingPadInfo * R);
+ struct CallSiteEntry
+ {
+ };
+ void EmitExceptionTable ();
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ template < typename _RandomAccessIterator,
+ typename _Compare >
+ void __unguarded_linear_insert (_RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ typename iterator_traits < _RandomAccessIterator >::value_type __val =
+ (*__last);
+ _RandomAccessIterator __next = __last;
+ while (__comp (__val, *__next))
+ {
+ }
+ }
+ template < typename _RandomAccessIterator,
+ typename _Compare > void __insertion_sort (_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
+ {
+ if (__comp (*__i, *__first))
+ {
+ }
+ else
+ std::__unguarded_linear_insert (__i, __comp);
+ }
+ }
+ enum
+ { _S_threshold = 16 };
+ template < typename _RandomAccessIterator,
+ typename _Compare >
+ void __final_insertion_sort (_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ if (__last - __first > int (_S_threshold))
+ {
+ std::__insertion_sort (__first, __first + int (_S_threshold), __comp);
+ }
+ }
+ template < typename _RandomAccessIterator,
+ typename _Compare > inline void sort (_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _Compare __comp)
+ {
+ if (__first != __last)
+ {
+ std::__final_insertion_sort (__first, __last, __comp);
+ }
+ }
+}
+
+namespace llvm
+{
+ class SmallVectorBase
+ {
+ protected:void *BeginX, *EndX, *CapacityX;
+ struct U
+ {
+ } FirstEl;
+ protected: SmallVectorBase (size_t Size):BeginX (&FirstEl), EndX (&FirstEl),
+ CapacityX ((char *) &FirstEl + Size)
+ {
+ }};
+template < typename T > class SmallVectorTemplateCommon:public
+ SmallVectorBase
+ {
+ public: SmallVectorTemplateCommon (size_t Size):SmallVectorBase (Size)
+ {
+ } typedef size_t size_type;
+ typedef T *iterator;
+ iterator begin ()
+ {
+ } iterator end ()
+ {
+ } size_type size () const
+ {
+ }};
+template < typename T, bool isPodLike > class SmallVectorTemplateBase:public SmallVectorTemplateCommon <
+ T >
+ {
+ public: SmallVectorTemplateBase (size_t Size):SmallVectorTemplateCommon < T >
+ (Size)
+ {
+ }};
+template < typename T > class SmallVectorImpl:public SmallVectorTemplateBase < T,
+ isPodLike < T >::value >
+ {
+ typedef SmallVectorTemplateBase < T, isPodLike < T >::value > SuperClass;
+ public:typedef typename SuperClass::iterator iterator;
+ explicit SmallVectorImpl (unsigned N):SmallVectorTemplateBase < T,
+ isPodLike < T >::value > (N * sizeof (T))
+ {
+ }
+ };
+ template < typename T,
+ unsigned N > class SmallVector:public SmallVectorImpl < T >
+ {
+ typedef typename SmallVectorImpl < T >::U U;
+ enum
+ { MinUs =
+ (static_cast < unsigned int >(sizeof (T)) * N + static_cast <
+ unsigned int >(sizeof (U)) - 1) /static_cast <
+ unsigned int >(sizeof (U)), NumInlineEltsElts =
+ MinUs > 1 ? (MinUs - 1) : 1, NumTsAvailable =
+ (NumInlineEltsElts + 1) * static_cast <
+ unsigned int >(sizeof (U)) / static_cast <
+ unsigned int >(sizeof (T)) };
+ public: SmallVector ():SmallVectorImpl < T > (NumTsAvailable)
+ {
+ }
+ };
+ struct LandingPadInfo
+ {
+ std::vector < int >TypeIds;
+ union
+ {
+ } Contents;
+ };
+}
+
+using namespace llvm;
+bool
+DwarfException::PadLT (const LandingPadInfo * L, const LandingPadInfo * R)
+{
+ const std::vector < int >&LIds = L->TypeIds, &RIds = R->TypeIds;
+ unsigned LSize = LIds.size (), RSize = RIds.size ();
+ unsigned MinSize = LSize < RSize ? LSize : RSize;
+ for (unsigned i = 0; i != MinSize; ++i)
+ if (LIds[i] != RIds[i])
+ return LIds[i] < RIds[i];
+}
+
+void
+DwarfException::EmitExceptionTable ()
+{
+ SmallVector < const LandingPadInfo *, 64 > LandingPads;
+ std::sort (LandingPads.begin (), LandingPads.end (), PadLT);
+ SmallVector < CallSiteEntry, 64 > CallSites;
+ for (unsigned i = 0, e = CallSites.size (); i < e; ++i)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44492.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44492.C
new file mode 100644
index 000000000..41669241e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44492.C
@@ -0,0 +1,31 @@
+// PR middle-end/44492
+// { dg-do run }
+
+struct T { unsigned long p; };
+struct S { T a, b, c; unsigned d; };
+
+__attribute__((noinline))
+void
+bar (const T &x, const T &y)
+{
+ if (x.p != 0x2348 || y.p != 0x2346)
+ __builtin_abort ();
+}
+
+__attribute__((noinline))
+void
+foo (S &s, T e)
+{
+ unsigned long a = e.p;
+ unsigned long b = s.b.p;
+ __asm__ volatile ("" : : "rm" (a), "rm" (b));
+ bar (e, s.b);
+}
+
+int
+main ()
+{
+ S s = { { 0x2345 }, { 0x2346 }, { 0x2347 }, 6 };
+ T t = { 0x2348 };
+ foo (s, t);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44535.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44535.C
new file mode 100644
index 000000000..9126f3997
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44535.C
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+
+namespace FOO {
+
+template <typename T>
+class A
+{
+public:
+ void Enum();
+ virtual void OnProv() = 0;
+ virtual ~A() { }
+};
+typedef A<char> B;
+
+template<typename T>
+void A<T>::Enum ()
+{
+ OnProv ();
+}
+} // namespace FOO
+
+class C {};
+
+class D: public C, public FOO::B {
+public:
+ void OnProv() {}
+};
+
+int main(int argc, char *argv[])
+{
+ D x;
+ x.Enum();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44809.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44809.C
new file mode 100644
index 000000000..b6615f23f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44809.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+unsigned int mEvictionRank[(1 << 5)];
+void Unswap(int i)
+{
+ mEvictionRank[i] = ({ unsigned int __v = i; __v; });
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44813.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44813.C
new file mode 100644
index 000000000..1dc01b06a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44813.C
@@ -0,0 +1,60 @@
+typedef unsigned int PRUint32;
+typedef int PRInt32;
+typedef unsigned long PRUint64;
+typedef int PRIntn;
+typedef PRIntn PRBool;
+struct nsRect {
+ nsRect(const nsRect& aRect) { }
+};
+enum nsCompatibility { eCompatibility_NavQuirks = 3 };
+class gfxContext;
+typedef PRUint64 nsFrameState;
+class nsPresContext {
+public:
+ nsCompatibility CompatibilityMode() const { }
+};
+class nsStyleContext {
+public:
+ PRBool HasTextDecorations() const;
+};
+class nsIFrame {
+public:
+ nsPresContext* PresContext() const;
+ nsStyleContext* GetStyleContext() const;
+ nsFrameState GetStateBits() const;
+ nsRect GetOverflowRect() const;
+};
+class nsFrame : public nsIFrame { };
+class nsLineList_iterator { };
+class nsLineList {
+public:
+ typedef nsLineList_iterator iterator;
+};
+class gfxSkipCharsIterator { };
+class gfxTextRun {
+public:
+ class PropertyProvider { };
+};
+class nsTextFrame : public nsFrame
+{
+ virtual nsRect ComputeTightBounds(gfxContext* aContext) const;
+ gfxSkipCharsIterator EnsureTextRun(gfxContext* aReferenceContext = 0L,
+ nsIFrame* aLineContainer = 0L,
+ const nsLineList::iterator* aLine = 0L,
+ PRUint32* aFlowEndInTextRun = 0L);
+};
+class PropertyProvider : public gfxTextRun::PropertyProvider
+{
+public:
+ PropertyProvider(nsTextFrame* aFrame, const gfxSkipCharsIterator& aStart);
+ PRInt32 mLength[64];
+};
+nsRect nsTextFrame::ComputeTightBounds(gfxContext* aContext) const
+{
+ if ((GetStyleContext()->HasTextDecorations()
+ && eCompatibility_NavQuirks == PresContext()->CompatibilityMode())
+ || (GetStateBits() & (nsFrameState(1) << (23))))
+ return GetOverflowRect();
+ gfxSkipCharsIterator iter = const_cast<nsTextFrame*>(this)->EnsureTextRun();
+ PropertyProvider provider(const_cast<nsTextFrame*>(this), iter);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44826.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44826.C
new file mode 100644
index 000000000..aece14070
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44826.C
@@ -0,0 +1,44 @@
+typedef unsigned short PRUint16;
+typedef PRUint16 PRUnichar;
+template <class CharT> struct nsCharTraits {
+};
+class nsAString_internal {
+public:
+ typedef PRUnichar char_type;
+};
+class nsString : public nsAString_internal {
+public:
+ typedef nsString self_type;
+ nsString( const self_type& str );
+};
+class nsDependentString : public nsString {
+public:
+ explicit nsDependentString( const char_type* data );
+};
+typedef struct sqlite3_stmt sqlite3_stmt;
+const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
+class nsIVariant { };
+template <typename DataType> struct variant_storage_traits {
+ typedef DataType ConstructorType;
+ typedef DataType StorageType;
+ static inline StorageType storage_conversion(ConstructorType aData) {
+ return aData;
+ }
+};
+template <typename DataType> class Variant : public nsIVariant {
+public:
+ Variant(typename variant_storage_traits<DataType>::ConstructorType aData)
+ : mData(variant_storage_traits<DataType>::storage_conversion(aData)) {}
+ typename variant_storage_traits<DataType>::StorageType mData;
+};
+typedef Variant<nsString> TextVariant;
+class Row {
+ void initialize(sqlite3_stmt *aStatement);
+};
+void Row::initialize(sqlite3_stmt *aStatement)
+{
+ nsDependentString str(static_cast<const PRUnichar
+*>(::sqlite3_column_text16(aStatement, 0)));
+ new TextVariant(str);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44900.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44900.C
new file mode 100644
index 000000000..ad150d7fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44900.C
@@ -0,0 +1,76 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-msse" } */
+/* { dg-require-effective-target sse_runtime } */
+
+typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
+typedef float __v4sf __attribute__ ((__vector_size__ (16)));
+
+extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__,
+__artificial__))
+_mm_set_ps (const float __Z, const float __Y, const float __X, const float __W)
+{
+ return __extension__ (__m128)(__v4sf){ __W, __X, __Y, __Z };
+}
+
+struct vec
+{
+ union {
+ __m128 v;
+ float e[4];
+ };
+
+ static const vec & zero()
+ {
+ static const vec v = _mm_set_ps(0, 0, 0, 0);
+ return v;
+ }
+
+ vec() {}
+ vec(const __m128 & a) : v(a) {}
+
+ operator const __m128&() const { return v; }
+};
+
+struct vec2
+{
+ vec _v1;
+ vec _v2;
+
+ vec2() {}
+ vec2(const vec & a, const vec & b) : _v1(a), _v2(b) {}
+
+ static vec2 load(const float * a)
+ {
+ return vec2(
+ __builtin_ia32_loadups(&a[0]),
+ __builtin_ia32_loadups(&a[4]));
+ }
+
+ const vec & v1() const { return _v1; }
+ const vec & v2() const { return _v2; }
+};
+
+extern "C" void abort(void);
+
+
+inline bool operator==(const vec & a, const vec & b)
+{ return 0xf == __builtin_ia32_movmskps(__builtin_ia32_cmpeqps(a, b)); }
+
+int main( int argc, char * argv[] )
+{
+ __attribute__((aligned(16))) float data[] =
+ { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5 };
+
+ float * p = &data[2];
+ vec2 a;
+
+ a = vec2::load(p);
+
+ vec v1 = a.v1();
+ vec v2 = a.v2();
+
+ if (v2.e[3] != 7.0)
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44915.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44915.C
new file mode 100644
index 000000000..ba7e96606
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44915.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-findirect-inlining" } */
+
+struct A;
+
+typedef void (A::*f_ptr) ();
+
+void dummy (f_ptr) { }
+
+void call_dummy (f_ptr cb)
+{
+ dummy (cb);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44972.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44972.C
new file mode 100644
index 000000000..e409148da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr44972.C
@@ -0,0 +1,142 @@
+/* { dg-do compile } */
+
+#include<cassert>
+#include<new>
+#include<utility>
+
+namespace boost {
+
+template<class T>
+class optional;
+
+class aligned_storage
+{
+ char data[ 1000 ];
+ public:
+ void const* address() const { return &data[0]; }
+ void * address() { return &data[0]; }
+} ;
+
+
+template<class T>
+class optional_base
+{
+ protected :
+ optional_base(){}
+ optional_base ( T const& val )
+ {
+ construct(val);
+ }
+
+ template<class U>
+ void assign ( optional<U> const& rhs )
+ {
+ if (!is_initialized())
+ if ( rhs.is_initialized() )
+ construct(T());
+ }
+
+ public :
+
+ bool is_initialized() const { return m_initialized ; }
+
+ protected :
+
+ void construct ( T const& val )
+ {
+ new (m_storage.address()) T(val) ;
+ }
+
+ T const* get_ptr_impl() const
+ { return static_cast<T const*>(m_storage.address()); }
+
+ private :
+
+ bool m_initialized ;
+ aligned_storage m_storage ;
+} ;
+
+
+template<class T>
+class optional : public optional_base<T>
+{
+ typedef optional_base<T> base ;
+
+ public :
+
+ optional() : base() {}
+ optional ( T const& val ) : base(val) {}
+ optional& operator= ( optional const& rhs )
+ {
+ this->assign( rhs ) ;
+ return *this ;
+ }
+
+ T const& get() const ;
+
+ T const* operator->() const { assert(this->is_initialized()) ; return this->get_ptr_impl() ; }
+
+} ;
+
+
+} // namespace boost
+
+
+namespace std
+{
+
+ template<typename _Tp, std::size_t _Nm>
+ struct array
+ {
+ typedef _Tp value_type;
+ typedef const value_type* const_iterator;
+
+ value_type _M_instance[_Nm];
+
+ };
+}
+
+
+class NT
+{
+ double _inf, _sup;
+};
+
+
+template < typename T > inline
+std::array<T, 1>
+make_array(const T& b1)
+{
+ std::array<T, 1> a = { { b1 } };
+ return a;
+}
+
+class V
+{
+ typedef std::array<NT, 1> Base;
+ Base base;
+
+public:
+ V() {}
+ V(const NT &x)
+ : base(make_array(x)) {}
+
+};
+
+using boost::optional ;
+
+optional< std::pair< NT, NT > >
+ linsolve_pointC2() ;
+
+optional< V > construct_normal_offset_lines_isecC2 ( )
+{
+ optional< std::pair<NT,NT> > ip;
+
+ ip = linsolve_pointC2();
+
+ V a(ip->first) ;
+ return a;
+}
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45393.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45393.C
new file mode 100644
index 000000000..5bf16b034
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45393.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+
+class FloatPoint;
+class Path {
+public:
+ ~Path();
+ void moveTo(const FloatPoint&);
+ static void createEllipse(const FloatPoint& center, float rx, float ry);
+};
+extern "C" {
+ extern float cosf (float);
+ extern float sinf (float);
+}
+const float piFloat = static_cast<float>(3.14159265358979323846);
+class FloatPoint {
+public:
+ FloatPoint(float x, float y) : m_x(x), m_y(y) { }
+ float x() const;
+ float y() const;
+ float m_x, m_y;
+};
+void Path::createEllipse(const FloatPoint& center, float rx, float ry)
+{
+ float cx = center.x();
+ float cy = center.y();
+ Path path;
+ float x = cx;
+ float y = cy;
+ unsigned step = 0, num = 100;
+ while (1) {
+ float angle = static_cast<float>(step) / num * 2.0f * piFloat;
+ x = cx + cosf(angle) * rx;
+ y = cy + sinf(angle) * ry;
+ step++;
+ if (step == 1)
+ path.moveTo(FloatPoint(x, y));
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45580.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45580.C
new file mode 100644
index 000000000..c3af4910a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45580.C
@@ -0,0 +1,50 @@
+// { dg-do compile }
+
+namespace std {
+ typedef __SIZE_TYPE__ size_t;
+}
+inline void* operator new(std::size_t, void* __p) throw() {
+ return __p;
+}
+class Noncopyable { };
+struct CollectorCell { };
+template<typename T> class PassRefPtr {
+public:
+ T* releaseRef() const { }
+};
+template <typename T> class NonNullPassRefPtr {
+public:
+ template <class U> NonNullPassRefPtr(const PassRefPtr<U>& o)
+ : m_ptr(o.releaseRef()) { }
+ mutable T* m_ptr;
+};
+struct ClassInfo;
+class JSValue { };
+JSValue jsNull();
+class Structure;
+class JSGlobalData {
+ static void storeVPtrs();
+};
+class JSCell : public Noncopyable {
+ friend class JSObject;
+ friend class JSGlobalData;
+ virtual ~JSCell();
+};
+class JSObject : public JSCell {
+public:
+ explicit JSObject(NonNullPassRefPtr<Structure>);
+ static PassRefPtr<Structure> createStructure(JSValue prototype) { }
+};
+class JSByteArray : public JSObject {
+ friend class JSGlobalData;
+ enum VPtrStealingHackType { VPtrStealingHack };
+ JSByteArray(VPtrStealingHackType)
+ : JSObject(createStructure(jsNull())), m_classInfo(0) { }
+ const ClassInfo* m_classInfo;
+};
+void JSGlobalData::storeVPtrs() {
+ CollectorCell cell;
+ void* storage = &cell;
+ JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack);
+ jsByteArray->~JSCell();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45699.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45699.C
new file mode 100644
index 000000000..828c1ef8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45699.C
@@ -0,0 +1,61 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static inline void bar (B &b)
+{
+ b.foo ();
+}
+
+int main()
+{
+ D d;
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709-2.C
new file mode 100644
index 000000000..1f6a2344f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709-2.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+struct Region {
+ int storage[4];
+ int count;
+};
+static inline Region subtract(int lhs)
+{
+ Region reg;
+ int* storage = reg.storage;
+ int* storage2 = reg.storage;
+ if (lhs > 0)
+ storage++, storage2--;
+ reg.count = storage - reg.storage + storage2 - reg.storage;
+ return reg;
+}
+void bar(int a)
+{
+ const Region copyBack(subtract(a));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709.C
new file mode 100644
index 000000000..1584ec76a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45709.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+struct Region {
+ int storage[4];
+ int count;
+};
+static inline Region subtract(int lhs)
+{
+ Region reg;
+ int* storage = reg.storage;
+ if (lhs > 0)
+ storage++;
+ reg.count = storage - reg.storage;
+ return reg;
+}
+void bar(int a)
+{
+ const Region copyBack(subtract(a));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45843.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45843.C
new file mode 100644
index 000000000..f77b8cb01
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45843.C
@@ -0,0 +1,28 @@
+// PR target/45843
+// { dg-do run }
+
+#include <stdarg.h>
+
+extern "C" void abort ();
+struct S { struct T { } a[14]; char b; };
+struct S arg, s;
+
+void
+foo (int z, ...)
+{
+ char c;
+ va_list ap;
+ va_start (ap, z);
+ c = 'a';
+ arg = va_arg (ap, struct S);
+ if (c != 'a')
+ abort ();
+ va_end (ap);
+}
+
+int
+main ()
+{
+ foo (1, s);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45854.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45854.C
new file mode 100644
index 000000000..17ee006e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45854.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+
+template < typename = void >
+struct X { } ;
+struct Y
+{
+ Y () ;
+} ;
+template < typename = X < > >
+struct T
+{
+ void f ()
+ {
+ f () ;
+ }
+} ;
+struct S
+{
+ S ( X < > = X < > ()) ;
+ ~S ()
+ {
+ T < > () . f () ;
+ }
+} ;
+struct Z
+{
+ S s ;
+ Y y ;
+} a ;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45874.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45874.C
new file mode 100644
index 000000000..70965ff57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45874.C
@@ -0,0 +1,58 @@
+// { dg-do compile }
+
+typedef struct {
+} IppLibraryVersion;
+typedef unsigned char Ipp8u;
+typedef unsigned int Ipp32u;
+typedef signed int Ipp32s;
+typedef enum e_vm_Status {
+ VM_OK = 0, VM_OPERATION_FAILED =-999, VM_NOT_INITIALIZED =-998, VM_TIMEOUT =-987, VM_NOT_ENOUGH_DATA =-996, VM_NULL_PTR =-995, VM_SO_CANT_LOAD =-994, VM_SO_INVALID_HANDLE =-993, VM_SO_CANT_GET_ADDR =-992 }
+ vm_status;
+ typedef Ipp32s Status;
+ class MediaReceiver {
+ };
+class MediaBuffer : public MediaReceiver {
+};
+struct TrackInfo {
+};
+struct Mpeg2TrackInfo : public TrackInfo {
+};
+class BitstreamReader {
+public: BitstreamReader(void);
+ virtual ~BitstreamReader(void) {
+ }
+ Ipp32u GetBits(Ipp32s iNum);
+ void SkipBits(Ipp32s iNum);
+protected: virtual void Refresh(void);
+ Ipp32s m_iReadyBits;
+};
+class FrameConstructor : public MediaBuffer {
+};
+class VideoFrameConstructor : public FrameConstructor {
+};
+class Mpeg2FrameConstructor : public VideoFrameConstructor {
+ static Status ParsePictureHeader(Ipp8u *buf, Ipp32s iLen, Mpeg2TrackInfo *pInfo);
+};
+Status Mpeg2FrameConstructor::ParsePictureHeader(Ipp8u *buf, Ipp32s iLen, Mpeg2TrackInfo *pInfo) {
+ BitstreamReader bs;
+ bs.SkipBits(32 + 4 + 4 + 4 + 4 + 4 + 2);
+ bs.SkipBits(1 + 1 + 1 + 1 + 1 + 1 + 1);
+ bs.SkipBits(5);
+ bs.SkipBits(3);
+ Ipp8u source_format;
+ bs.SkipBits(22);
+ bs.SkipBits(8);
+ if (7 == source_format) {
+ Ipp8u ufep = (Ipp8u)bs.GetBits(3);
+ if (0x01 == ufep) {
+ bs.SkipBits(10);
+ }
+ }
+}
+void BitstreamReader::SkipBits(Ipp32s iNum) {
+ if (iNum <= m_iReadyBits) {
+ m_iReadyBits -= iNum;
+ Refresh();
+ }
+}
+void BitstreamReader::Refresh(void) { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45875.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45875.C
new file mode 100644
index 000000000..f1347f543
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45875.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+struct c1 {};
+
+struct c10 : c1
+{
+ virtual void foo ();
+};
+
+struct c11 : c10, c1 // // { dg-warning "" }
+{
+ virtual void f6 ();
+};
+
+struct c28 : virtual c11
+{
+ void f6 ();
+};
+
+void check_c28 ()
+{
+ c28 obj;
+ c11 *ptr = &obj;
+ ptr->f6 ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45877.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45877.C
new file mode 100644
index 000000000..9af6ae999
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45877.C
@@ -0,0 +1,141 @@
+// { dg-do compile }
+
+namespace std __attribute__ ((__visibility__ ("default")))
+{
+ typedef __SIZE_TYPE__ size_t;
+ template<typename _Alloc> class allocator;
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>,
+ typename _Alloc = allocator<_CharT> >
+ class basic_string;
+ typedef basic_string<char> string;
+ template<class _T1, class _T2> struct pair { };
+ template<typename _Tp> class allocator { };
+ template<typename _Arg1, typename _Arg2, typename _Result>
+ struct binary_function {
+ typedef _Arg1 first_argument_type;
+ typedef _Arg2 second_argument_type;
+ typedef _Result result_type;
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ class basic_string {
+ public:
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ };
+ class type_info {
+ public:
+ const char* name() const;
+ };
+ extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__))
+ void * memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __len) throw ()
+ {
+ return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
+ }
+ template <typename _Key, typename _Tp >
+ class map {
+ typedef _Key key_type;
+ typedef _Tp mapped_type;
+ public:
+ mapped_type& operator[](const key_type& __k);
+ };
+}
+class CodeAlloc { };
+using namespace std;
+typedef void *Stack;
+class basicForEachType;
+typedef const basicForEachType * aType;
+extern map<const string,basicForEachType *> map_type;
+class AnyTypeWithOutCheck { };
+typedef AnyTypeWithOutCheck AnyType;
+template<typename T> AnyTypeWithOutCheck inline SetAny(const T & x)
+{
+ AnyTypeWithOutCheck any;
+ memcpy(&any,&x,sizeof(x));
+}
+template<typename T> const T& GetAny(const AnyTypeWithOutCheck & x);
+class E_F0;
+class C_F0;
+class Polymorphic;
+typedef E_F0 * Expression;
+class basicAC_F0;
+extern Polymorphic * TheOperators, * TheRightOperators;
+class basicForEachType : public CodeAlloc {
+public:
+ virtual C_F0 CastTo(const C_F0 & e) const ;
+};
+class E_F0 :public CodeAlloc {
+public:
+ virtual AnyType operator()(Stack) const =0;
+};
+class E_F0mps : public E_F0 {
+};
+class ArrayOfaType : public CodeAlloc{
+protected:
+ aType * t;
+};
+class OneOperator : public ArrayOfaType {
+public:
+ OneOperator(aType rr,aType a,aType b);
+ virtual E_F0 * code(const basicAC_F0 &) const =0;
+};
+class Polymorphic: public E_F0mps {
+public:
+ void Add(const char * op,OneOperator * p0 ,OneOperator * p1=0) const;
+};
+class C_F0 {
+public:
+ operator E_F0 * () const;
+};
+class basicAC_F0 {
+public:
+ const C_F0 & operator [] (int i) const;
+};
+struct OneBinaryOperatorMI { };
+struct evalE_F2 { };
+template<typename C,class MI=OneBinaryOperatorMI,class MIx=evalE_F2 >
+class OneBinaryOperator : public OneOperator
+{
+ typedef typename C::result_type R;
+ typedef typename C::first_argument_type A;
+ typedef typename C::second_argument_type B;
+ aType t0,t1;
+ class Op : public E_F0 {
+ Expression a,b;
+ public:
+ AnyType operator()(Stack s) const {
+ return SetAny<R>(static_cast<R>(C::f( GetAny<A>((*a)(s)),
+ GetAny<B>((*b)(s)))));
+ }
+ Op(Expression aa,Expression bb) : a(aa),b(bb) { }
+ };
+public:
+ E_F0 * code(const basicAC_F0 & args) const {
+ return new Op(t0->CastTo(args[0]),t1->CastTo(args[1]));
+ }
+ OneBinaryOperator()
+ : OneOperator(map_type[typeid(R).name()],
+ map_type[typeid(A).name()],
+ map_type[typeid(B).name()]), t0(t[0]), t1(t[1]) { }
+};
+struct NothingType { };
+class ShapeOfArray{ };
+template<class R> class KN_: public ShapeOfArray { };
+template <class T> struct affectation: binary_function<T, T, T> { };
+template<class K,class L,class OP> struct set_A_BI
+: public binary_function<KN_<K>,pair<KN_<K>, KN_<L> > *,KN_<K> >
+{
+ static KN_<K> f(const KN_<K> & a, pair<KN_<K>, KN_<L> > * const & b);
+};
+template<class K,class L,class OP> struct set_AI_B
+: public binary_function<pair<KN_<K>, KN_<L> > * ,KN_<K>, NothingType >
+{
+ static NothingType f( pair<KN_<K>, KN_<L> > * const & b,const KN_<K> & a);
+};
+template<class K,class Z> void ArrayOperator()
+{
+ TheOperators->Add("=", new OneBinaryOperator<set_A_BI< K,Z,affectation<K> > >,
+ new OneBinaryOperator<set_AI_B< K,Z,affectation<K> > >);
+}
+void initArrayOperatorlong() {
+ ArrayOperator<long,long>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45934.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45934.C
new file mode 100644
index 000000000..f43964107
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr45934.C
@@ -0,0 +1,23 @@
+/* { dg-do run } */
+
+extern "C" void abort ();
+
+struct B *b;
+
+struct B
+{
+ virtual void f () { }
+ ~B() { b->f(); }
+};
+
+struct D : public B
+{
+ virtual void f () { abort (); }
+};
+
+int main ()
+{
+ D d;
+ b = &d;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46111.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46111.C
new file mode 100644
index 000000000..df57d8d02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46111.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-ftree-parallelize-loops=2 -g" }
+
+struct A
+{
+ int zero ()
+ {
+ return 0;
+ }
+};
+
+static inline void
+bar (int)
+{
+}
+
+struct B
+{
+ struct A a;
+ B (int n)
+ {
+ for (int i = 0; i < n; i++)
+ bar (a.zero ());
+ }
+};
+
+void
+foo (int n)
+{
+ struct B b (n);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46149.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46149.C
new file mode 100644
index 000000000..bdc3d7704
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46149.C
@@ -0,0 +1,51 @@
+// { dg-do run }
+// { dg-options "-fno-tree-sra" }
+
+struct S
+{
+ S ():p ((char *) __builtin_calloc (1, 1))
+ {
+ }
+ char *p;
+};
+
+template < class T > struct A
+{
+ A (const S & __m1, const T & __m2):m1 (__m1), m2 (__m2)
+ {
+ }
+ const S & m1;
+ const T & m2;
+};
+
+struct B:A < S >
+{
+ B (const S & __v):A < S > (__v, __v)
+ {
+ }
+};
+
+struct C:A < B >
+{
+ C (const S & __e1, const B & __e2):A < B > (__e1, __e2)
+ {
+ }
+};
+
+struct D
+{
+ D (const C & __c):c (__c)
+ {
+ }
+ const C c;
+};
+
+int
+main ()
+{
+ S s;
+ B b (s);
+ C c (s, b);
+ D d (c);
+ return d.c.m2.m2.p[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46154.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46154.C
new file mode 100644
index 000000000..424b1fad8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46154.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fipa-cp-clone" } */
+
+struct S
+{
+ virtual int foo ()
+ {
+ return foo () == 0;
+ }
+ virtual void baz ();
+};
+
+void A ()
+{
+ S s;
+ s.foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46287.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46287.C
new file mode 100644
index 000000000..fd201c48d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46287.C
@@ -0,0 +1,66 @@
+// Check that indirect calls to thunks do not lead to errors.
+// { dg-do run }
+
+extern "C" void abort ();
+
+class A
+{
+public:
+ virtual void foo () {abort();}
+};
+
+class B : public A
+{
+public:
+ int z;
+ virtual void foo () {abort();}
+};
+
+class C : public A
+{
+public:
+ void *a[32];
+ unsigned long b;
+ long c[32];
+
+ virtual void foo () {abort();}
+};
+
+class D : public C, public B
+{
+public:
+ D () : C(), B()
+ {
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ a[i] = (void *) 0;
+ c[i] = 0;
+ }
+ b = 0xaaaa;
+ }
+
+ virtual void foo ();
+};
+
+void D::foo()
+{
+ if (b != 0xaaaa)
+ abort();
+}
+
+static inline void bar (B &b)
+{
+
+ b.foo ();
+}
+
+int main()
+{
+ int i;
+ D d;
+
+ for (i = 0; i < 5000; i++)
+ bar (d);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46364.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46364.C
new file mode 100644
index 000000000..8098991ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46364.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+#include <string>
+
+void a() throw (int);
+void b(std::string const &);
+
+void c(std::string *e)
+{
+ b("");
+
+ try {
+ a();
+ } catch (...) {
+ *e = "";
+ }
+}
+
+void d() {
+ c(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46367.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46367.C
new file mode 100644
index 000000000..260b5c113
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46367.C
@@ -0,0 +1,11 @@
+#pragma interface
+struct S
+{
+ S *s;
+ ~S ()
+ {
+ delete s;
+ }
+};
+
+S s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46383.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46383.C
new file mode 100644
index 000000000..2b610394b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46383.C
@@ -0,0 +1,252 @@
+// { dg-do compile }
+
+namespace std {
+template<class,class>struct pair{};
+ template<typename _Tp> struct _Vector_base {
+ struct _Vector_impl
+ {
+ _Tp* _M_start;
+ _Tp* _M_finish;
+ _Tp* _M_end_of_storage;
+ };
+ _Vector_impl _M_impl;
+ };
+ template<typename _Tp >
+ struct vector : _Vector_base<_Tp>
+ {
+ vector(const vector& __x);
+ };
+}
+namespace boost {
+struct G{};
+template <class T, class U >
+struct modable2
+: G
+{ };
+}
+namespace CGAL {
+struct Rep { };
+struct Handle
+{
+ Handle() ;
+ Handle(const Handle& x) ;
+ Rep* PTR;
+};
+template <typename ET_> class Lazy_exact_nt
+ : Handle
+ , boost::modable2< Lazy_exact_nt<ET_>, int >
+ , boost::modable2< Lazy_exact_nt<ET_>, double >
+{ };
+ struct CC_iterator { };
+struct Triangulation_data_structure_3 {
+ typedef CC_iterator Vertex_handle;
+ typedef CC_iterator Cell_handle;
+ typedef std::pair<Cell_handle, int> Facet;
+};
+template < class GT, class Tds_ > struct Triangulation_3 {
+ typedef Tds_ Tds;
+ typedef typename GT::Point_3 Point;
+ typedef typename Tds::Facet Facet;
+ typedef typename Tds::Vertex_handle Vertex_handle;
+ enum Locate_type { VERTEX=0, EDGE, FACET, CELL, OUTSIDE_CONVEX_HULL, OUTSIDE_AFFINE_HULL };
+ Tds _tds;
+ bool is_infinite(const Facet & f) const ;
+};
+template < class Gt, class Tds_ > struct Delaunay_triangulation_3 : public Triangulation_3<Gt, Tds_> { };
+ namespace Surface_mesher { enum Verbose_flag { VERBOSE, NOT_VERBOSE }; }
+enum Mesher_level_conflict_status { NO_CONFLICT = 0, CONFLICT_BUT_ELEMENT_CAN_BE_RECONSIDERED, CONFLICT_AND_ELEMENT_SHOULD_BE_DROPPED };
+struct Null_mesher_level {
+ template <typename P, typename Z> Mesher_level_conflict_status test_point_conflict_from_superior(P, Z) ;
+};
+template < class Tr, class Derived, class Element, class Previous, class Triangulation_traits > struct Mesher_level {
+ typedef Tr Triangulation;
+ typedef typename Triangulation::Point Point;
+ typedef typename Triangulation::Vertex_handle Vertex_handle;
+ typedef typename Triangulation_traits::Zone Zone;
+ typedef Previous Previous_level;
+ Derived& derived() { return static_cast<Derived&>(*this); }
+ Previous& previous_level;
+ Mesher_level(Previous_level& previous)
+ : previous_level(previous)
+ { }
+ Vertex_handle insert(Point p, Zone& z) ;
+ Zone conflicts_zone(const Point& p, Element e) ;
+ Element get_next_element() ;
+ template <class Mesh_visitor> void before_insertion(Element& e, const Point& p, Zone& zone, Mesh_visitor visitor) {
+ visitor.before_insertion(e, p, zone);
+ }
+ template <class Mesh_visitor> void after_insertion(Vertex_handle vh, Mesh_visitor visitor) {
+ derived().after_insertion_impl(vh);
+ }
+ template <class Mesh_visitor> void after_no_insertion(const Element& e, const Point& p, Zone& zone, Mesh_visitor visitor) {
+ visitor.after_no_insertion(e, p, zone);
+ }
+ template <class Mesh_visitor> void refine(Mesh_visitor visitor)
+ {
+ Element e = get_next_element();
+ const Mesher_level_conflict_status result = try_to_refine_element(e, visitor);
+ }
+ template <class Mesh_visitor> Mesher_level_conflict_status try_to_refine_element(Element e, Mesh_visitor visitor)
+ {
+ Point p ;
+ Zone zone = conflicts_zone(p, e);
+ const Mesher_level_conflict_status result = test_point_conflict(p, zone);
+ before_insertion(e, p, zone, visitor);
+ Vertex_handle v = insert(p, zone);
+ after_insertion(v, visitor);
+ after_no_insertion(e, p, zone, visitor);
+ }
+ Mesher_level_conflict_status test_point_conflict(const Point& p, Zone& zone)
+ {
+ return previous_level.test_point_conflict_from_superior(p, zone);
+ }
+};
+struct Null_mesh_visitor {
+ template <typename E, typename P, typename Z> void before_insertion(E, P, Z) const {}
+ template <typename E, typename P, typename Z> void after_no_insertion(E, P, Z) const {}
+};
+template <class Tr> struct Triangulation_ref_impl {
+ Triangulation_ref_impl(Tr& t);
+};
+template <typename Tr> struct Triangulation_mesher_level_traits_3
+: public Triangulation_ref_impl<Tr>
+{
+ typedef typename Tr::Facet Facet;
+ Triangulation_mesher_level_traits_3(Tr& t)
+ : Triangulation_ref_impl<Tr>(t)
+ { }
+ struct Zone {
+ typedef std::vector<int*> Cells;
+ typedef std::vector<Facet> Facets;
+ typedef typename Tr::Locate_type Locate_type;
+ Locate_type locate_type;
+ Cells cells;
+ Facets boundary_facets;
+ Facets internal_facets;
+ };
+};
+ namespace Surface_mesher {
+ namespace details {
+ template <typename Base> struct Triangulation_generator {
+ typedef typename Base::Complex_2_in_triangulation_3 C2T3;
+ typedef typename C2T3::Triangulation Triangulation;
+ typedef Triangulation Type;
+ typedef Type type;
+ };
+ template <typename Base> struct Facet_generator {
+ typedef typename Triangulation_generator<Base>::type Tr;
+ typedef typename Tr::Facet Type;
+ typedef Type type;
+ };
+ template <typename Base, typename Self, typename Element, typename PreviousLevel = Null_mesher_level> struct Mesher_level_generator {
+ typedef typename Base::Complex_2_in_triangulation_3 C2T3;
+ typedef typename C2T3::Triangulation Triangulation;
+ typedef Triangulation_mesher_level_traits_3<Triangulation> Tr_m_l_traits_3;
+ typedef Mesher_level <Triangulation, Self, Element, PreviousLevel, Tr_m_l_traits_3> Type;
+ };
+ }
+ template < class C2T3, class Surface_, class SurfaceMeshTraits, class Criteria_ > struct Surface_mesher_base
+ : public Triangulation_mesher_level_traits_3<typename C2T3::Triangulation>
+ {
+ typedef C2T3 Complex_2_in_triangulation_3;
+ typedef Surface_ Surface;
+ typedef SurfaceMeshTraits Surface_mesh_traits;
+ typedef Criteria_ Criteria;
+ typedef typename C2T3::Triangulation Tr;
+ typedef typename Tr::Vertex_handle Vertex_handle;
+ typedef typename Tr::Facet Facet;
+ Surface_mesher_base (C2T3& co, const Surface& s, const Surface_mesh_traits& mesh_traits, const Criteria& c)
+: Triangulation_mesher_level_traits_3<Tr>(co.triangulation()), c2t3(co), tr(co.triangulation()), surf(s), meshtraits(mesh_traits), criteria(c)
+ { }
+ C2T3& c2t3;
+ Tr& tr;
+ const Surface& surf;
+ const Surface_mesh_traits& meshtraits;
+ const Criteria& criteria;
+ void after_insertion_impl(const Vertex_handle& v) {
+ after_insertion_handle_opposite_facet (Facet ());
+ after_insertion_handle_incident_facet (Facet ());
+ }
+ void after_insertion_handle_incident_facet (const Facet& f) {
+ tr.is_infinite(f) ;
+ new_facet<false>(f);
+ }
+ template <bool remove_from_complex_if_not_in_restricted_Delaunay> void new_facet (const Facet& f) ;
+ void after_insertion_handle_opposite_facet (const Facet& f) {
+ after_insertion_handle_incident_facet (f);
+ }
+ };
+ template < typename Base, typename Element = typename details::Facet_generator<Base>::type, typename PreviousLevel = Null_mesher_level, Verbose_flag verbose = NOT_VERBOSE > struct Surface_mesher
+ : public Base , public details::Mesher_level_generator< Base, Surface_mesher<Base, Element, PreviousLevel, verbose>, Element, PreviousLevel >::Type
+ {
+ typedef typename Base::Complex_2_in_triangulation_3 C2T3;
+ typedef typename Base::Surface Surface;
+ typedef typename Base::Criteria Criteria;
+ typedef typename Base::Surface_mesh_traits Surface_mesh_traits;
+ typedef typename details::Mesher_level_generator< Base, Surface_mesher<Base, Element, PreviousLevel, verbose>, Element, PreviousLevel >::Type Mesher_lvl;
+ using Mesher_lvl::refine;
+ Null_mesher_level null_mesher_level;
+ Null_mesh_visitor null_visitor;
+ bool initialized;
+ Surface_mesher(C2T3& c2t3, const Surface& surface, const Surface_mesh_traits& mesh_traits, const Criteria& criteria)
+ : Base(c2t3, surface, mesh_traits, criteria), Mesher_lvl(null_mesher_level), initialized(false)
+ { }
+ void refine_mesh () {
+ refine(null_visitor);
+ }
+ };
+ }
+template <typename Surface> struct Surface_mesh_traits_generator_3 {
+ typedef typename Surface::Surface_mesher_traits_3 Type;
+ typedef Type type;
+};
+template < class Tr, typename Edge_info_ = void > struct Complex_2_in_triangulation_3 {
+ typedef Tr Triangulation;
+ Triangulation& triangulation();
+};
+template <class Tr> struct Surface_mesh_complex_2_in_triangulation_3
+: public Complex_2_in_triangulation_3<Tr>
+{ };
+ struct Non_manifold_tag {};
+ template < typename C2T3, typename SurfaceMeshTraits_3, typename Criteria, typename Tag > struct Make_surface_mesh_helper {
+ typedef Surface_mesher::Surface_mesher_base< C2T3, typename SurfaceMeshTraits_3::Surface_3, SurfaceMeshTraits_3, Criteria> Mesher_base;
+ };
+ template <typename C2T3, typename SurfaceMeshTraits_3, typename Criteria, typename Tag, Surface_mesher::Verbose_flag verbosity = Surface_mesher::NOT_VERBOSE > struct Surface_mesher_generator {
+ typedef typename Make_surface_mesh_helper< C2T3, SurfaceMeshTraits_3, Criteria, Tag>::Mesher_base Mesher_base;
+ typedef Surface_mesher::Surface_mesher< Mesher_base, typename Surface_mesher::details::Facet_generator<Mesher_base>::type, Null_mesher_level, verbosity> Mesher;
+ typedef Mesher type;
+ };
+template <typename C2T3, typename SurfaceMeshTraits_3, typename Criteria> void make_surface_mesh(C2T3& c2t3, const typename SurfaceMeshTraits_3::Surface_3& surface, const SurfaceMeshTraits_3& surface_mesh_traits, const Criteria& criteria) {
+ typedef typename Surface_mesher_generator< C2T3, SurfaceMeshTraits_3, Criteria, Non_manifold_tag, Surface_mesher::NOT_VERBOSE >::type Mesher;
+ Mesher mesher(c2t3, surface, surface_mesh_traits, criteria);
+ mesher.refine_mesh();
+}
+template <class Kernel> struct Surface_mesh_triangulation_generator_3 {
+ typedef CGAL::Triangulation_data_structure_3 Tds;
+ typedef CGAL::Delaunay_triangulation_3<Kernel, Tds> Type;
+};
+ namespace Surface_mesher {
+ namespace { struct Return_min { }; }
+ template < class GT, class Surface, class Unused = Return_min > struct Implicit_surface_oracle_3 {
+ typedef Surface Surface_3;
+ };
+ }
+ template< typename GT> struct Implicit_surface_3 {
+ typedef GT Geom_traits;
+ typedef Implicit_surface_3<Geom_traits > Self;
+ typedef Surface_mesher::Implicit_surface_oracle_3< Geom_traits, Self> Surface_mesher_traits_3;
+ };
+}
+struct K {
+struct Point_3 {
+CGAL::Lazy_exact_nt<double> a[3];
+};
+};
+typedef CGAL::Surface_mesh_triangulation_generator_3<K>::Type Tr;
+typedef CGAL::Surface_mesh_complex_2_in_triangulation_3<Tr> C2T3;
+typedef CGAL::Implicit_surface_3<K > Surface;
+typedef CGAL::Surface_mesh_traits_generator_3<Surface>::type Traits;
+void f() {
+ C2T3 c2t3 ;
+ CGAL::make_surface_mesh(c2t3, Surface(), Traits(), 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46469.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46469.C
new file mode 100644
index 000000000..8212ea4f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr46469.C
@@ -0,0 +1,13 @@
+extern "C" __inline __attribute__ ((__gnu_inline__)) int pthread_equal ()
+ {
+ }
+
+static
+ __typeof
+ (pthread_equal)
+ __gthrw_pthread_equal __attribute__ ((__weakref__ ("pthread_equal")));
+
+int identifierByPthreadHandle ()
+{
+ pthread_equal ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47290.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47290.C
new file mode 100644
index 000000000..b739de5b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47290.C
@@ -0,0 +1,19 @@
+// PR tree-optimization/47290
+// { dg-do compile }
+
+struct V
+{
+ V (int = 0);
+ ~V ()
+ {
+ for (;;)
+ ;
+ }
+ int size ();
+};
+
+struct S
+{
+ V a, b;
+ S () : b (a.size ()) {}
+} s;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47313.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47313.C
new file mode 100644
index 000000000..c10f558a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47313.C
@@ -0,0 +1,53 @@
+// { dg-do compile }
+
+namespace internal {
+ template < class DSC, bool Const > struct CC_iterator {
+ typedef CC_iterator iterator;
+ typedef typename DSC::value_type value_type;
+ typedef const value_type* pointer;
+ CC_iterator () ;
+ CC_iterator (const iterator &it) {
+ }
+ pointer p;
+ pointer operator->() const ;
+ };
+}
+template < class T > struct Compact_container {
+ typedef Compact_container <T> Self;
+ typedef T value_type;
+ typedef internal::CC_iterator<Self, false> iterator;
+};
+template < typename TDS = void > struct Periodic_3_triangulation_ds_cell_base_3 {
+ typedef typename TDS::Vertex_handle Vertex_handle;
+ const Vertex_handle& vertex(int i) const {
+ }
+};
+struct Triangulation_data_structure_3 {
+ typedef Triangulation_data_structure_3 Tds;
+ typedef Periodic_3_triangulation_ds_cell_base_3<Tds> Cell;
+ typedef Compact_container<Cell> Cell_range;
+ typedef Compact_container<int> Vertex_range;
+ typedef typename Cell_range::iterator Cell_handle;
+ typedef typename Vertex_range::iterator Vertex_handle;
+};
+typedef Triangulation_data_structure_3 TDS1;
+template < class > struct Periodic_3_Delaunay_triangulation_3 {
+ typedef TDS1::Vertex_handle Vertex_handle;
+ typedef TDS1::Cell_handle Cell_handle;
+ int compare_distance() const {
+ }
+ Vertex_handle nearest_vertex() const;
+};
+template < class Tds > typename Periodic_3_Delaunay_triangulation_3<Tds>::Vertex_handle Periodic_3_Delaunay_triangulation_3<Tds>::nearest_vertex() const {
+ Cell_handle c ;
+ Vertex_handle nearest = c->vertex(0);
+ nearest = (compare_distance() == -1) ? nearest : c->vertex(0);
+ return nearest;
+}
+typedef Periodic_3_Delaunay_triangulation_3<TDS1> PDT1;
+struct Periodic_3_triangulation_hierarchy_3 : PDT1 {
+ Vertex_handle nearest_vertex() const;
+};
+Periodic_3_triangulation_hierarchy_3::Vertex_handle Periodic_3_triangulation_hierarchy_3:: nearest_vertex() const {
+ return PDT1::nearest_vertex();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47382.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47382.C
new file mode 100644
index 000000000..a12dbe3fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47382.C
@@ -0,0 +1,30 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct A
+{
+ inline ~A ();
+ virtual void foo () {}
+};
+
+struct B : A
+{
+ virtual void foo () { abort(); }
+};
+
+static inline void middleman (A *a)
+{
+ a->foo ();
+}
+
+inline A::~A ()
+{
+ middleman (this);
+}
+
+int main ()
+{
+ B b;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47541.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47541.C
new file mode 100644
index 000000000..350a05192
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47541.C
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+
+struct Dummy {};
+struct RefCount : public Dummy {
+ ~RefCount(); /* Has to be non-pod. */
+ int *a;
+ int *b;
+};
+RefCount::~RefCount(){}
+struct Wrapper : public Dummy { RefCount ref; };
+void __attribute__((noinline,noclone))
+Push(Wrapper ptr)
+{
+ *ptr.ref.b = 0;
+}
+extern "C" void abort (void);
+int main()
+{
+ int a = 1, b = 1;
+ Wrapper x;
+ x.ref.a = &a;
+ x.ref.b = &b;
+ Push(x);
+ if (b != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47559.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47559.C
new file mode 100644
index 000000000..00731c3ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47559.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fnon-call-exceptions" }
+
+void foo (int *k) noexcept
+{
+ for (;;)
+ *k = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47714.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47714.C
new file mode 100644
index 000000000..4ff2eeef0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr47714.C
@@ -0,0 +1,16 @@
+struct A { virtual ~A () {} };
+struct B { virtual ~B () {} };
+struct C { virtual const A *foo (int) const = 0; };
+struct E : public B, public A { };
+struct F : public C
+{
+ virtual const E *foo (int) const;
+};
+void bar (int &);
+
+const E *
+F::foo (int x) const
+{
+ bar (x);
+ return __null;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48165.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48165.C
new file mode 100644
index 000000000..a42893f60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48165.C
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+
+typedef __SIZE_TYPE__ size_t;
+
+extern "C" {
+ extern __inline __attribute__ ((__always_inline__))
+ __attribute__ ((__gnu_inline__, __artificial__)) void *
+ memcpy (void *__restrict __dest, __const void *__restrict __src,
+ size_t __len) throw ()
+ {
+ return __builtin___memcpy_chk (__dest, __src, __len,
+ __builtin_object_size (__dest, 0));
+ }
+}
+
+typedef char TCODE[20];
+typedef TCODE TCODE_ARRAY[5];
+typedef struct PARAM
+{
+ TCODE_ARRAY tcode;
+} PARAM;
+
+static void foo (void* p)
+{
+ char buffer[4+sizeof(PARAM)];
+ PARAM *param = (PARAM *)(buffer + 4);
+ int i;
+
+ for (i=0; i < 5; i++)
+ {
+ memcpy( param->tcode[i], p, 20 );
+ }
+}
+
+void bar (void* p)
+{
+ foo (p);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48271.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48271.C
new file mode 100644
index 000000000..5b60ccd76
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48271.C
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-ftree-vrp -fno-guess-branch-probability -fnon-call-exceptions" }
+
+void *xalloc ();
+void xfree (void *);
+void error ();
+
+static inline void *
+MallocT ()
+{
+ void *p = xalloc ();
+ if (!p)
+ error ();
+ return p;
+}
+
+
+struct ByteBlob
+{
+ int *header;
+
+ ByteBlob();
+
+ ~ByteBlob ()
+ {
+ Free ();
+ }
+
+ int RawFree (int * p)
+ {
+ if (!p)
+ error ();
+ xfree (p);
+ }
+
+ int *LengthRef ();
+
+ void Free ()
+ {
+ if (*header)
+ RawFree (header);
+ }
+
+ int Append (int num_ints)
+ {
+ if (*header)
+ MallocT ();
+ *LengthRef () += num_ints;
+ }
+};
+
+struct CBlobT:ByteBlob
+{
+ ~CBlobT ()
+ {
+ Free ();
+ }
+};
+
+template < class T > struct FixedSizeArray
+{
+ int HeaderSize;
+ T *data;
+ FixedSizeArray ();
+ int RefCnt ()
+ {
+ return *(int *) MallocT ();
+ }
+ ~FixedSizeArray ()
+ {
+ if (RefCnt ())
+ for (T * pItem = data + Length (); pItem != data; pItem--)
+ T ();
+ }
+ int Length ();
+};
+
+class SmallArray
+{
+ typedef FixedSizeArray < int > SubArray;
+ typedef FixedSizeArray < SubArray > SuperArray;
+ SuperArray data;
+};
+
+struct CHashTableT
+{
+ int *m_slots;
+ ~CHashTableT ()
+ {
+ delete m_slots;
+ }
+};
+
+struct CYapfBaseT
+{
+ int *PfGetSettings ();
+ SmallArray m_arr;
+ CHashTableT m_closed;
+ CYapfBaseT ()
+ {
+ MallocT ();
+ }
+};
+
+struct CYapfCostRailT:CYapfBaseT
+{
+ CBlobT m_sig_look_ahead_costs;
+ CYapfCostRailT ()
+ {
+ m_sig_look_ahead_costs.Append (*Yapf ()->PfGetSettings ());
+ Yapf ()->PfGetSettings ();
+ }
+ CYapfBaseT *Yapf ();
+};
+
+void stCheckReverseTrain ()
+{
+ CYapfCostRailT pf1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48600.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48600.C
new file mode 100644
index 000000000..b60a0a011
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48600.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+class mx {
+public:
+ mx();
+};
+
+int main()
+{
+ while (true) {
+ mx *bar = new mx;
+ mx *baz = new mx;
+ continue;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48661.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48661.C
new file mode 100644
index 000000000..8de2142f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48661.C
@@ -0,0 +1,77 @@
+// PR middle-end/48661
+// { dg-do run }
+
+extern "C" void abort ();
+
+__attribute__((noinline))
+double
+foo (double x, double y)
+{
+ asm volatile ("" : : : "memory");
+ return x + y;
+}
+
+__attribute__((noinline, noclone))
+void
+bar (int x)
+{
+ if (x != 123)
+ abort ();
+}
+
+struct A
+{
+ double a1, a2;
+};
+
+struct B
+{
+ virtual int m () const = 0 ;
+};
+
+struct C
+{
+ virtual ~C () {}
+};
+
+struct D : virtual public B, public C
+{
+ explicit D (const A &x) : d(123) { foo (x.a2, x.a1); }
+ int m () const { return d; }
+ int d;
+};
+
+struct E
+{
+ E () : d(0) {}
+ virtual void n (const B &x) { d = x.m (); x.m (); x.m (); }
+ int d;
+};
+
+void
+test ()
+{
+ A a;
+ a.a1 = 0;
+ a.a2 = 1;
+ E p;
+ D q (a);
+ const B &b = q;
+ bar (b.m ());
+ p.n (b);
+ bar (p.d);
+}
+
+void
+baz ()
+{
+ A a;
+ D p2 (a);
+}
+
+int
+main ()
+{
+ test ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48695.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48695.C
new file mode 100644
index 000000000..44e6c771d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48695.C
@@ -0,0 +1,38 @@
+// { dg-do run }
+
+typedef __SIZE_TYPE__ size_t;
+
+inline void *operator new (size_t, void *__p) throw() { return __p; }
+
+struct _Vector_impl
+{
+ int *_M_start;
+ int *_M_finish;
+ _Vector_impl () :_M_start (0), _M_finish (0) {}
+};
+
+struct vector
+{
+ _Vector_impl _M_impl;
+ int *_M_allocate (size_t __n)
+ {
+ return __n != 0 ? new int[__n] : 0;
+ }
+ void push_back ()
+ {
+ new (this->_M_impl._M_finish) int ();
+ this->_M_impl._M_finish =
+ this->_M_allocate (this->_M_impl._M_finish - this->_M_impl._M_start) + 1;
+ }
+};
+
+int
+main ()
+{
+ for (int i = 0; i <= 1; i++)
+ for (int j = 0; j <= 1; j++)
+ {
+ vector a[2];
+ a[i].push_back ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48954.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48954.C
new file mode 100644
index 000000000..bdd120004
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr48954.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -flto -fno-early-inlining -fkeep-inline-functions" } */
+/* { dg-require-effective-target lto } */
+
+struct A
+{
+ virtual void foo () = 0;
+};
+
+struct B : A {};
+struct C : A {};
+
+struct D: C, B
+{
+ void foo () {}
+};
+
+static inline void
+bar (B *b)
+{
+ b->foo ();
+}
+
+int
+main ()
+{
+ D d;
+ for (;;)
+ bar (&d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49039.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49039.C
new file mode 100644
index 000000000..f576cba42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49039.C
@@ -0,0 +1,76 @@
+// PR tree-optimization/49039
+// { dg-do run }
+
+template <class T1, class T2>
+struct pair
+{
+ T1 first;
+ T2 second;
+ pair (const T1 & a, const T2 & b):first (a), second (b) {}
+};
+
+template <class T1, class T2>
+inline pair <T1, T2>
+make_pair (T1 x, T2 y)
+{
+ return pair <T1, T2> (x, y);
+}
+
+typedef __SIZE_TYPE__ size_t;
+struct S
+{
+ const char *Data;
+ size_t Length;
+ static size_t min (size_t a, size_t b) { return a < b ? a : b; }
+ static size_t max (size_t a, size_t b) { return a > b ? a : b; }
+ S () :Data (0), Length (0) { }
+ S (const char *Str) : Data (Str), Length (__builtin_strlen (Str)) {}
+ S (const char *data, size_t length) : Data (data), Length (length) {}
+ bool empty () const { return Length == 0; }
+ size_t size () const { return Length; }
+ S slice (size_t Start, size_t End) const
+ {
+ Start = min (Start, Length);
+ End = min (max (Start, End), Length);
+ return S (Data + Start, End - Start);
+ }
+ pair <S, S> split (char Separator) const
+ {
+ size_t Idx = find (Separator);
+ if (Idx == ~size_t (0))
+ return make_pair (*this, S ());
+ return make_pair (slice (0, Idx), slice (Idx + 1, ~size_t (0)));
+ }
+ size_t find (char C, size_t From = 0) const
+ {
+ for (size_t i = min (From, Length), e = Length; i != e; ++i)
+ if (Data[i] == C)
+ return i;
+ return ~size_t (0);
+ }
+};
+
+void
+Test (const char *arg)
+{
+ S Desc (arg);
+ while (!Desc.empty ())
+ {
+ pair <S, S> Split = Desc.split ('-');
+ S Token = Split.first;
+ Desc = Split.second;
+ if (Token.empty ())
+ continue;
+ Split = Token.split (':');
+ S Specifier = Split.first;
+ if (Specifier.empty ())
+ __builtin_abort ();
+ }
+}
+
+int
+main ()
+{
+ Test ("-");
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49115.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49115.C
new file mode 100644
index 000000000..c4cce21ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49115.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+extern "C" void abort (void);
+struct MyException {};
+struct Data {
+ int nr;
+ Data() : nr(66) {}
+};
+Data __attribute__((noinline,noclone)) getData(int i)
+{
+ if (i) throw MyException();
+ Data data;
+ data.nr = i;
+ return data;
+}
+int main(int, char **)
+{
+ Data data;
+ try {
+ data = getData(1);
+ } catch (MyException& e) {
+ if (data.nr != 66)
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49394.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49394.C
new file mode 100644
index 000000000..67d521f45
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49394.C
@@ -0,0 +1,50 @@
+// { dg-do run }
+// { dg-options "-fipa-pta -fnon-call-exceptions" }
+
+struct Mutex
+{
+ bool locked;
+ ~Mutex ()
+ {
+ if (locked)
+ throw 0;
+ }
+ void lock ()
+ {
+ locked = true;
+ }
+ void unlock ()
+ {
+ if (!locked)
+ throw 0;
+ locked = false;
+ }
+};
+
+struct lock_guard
+{
+ Mutex *m;
+ lock_guard (Mutex *m) : m(m)
+ {
+ }
+ ~lock_guard ()
+ {
+ m->unlock ();
+ }
+};
+
+int
+main ()
+{
+ Mutex m;
+ m.lock ();
+ try
+ {
+ lock_guard l (&m);
+ }
+ catch ( ...)
+ {
+ __builtin_abort ();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49519.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49519.C
new file mode 100644
index 000000000..2888709d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49519.C
@@ -0,0 +1,135 @@
+/* { dg-do run } */
+
+#include <stdlib.h>
+
+struct null_type {};
+
+inline const null_type cnull() { return null_type(); }
+
+template <class TT> struct cons;
+class tuple;
+
+template< int N >
+struct get_class {
+ template<class TT >
+ inline static int& get(cons<TT>& t)
+ {
+ return get_class<N-1>::template get(t.tail);
+ }
+};
+
+template<>
+struct get_class<0> {
+ template<class TT>
+ inline static int& get(cons<TT>& t)
+ {
+ return t.head;
+ }
+};
+
+template<int N, class T>
+struct element
+{
+private:
+ typedef typename T::tail_type Next;
+public:
+ typedef typename element<N-1, Next>::type type;
+};
+
+template<class T>
+struct element<0,T>
+{
+ typedef int type;
+};
+
+template<int N, class TT>
+inline int& get(cons<TT>& c) {
+ return get_class<N>::template get(c);
+}
+
+template <class TT>
+struct cons {
+ typedef TT tail_type;
+
+ int head;
+ tail_type tail;
+
+ cons() : head(), tail() {}
+
+ template <class T1, class T2, class T3, class T4>
+ cons( T1& t1, T2& t2, T3& t3, T4& t4 )
+ : head (t1),
+ tail (t2, t3, t4, cnull())
+ {}
+};
+
+template <>
+struct cons<null_type> {
+ typedef null_type tail_type;
+
+ int head;
+
+ cons() : head() {}
+
+ template<class T1>
+ cons(T1& t1, const null_type&, const null_type&, const null_type&)
+ : head (t1) {}
+};
+
+template <class T0, class T1, class T2, class T3>
+struct map_tuple_to_cons
+{
+ typedef cons<typename map_tuple_to_cons<T1, T2, T3, null_type>::type> type;
+};
+
+template <>
+struct map_tuple_to_cons<null_type, null_type, null_type, null_type>
+{
+ typedef null_type type;
+};
+
+class tuple :
+ public map_tuple_to_cons<int, int, int, int>::type
+{
+public:
+ typedef typename
+ map_tuple_to_cons<int, int, int, int>::type inherited;
+
+ tuple(const int &t0,
+ const int &t1,
+ const int &t2,
+ const int &t3)
+ : inherited(t0, t1, t2, t3) {}
+};
+
+void foo(void (*boo)(int, int, int, int), tuple t)
+{
+ boo(get<0>(t), get<1>(t), get<2>(t), get<3>(t));
+}
+
+int tailcalled_t1;
+int tailcalled_t2;
+int tailcalled_t3;
+int tailcalled_t4;
+
+void print(int t1, int t2, int t3, int t4)
+{
+ tailcalled_t1 = t1;
+ tailcalled_t2 = t2;
+ tailcalled_t3 = t3;
+ tailcalled_t4 = t4;
+}
+
+int main ()
+{
+ tuple t(1,2,3,4);
+ foo(print, t);
+
+ if( (get<0>(t) != tailcalled_t1)
+ ||(get<1>(t) != tailcalled_t2)
+ ||(get<2>(t) != tailcalled_t3)
+ ||(get<3>(t) != tailcalled_t4))
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49615.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49615.C
new file mode 100644
index 000000000..98a2f95b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49615.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+template <class T>
+static inline bool Dispatch (T* obj, void (T::*func) ())
+{
+ (obj->*func) ();
+}
+class C
+{
+ bool f (int);
+ void g ();
+};
+bool C::f (int n)
+{
+ bool b;
+ switch (n)
+ {
+ case 0:
+ b = Dispatch (this, &C::g);
+ case 1:
+ b = Dispatch (this, &C::g);
+ }
+}
+void C::g ()
+{
+ for (;;) { }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49628.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49628.C
new file mode 100644
index 000000000..4bc6543a3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49628.C
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#include <vector>
+
+template <int rank, int dim> class Tensor;
+template <int dim> class Tensor<1,dim> {
+public:
+ explicit Tensor (const bool initialize = true);
+ Tensor (const Tensor<1,dim> &);
+ Tensor<1,dim> & operator = (const Tensor<1,dim> &);
+ double values[(dim!=0) ? (dim) : 1];
+};
+template <int dim>
+inline Tensor<1,dim> & Tensor<1,dim>::operator = (const Tensor<1,dim> &p)
+{
+ for (unsigned int i=0; i<dim; ++i)
+ values[i] = p.values[i];
+};
+template <int dim> class Quadrature {
+public:
+ const unsigned int n_quadrature_points;
+};
+class MappingQ1
+{
+ class InternalData {
+ public:
+ std::vector<Tensor<1,3> > shape_derivatives;
+ unsigned int n_shape_functions;
+ };
+ void compute_data (const Quadrature<3> &quadrature, InternalData &data)
+ const;
+};
+void MappingQ1::compute_data (const Quadrature<3> &q, InternalData &data) const
+{
+ const unsigned int n_q_points = q.n_quadrature_points;
+ data.shape_derivatives.resize(data.n_shape_functions * n_q_points);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49644.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49644.C
new file mode 100644
index 000000000..5fb82e017
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49644.C
@@ -0,0 +1,17 @@
+// PR c/49644
+// { dg-do run }
+
+extern "C" void abort ();
+
+int
+main ()
+{
+ _Complex double a[12], *c = a, s = 3.0 + 1.0i;
+ double b[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *d = b;
+ int i;
+ for (i = 0; i < 6; i++)
+ *c++ = *d++ * s;
+ if (c != a + 6 || d != b + 6)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49720.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49720.C
new file mode 100644
index 000000000..d2c69087d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49720.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+__extension__ typedef __PTRDIFF_TYPE__ pdiff_t;
+
+extern char t_start[], t_end[], t_size[];
+bool foo (void)
+{
+ pdiff_t size = reinterpret_cast<pdiff_t>(t_size);
+ return (size == t_end - t_start);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49770.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49770.C
new file mode 100644
index 000000000..8180648cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49770.C
@@ -0,0 +1,86 @@
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-fno-tree-forwprop" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+template < typename > struct remove_reference;
+template < typename _Tp > struct remove_reference <_Tp & >
+{
+ typedef _Tp type;
+};
+template < typename _Tp > typename remove_reference < _Tp >::type &&
+move (_Tp && __t)
+{
+ return static_cast < typename remove_reference < _Tp >::type && >(__t);
+}
+
+template < typename _Tp > void
+stdswap (_Tp & __a, _Tp & __b)
+{
+ _Tp __tmp (__a);
+ __a = (__b);
+ __b = (__tmp);
+}
+
+struct _Deque_iterator
+{
+ int *_M_cur;
+ int *_M_first;
+ int *_M_last;
+ int **_M_node;
+};
+
+static inline int operatorMIN (_Deque_iterator & __x, _Deque_iterator & __y)
+{
+ return sizeof (int) * (__x._M_node - __y._M_node - 1)
+ + (__x._M_cur - __x._M_first) + (__y._M_last - __y._M_cur);
+}
+
+struct deque
+{
+ deque & operator = (deque && __x)
+ {
+ stdswap (_M_finish, __x._M_finish);
+ return *this;
+ }
+ size_t size ()
+ {
+ return operatorMIN (_M_finish, _M_start);
+ }
+
+deque ():
+ _M_map (), _M_map_size (), _M_start (), _M_finish ()
+ {
+ _M_start._M_last = _M_start._M_first + sizeof (int);
+ }
+
+ int **_M_map;
+ size_t _M_map_size;
+ _Deque_iterator _M_start;
+ _Deque_iterator _M_finish;
+};
+
+struct queue
+{
+ deque c;
+ size_t size ()
+ {
+ return c.size ();
+ }
+};
+
+void
+test01 ()
+{
+ queue a, b;
+ ++a.c._M_finish._M_cur;
+ b = move (a);
+ if (!b.size ())
+ __builtin_abort ();
+}
+
+main ()
+{
+ test01 ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49938.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49938.C
new file mode 100644
index 000000000..91804f4b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr49938.C
@@ -0,0 +1,48 @@
+#include <vector>
+#include <cstdlib>
+typedef unsigned short uint16;
+
+namespace base {
+ class StringPiece
+ {
+ public:
+ typedef std::size_t size_type;
+ size_type size() const { return length_; }
+ size_type length_;
+ };
+}
+
+namespace net {
+ class DNSSECKeySet
+ {
+ bool CheckSignature (const base::StringPiece& name, const
+ base::StringPiece& zone, const
+ base::StringPiece& signature, uint16 rrtype,
+ const std::vector<base::StringPiece>& rrdatas);
+ };
+}
+
+template <class C> class scoped_array
+{
+public: typedef C element_type;
+ explicit scoped_array(C* p = __null):array_(p) {}
+private: C* array_;
+};
+
+namespace net {
+ bool DNSSECKeySet::CheckSignature (const base::StringPiece& name,
+ const base::StringPiece& zone, const base::StringPiece& signature,
+ uint16 rrtype, const std::vector<base::StringPiece>& rrdatas)
+ {
+ unsigned signed_data_len = 0;
+ for (std::vector<base::StringPiece>::const_iterator i =
+ rrdatas.begin();
+ i != rrdatas.end(); i++) {
+ signed_data_len += 2;
+ signed_data_len += i->size();
+ }
+ scoped_array<unsigned char> signed_data(new unsigned
+ char[signed_data_len]);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50189.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50189.C
new file mode 100644
index 000000000..06f1d3695
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50189.C
@@ -0,0 +1,121 @@
+// { dg-do run }
+// { dg-options "-fstrict-enums" }
+
+extern "C" void abort (void);
+class CCUTILS_KeyedScalarLevelPosition
+{
+public:
+
+ typedef enum
+ {
+ UNINITED = 0,
+ AT_BEGIN = 1,
+ AT_END = 2,
+ AT_KEY = 3
+
+ } position_t;
+
+ bool is_init() const
+ { return(m_timestamp != UNINITED); }
+
+ bool is_at_begin() const
+ { return(m_timestamp == AT_BEGIN); }
+
+ position_t get_state() const
+ {
+ return((m_timestamp >= AT_KEY)
+ ? AT_KEY
+ : ((position_t)m_timestamp));
+ }
+
+ void set_at_begin()
+ { m_timestamp = AT_BEGIN; }
+
+ unsigned int get_index() const
+ { return(m_index); }
+
+ void set_pos(unsigned int a_index, unsigned int a_timestmap)
+ {
+ m_index = a_index;
+ m_timestamp = a_timestmap;
+ }
+
+ bool check_pos(unsigned int a_num_entries, unsigned int a_timestamp) const
+ {
+ if (get_state() != AT_KEY)
+ return(false);
+
+ if (m_timestamp != a_timestamp)
+ return(false);
+
+ return(m_index < a_num_entries);
+ }
+
+ void set_not_init()
+ { m_timestamp = 0; }
+
+private:
+
+ unsigned int m_timestamp;
+ unsigned int m_index;
+
+};
+
+class CCUTILS_KeyedScalarPosition
+{
+public:
+
+ CCUTILS_KeyedScalarLevelPosition m_L1;
+ CCUTILS_KeyedScalarLevelPosition m_L2;
+};
+
+class baz
+{
+public:
+ int *n[20];
+ unsigned int m_cur_array_len;
+ unsigned int m_timestamp;
+
+ unsigned int _get_timestamp() const
+ { return(m_timestamp); }
+
+ bool _check_L1_pos(const CCUTILS_KeyedScalarPosition &a_position) const
+ {
+ return(a_position.m_L1.check_pos(
+ m_cur_array_len, _get_timestamp()));
+ }
+
+ void *next (CCUTILS_KeyedScalarPosition &);
+};
+
+void * baz::next (CCUTILS_KeyedScalarPosition &a_position)
+{
+ if (a_position.m_L1.is_at_begin() || (!a_position.m_L1.is_init()))
+ {
+ a_position.m_L1.set_pos(0, _get_timestamp());
+ a_position.m_L2.set_at_begin();
+ }
+ else if (!_check_L1_pos(a_position))
+ return(0);
+
+ return n[a_position.m_L1.get_index ()];
+}
+
+int main (int, char **)
+{
+ baz obj;
+ CCUTILS_KeyedScalarPosition a_pos;
+ void *ret;
+ int n[5];
+
+ obj.n[0] = n;
+ obj.m_cur_array_len = 1;
+ obj.m_timestamp = 42;
+
+ a_pos.m_L1.set_pos (0, 42);
+
+ ret = obj.next (a_pos);
+ if (ret == 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50672.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50672.C
new file mode 100644
index 000000000..614a35b6c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr50672.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+struct A
+{
+ bool isHint();
+};
+class B
+{
+ void makeLine( int *) const;
+ void drawLine() const; A* to() const;
+ void _print() const;
+};
+A a;
+void B::makeLine(int *p1) const
+{
+ if (a.isHint() && to()->isHint()) ;
+ else {
+ if (p1) B::drawLine(); else B::_print();
+ return;
+ }
+ if (p1) B::drawLine(); else B::_print();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51198.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51198.C
new file mode 100644
index 000000000..79819e04e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51198.C
@@ -0,0 +1,29 @@
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ int i = 0 ? 0 : throw 1;
+};
+
+
+struct B
+{
+ int f();
+ int i = f();
+};
+
+struct C
+{
+ C(int);
+};
+
+struct D
+{
+ C a = 0;
+};
+
+A a;
+B b;
+D d;
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51344.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51344.C
new file mode 100644
index 000000000..07be919c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51344.C
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { i?86-*-* && ilp32 } } } */
+class A;
+
+template <class T>
+class B
+{
+ friend __attribute__((cdecl)) A& operator >>(A& a, B& b)
+ {
+ return a;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51436.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51436.C
new file mode 100644
index 000000000..43d6c7300
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51436.C
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *memcpy (void *, __const void *, size_t);
+template < class Dest, class Source > struct BitCastHelper {
+ static Dest cast (const Source & source) __attribute__ ((always_inline)) {
+ Dest dest;
+ memcpy (0, &source, sizeof dest);
+ }
+};
+template < class Dest, class Source > Dest BitCast (Source)
+{
+ BitCastHelper < Dest, Source >::cast (0);
+}
+
+class MaybeObject
+{
+};
+class Object:MaybeObject
+{
+public:
+ static Object *cast (Object *) {
+ }
+};
+class HeapObject:public Object
+{
+};
+class String:public HeapObject
+{
+};
+class ExternalString:public String
+{
+};
+class ExternalTwoByteString:public ExternalString
+{
+};
+
+template < typename T > class Handle
+{
+public:
+ Handle () {
+ }
+ T *operator* () const;
+ template < class S > static Handle < T > cast (Handle < S > that) {
+ T::cast (*that);
+ }
+ T **location_;
+};
+
+template < typename T > T * Handle < T >::operator* () const
+{
+ *BitCast < T ** >(location_);
+}
+
+void
+TestCharacterStream ()
+{
+ Handle < String > uc16_string;
+ Handle < ExternalTwoByteString >::cast (uc16_string);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51482.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51482.C
new file mode 100644
index 000000000..28435919f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51482.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+
+typedef enum { CLASS_IN = 1, CLASS_OUT = -1 } FERGUSON_KEY_CLASS, BEZIER_KEY_CLASS;
+typedef class flag_interface { } VECT3DF_SIMPLE;
+typedef struct vect3df {
+ float x,y,z;
+} VECT3DF, VECT;
+typedef struct vect4df : public vect3df {
+ float w;
+} VECT4DF, WVECT;
+typedef class llist_item { } ANIM_KEY;
+typedef class anim_track : public flag_interface, public llist_item { } ANIM_KEY_BEZ;
+typedef class anim_track_bezier : public anim_track { } ANIM_KEY_BEZ_WVECT;
+typedef class anim_track_bez_wvect : public anim_track_bezier {
+ WVECT * tangent(int kn, BEZIER_KEY_CLASS key_class, WVECT *p_tn);
+} ANIM_TRACK_BEZ_WVECT;
+WVECT * anim_track_bez_wvect::tangent(int kn, BEZIER_KEY_CLASS key_class, WVECT *p_tn)
+{
+ float bias,continuity,tension,tn1,bp1;
+ WVECT *p_p0,*p_p1,*p_p2, t1, g1,g2,g3;
+ g1.x = (p_p1->x - p_p0->x)*bp1;
+ g1.y = (p_p1->y - p_p0->y)*bp1;
+ g1.z = (p_p1->z - p_p0->z)*bp1;
+ g1.w = (p_p1->w - p_p0->w)*bp1;
+ bp1 = (0.5f + key_class*0.5f*continuity);
+ p_tn->x = (g1.x + g3.x*bp1)*tn1;
+ p_tn->y = (g1.y + g3.y*bp1)*tn1;
+ p_tn->z = (g1.z + g3.z*bp1)*tn1;
+ p_tn->w = (g1.w + g3.w*bp1)*tn1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51600.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51600.C
new file mode 100644
index 000000000..618036077
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51600.C
@@ -0,0 +1,16 @@
+template<class T> inline T min(T a, T b) { return a < b ? a : b; }
+double cornerbound(double *P, double (*m)(double, double))
+{
+ double b=m(P[0],P[3]);
+ return m(b,P[12]);
+}
+void bound(double *P, double (*m)(double, double), double b)
+{
+ m(b,cornerbound(P,m));
+}
+void bounds(double fuzz, unsigned maxdepth)
+{
+ double Px[]={};
+ double bx=Px[0];
+ bound(Px,min,bx);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51737.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51737.C
new file mode 100644
index 000000000..ff77edbf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51737.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+template<class T> class intrusive_ptr {
+public:
+ ~intrusive_ptr() { intrusive_ptr_release( px ); }
+ T * px;
+};
+template <typename T> struct intrusive_base {
+ friend void intrusive_ptr_release(T* ptr) { delete ptr; }
+};
+struct section_info;
+struct file_info : intrusive_base<file_info> {
+ intrusive_ptr<file_info> parent;
+ intrusive_ptr<section_info> switched_section;
+};
+struct section_info : intrusive_base<section_info> {
+ intrusive_ptr<section_info> parent;
+};
+struct id_state {
+ void * start_file(void);
+};
+void * id_state::start_file(void) {
+ intrusive_ptr<file_info> parent;
+}
+struct id_generation_data : intrusive_base<id_generation_data> {
+ void child_length() const {}
+};
+void generate_id(id_generation_data& generation_data)
+{
+ generation_data.child_length();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51903.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51903.C
new file mode 100644
index 000000000..925021b7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51903.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions -fno-guess-branch-probability" }
+
+#include <vector>
+
+void foo ()
+{
+ std::vector < std::vector< int > > (20000);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51959.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51959.C
new file mode 100644
index 000000000..da0be71eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr51959.C
@@ -0,0 +1,80 @@
+// { dg-do compile }
+
+namespace std {
+ typedef __SIZE_TYPE__ size_t;
+}
+inline void* operator new(std::size_t, void* __p) throw() {
+ return __p;
+}
+template <typename T> class QTypeInfo {
+};
+enum { Q_COMPLEX_TYPE = 0, Q_PRIMITIVE_TYPE = 0x1, Q_STATIC_TYPE = 0, Q_MOVABLE_TYPE = 0x2, Q_DUMMY_TYPE = 0x4 };
+template<typename Enum> class QFlags {
+ int i;
+ inline QFlags(Enum f) : i(f) { }
+};
+class __attribute__((visibility("default"))) QSize {
+public:
+ bool isEmpty() const;
+ friend inline bool operator==(const QSize &, const QSize &);
+ int wd;
+ int ht;
+};
+template<> class QTypeInfo<QSize > {
+public:
+ enum {
+ isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isLarge = (sizeof(QSize)>sizeof(void*)), isPointer = false, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0) };
+};
+class __attribute__((visibility("default"))) QBasicAtomicInt {
+public:
+ inline bool operator!=(int value) const { }
+};
+struct __attribute__((visibility("default"))) QListData {
+ struct Data {
+ QBasicAtomicInt ref;
+ };
+ void **append();
+};
+template <typename T> class QList {
+ struct Node {
+ void *v;
+ };
+ union {
+ QListData p;
+ QListData::Data *d;
+ };
+public:
+ void append(const T &t);
+ inline void push_back(const T &t) {
+ append(t);
+ }
+ void node_construct(Node *n, const T &t);
+ void node_destruct(Node *n);
+};
+template <typename T> inline void QList<T>::node_construct(Node *n, const T &t) {
+ if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) n->v = new T(t);
+ else if (QTypeInfo<T>::isComplex) new (n) T(t);
+}
+template <typename T> inline void QList<T>::node_destruct(Node *n) {
+}
+template <typename T> void QList<T>::append(const T &t) {
+ if (d->ref != 1) {
+ try {
+ }
+ catch (...) {
+ }
+ if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
+ }
+ else {
+ Node *n, copy;
+ node_construct(&copy, t);
+ try { n = reinterpret_cast<Node *>(p.append());; }
+ catch (...) { node_destruct(&copy); throw; }
+ *n = copy;
+ }
+ }
+};
+void virtual_hook(QSize sz, QList<QSize> &arg)
+{
+ arg.push_back(sz);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52582.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52582.C
new file mode 100644
index 000000000..1b93fc490
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52582.C
@@ -0,0 +1,23 @@
+// PR c++/52582
+
+inline void *operator new (__SIZE_TYPE__, void *p) throw ()
+{
+ return p;
+}
+struct B
+{
+ virtual ~B ();
+ B ();
+};
+struct A : B
+{
+ A () : B () {}
+ virtual void bar ();
+};
+void
+foo ()
+{
+ char a[64];
+ B *b = new (&a) A ();
+ b->~B ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52638.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52638.C
new file mode 100644
index 000000000..3ac76ccc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52638.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-ftree-vectorize" }
+
+void
+bar (bool * b, bool * e, bool t)
+{
+ while (b < e)
+ *b++ = t;
+}
+
+void
+foo (bool * b, bool * e, bool t)
+{
+ bar (b, e, true);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52772.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52772.C
new file mode 100644
index 000000000..810e6579f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52772.C
@@ -0,0 +1,85 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+
+class c1;
+
+class c2 {
+ public: c2() { };
+ void *operator new(size_t size, const c1 & crc1);
+};
+
+class c3 {
+ public: c3() { _Obj = 0; }
+ ~c3() { if (_Obj) delete _Obj; }
+ void set(c2 *pObj);
+ protected: c2 *_Obj;
+};
+
+void c3::set(c2 *pObj) { _Obj = pObj; };
+
+template<class TYPE> class tc1 : public c2 {
+ public: tc1(int n=0){};
+ int get() const;
+ TYPE& operator[] (int id);
+ TYPE * _data;
+ int _size;
+};
+
+template<class TYPE> TYPE & tc1<TYPE>::operator[] (int id) {
+ return _data[id];
+}
+
+template<class TYPE> int tc1<TYPE>::get() const {
+ return _size;
+}
+
+class c4 {
+ public: c4();
+};
+
+class c5 : public c2 {
+ protected: c2 * _own;
+ public: c5(c2 *o) : _own(o) { }
+ c5(const c4 & box);
+ int add(const c4 & ext);
+};
+
+class c6 {
+ public: int get() const {};
+};
+
+class c7 {
+ friend class c8;
+ int find(c6 * loop) const;
+};
+
+class c8 {
+ const c1 & _rc1;
+ int tria(c7 * face, c5 * vtree0 = 0);
+};
+
+int c8::tria(c7 * face, c5 * vtree0) {
+ c6 *sLData[64];
+ tc1<c6*> loops(64);
+ while (loops.get() > 1) {
+ c6 *iloop = 0;
+ for (int j=1; j<loops.get(); j++) {
+ if (loops[j]->get() < 32) {
+ iloop = loops[j];
+ }
+ }
+ face->find(iloop);
+ }
+ c4 box;
+ c3 ctree;
+ c5 *vtree = vtree0;
+ if (!vtree) {
+ vtree = new (_rc1) c5(box);
+ ctree.set(vtree);
+ for (int j=0; j<1; j++) {
+ c4 sVBBox;
+ vtree->add(sVBBox);
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-1.C
new file mode 100644
index 000000000..9e7b21ba6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-1.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+class bad_alloc { };
+typedef struct {
+} __gthread_mutex_t;
+int __gthread_mutex_unlock (__gthread_mutex_t *__mutex);
+class __concurrence_unlock_error {
+};
+inline void __throw_concurrence_unlock_error() {
+ throw __concurrence_unlock_error();
+}
+class __mutex {
+ __gthread_mutex_t _M_mutex;
+public:
+ void unlock() {
+ if (__gthread_mutex_unlock(&_M_mutex) != 0)
+ __throw_concurrence_unlock_error();
+ }
+};
+class free_list {
+ typedef __mutex __mutex_type;
+ __mutex_type& _M_get_mutex();
+ void _M_get(size_t __sz) throw(bad_alloc);
+};
+void free_list::_M_get(size_t __sz) throw(bad_alloc)
+{
+ __mutex_type& __bfl_mutex = _M_get_mutex();
+ __bfl_mutex.unlock();
+ int __ctr = 2;
+ while (__ctr) {
+ size_t* __ret = 0;
+ --__ctr;
+ try {
+ __ret = (size_t*) (::operator new(__sz + sizeof(size_t)));
+ }
+ catch(const bad_alloc&) { }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-2.C
new file mode 100644
index 000000000..ba31295e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr52918-2.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+void* __cxa_allocate_exception(size_t) throw();
+typedef struct { } __gthread_mutex_t;
+extern int __gthr_win32_mutex_unlock (__gthread_mutex_t *);
+int __gthread_mutex_lock (__gthread_mutex_t *__mutex);
+int __gthread_mutex_unlock (__gthread_mutex_t *__mutex);
+void __throw_concurrence_lock_error();
+void __throw_concurrence_unlock_error();
+class __mutex {
+ __gthread_mutex_t _M_mutex;
+public:
+ void lock() {
+ if (__gthread_mutex_lock(&_M_mutex) != 0)
+ __throw_concurrence_lock_error();
+ }
+ void unlock() {
+ if (__gthread_mutex_unlock(&_M_mutex) != 0)
+ __throw_concurrence_unlock_error();
+ }
+};
+class __scoped_lock {
+ typedef __mutex __mutex_type;
+ __mutex_type& _M_device;
+public:
+ explicit __scoped_lock(__mutex_type& __name) : _M_device(__name) {
+ _M_device.lock();
+ }
+ ~__scoped_lock() throw() {
+ _M_device.unlock();
+ }
+};
+__mutex emergency_mutex;
+void * __cxa_allocate_exception(size_t thrown_size) throw()
+{
+ void *ret;
+ if (! ret)
+ __scoped_lock sentry(emergency_mutex);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53011.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53011.C
new file mode 100644
index 000000000..2cd8a6033
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53011.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+
+extern "C" class WvFastString;
+typedef WvFastString& WvStringParm;
+struct WvFastString {
+ ~WvFastString();
+ operator char* () {}
+};
+class WvString : WvFastString {};
+class WvAddr {};
+class WvIPAddr : WvAddr {};
+struct WvIPNet : WvIPAddr {
+ bool is_default() {}
+};
+template<class T, bool> struct WvTraits_Helper {
+ static void release(T *obj) {
+ delete obj;
+ }
+};
+template<class From> struct WvTraits {
+ static void release(From *obj) {
+ WvTraits_Helper<From, 0>::release(obj);
+ }
+};
+struct WvLink {
+ void *data;
+ WvLink *next;
+ bool autofree;
+ WvLink(bool, int) : autofree() {}
+ bool get_autofree() {}
+
+ void unlink() {
+ delete this;
+ }
+};
+struct WvListBase {
+ WvLink head, *tail;
+ WvListBase() : head(0, 0) {}
+};
+template<class T> struct WvList : WvListBase {
+ ~WvList() {
+ zap();
+ }
+
+ void zap(bool destroy = 1) {
+ while (head.next) unlink_after(&head, destroy);
+ }
+
+ void unlink_after(WvLink *after, bool destroy) {
+ WvLink *next = 0;
+ T *obj = (destroy && next->get_autofree()) ?
+ static_cast<T*>(next->data) : 0;
+
+ if (tail) tail = after;
+ next->unlink();
+ WvTraits<T>::release(obj);
+ }
+};
+typedef WvList<WvString>WvStringListBase;
+class WvStringList : WvStringListBase {};
+class WvSubProc {
+ WvStringList last_args, env;
+};
+void addroute(WvIPNet& dest, WvStringParm table) {
+ if (dest.is_default() || (table != "default")) WvSubProc checkProc;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53085.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53085.C
new file mode 100644
index 000000000..9ee29fec1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53085.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } }
+// { dg-options "-fdump-tree-optimized" }
+
+class aa{
+ void f();
+private:
+ volatile int a;
+};
+
+void aa::f(){
+ a=1;
+ a=1;
+}
+
+// { dg-final { scan-tree-dump-times "a ={v} 1;" 2 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53161.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53161.C
new file mode 100644
index 000000000..483556d9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53161.C
@@ -0,0 +1,22 @@
+/* { dg-do compile { target c++11 } } */
+void gg();
+static __typeof(gg) __gthrw_gg __attribute__((__weakref__("gg")));
+
+template<typename R,typename... A>
+struct data {
+ template<typename Y,typename X>
+ data(Y& y,R(X::*f)(A...));
+};
+
+template<typename Y,typename X,typename R,typename... A>
+data<R,A...> make_data(Y& y,R(X::*f)(A...)) {
+ return data<R,A...>(y,f);
+}
+
+void global(data<void>);
+
+struct test {
+ void bar() {}
+ void doit() { global(make_data(*this,&test::bar)); }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53321.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53321.C
new file mode 100644
index 000000000..40a2de731
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53321.C
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-require-profiling "-fprofile-generate" }
+// { dg-options "-fprofile-generate" }
+
+typedef long unsigned int size_t;
+
+extern "C"
+{
+ extern void *memcpy (void *__dest, __const void *__src, size_t __n);
+}
+
+extern char *src, *sources;
+extern int n_sources;
+
+static void
+find_source (const char *file_name)
+{
+ memcpy (src, sources, n_sources * sizeof (*sources));
+}
+
+extern const char *gcov_read_string (void);
+
+static void read_graph_file (void)
+{
+ find_source (gcov_read_string ());
+}
+
+static void process_file (void)
+{
+ read_graph_file ();
+}
+
+int main ()
+{
+ process_file ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53336.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53336.C
new file mode 100644
index 000000000..ab121945d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53336.C
@@ -0,0 +1,45 @@
+// { dg-do compile }
+
+bool foo();
+
+struct C
+{
+ C()
+ {
+ if (foo())
+ foo();
+ }
+};
+
+struct S
+{
+ struct dummy
+ {
+ int i_;
+ };
+ typedef int dummy::*bool_type;
+
+ operator bool_type() const
+ {
+ return foo() ? &dummy::i_ : 0;
+ }
+};
+
+int x;
+
+struct adaptor
+{
+ C c;
+
+ virtual void bar()
+ {
+ if (S())
+ x = 0;
+ }
+};
+
+int main()
+{
+ adaptor a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53364.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53364.C
new file mode 100644
index 000000000..36bb083e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53364.C
@@ -0,0 +1,37 @@
+// { dg-do run }
+
+extern "C" void abort (void);
+
+template<typename _Tp>
+inline const _Tp&
+min(const _Tp& __a, const _Tp& __b)
+{
+ if (__b < __a)
+ return __b;
+ return __a;
+}
+
+struct A
+{
+ int m_x;
+
+ explicit A(int x) : m_x(x) {}
+ operator int() const { return m_x; }
+};
+
+struct B : public A
+{
+public:
+ explicit B(int x) : A(x) {}
+};
+
+int data = 1;
+
+int main()
+{
+ B b = B(10);
+ b = min(b, B(data));
+ if (b != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53602.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53602.C
new file mode 100644
index 000000000..ab0f16fe2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53602.C
@@ -0,0 +1,364 @@
+// { dg-do compile { target c++11 } }
+
+namespace std
+{
+ template <class, class>
+ struct pair
+ {
+ };
+ struct input_iterator_tag
+ {
+ };
+ struct forward_iterator_tag : public input_iterator_tag
+ {
+ };
+ template <typename, typename _Tp, typename = _Tp>
+ struct iterator
+ {
+ };
+}
+namespace __gnu_cxx
+{
+ template <typename _Tp>
+ struct new_allocator
+ {
+ typedef _Tp pointer;
+ typedef _Tp value_type;
+ template <typename _Tp1>
+ struct rebind
+ {
+ typedef new_allocator <_Tp1> other;
+ };
+ };
+}
+namespace std
+{
+ template <typename _Tp>
+ struct allocator : public __gnu_cxx::new_allocator <_Tp>
+ {
+ };
+}
+extern "C"
+{
+ struct rtl_String;
+ void rtl_string_release (rtl_String *) throw ();
+ void rtl_string_newFromStr (rtl_String * *, const char *) throw ();
+}
+namespace std
+{
+ template <typename, typename, typename> struct binary_function;
+ template <typename _Tp>
+ struct equal_to : public binary_function <_Tp, _Tp, bool>
+ {
+ };
+}
+namespace rtl
+{
+ struct OString
+ {
+ rtl_String * pData;
+ OString (const char *value)
+ {
+ rtl_string_newFromStr (&pData, value);
+ }
+ ~OString ()
+ {
+ rtl_string_release (pData);
+ }
+ };
+ struct OStringHash;
+}
+namespace boost
+{
+ template <class> struct hash;
+ namespace unordered
+ {
+ template <class T, class = boost::hash <T>, class = std::equal_to <T>, class = std::allocator <T>>class unordered_set;
+ }
+ using boost::unordered::unordered_set;
+ namespace detail
+ {
+ template <bool>
+ struct if_true
+ {
+ template <class, class F>
+ struct then
+ {
+ typedef F type;
+ };
+ };
+ }
+ template <class, class> struct pointer_to_other;
+ template <class T, class U>
+ struct pointer_to_other <T *, U>
+ {
+ typedef U type;
+ };
+ namespace unordered
+ {
+ namespace detail
+ {
+ template <typename T, T> struct integral_constant
+ {
+ };
+ struct choice9
+ {
+ typedef char (&type)[9];
+ };
+ struct choice8:choice9
+ {
+ };
+ struct choice7:choice8
+ {
+ };
+ struct choice6:choice7
+ {
+ };
+ struct choice5:choice6
+ {
+ };
+ struct choice4:choice5
+ {
+ };
+ struct choice3:choice4
+ {
+ };
+ struct choice2:choice3
+ {
+ };
+ struct choice1:choice2
+ {
+ };
+ choice1 choose ();
+ template <typename Alloc, typename T>
+ struct rebind_wrap
+ {
+ typedef typename Alloc::template rebind <T>::other type;
+ };
+ template <typename, typename T2>
+ struct sfinae:T2
+ {
+ };
+ template <typename Tp, typename Default>
+ struct default_type_pointer
+ {
+ template <typename X>
+ static boost::unordered::detail::sfinae <typename X::pointer, choice1> test (choice1);
+ struct DefaultWrap
+ {
+ typedef Default pointer;
+ };
+ enum { value = (1 == sizeof (test <Tp> (choose ()))) };
+ typedef typename boost::detail::if_true <value>::template then <Tp, DefaultWrap>::type::pointer type;
+ };
+ template <typename Tp, typename Default>
+ struct default_type_const_pointer
+ {
+ template <typename>
+ static choice2::type test (choice2);
+ struct DefaultWrap
+ {
+ };
+ enum { value = (1 == sizeof (test <Tp> (choose ()))) };
+ typedef typename boost::detail::if_true <value>::template then <Tp, DefaultWrap> type;
+ };
+ struct default_type_propagate_on_container_swap
+ {
+ struct DefaultWrap
+ {
+ };
+ };
+ template <typename Alloc>
+ struct allocator_traits
+ {
+ typedef typename Alloc::value_type value_type;
+ typedef typename default_type_pointer <Alloc, value_type *>::type pointer;
+ template <typename T>
+ struct pointer_to_other : boost::pointer_to_other <pointer, T>
+ {
+ };
+ typedef typename default_type_const_pointer <Alloc, typename pointer_to_other <value_type>::type>::type const_pointer;
+ };
+ }
+ namespace detail
+ {
+ struct move_tag
+ {
+ };
+ template <typename> struct table;
+ template <typename NodeAlloc>
+ struct node_constructor
+ {
+ void construct_value ()
+ {
+ }
+ };
+ struct ptr_bucket
+ {
+ ptr_bucket ()
+ {
+ }
+ };
+ template <typename A, typename Bucket, typename Node>
+ struct buckets
+ {
+ typedef Node node;
+ typedef Bucket bucket;
+ typedef typename boost::unordered::detail::rebind_wrap <A, node>::type node_allocator;
+ typedef typename boost::unordered::detail::rebind_wrap <A, bucket>::type bucket_allocator;
+ typedef boost::unordered::detail::allocator_traits <node_allocator> node_allocator_traits;
+ typedef boost::unordered::detail::allocator_traits <bucket_allocator> bucket_allocator_traits;
+ typedef typename node_allocator_traits::pointer node_pointer;
+ typedef typename node_allocator_traits::const_pointer const_node_pointer;
+ typedef typename bucket_allocator_traits::pointer bucket_pointer;
+ typedef boost::unordered::detail::node_constructor <node_allocator> node_constructor;
+ bucket_pointer buckets_;
+ unsigned size_;
+ template <typename Types>
+ buckets (boost::unordered::detail::table <Types>, boost::unordered::detail::move_tag) : buckets_ (), size_ ()
+ {
+ }
+ };
+ struct functions
+ {
+ };
+ }
+ }
+ namespace detail
+ {
+ template <class Category, class T, class, class, class>
+ struct iterator_base:std::iterator <Category, T>
+ {
+ };
+ }
+ template <class Category, class T, class Distance, class Pointer = T, class Reference = T>
+ struct iterator:boost::detail::iterator_base <Category, T, Distance, Pointer, Reference>
+ {
+ };
+ namespace unordered
+ {
+ namespace iterator_detail
+ {
+ template <typename, typename NodePointer, typename Value> struct c_iterator:public boost::iterator <std::forward_iterator_tag, Value, int>
+ {
+ friend bool operator== (c_iterator, c_iterator)
+ {
+ }
+ };
+ }
+ namespace detail
+ {
+ template <typename ValueType>
+ struct value_base
+ {
+ typedef ValueType value_type;
+ value_type value ()
+ {
+ }
+ };
+ template <typename Types>
+ struct table:boost::unordered::detail::buckets <typename Types::allocator, typename Types::bucket, typename Types::key_equal>
+ {
+ typedef typename Types::value_type value_type;
+ typedef boost::unordered::detail::buckets <typename Types::allocator, typename Types::bucket, typename Types::node> buckets;
+ typedef typename buckets::node_pointer node_pointer;
+ typedef typename buckets::const_node_pointer const_node_pointer;
+ typedef boost::unordered::iterator_detail::c_iterator <const_node_pointer, node_pointer, value_type> c_iterator;
+ unsigned max_size ()
+ {
+ }
+ };
+ template <typename> struct table_impl;
+ template <typename T>
+ struct ptr_node : boost::unordered::detail::value_base <T>, boost::unordered::detail::ptr_bucket
+ {
+ boost::unordered::detail::ptr_bucket bucket_base;
+ unsigned hash_;
+ ptr_node () : bucket_base (), hash_ ()
+ {
+ }
+ };
+ template <typename A, typename T, typename, typename> struct pick_node2
+ {
+ };
+ template <typename A, typename T> struct pick_node2 <A, T, boost::unordered::detail::ptr_node <T> *, boost::unordered::detail::ptr_bucket *>
+ {
+ typedef boost::unordered::detail::ptr_node <T> node;
+ typedef boost::unordered::detail::ptr_bucket bucket;
+ };
+ template <typename A, typename T> struct pick_node
+ {
+ typedef boost::unordered::detail::allocator_traits <typename boost::unordered::detail::rebind_wrap <A, boost::unordered::detail::ptr_node <T>>::type> tentative_node_traits;
+ typedef boost::unordered::detail::allocator_traits <typename boost::unordered::detail::rebind_wrap <A, boost::unordered::detail::ptr_bucket>::type> tentative_bucket_traits;
+ typedef pick_node2 <A, T, typename tentative_node_traits::pointer, typename tentative_bucket_traits::pointer> pick;
+ typedef typename pick::node node;
+ typedef typename pick::bucket bucket;
+ };
+ template <typename A, typename T, typename H, typename P>
+ struct set
+ {
+ typedef boost::unordered::detail::set <A, T, H, P> types;
+ typedef T value_type;
+ typedef P key_equal;
+ typedef typename boost::unordered::detail::rebind_wrap <A, value_type>::type allocator;
+ typedef boost::unordered::detail::pick_node <allocator, value_type> pick;
+ typedef typename pick::node node;
+ typedef typename pick::bucket bucket;
+ typedef boost::unordered::detail::table_impl <types> table;
+ };
+ template <typename Types>
+ struct table_impl : boost::unordered::detail::table <Types>
+ {
+ typedef boost::unordered::detail::table <Types> table;
+ typedef typename table::node_constructor node_constructor;
+ table_impl () : table ()
+ {
+ }
+ template <class InputIt>
+ void insert_range_impl2 (node_constructor, InputIt)
+ {
+ }
+ };
+ }
+ template <class T, class H, class P, class A>
+ struct unordered_set
+ {
+ typedef T key_type;
+ typedef T value_type;
+ typedef boost::unordered::detail::set <A, T, H, P> types;
+ typedef typename types::table table;
+ typedef typename table::c_iterator const_iterator;
+ typedef typename table::c_iterator iterator;
+ table table_;
+ bool empty ()
+ {
+ return table_.size_;
+ }
+ iterator end ()
+ {
+ }
+ std::pair <iterator, bool> insert (value_type)
+ {
+ }
+ unsigned erase (const key_type &);
+ const_iterator find (const key_type);
+ };
+ template <class T, class H, class P, class A>
+ unsigned unordered_set <T, H, P, A>::erase (const key_type &)
+ {
+ }
+ }
+}
+using namespace::rtl;
+namespace skeletonmaker
+{
+ void
+ checkDefaultInterfaces (boost::unordered_set <OString, OStringHash> interfaces,
+ boost::unordered_set <OStringHash> services, OString)
+ {
+ if (services.empty ())
+ interfaces.erase ("com.sun.star.lang.XServiceInfo");
+ else if (interfaces.find ("com.sun.star.lang.XServiceInfo") == interfaces.end ())
+ interfaces.insert ("com.sun.star.lang.XServiceInfo");
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53693.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53693.C
new file mode 100644
index 000000000..b67a484b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53693.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+void
+filter_scanlines (void *src_buffer, void *dst_buffer, int dst_pitch, int width)
+{
+ int x;
+ unsigned short *src, *dst_a, *dst_b;
+
+ src = (unsigned short *) src_buffer;
+ dst_a = (unsigned short *) dst_buffer;
+ dst_b = ((unsigned short *) dst_buffer) + (dst_pitch >> 1);
+
+ for (x = 0; x < width; x++)
+ {
+ unsigned char gs, gh;
+ gs = src[x];
+ gh = gs + (gs >> 1);
+ dst_a[x] = (gh << 5) | (gh);
+ dst_b[x] = ((gs - gh) << 5) | (gs - gh);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53752.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53752.C
new file mode 100644
index 000000000..fd6c68766
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53752.C
@@ -0,0 +1,156 @@
+// { dg-do compile }
+// { dg-options "-g" }
+
+typedef unsigned int uint32_t;
+typedef unsigned long int uint64_t;
+namespace mpl_ {
+ template< typename T, T N > struct integral_c {
+ static const T value = N;
+ };
+}
+namespace mpl {
+ using namespace mpl_;
+};
+template <class T, T val> struct integral_constant : public mpl::integral_c<T, val> {
+ typedef integral_constant<bool,false> type;
+};
+template< typename T > struct is_lvalue_reference : public ::integral_constant<bool,false> {
+};
+template< typename T > struct is_rvalue_reference : public ::integral_constant<bool,false> {
+};
+namespace type_traits {
+ template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false> struct ice_or;
+ template <> struct ice_or<false, false, false, false, false, false, false> {
+ static const bool value = false;
+ };
+}
+template <typename T> struct is_reference_impl {
+ static const bool value = (::type_traits::ice_or< ::is_lvalue_reference<T>::value, ::is_rvalue_reference<T>::value >::value) ;
+};
+template< typename T > struct is_reference : public ::integral_constant<bool,::is_reference_impl<T>::value> {
+};
+struct na {
+};
+namespace mpl {
+ template< bool C , typename T1 , typename T2 > struct if_c {
+ typedef T2 type;
+ };
+ template< typename T1 = na , typename T2 = na , typename T3 = na > struct if_ {
+ typedef if_c< static_cast<bool>(T1::value) , T2 , T3 > almost_type_;
+ typedef typename almost_type_::type type;
+ };
+}
+namespace optional_detail {
+ template<class T> struct types_when_isnt_ref {
+ typedef T & reference_type ;
+ }
+ ;
+ template<class T> struct types_when_is_ref {
+ }
+ ;
+ struct optional_tag {
+ }
+ ;
+ template<class T> class optional_base : public optional_tag {
+ typedef types_when_isnt_ref<T> types_when_not_ref ;
+ typedef types_when_is_ref<T> types_when_ref ;
+ protected :
+ typedef typename is_reference<T>::type is_reference_predicate ;
+ typedef typename mpl::if_<is_reference_predicate,types_when_ref,types_when_not_ref>::type types ;
+ typedef typename types::reference_type reference_type ;
+ }
+ ;
+}
+template<class T> class optional : public optional_detail::optional_base<T> {
+ typedef optional_detail::optional_base<T> base ;
+public :
+ typedef typename base::reference_type reference_type ;
+ reference_type operator *() {
+ }
+};
+namespace noncopyable_ {
+ class noncopyable {
+ };
+}
+typedef noncopyable_::noncopyable noncopyable;
+template<class T> class shared_ptr {
+public:
+ T * operator-> () const {
+ }
+};
+typedef uint64_t block_address;
+class transaction_manager : noncopyable {
+public:
+ typedef shared_ptr<transaction_manager> ptr;
+};
+template <typename ValueType> class NoOpRefCounter {
+};
+struct uint64_traits {
+};
+namespace btree_detail {
+ class shadow_spine : private noncopyable {
+ public:
+ shadow_spine(transaction_manager::ptr tm) : tm_(tm) {
+ }
+ transaction_manager::ptr tm_;
+ };
+}
+template <unsigned Levels, typename ValueTraits> class btree {
+public:
+ typedef shared_ptr<btree<Levels, ValueTraits> > ptr;
+ typedef uint64_t key[Levels];
+ typedef typename ValueTraits::value_type value_type;
+ typedef optional<value_type> maybe_value;
+ btree(typename transaction_manager::ptr tm, typename ValueTraits::ref_counter rc);
+ maybe_value lookup(key const &key) const;
+ void insert(key const &key, typename ValueTraits::value_type const &value);
+ template <typename ValueTraits2> bool insert_location(btree_detail::shadow_spine &spine, block_address block, uint64_t key, int *index);
+ typename transaction_manager::ptr tm_;
+ block_address root_;
+ typename ValueTraits::ref_counter rc_;
+};
+template <unsigned Levels, typename ValueTraits> void btree<Levels, ValueTraits>:: insert(key const &key, typename ValueTraits::value_type const &value) {
+ using namespace btree_detail;
+ block_address block = root_;
+ int index = 0;
+ shadow_spine spine(tm_);
+ for (unsigned level = 0;
+ level < Levels - 1;
+ ++level) {
+ bool need_insert = insert_location<uint64_traits>(spine, block, key[level], &index);
+ if (need_insert) {
+ btree<Levels - 1, ValueTraits> new_tree(tm_, rc_);
+ }
+ }
+}
+struct device_details_disk {
+}
+__attribute__ ((packed));
+struct device_details {
+};
+struct device_details_traits {
+ typedef device_details value_type;
+ typedef NoOpRefCounter<device_details> ref_counter;
+};
+typedef uint32_t thin_dev_t;
+typedef btree<1, device_details_traits> detail_tree;
+struct metadata {
+ typedef shared_ptr<metadata> ptr;
+ detail_tree::ptr details_;
+};
+class thin_pool;
+class thin {
+ void set_snapshot_time(uint32_t time);
+ thin_dev_t dev_;
+ thin_pool *pool_;
+};
+class thin_pool {
+public:
+ metadata::ptr md_;
+};
+void thin::set_snapshot_time(uint32_t time) {
+ uint64_t key[1] = {
+ dev_ };
+ optional<device_details> mdetail = pool_->md_->details_->lookup(key);
+ pool_->md_->details_->insert(key, *mdetail);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53970.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53970.C
new file mode 100644
index 000000000..53cbc1f85
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr53970.C
@@ -0,0 +1,17 @@
+// { dg-do run }
+
+#pragma pack(1)
+struct mystruct {
+ char c;
+ unsigned long l[1024];
+};
+#pragma pack()
+
+int main(int argc, char **argv)
+{
+ mystruct *a = new mystruct;
+ unsigned long i;
+ for (i = 0; i < 1024; ++i)
+ a->l[i] = 0xdeadbeaf;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54563.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54563.C
new file mode 100644
index 000000000..2980320f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54563.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/54563
+// { dg-do compile }
+
+extern "C" float powf (float, float);
+struct S { ~S (); };
+double bar ();
+double x;
+
+void
+foo ()
+{
+ S s;
+ x = powf (bar (), 2.);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54647.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54647.C
new file mode 100644
index 000000000..2177ecd67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54647.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+class A
+{
+};
+template <class type> struct D:A
+{
+ type & operator[](int);
+};
+struct B
+{
+ typedef D <int *>Row;
+ struct C
+ {
+ Row *row;
+ };
+};
+B::C a;
+B::Row & b = *a.row;
+void
+fn1 ()
+{
+ while (1)
+ b[0] = b[0] ? (int *) -1 : 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54684.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54684.C
new file mode 100644
index 000000000..4934011e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54684.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+// { dg-options "-fno-short-enums" }
+
+typedef union tree_node *tree;
+typedef union gimple_statement_d *gimple;
+struct vec_prefix { unsigned num_; };
+template<typename T> struct vec_t {
+ unsigned length (void) const;
+ T &operator[] (unsigned);
+ vec_prefix prefix_;
+ T vec_[1];
+};
+template<typename T> inline unsigned vec_t<T>::length (void) const {
+ return prefix_.num_;
+}
+template<typename T> T & vec_t<T>::operator[] (unsigned ix) {
+ ((void)(__builtin_expect(!(ix < prefix_.num_), 0) ? __builtin_unreachable(), 0 : 0));
+ return vec_[ix];
+}
+enum tree_code { PARM_DECL };
+struct tree_base {
+ enum tree_code code : 16;
+ unsigned default_def_flag : 1;
+};
+union tree_node {
+ struct tree_base base;
+};
+struct ipa_param_descriptor {
+ tree decl;
+ unsigned used : 1;
+};
+typedef struct ipa_param_descriptor ipa_param_descriptor_t;
+struct ipa_node_params {
+ vec_t<ipa_param_descriptor_t> *descriptors;
+};
+static inline int ipa_get_param_count (struct ipa_node_params *info) {
+ return ((info->descriptors) ? (info->descriptors)->length () : 0);
+}
+static inline tree ipa_get_param (struct ipa_node_params *info, int i) {
+ return ((*(info->descriptors))[i]).decl;
+}
+static inline void ipa_set_param_used (struct ipa_node_params *info, int i, bool val) {
+ ((*(info->descriptors))[i]).used = val;
+}
+int ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
+{
+ int i, count;
+ count = ipa_get_param_count (info);
+ for (i = 0; i < count; i++)
+ if (ipa_get_param (info, i) == ptree) return i;
+ return -1;
+}
+bool visit_ref_for_mod_analysis (gimple stmt __attribute__ ((__unused__)),
+ tree op, void *data)
+{
+ struct ipa_node_params *info = (struct ipa_node_params *) data;
+ if (op && ((enum tree_code) (op)->base.code) == PARM_DECL)
+ {
+ int index = ipa_get_param_decl_index (info, op);
+ ((void)(__builtin_expect(!(index >= 0), 0) ? __builtin_unreachable(), 0 : 0));
+ ipa_set_param_used (info, index, true);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54735.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54735.C
new file mode 100644
index 000000000..0604ec517
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54735.C
@@ -0,0 +1,179 @@
+// { dg-do compile }
+
+class Gmpfr
+{};
+class M : Gmpfr
+{
+public:
+ Gmpfr infconst;
+ M(int);
+};
+template<typename>struct A;
+template<typename, int, int, int = 0 ? : 0, int = 0, int = 0>class N;
+template<typename>class O;
+template<typename>struct B;
+struct C
+{
+ enum
+ { value };
+};
+class D
+{
+public:
+ enum
+ { ret };
+};
+struct F
+{
+ enum
+ { ret = 0 ? : 0 };
+};
+template<typename Derived>struct G
+{
+ typedef O<Derived>type;
+};
+struct H
+{
+ void operator * ();
+};
+struct I
+{
+ enum
+ { RequireInitialization = C::value ? : 0, ReadCost };
+};
+template<typename Derived>struct J
+{
+ enum
+ { ret = A<Derived>::InnerStrideAtCompileTime };
+};
+template<typename Derived>struct K
+{
+ enum
+ { ret = A<Derived>::OuterStrideAtCompileTime };
+};
+template<typename Derived>class P : H
+{
+public:
+ using H::operator *;
+ typedef typename A<Derived>::Scalar Scalar;
+ enum
+ { RowsAtCompileTime =
+ A<Derived>::RowsAtCompileTime, ColsAtCompileTime =
+ A<Derived>::ColsAtCompileTime, SizeAtCompileTime =
+ F::ret, MaxRowsAtCompileTime =
+ A<Derived>::MaxRowsAtCompileTime, MaxColsAtCompileTime =
+ A<Derived>::MaxColsAtCompileTime, MaxSizeAtCompileTime =
+ F::ret, Flags =
+ A<Derived>::Flags ? : 0 ? : 0, CoeffReadCost =
+ A<Derived>::CoeffReadCost, InnerStrideAtCompileTime =
+ J<Derived>::ret, OuterStrideAtCompileTime = K<Derived>::ret };
+ B<Derived> operator << (const Scalar&);
+};
+
+template<typename Derived>class O : public P<Derived>
+{};
+
+template<int _Cols>class L
+{
+public:
+
+ int cols()
+ {
+ return _Cols;
+ }
+};
+template<typename Derived>class Q : public G<Derived>::type
+{
+public:
+ typedef typename G<Derived>::type Base;
+ typedef typename A<Derived>::Index Index;
+ typedef typename A<Derived>::Scalar Scalar;
+ L<Base::ColsAtCompileTime> m_storage;
+ Index cols()
+ {
+ return m_storage.cols();
+ }
+
+ Scalar& coeffRef(Index,
+ Index);
+};
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
+ int _MaxCols>struct A<N<_Scalar, _Rows, _Cols, _Options, _MaxRows,
+ _MaxCols> >
+{
+ typedef _Scalar Scalar;
+ typedef int Index;
+ enum
+ { RowsAtCompileTime, ColsAtCompileTime =
+ _Cols, MaxRowsAtCompileTime, MaxColsAtCompileTime, Flags =
+ D::ret, CoeffReadCost =
+ I::ReadCost, InnerStrideAtCompileTime, OuterStrideAtCompileTime =
+ 0 ? : 0 };
+};
+template<typename _Scalar, int, int _Cols, int, int,
+ int>class N : public Q<N<_Scalar, 0, _Cols> >
+{
+public:
+ Q<N> Base;
+ template<typename T0, typename T1>N(const T0&,
+ const T1&);
+};
+void
+__assert_fail(int)
+throw() __attribute__((__noreturn__));
+template<typename XprType>struct B
+{
+ typedef typename XprType::Scalar Scalar;
+ typedef typename XprType::Index Index;
+ B(XprType & p1, const Scalar &) : m_xpr(p1), m_col(),
+ m_currentBlockRows(1)
+ {} B& operator, (const Scalar&)
+ {
+ Index a;
+
+ if (m_col == m_xpr.cols())
+ {
+ m_col = 0;
+ m_currentBlockRows = 1;
+ a && "Too " ? static_cast<void>(0) : __assert_fail(0);
+ }
+ m_col < m_xpr.cols()
+ && "Too " ? static_cast<void>(0) : __assert_fail(1);
+ m_currentBlockRows ? static_cast<void>(0) : __assert_fail(4);
+ m_xpr.coeffRef(0, m_col++) = 0;
+ return *this;
+ }
+ ~B()
+ {
+ 1 + m_currentBlockRows && m_col
+ && "Too " ? static_cast<void>(0) : __assert_fail(0);
+ }
+
+ XprType& m_xpr;
+ Index m_col;
+ Index m_currentBlockRows;
+};
+
+template<typename Derived>B<Derived>P<
+ Derived >::operator << (const Scalar&)
+{
+ return B<Derived>(*static_cast<Derived *>(this), 0);
+}
+
+template<class NT, int s>void
+ check_()
+{
+ N<NT, 0, s>m(0, 0);
+ m << 0, 0, 0, 0;
+}
+
+template<class NT>void check()
+{
+ check_<NT, 3>();
+}
+
+int main()
+{
+ check<M>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54838.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54838.C
new file mode 100644
index 000000000..6d34d57a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54838.C
@@ -0,0 +1,102 @@
+// { dg-do compile }
+// { dg-options "-ftracer -fno-tree-dce -fno-tree-sra" }
+
+struct bidirectional_iterator_tag
+{};
+struct random_access_iterator_tag:bidirectional_iterator_tag
+{};
+template < typename _Category, typename, typename _Distance, typename > struct iterator
+{
+ typedef _Distance difference_type;
+};
+template < typename _Iterator > struct iterator_traits
+{
+ typedef typename _Iterator::difference_type difference_type;
+};
+template < typename _Tp > struct iterator_traits <_Tp * >
+{
+ typedef random_access_iterator_tag iterator_category;
+ typedef _Tp value_type;
+ typedef int difference_type;
+ typedef _Tp reference;
+};
+template < typename _Iterator > class reverse_iterator:
+ public
+ iterator < typename iterator_traits < _Iterator >::iterator_category,
+ typename iterator_traits < _Iterator >::value_type,
+ typename iterator_traits < _Iterator >::difference_type, typename iterator_traits < _Iterator >::reference >
+{
+ _Iterator current;
+public:
+ typedef _Iterator iterator_type;
+ reverse_iterator (const reverse_iterator & __x):current (__x.current)
+ {}
+ iterator_type base ()
+ {
+ return current;
+ }
+ reverse_iterator operator++ ()
+ {
+ --current;
+ }
+};
+template
+<
+typename
+_Iterator
+>
+bool
+operator
+==
+(reverse_iterator < _Iterator > __x, reverse_iterator < _Iterator > __y)
+{
+ return __x.base () == __y.base ();
+}
+
+template
+<
+typename
+_Iterator
+>
+typename
+reverse_iterator
+<
+_Iterator
+>::difference_type
+operator
+- (reverse_iterator < _Iterator >, reverse_iterator < _Iterator >)
+{}
+template
+<
+typename
+_RandomAccessIterator
+>
+_RandomAccessIterator
+__find
+(_RandomAccessIterator
+ __first, _RandomAccessIterator __last)
+{
+ typename
+ iterator_traits
+ <
+ _RandomAccessIterator
+ >::difference_type __trip_count (__last - __first);
+ for (; __trip_count; --__trip_count)
+ ++__first;
+ return __last;
+}
+typedef reverse_iterator < int* > _ForwardIterator1;
+_ForwardIterator1
+search
+(_ForwardIterator1
+ __first1,
+ _ForwardIterator1
+ __last1)
+{
+ for (;;)
+ {
+ __first1 = __find (__first1, __last1);
+ if (__first1 == __last1)
+ return __last1;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54902.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54902.C
new file mode 100644
index 000000000..790ffe5fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr54902.C
@@ -0,0 +1,131 @@
+// { dg-do compile }
+
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator> struct iterator_traits {
+ };
+ template<typename _Tp> struct iterator_traits<_Tp*> {
+ typedef _Tp& reference;
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ using std::iterator_traits;
+ template<typename _Iterator, typename _Container> class __normal_iterator {
+ _Iterator _M_current;
+ typedef iterator_traits<_Iterator> __traits_type;
+ public:
+ typedef typename __traits_type::reference reference;
+ explicit __normal_iterator(const _Iterator& __i) : _M_current(__i) {
+ }
+ reference operator*() const {
+ return *_M_current;
+ }
+ __normal_iterator operator++(int) {
+ return __normal_iterator(_M_current++);
+ }
+ };
+ template<typename _Tp> class new_allocator {
+ public:
+ typedef _Tp* pointer;
+ template<typename _Tp1> struct rebind {
+ typedef new_allocator<_Tp1> other;
+ };
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Alloc> struct __alloc_traits {
+ typedef typename _Alloc::pointer pointer;
+ template<typename _Tp> struct rebind {
+ typedef typename _Alloc::template rebind<_Tp>::other other;
+ };
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<_Tp>::other _Tp_alloc_type;
+ typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer pointer;
+ struct _Vector_impl : public _Tp_alloc_type {
+ pointer _M_start;
+ };
+ _Vector_impl _M_impl;
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ public:
+ typedef typename _Base::pointer pointer;
+ typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
+ iterator begin() {
+ return iterator(this->_M_impl._M_start);
+ }
+ };
+}
+class myServer {
+ static std::vector<myServer *> server_list;
+ class Callback;
+ class myFolder *currentFolder;
+ static bool eventloop(Callback *);
+};
+extern "C" {
+ typedef unsigned int uint32_t;
+ typedef uint32_t unicode_char;
+ extern int strcmp (__const char *__s1, __const char *__s2) throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+};
+class CursesObj {
+};
+class Curses : public CursesObj {
+public:
+ class Key {
+ public:
+ unicode_char ukey;
+ const char *keycode;
+ Key(unicode_char ch) : ukey(ch), keycode(0) {
+ }
+ bool plain() const {
+ }
+ bool nokey() const {
+ }
+ bool operator==(const Key &k) const {
+ return strcmp(keycode ? keycode:
+ "", k.keycode ? k.keycode:
+ "") == 0 && ukey == k.ukey;
+ }
+ };
+ static bool processKey(const Key &k);
+};
+class CursesContainer : public Curses {
+};
+class myFolder {
+public:
+ void checkExpunged();
+};
+class Typeahead {
+public:
+ static Typeahead *typeahead;
+ bool empty() {
+ }
+ Curses::Key pop() {
+ }
+};
+class CursesScreen : public CursesContainer {
+public:
+ Key getKey();
+};
+using namespace std;
+extern CursesScreen *cursesScreen;
+bool myServer::eventloop(myServer::Callback *callback) {
+ Curses::Key k1= (callback == __null && !Typeahead::typeahead->empty() ? Typeahead::typeahead->pop() : cursesScreen->getKey());
+ if (callback == __null || (k1.plain() && k1.ukey == '\x03')) {
+ if (!k1.nokey()) {
+ bool rc=Curses::processKey(k1);
+ if (rc) { while (k1.plain() && k1 == '\x03' && !Typeahead::typeahead->empty()) Typeahead::typeahead->pop(); }
+ }
+ }
+ vector<myServer *>::iterator b=server_list.begin();
+ while (1) {
+ myServer *p= *b++;
+ if (p->currentFolder) p->currentFolder->checkExpunged();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-1.C
new file mode 100644
index 000000000..dee5b6035
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-1.C
@@ -0,0 +1,24 @@
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-fno-inline" } */
+/* { dg-add-options bind_pic_locally } */
+
+ struct B
+ {
+ constexpr B ():
+ bp ()
+ {}
+ ~B ()
+ {
+ if (bp)
+ bp->f ();
+ }
+ void f ();
+ B *bp;
+ };
+struct A { B b;
+};
+
+void foo ()
+{
+ A a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-2.C
new file mode 100644
index 000000000..43ed1e775
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55260-2.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-add-options bind_pic_locally } */
+
+struct B
+{
+ virtual void test_suite_finish ();
+};
+void
+fn1 (B & p2)
+{
+ fn1 (p2);
+ B & a = p2;
+ a.test_suite_finish ();
+ B b;
+ fn1 (b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55355.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55355.C
new file mode 100644
index 000000000..6d8f8b6be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55355.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+struct A
+{
+ void funcA(void);
+};
+
+struct B {};
+
+struct C
+{
+ void funcC(void) { a_mp->funcA(); }
+
+ char buf_ma[268435456];
+ A *a_mp;
+ B b_m;
+};
+
+void
+func(C *c_p)
+{
+ c_p->funcC();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55740.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55740.C
new file mode 100644
index 000000000..cdd842543
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55740.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+static bool st_IsPathDelimiter( char c ) { return c == '/'; }
+bool IsValidPath( char const * filename )
+{
+ if ( !filename || filename[0] == 0 )
+ return false;
+ char const * run = filename;
+ while ( run && *run )
+ {
+ if ( run[0] == '.' )
+ if ( run[1] != '.' || ( !st_IsPathDelimiter( run[2] ) && run[2] != 0 ) )
+ return false;
+ while ( *run && !st_IsPathDelimiter( *run ) )
+ ++run;
+ if ( *run )
+ ++run;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55789.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55789.C
new file mode 100644
index 000000000..a5a31a4f5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55789.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-fno-guess-branch-probability -fno-tree-forwprop --param max-early-inliner-iterations=10 --param=early-inlining-insns=176" } */
+
+template < typename T > struct intrusive_ptr
+{
+ ~intrusive_ptr ()
+ {
+ delete px;
+ }
+ T *px;
+};
+
+struct section_info
+{
+ intrusive_ptr < section_info > parent;
+};
+
+struct file_info
+{
+ intrusive_ptr < file_info > parent;
+ intrusive_ptr < section_info > switched_section;
+};
+
+
+void
+start_file (void)
+{
+ intrusive_ptr < file_info > parent;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55875.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55875.C
new file mode 100644
index 000000000..faadf88f4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr55875.C
@@ -0,0 +1,55 @@
+// { dg-do run }
+
+struct A
+{
+ short int a1;
+ unsigned char a2;
+ unsigned int a3;
+};
+
+struct B
+{
+ unsigned short b1;
+ const A *b2;
+};
+
+B b;
+
+__attribute__((noinline, noclone))
+int foo (unsigned x)
+{
+ __asm volatile ("" : "+r" (x) : : "memory");
+ return x;
+}
+
+inline void
+bar (const int &)
+{
+}
+
+__attribute__((noinline)) void
+baz ()
+{
+ const A *a = b.b2;
+ unsigned int i;
+ unsigned short n = b.b1;
+ for (i = 0; i < n; ++i)
+ if (a[i].a1 == 11)
+ {
+ if (i > 0 && (a[i - 1].a2 & 1))
+ continue;
+ bar (foo (2));
+ return;
+ }
+}
+
+int
+main ()
+{
+ A a[4] = { { 10, 0, 0 }, { 11, 1, 0 }, { 11, 1, 0 }, { 11, 1, 0 } };
+ b.b1 = 4;
+ b.b2 = a;
+ baz ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56029.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56029.C
new file mode 100644
index 000000000..ca4a82a00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56029.C
@@ -0,0 +1,126 @@
+// PR tree-optimization/56029
+// { dg-do compile }
+
+template <class T>
+struct DefaultDeleter
+{
+ void operator () (T * ptr) { delete ptr; }
+};
+template <class T, class D>
+struct scoped_ptr_impl
+{
+ scoped_ptr_impl (T * p):data_ (p) {}
+ template <typename U, typename V>
+ scoped_ptr_impl (scoped_ptr_impl <U, V> *other):data_ (other->release (), get_deleter ()) {}
+ ~scoped_ptr_impl () { static_cast <D> (data_) (data_.ptr); }
+ void reset (T * p) { data_.ptr = p; }
+ D get_deleter () {}
+ T *release () { data_.ptr = __null; }
+ struct Data
+ : D
+ {
+ Data (T *) : ptr () {}
+ Data (T *, D) : D (), ptr () {}
+ T *ptr;
+ };
+ Data data_;
+};
+template <class T, class D = DefaultDeleter <T> >
+struct scoped_ptr
+{
+ struct RValue
+ {
+ RValue (scoped_ptr * object):object (object) {}
+ scoped_ptr *object;
+ };
+ scoped_ptr Pass () { return scoped_ptr ((this)); }
+ typedef T element_type;
+ typedef D deleter_type;
+ scoped_ptr () : impl_ (__null) {}
+ scoped_ptr (RValue rvalue) : impl_ (&rvalue.object->impl_) {}
+ void reset (element_type * p) { impl_.reset (p); }
+ scoped_ptr_impl <element_type, deleter_type> impl_;
+};
+template <typename>
+struct Callback;
+struct ClientSocketFactory;
+struct DatagramClientSocket;
+struct DnsSocketPool
+{
+ scoped_ptr <DatagramClientSocket> CreateConnectedSocket ();
+ ClientSocketFactory *socket_factory_;
+};
+int RandInt (int, int);
+struct BindStateBase {};
+struct CallbackBase
+{
+ CallbackBase (BindStateBase *);
+ ~CallbackBase ();
+};
+template <typename, typename, typename>
+struct BindState;
+template <typename R, typename A1, typename A2>
+struct Callback <R (A1, A2)> : CallbackBase
+{
+ template <typename Runnable, typename BindRunType, typename BoundArgsType>
+ Callback (BindState <Runnable, BindRunType, BoundArgsType> *bind_state) : CallbackBase (bind_state) {}
+};
+typedef Callback <int (int, int)>
+RandIntCallback;
+struct ClientSocketFactory
+{
+ virtual DatagramClientSocket *CreateDatagramClientSocket (RandIntCallback) = 0;
+};
+template <typename>
+struct RunnableAdapter;
+template <typename R, typename A1, typename A2>
+struct RunnableAdapter <R (*) (A1, A2)>
+{
+ typedef R (RunType) (A1, A2);
+};
+template <typename T>
+struct FunctorTraits
+{
+ typedef RunnableAdapter <T> RunnableType;
+ typedef typename RunnableType::RunType RunType;
+};
+template <typename T>
+typename FunctorTraits <T>::RunnableType MakeRunnable (T)
+{
+}
+template <int, typename, typename>
+struct Invoker;
+template <typename StorageType, typename R, typename X1, typename X2>
+struct Invoker <0, StorageType, R (X1, X2)>
+{
+ typedef R (UnboundRunType) (X1, X2);
+};
+template <typename Runnable, typename RunType>
+struct BindState <Runnable, RunType, void ()> : BindStateBase
+{
+ typedef Runnable RunnableType;
+ typedef Invoker <0, BindState, RunType> InvokerType;
+ typedef typename InvokerType::UnboundRunType UnboundRunType;
+ BindState (Runnable):runnable_ () {}
+ RunnableType runnable_;
+};
+template <typename Functor>
+Callback <typename BindState <typename FunctorTraits <Functor>::RunnableType, typename FunctorTraits <Functor>::RunType, void ()>::UnboundRunType>
+Bind (Functor functor)
+{
+ typedef typename FunctorTraits <Functor>::RunnableType RunnableType;
+ typedef typename FunctorTraits <Functor>::RunType RunType;
+ typedef BindState <RunnableType, RunType, void ()> BindState;
+ Callback <typename BindState::UnboundRunType> (new BindState (MakeRunnable (functor)));
+}
+struct DatagramClientSocket
+{
+ virtual ~ DatagramClientSocket ();
+};
+scoped_ptr <DatagramClientSocket>
+DnsSocketPool::CreateConnectedSocket ()
+{
+ scoped_ptr <DatagramClientSocket> socket;
+ socket.reset (socket_factory_->CreateDatagramClientSocket (Bind (RandInt)));
+ socket.Pass ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56302.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56302.C
new file mode 100644
index 000000000..08d47982a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56302.C
@@ -0,0 +1,41 @@
+// PR c++/56302
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+# define STAP_SDT_ARG_CONSTRAINT nor
+# define _SDT_STRINGIFY(x) #x
+# define _SDT_ARG_CONSTRAINT_STRING(x) _SDT_STRINGIFY(x)
+# define _SDT_ARG(n, x) \
+ [_SDT_S##n] "n" ((_SDT_ARGSIGNED (x) ? 1 : -1) * (int) _SDT_ARGSIZE (x)), \
+ [_SDT_A##n] _SDT_ARG_CONSTRAINT_STRING (STAP_SDT_ARG_CONSTRAINT) (_SDT_ARGVAL (x))
+#define _SDT_ARGARRAY(x) (__builtin_classify_type (x) == 14 \
+ || __builtin_classify_type (x) == 5)
+# define _SDT_ARGSIGNED(x) (!_SDT_ARGARRAY (x) \
+ && __sdt_type<__typeof (x)>::__sdt_signed)
+# define _SDT_ARGSIZE(x) (_SDT_ARGARRAY (x) \
+ ? sizeof (void *) : sizeof (x))
+# define _SDT_ARGVAL(x) (x)
+template<typename __sdt_T>
+struct __sdt_type
+{
+ static const bool __sdt_signed = false;
+};
+#define __SDT_ALWAYS_SIGNED(T) \
+template<> struct __sdt_type<T> { static const bool __sdt_signed = true; };
+__SDT_ALWAYS_SIGNED(signed char)
+__SDT_ALWAYS_SIGNED(short)
+__SDT_ALWAYS_SIGNED(int)
+__SDT_ALWAYS_SIGNED(long)
+__SDT_ALWAYS_SIGNED(long long)
+template<typename __sdt_E>
+struct __sdt_type<__sdt_E[]> : public __sdt_type<__sdt_E *> {};
+template<typename __sdt_E, size_t __sdt_N>
+struct __sdt_type<__sdt_E[__sdt_N]> : public __sdt_type<__sdt_E *> {};
+
+struct S { char p[8]; };
+
+void
+foo (const S &str)
+{
+ __asm__ __volatile__ ("" : : _SDT_ARG (0, &str));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56398.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56398.C
new file mode 100644
index 000000000..5b7bcf279
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56398.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-g" }
+
+namespace
+{
+#0 "/usr/include/c/4.8/bits/postypes.h" 3
+}
+
+vtkpow (int b)
+{
+ int a1;
+ int b1;
+ int c;
+ while (b1)
+ {
+ while (b)
+ b1 = 0;
+ b1 = b1 - 1;
+ c = c * a1;
+ }
+ return c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56403.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56403.C
new file mode 100644
index 000000000..27b6eeb88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56403.C
@@ -0,0 +1,12 @@
+// PR c++/56403
+// { dg-do compile }
+
+#include <stdarg.h>
+
+struct S { va_list err_args; };
+
+void *
+foo ()
+{
+ return new S ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56635.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56635.C
new file mode 100644
index 000000000..53d6bb96a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56635.C
@@ -0,0 +1,17 @@
+// PR tree-optimization/56635
+// { dg-do compile }
+
+struct A { _Complex double a; };
+
+void
+foo (A **x, A **y)
+{
+ A r;
+ if (__real__ x[0]->a)
+ {
+ r.a = y[0]->a / x[0]->a;
+ **x = r;
+ }
+ else
+ **x = **y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56694.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56694.C
new file mode 100644
index 000000000..d3de05101
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56694.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+// { dg-require-effective-target fopenmp }
+
+class GException {
+public:
+ class vector_mismatch {
+ public:
+ vector_mismatch(int size1, int size2);
+ };
+};
+class GVector{
+public:
+ GVector& operator+=(const GVector& v);
+ int m_num;
+ double* m_data;
+};
+inline GVector& GVector::operator+= (const GVector& v)
+{
+ if (m_num != v.m_num)
+ throw GException::vector_mismatch(m_num, v.m_num);
+ for (int i = 0; i < m_num; ++i) m_data[i] += v.m_data[i];
+};
+void eval(GVector* m_gradient, GVector* vect_cpy_grad, int n)
+{
+#pragma omp sections
+ {
+ for (int i = 0; i < n; ++i)
+ *m_gradient += vect_cpy_grad[i];
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56768.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56768.C
new file mode 100644
index 000000000..93d292a9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56768.C
@@ -0,0 +1,40 @@
+// { dg-do compile { target c++11 } }
+
+struct Iter
+{
+ int& operator* ();
+ void operator++ ();
+};
+
+bool operator!= (Iter &, Iter &) { }
+
+struct Container
+{
+ Iter begin () const;
+ Iter end () const;
+};
+
+struct J
+{
+ virtual J *mutable_child ();
+};
+
+struct M
+{
+ M (const Container &);
+ J ns_;
+};
+namespace
+{
+ J MakeNamespace (const Container &src)
+ {
+ J a;
+ J *b = 0;
+ for (const int &c: src)
+ b = b ? b->mutable_child () : &a;
+ return a;
+ }
+}
+M::M (const Container &ns):ns_ (MakeNamespace (ns))
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56817.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56817.C
new file mode 100644
index 000000000..35fc6f74f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56817.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "--param max-unroll-times=32" }
+
+struct A {};
+A **q;
+struct B
+{
+ A **j;
+ B () { j = q; }
+ A *& operator[] (unsigned long x) { return j[x]; }
+};
+struct C
+{
+ C (int r) : v (), s (r) {}
+ A *& operator () (int i, int j) { return v[i * s + j]; }
+ B v;
+ int s;
+};
+struct D
+{
+ D ()
+ {
+ unsigned h = 2;
+ for (int i = 0; i < 1; ++i, h *= 2)
+ {
+ C w (h);
+ for (unsigned j = 0; j < h; ++j)
+ for (unsigned k = 0; k < h; ++k)
+ w (j, k) = new A;
+ }
+ }
+};
+void
+foo ()
+{
+ for (int i = 0; i < 3; i++)
+ A (), A (), D ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56837.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56837.C
new file mode 100644
index 000000000..d00712280
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56837.C
@@ -0,0 +1,20 @@
+// { dg-do run }
+// { dg-options "-ftree-loop-distribute-patterns" }
+
+extern "C" void abort (void);
+extern "C" int memcmp (const void *, const void *, __SIZE_TYPE__);
+
+bool b1[8];
+bool b2[8] = { true, true, true, true, true, true, true, true };
+
+int main()
+{
+ unsigned int i;
+ for(i=0 ; i < 8; i++)
+ b1[i] = true;
+
+ if (memcmp (b1, b2, 8) != 0)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56854.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56854.C
new file mode 100644
index 000000000..fc7e30299
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr56854.C
@@ -0,0 +1,24 @@
+// PR tree-optimization/56854
+// { dg-do compile }
+
+inline void *
+operator new (__SIZE_TYPE__, void *p) throw ()
+{
+ return p;
+}
+
+struct A
+{
+ int a;
+ A () : a (0) {}
+ ~A () {}
+ A &operator= (const A &v) { this->~A (); new (this) A (v); return *this; }
+};
+A b[4], c[4];
+
+void
+foo ()
+{
+ for (int i = 0; i < 4; ++i)
+ c[i] = b[i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57107.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57107.C
new file mode 100644
index 000000000..516dec16f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57107.C
@@ -0,0 +1,193 @@
+// { dg-do compile }
+
+typedef long unsigned int size_t;
+namespace std {
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<class _Sp, class _Tp> struct __traitor {
+ enum {
+ __value = bool(_Sp::__value) || bool(_Tp::__value) };
+ };
+ template<typename _Tp> struct __is_integer {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_floating {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_pointer {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_normal_iterator {
+ enum {
+ __value = 0 };
+ };
+ template<typename _Tp> struct __is_arithmetic : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> > {
+ };
+ template<typename _Tp> struct __is_scalar : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> > {
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<bool, typename> struct __enable_if {
+ };
+ template<typename _Tp> struct __enable_if<true, _Tp> {
+ typedef _Tp __type;
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator> struct iterator_traits {
+ };
+ template<typename _Tp> struct iterator_traits<_Tp*> {
+ typedef _Tp value_type;
+ };
+ template<typename _Iterator, bool _HasBase> struct _Iter_base {
+ typedef _Iterator iterator_type;
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Iterator> struct _Niter_base : _Iter_base<_Iterator, __is_normal_iterator<_Iterator>::__value> {
+ };
+ template<typename _Iterator> inline typename _Niter_base<_Iterator>::iterator_type __niter_base(_Iterator __it) {
+ }
+ template<typename _OutputIterator, typename _Size, typename _Tp> inline typename __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value) {
+ for (__decltype(__n + 0) __niter = __n;
+ __niter > 0;
+ --__niter, ++__first) *__first = __value;
+ }
+ template<typename _OI, typename _Size, typename _Tp> inline _OI fill_n(_OI __first, _Size __n, const _Tp& __value) {
+ return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
+ }
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ public:
+ typedef size_t size_type;
+ typedef _Tp* pointer;
+ ~new_allocator() throw() {
+ }
+ pointer allocate(size_type __n, const void* = 0) {
+ return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
+ }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public:
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Alloc> struct __alloc_traits {
+ typedef typename _Alloc::pointer pointer;
+ template<typename _Tp> struct rebind {
+ typedef typename _Alloc::template rebind<_Tp>::other other;
+ };
+ };
+}
+class QString {
+public:
+ bool isEmpty() const;
+};
+class QObject {
+};
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<bool _TrivialValueType> struct __uninitialized_fill_n {
+ template<typename _ForwardIterator, typename _Size, typename _Tp> static void __uninit_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x) {
+ std::fill_n(__first, __n, __x);
+ }
+ };
+ template<typename _ForwardIterator, typename _Size, typename _Tp> inline void uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x) {
+ typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
+ std::__uninitialized_fill_n<__is_trivial(_ValueType)>:: __uninit_fill_n(__first, __n, __x);
+ }
+ template<typename _ForwardIterator, typename _Size, typename _Tp, typename _Tp2> inline void __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, const _Tp& __x, allocator<_Tp2>&) {
+ std::uninitialized_fill_n(__first, __n, __x);
+ }
+ template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<_Tp>::other _Tp_alloc_type;
+ typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer pointer;
+ struct _Vector_impl : public _Tp_alloc_type {
+ pointer _M_start;
+ pointer _M_finish;
+ pointer _M_end_of_storage;
+ _Vector_impl(_Tp_alloc_type const& __a) : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) {
+ }
+ };
+ typedef _Alloc allocator_type;
+ _Tp_alloc_type& _M_get_Tp_allocator() {
+ }
+ _Vector_base(size_t __n, const allocator_type& __a) : _M_impl(__a) {
+ _M_create_storage(__n);
+ }
+ _Vector_impl _M_impl;
+ pointer _M_allocate(size_t __n) {
+ return __n != 0 ? _M_impl.allocate(__n) : 0;
+ }
+ void _M_create_storage(size_t __n) {
+ this->_M_impl._M_start = this->_M_allocate(__n);
+ this->_M_impl._M_finish = this->_M_impl._M_start;
+ }
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef _Tp value_type;
+ typedef size_t size_type;
+ typedef _Alloc allocator_type;
+ using _Base::_M_get_Tp_allocator;
+ public:
+ explicit vector(size_type __n, const value_type& __value = value_type(), const allocator_type& __a = allocator_type()) : _Base(__n, __a) {
+ _M_fill_initialize(__n, __value);
+ }
+ void _M_fill_initialize(size_type __n, const value_type& __value) {
+ std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value, _M_get_Tp_allocator());
+ }
+ };
+};
+class QPaintDevice {
+public:
+ int width() const {
+ }
+ int height() const {
+ }
+};
+class QImage : public QPaintDevice {
+};
+extern "C" {
+ struct __jmp_buf_tag {
+ };
+ typedef struct __jmp_buf_tag jmp_buf[1];
+ extern int _setjmp (struct __jmp_buf_tag __env[1]) throw ();
+ extern void longjmp (struct __jmp_buf_tag __env[1], int __val) throw () __attribute__ ((__noreturn__));
+}
+typedef unsigned int png_uint_32;
+typedef void * png_voidp;
+typedef const char * png_const_charp;
+extern "C" {
+ typedef struct png_struct_def png_struct;
+ typedef png_struct * png_structp;
+ typedef void ( *png_error_ptr) (png_structp, png_const_charp);
+ typedef void ( *png_longjmp_ptr) (jmp_buf, int);
+ extern __attribute__((__malloc__)) png_structp ( png_create_write_struct) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn) ;
+ extern jmp_buf* ( png_set_longjmp_fn) (png_structp png_ptr, png_longjmp_ptr longjmp_fn, size_t jmp_buf_size) ;
+}
+class PngWriter : public QObject {
+ const QImage *m_out_qimage;
+ QString m_fname;
+ bool writeQImageToPng();
+};
+bool PngWriter::writeQImageToPng() {
+ png_uint_32 width = m_out_qimage->width();
+ png_uint_32 height = m_out_qimage->height();
+ if ( !m_fname.isEmpty() ) {
+ std::vector<char> t(width * height * 4 + (width * height * 4) * 0.1);
+ }
+ png_structp png_ptr = png_create_write_struct ("1.5.13", __null, __null, __null);
+ if (_setjmp ((*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))))) {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57140.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57140.C
new file mode 100644
index 000000000..2ea2f9c4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57140.C
@@ -0,0 +1,186 @@
+// { dg-do compile }
+
+namespace std {
+ typedef long unsigned int size_t;
+ template<typename> class allocator;
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string;
+ typedef basic_string<char> string;
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public:
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+}
+namespace std {
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _CharT, typename _Traits, typename _Alloc> class basic_string {
+ struct _Alloc_hider : _Alloc {
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a) : _Alloc(__a), _M_p(__dat) {
+ }
+ _CharT* _M_p;
+ };
+ mutable _Alloc_hider _M_dataplus;
+ public:
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> inline bool operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const _CharT* __rhs) {
+ }
+}
+extern "C" {
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ namespace __detail {
+ struct _List_node_base {
+ _List_node_base* _M_next;
+ };
+ }
+ template<typename _Tp> struct _List_node : public __detail::_List_node_base {
+ };
+ template<typename _Tp> struct _List_iterator {
+ typedef _List_iterator<_Tp> _Self;
+ typedef _Tp& reference;
+ reference operator*() const {
+ }
+ bool operator!=(const _Self& __x) const {
+ }
+ };
+ template<typename _Tp, typename _Alloc> class _List_base {
+ protected:
+ typedef typename _Alloc::template rebind<_List_node<_Tp> >::other _Node_alloc_type;
+ struct _List_impl : public _Node_alloc_type {
+ __detail::_List_node_base _M_node;
+ _List_impl() : _Node_alloc_type(), _M_node() {
+ }
+ _List_impl(const _Node_alloc_type& __a) : _Node_alloc_type(__a), _M_node() {
+ }
+ };
+ _List_impl _M_impl;
+ ~_List_base() {
+ }
+ void _M_clear();
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class list : protected _List_base<_Tp, _Alloc> {
+ typedef _List_iterator<_Tp> iterator;
+ typedef size_t size_type;
+ public:
+ iterator begin() {
+ }
+ iterator end() {
+ }
+ bool empty() const {
+ }
+ size_type size() const {
+ }
+ void swap(list& __x) {
+ }
+ template<typename _StrictWeakOrdering> void merge(list& __x, _StrictWeakOrdering __comp);
+ template<typename _StrictWeakOrdering> void sort(_StrictWeakOrdering);
+ };
+ template<typename _Tp, typename _Alloc> template <typename _StrictWeakOrdering> void list<_Tp, _Alloc>:: merge(list& __x, _StrictWeakOrdering __comp) {
+ if (this != &__x) {
+ iterator __first1 = begin();
+ iterator __last1 = end();
+ iterator __first2 = __x.begin();
+ iterator __last2 = __x.end();
+ while (__first1 != __last1 && __first2 != __last2) if (__comp(*__first2, *__first1)) {
+ iterator __next = __first2;
+ __first2 = __next;
+ }
+ }
+ }
+ template<typename _Tp, typename _Alloc> template <typename _StrictWeakOrdering> void list<_Tp, _Alloc>:: sort(_StrictWeakOrdering __comp) {
+ if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node && this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node) {
+ list __carry;
+ list __tmp[64];
+ list * __fill = &__tmp[0];
+ list * __counter;
+ do {
+ for(__counter = &__tmp[0];
+ __counter != __fill && !__counter->empty();
+ ++__counter) { __counter->merge(__carry, __comp); __carry.swap(*__counter); }
+ }
+ while ( !empty() );
+ for (__counter = &__tmp[1];
+ __counter != __fill;
+ ++__counter) __counter->merge(*(__counter - 1), __comp);
+ }
+ }
+}
+namespace gloox {
+ class Tag {
+ };
+ class StanzaExtension {
+ };
+}
+namespace gloox {
+}
+using namespace gloox;
+class AbstractPurpleRequest {
+};
+class AdhocCommandHandler : public AbstractPurpleRequest {
+};
+class AdhocTag : public Tag {
+};
+class AbstractConfigInterfaceHandler {
+};
+namespace gloox {
+ class DataFormField {
+ public:
+ const std::string& value() const {
+ }
+ };
+ class DataFormFieldContainer {
+ public:
+ bool hasField( const std::string& field ) const {
+ }
+ DataFormField* field( const std::string& field ) const;
+ };
+ class DataForm : public StanzaExtension, public DataFormFieldContainer {
+ };
+}
+enum {
+ SORT_BY_JID, SORT_BY_UIN, SORT_BY_BUDDIES, };
+struct SortData {
+};
+struct ListData {
+ std::list<SortData> output;
+ int sort_by;
+};
+class AdhocAdmin : public AdhocCommandHandler, public AbstractConfigInterfaceHandler {
+ AdhocTag *handleAdhocTag(Tag *stanzaTag);
+ AdhocTag *handleUnregisterUserForm(Tag *tag, const DataForm &form);
+ AdhocTag *handleListUsersForm(Tag *tag, const DataForm &form);
+ ListData m_listUsersData;
+};
+namespace gloox {
+}
+static bool compareIDataASC(SortData &a, SortData &b) {
+}
+AdhocTag *AdhocAdmin::handleListUsersForm(Tag *tag, const DataForm &form) {
+ ListData &data = m_listUsersData;
+ if (data.output.size() == 0) {
+ if (!form.hasField("users_vip") || !form.hasField("show_jid") || !form.hasField("show_uin") || !form.hasField("show_buddies") || !form.hasField("show_sort_by") || !form.hasField("show_sort_order") || !form.hasField("show_max_per_page") ) {
+ }
+ bool sort_asc = form.field("show_sort_order")->value() == "asc";
+ if (data.sort_by == SORT_BY_BUDDIES) {
+ if (sort_asc) data.output.sort(compareIDataASC);
+ }
+ else {
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57190.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57190.C
new file mode 100644
index 000000000..9fa11cd26
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57190.C
@@ -0,0 +1,42 @@
+// { dg-do compile }
+
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ };
+}
+namespace std {
+ template<typename> class allocator;
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string;
+ typedef basic_string<char> string;
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> class basic_string {
+ public:
+ basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
+ };
+}
+class UIException {
+};
+class PasswordDialog {
+ void run() throw (UIException);
+};
+class MessageBox {
+public:
+ MessageBox (std::string t) throw (UIException);
+ virtual int run() throw (UIException) ;
+};
+extern "C" {
+ struct __jmp_buf_tag {
+ };
+ extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) throw ();
+ typedef struct __jmp_buf_tag sigjmp_buf[1];
+}
+sigjmp_buf password_dialog_sig_jmp_buf;
+void PasswordDialog::run() throw (UIException)
+{
+ __sigsetjmp (password_dialog_sig_jmp_buf, 1);
+ MessageBox* errmsg = __null;
+ errmsg = new MessageBox ("E R R O R");
+ errmsg->run();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57235.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57235.C
new file mode 100644
index 000000000..fd5663348
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57235.C
@@ -0,0 +1,156 @@
+// { dg-do compile }
+
+namespace std
+{
+ template < class _Elem > struct char_traits
+ {
+ };
+ struct _Container_base
+ {
+ };
+ template < class _Ty > struct _Allocator_base
+ {
+ };
+ template < class _Ty > class allocator:public _Allocator_base < _Ty >
+ {
+ };
+ class _String_base:public _Container_base
+ {
+ };
+template < class _Ty, class _Alloc > class _String_val:public _String_base
+ {
+ };
+template < class _Elem, class _Traits, class _Ax > class basic_string:public _String_val < _Elem,
+ _Ax
+ >
+ {
+ public:typedef basic_string < _Elem, _Traits, _Ax > _Myt;
+ typedef _String_val < _Elem, _Ax > _Mybase;
+ basic_string (const _Elem * _Ptr):_Mybase ()
+ {
+ }
+ };
+ typedef basic_string < char, char_traits < char >,
+ allocator < char > >string;
+}
+
+
+namespace google
+{
+ namespace protobuf
+ {
+ namespace internal
+ {
+ template < class C > class scoped_ptr
+ {
+ public:typedef C element_type;
+ explicit scoped_ptr (C * p = __null):ptr_ (p)
+ {
+ }
+ ~scoped_ptr ()
+ {
+ delete ptr_;
+ }
+ C *get () const
+ {
+ return ptr_;
+ }
+ private: C * ptr_;
+ };
+ }
+ using internal::scoped_ptr;
+ enum LogLevel
+ {
+ LOGLEVEL_INFO, LOGLEVEL_WARNING, LOGLEVEL_ERROR, LOGLEVEL_FATAL,
+ LOGLEVEL_DFATAL = LOGLEVEL_ERROR
+ };
+ namespace internal
+ {
+ class LogMessage
+ {
+ public:LogMessage (LogLevel level, const char *filename,
+ int line);
+ ~LogMessage ();
+ LogMessage & operator<< (const std::string & value);
+ };
+ class LogFinisher
+ {
+ public:void operator= (LogMessage & other);
+ };
+ }
+ using namespace std;
+ class Descriptor
+ {
+ };
+ class FieldDescriptor
+ {
+ public:
+ const Descriptor *message_type () const;
+ string DebugString () const;
+ };
+ class MessageLite
+ {
+ };
+ class Message:public MessageLite
+ {
+ public:inline Message ()
+ {
+ }
+ virtual ~ Message ();
+ virtual Message *New () const = 0;
+ };
+ class MessageFactory
+ {
+ };
+ class UnknownFieldSet
+ {
+ };
+ class DynamicMessageFactory:public MessageFactory
+ {
+ public:DynamicMessageFactory ();
+ const Message *GetPrototype (const Descriptor * type);
+ };
+ namespace io
+ {
+ class ErrorCollector
+ {
+ public:inline ErrorCollector ()
+ {
+ }
+ virtual ~ ErrorCollector ();
+ };
+ }
+ class DescriptorBuilder
+ {
+ class OptionInterpreter
+ {
+ bool SetAggregateOption (const FieldDescriptor * option_field,
+ UnknownFieldSet * unknown_fields);
+ DynamicMessageFactory dynamic_factory_;
+ };
+ };
+ namespace
+ {
+ class AggregateErrorCollector:public io::ErrorCollector
+ {
+ };
+ }
+ bool DescriptorBuilder::OptionInterpreter::
+ SetAggregateOption (const FieldDescriptor * option_field,
+ UnknownFieldSet * unknown_fields)
+ {
+ const Descriptor *type = option_field->message_type ();
+ scoped_ptr < Message >
+ dynamic (dynamic_factory_.GetPrototype (type)->New ());
+ !(!(dynamic.get () !=
+ __null)) ? (void) 0 : ::google::protobuf::internal::
+ LogFinisher () =::google::protobuf::internal::LogMessage (::google::
+ protobuf::
+ LOGLEVEL_FATAL,
+ "descriptor.cc",
+ 4396) <<
+ option_field->DebugString ();
+ AggregateErrorCollector collector;
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57499.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57499.C
new file mode 100644
index 000000000..fd985a199
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr57499.C
@@ -0,0 +1,14 @@
+// PR middle-end/57499
+// { dg-do compile }
+
+struct S
+{
+ ~S () __attribute__ ((noreturn)) {} // { dg-warning "function does return" }
+};
+
+void
+foo ()
+{
+ S s;
+ throw 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201.h b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201.h
new file mode 100644
index 000000000..6071ccdf8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201.h
@@ -0,0 +1,24 @@
+class A
+{
+ protected:
+ A();
+ virtual ~A();
+};
+
+class B : virtual public A
+{
+ public:
+ B();
+ virtual ~B();
+};
+
+class C
+{
+ private:
+ class C2 : public B
+ {
+ public:
+ C2();
+ virtual ~C2();
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_0.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_0.C
new file mode 100644
index 000000000..f8fa7173c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_0.C
@@ -0,0 +1,9 @@
+#include "pr58201.h"
+
+C::C2::C2(){ }
+C::C2::~C2() { }
+
+int main ()
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_1.C
new file mode 100644
index 000000000..132cd5a43
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58201_1.C
@@ -0,0 +1,10 @@
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+/* { dg-additional-sources "pr58201_0.C" } */
+#include "pr58201.h"
+
+A::A() { }
+A::~A() { }
+B::B() { }
+B::~B() { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58252.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58252.C
new file mode 100644
index 000000000..d38a7a7ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58252.C
@@ -0,0 +1,142 @@
+// { dg-do compile }
+// { dg-options "-fpermissive" }
+typedef long unsigned int size_t;
+ typedef bool _CORBA_Boolean;
+ typedef unsigned int _CORBA_ULong;
+ template <class T> class _CORBA_Sequence {
+ public: typedef _CORBA_Sequence<T> T_seq;
+ inline T_seq &operator= (const T_seq &s) {
+ for (unsigned long i=0;
+ i < pd_len;
+ i++) {
+ }
+ }
+ _CORBA_ULong pd_len;
+ };
+ template <class T> class _CORBA_Unbounded_Sequence : public _CORBA_Sequence<T> {
+ inline _CORBA_Unbounded_Sequence_WChar() { // { dg-warning "forbids declaration" }
+ }
+ };
+ class _CORBA_ObjRef_Var_base {
+ };
+ template <class T, class T_Helper> class _CORBA_ObjRef_Var : public _CORBA_ObjRef_Var_base {
+ public: typedef T* ptr_t;
+ typedef T* T_ptr;
+ inline _CORBA_ObjRef_Var() : pd_objref(T_Helper::_nil()) {
+ }
+ inline _CORBA_ObjRef_Var(T_ptr p) : pd_objref(p) {
+ }
+ private: T_ptr pd_objref;
+ };
+ class omniLocalIdentity;
+ class omniObjRef {
+ };
+ class omniServant {
+ public: virtual ~omniServant();
+ virtual void* _ptrToInterface(const char* repoId);
+ };
+ namespace CORBA {
+ class NVList {
+ };
+ class Object {
+ };
+ struct StructMember {
+ };
+ class StructMemberSeq : public _CORBA_Unbounded_Sequence< StructMember > {
+ };
+ class _objref_IRObject : public virtual ::CORBA::Object, public virtual omniObjRef {
+ };
+ class _impl_IRObject : public virtual omniServant {
+ };
+ class _objref_Container;
+ typedef _objref_Container* Container_ptr;
+ class _impl_Contained : public virtual _impl_IRObject {
+ };
+ class _objref_ExceptionDef;
+ typedef _objref_ExceptionDef* ExceptionDef_ptr;
+ class ExceptionDef_Helper {
+ public: typedef ExceptionDef_ptr _ptr_type;
+ static _ptr_type _nil();
+ };
+ typedef _CORBA_ObjRef_Var<_objref_ExceptionDef, ExceptionDef_Helper> ExceptionDef_var;
+ class Container {
+ public: typedef Container_ptr _ptr_type;
+ static const char* _PD_repoId;
+ };
+ class _objref_Container : public virtual _objref_IRObject {
+ ExceptionDef_ptr create_exception(const char* id, const char* name, const char* version, const ::CORBA::StructMemberSeq& members);
+ };
+ class _impl_Container : public virtual _impl_IRObject {
+ public: virtual ~_impl_Container();
+ virtual ExceptionDef_ptr create_exception(const char* id, const char* name, const char* version, const ::CORBA::StructMemberSeq& members) = 0;
+ };
+ class _impl_IDLType : public virtual _impl_IRObject {
+ };
+ class _impl_TypedefDef : public virtual _impl_Contained, public virtual _impl_IDLType {
+ };
+ class _impl_StructDef : public virtual _impl_TypedefDef, public virtual _impl_Container {
+ };
+ }
+ namespace PortableServer {
+ class ServantBase : public virtual omniServant {
+ };
+ }
+ namespace POA_CORBA {
+ class IRObject : public virtual CORBA::_impl_IRObject, public virtual ::PortableServer::ServantBase {
+ };
+ class Contained : public virtual CORBA::_impl_Contained, public virtual IRObject {
+ };
+ class Container : public virtual CORBA::_impl_Container, public virtual IRObject {
+ };
+ class IDLType : public virtual CORBA::_impl_IDLType, public virtual IRObject {
+ };
+ class TypedefDef : public virtual CORBA::_impl_TypedefDef, public virtual Contained, public virtual IDLType {
+ };
+ class StructDef : public virtual CORBA::_impl_StructDef, public virtual TypedefDef, public virtual Container {
+ public: virtual ~StructDef();
+ };
+ }
+ namespace omni {
+ class omniOrbPOA;
+ class giopAddress;
+ }
+ class omniCallDescriptor {
+ public: typedef void (*LocalCallFn)(omniCallDescriptor*, omniServant*);
+ inline omniCallDescriptor(LocalCallFn lcfn, const char* op_, int op_len_, _CORBA_Boolean oneway, const char*const* user_excns_, int n_user_excns_, _CORBA_Boolean is_upcall_) : pd_localCall(lcfn), pd_op(op_), pd_oplen(op_len_), pd_user_excns(user_excns_), pd_n_user_excns(n_user_excns_), pd_is_oneway(oneway), pd_is_upcall(is_upcall_), pd_contains_values(0), pd_first_address_used(0), pd_current_address(0), pd_objref(0), pd_poa(0), pd_localId(0), pd_deadline_secs(0), pd_deadline_nanosecs(0) {
+ }
+ private: LocalCallFn pd_localCall;
+ const char* pd_op;
+ size_t pd_oplen;
+ const char*const* pd_user_excns;
+ int pd_n_user_excns;
+ _CORBA_Boolean pd_is_oneway;
+ _CORBA_Boolean pd_is_upcall;
+ _CORBA_Boolean pd_contains_values;
+ const omni::giopAddress* pd_first_address_used;
+ const omni::giopAddress* pd_current_address;
+ omniObjRef* pd_objref;
+ omni::omniOrbPOA* pd_poa;
+ omniLocalIdentity* pd_localId;
+ unsigned long pd_deadline_secs;
+ unsigned long pd_deadline_nanosecs;
+ };
+ class _0RL_cd_7963219a43724a61_f2000000 : public omniCallDescriptor {
+ public: inline _0RL_cd_7963219a43724a61_f2000000(LocalCallFn lcfn,const char* op_,size_t oplen,_CORBA_Boolean upcall=0): omniCallDescriptor(lcfn, op_, oplen, 0, _user_exns, 0, upcall) {
+ }
+ static const char* const _user_exns[];
+ const char* arg_0;
+ const char* arg_1;
+ const char* arg_2;
+ const CORBA::StructMemberSeq* arg_3;
+ CORBA::ExceptionDef_var result;
+ };
+ static void _0RL_lcfn_7963219a43724a61_03000000(omniCallDescriptor* cd, omniServant* svnt) {
+ _0RL_cd_7963219a43724a61_f2000000* tcd = (_0RL_cd_7963219a43724a61_f2000000*)cd;
+ CORBA::_impl_Container* impl = (CORBA::_impl_Container*) svnt->_ptrToInterface(CORBA::Container::_PD_repoId);
+ tcd->result = impl->create_exception(tcd->arg_0, tcd->arg_1, tcd->arg_2, *tcd->arg_3);
+ }
+ CORBA::ExceptionDef_ptr CORBA::_objref_Container::create_exception(const char* id, const char* name, const char* version, const ::CORBA::StructMemberSeq& members) {
+ _0RL_cd_7963219a43724a61_f2000000 _call_desc(_0RL_lcfn_7963219a43724a61_03000000, "create_exception", 17);
+ }
+ POA_CORBA::StructDef::~StructDef() {
+ }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58369.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58369.C
new file mode 100644
index 000000000..9284e2ca7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58369.C
@@ -0,0 +1,109 @@
+// { dg-do compile }
+// Reduced from boost-1.54
+
+int pow(int, int);
+int sqrt(int);
+
+class PolicyA { };
+
+template <class>
+int max_value() { return 0x7fffffff; }
+
+template <class>
+int min_value() { return 1; }
+
+void raise_denorm_error();
+
+template <class T>
+void raise_domain_error(int, int, const T &, const PolicyA &);
+
+template <class>
+int check_overflow(long double p1) {
+ long double __trans_tmp_2 = __builtin_fabsl(p1);
+ if (__trans_tmp_2 > max_value<int>())
+ return 1;
+ return 0;
+}
+
+template <class>
+int check_underflow(long double p1) {
+ if (p1 && (double)p1)
+ return 1;
+ return 0;
+}
+
+template <class>
+int check_denorm(long double p1) {
+ long double __trans_tmp_3 = __builtin_fabsl(p1);
+ if (__trans_tmp_3 < min_value<int>() && (double)p1) {
+ raise_denorm_error();
+ return 1;
+ }
+ return 0;
+}
+
+template <class, class>
+double checked_narrowing_cast(long double p1) {
+ if (check_overflow<int>(p1))
+ return 0;
+ if (check_underflow<int>(p1))
+ return 0;
+ if (check_denorm<int>(p1))
+ return 0;
+ return (double)p1;
+}
+
+long double ellint_rf_imp(long double, long double, long double);
+
+template <typename T, typename Policy>
+T ellint_rj_imp(T p1, T p2, T p3, T p4, Policy &p5) {
+ T value, tolerance, P, S3;
+ if (p4)
+ return 0;
+ if (p3 || p1)
+ raise_domain_error(0, 0, 0, p5);
+ tolerance = pow(0, 0);
+ if (p4) {
+ T q = -p4;
+ {
+ long double q6 = ellint_rj_imp((long double)p1, (long double)(double)p2, (long double)(double)p3, (long double)(int)0, p5);
+ value = checked_narrowing_cast<T, int>(q6);
+ }
+ {
+ long double q7 = ellint_rf_imp((long double)p1, (long double)(double)p2, (long double)(double)p3);
+ value -= checked_narrowing_cast<T, const int>(q7);
+ }
+ value += p1 * p3 + p4 * q;
+ return value;
+ }
+ do {
+ P = p4 / p1;
+ if (0 < tolerance)
+ break;
+ sqrt(p3);
+ } while (1);
+ S3 = P * p2 * 0;
+ value = S3 / p1;
+ return value;
+}
+
+template <typename Policy>
+void ellint_pi_imp4(double, double p3, Policy &p4) {
+ double x, y, z;
+ ellint_rj_imp(x, y, z, p3, p4);
+}
+
+template <typename Policy>
+double ellint_pi_imp5(double, double p3, double p4, Policy &p5) {
+ double x, y, z, p;
+ if (p3 > 0)
+ return 0;
+ ellint_rj_imp(x, y, z, p, p5);
+ ellint_pi_imp4((double)0, p4, p5);
+}
+
+void boost_ellint_3f() {
+ PolicyA p4;
+ ellint_pi_imp5((double)0, (double)0, (double)0, p4);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58380.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58380.C
new file mode 100644
index 000000000..3a6ca9420
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58380.C
@@ -0,0 +1,173 @@
+// { dg-do compile }
+// { dg-options "-w" }
+
+class iplugin_factory;
+class idocument_plugin_factory {
+ virtual idocument_plugin_factory *create_plugin(iplugin_factory &, int &);
+};
+template <typename _Iterator, typename> class __normal_iterator {
+ _Iterator _M_current;
+
+public:
+ _Iterator iterator_type;
+ __normal_iterator(const _Iterator &p1) : _M_current(p1) {}
+ void operator++();
+ _Iterator &base() { return _M_current; }
+};
+
+template <typename _IteratorL, typename _IteratorR, typename _Container>
+int operator!=(__normal_iterator<_IteratorL, _Container> &p1,
+ __normal_iterator<_IteratorR, _Container> &p2) {
+ return p1.base() != p2.base();
+}
+
+class new_allocator {
+public:
+ typedef int *const_pointer;
+ int *allocate();
+};
+template <typename> class allocator : public new_allocator {};
+
+class basic_string {
+public:
+ basic_string(char *);
+};
+struct __uninitialized_copy {
+ template <typename _InputIterator, typename _ForwardIterator>
+ static _ForwardIterator __uninit_copy(_InputIterator p1, _InputIterator p2,
+ _ForwardIterator p3) try {
+ for (; p1 != p2; ++p1, ++p3)
+ ;
+ return p3;
+ }
+ catch (...) {
+ }
+};
+
+template <typename _InputIterator, typename _ForwardIterator>
+_ForwardIterator uninitialized_copy(_InputIterator p1, _InputIterator p2,
+ _ForwardIterator p3) {
+ return __uninitialized_copy::__uninit_copy(p1, p2, p3);
+}
+
+template <typename _InputIterator, typename _ForwardIterator, typename _Tp>
+_ForwardIterator __uninitialized_copy_a(_InputIterator p1, _InputIterator p2,
+ _ForwardIterator p3, allocator<_Tp> &) {
+ return uninitialized_copy(p1, p2, p3);
+}
+
+struct _Vector_base {
+ struct _Vector_impl : allocator<int> {
+ int *_M_start;
+ int *_M_finish;
+ };
+ allocator<int> &_M_get_Tp_allocator() {}
+ _Vector_base() {}
+ _Vector_base(int p1) { _M_create_storage(p1); }
+ _Vector_impl _M_impl;
+ int *_M_allocate(int p1) { p1 ? _M_impl.allocate() : 0; }
+ void _M_create_storage(int p1) {
+ this->_M_impl._M_start = this->_M_allocate(p1);
+ }
+};
+
+class vector : _Vector_base {
+ _Vector_base _Base;
+
+public:
+ vector() {}
+ vector(const vector &p1) : _Base(p1.size()) {
+ this->_M_impl._M_finish = __uninitialized_copy_a(
+ p1.begin(), p1.end(), this->_M_impl._M_start, _M_get_Tp_allocator());
+ }
+ ~vector();
+ __normal_iterator<typename allocator<int>::const_pointer, int> begin() const {
+ return this->_M_impl._M_start;
+ }
+ __normal_iterator<typename allocator<int>::const_pointer, int> end() const {
+ return this->_M_impl._M_finish;
+ }
+ int size() const { return this->_M_impl._M_finish - this->_M_impl._M_start; }
+};
+class iplugin_factory {
+public:
+ typedef enum {
+ STABLE,
+ EXPERIMENTAL
+ } quality_t;
+};
+class plugin_factory : public iplugin_factory {
+public:
+ plugin_factory(const int &, const basic_string &, const basic_string &,
+ const basic_string &, quality_t);
+};
+template <typename plugin_t>
+class document_plugin_factory : plugin_factory, idocument_plugin_factory {
+public:
+ document_plugin_factory(const int &p1, const basic_string &,
+ const basic_string &, const basic_string &, quality_t)
+ : plugin_factory(0, 0, 0, 0, STABLE) {}
+ idocument_plugin_factory *create_plugin(iplugin_factory &p1, int &p2) {
+ plugin_t(p1, p2);
+ }
+};
+
+class container {
+public:
+ template <typename init_t> container(init_t &);
+};
+template <class init_t> class initializer_t : init_t {
+public:
+ initializer_t(const init_t &p1) : init_t(p1) {}
+};
+
+class composition_t {};
+template <typename lhs_t, typename rhs_t>
+const initializer_t<composition_t> operator+(const initializer_t<lhs_t> &,
+ const initializer_t<rhs_t> &);
+template <typename value_t> class value_initializer_t {
+public:
+ value_initializer_t(const value_t &p1) : m_value(p1) {}
+ value_t m_value;
+};
+
+template <typename value_t>
+initializer_t<value_initializer_t<value_t> > init_value(const value_t &p1) {
+ initializer_t<value_initializer_t<value_t> >(
+ value_initializer_t<value_t>(p1));
+}
+
+class name_t {};
+class label_t {};
+class description_t {};
+class owner_initializer_t {};
+template <typename owner_t>
+initializer_t<owner_initializer_t> init_owner(owner_t &);
+class set : vector {};
+class node {
+public:
+ node(iplugin_factory &, int &);
+};
+initializer_t<name_t> init_name();
+initializer_t<label_t> init_label();
+initializer_t<description_t> init_description();
+template <typename base_t> class mesh_selection_sink : base_t {
+public:
+ mesh_selection_sink(iplugin_factory &p1, int &p2)
+ : base_t(p1, p2),
+ m_mesh_selection(init_owner(*this) + init_name() + init_label() +
+ init_description() + init_value(set())) {}
+ container m_mesh_selection;
+};
+
+class selection_to_stdout : mesh_selection_sink<node> {
+public:
+ selection_to_stdout(iplugin_factory &p1, int &p2)
+ : mesh_selection_sink(p1, p2) {}
+ static iplugin_factory &get_factory() {
+ document_plugin_factory<selection_to_stdout>(0, "", 0, "",
+ iplugin_factory::EXPERIMENTAL);
+ }
+};
+
+void selection_to_stdout_factory() { selection_to_stdout::get_factory(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58464.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58464.C
new file mode 100644
index 000000000..3d9a2279d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58464.C
@@ -0,0 +1,268 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *memcpy(void *, const void *, size_t);
+void *xmalloc(size_t);
+enum {
+ _sch_isdigit, _sch_isidst, _sch_isidnum
+};
+extern const unsigned _sch_istable[256];
+typedef struct ht cpp_hash_table;
+typedef struct ht_identifier *hashnode;
+enum ht_lookup_option {
+ HT_NO_INSERT
+};
+struct ht {
+ struct cpp_reader *pfile;
+};
+hashnode ht_lookup_with_hash(cpp_hash_table *, unsigned char *, size_t, unsigned, ht_lookup_option);
+typedef unsigned source_location;
+enum cpp_ttype {
+ CPP_OTHER, CPP_STRING, CPP_STRING16, CPP_UTF8STRING
+};
+struct cpp_token {
+ source_location src_loc;
+};
+typedef int cppchar_t;
+struct cpp_options {
+ char user_literals;
+ unsigned warn_literal_suffix;
+};
+enum node_type { };
+struct cpp_hashnode {
+ node_type type:6;
+};
+enum {
+ CPP_DL_ERROR
+};
+enum {
+ CPP_W_LITERAL_SUFFIX
+};
+bool cpp_error_with_line(cpp_reader *, int, source_location, unsigned, ...);
+bool cpp_warning_with_line(cpp_reader *, int, source_location, unsigned, const char *);
+cpp_ttype cpp_userdef_string_add_type(cpp_ttype);
+cpp_ttype cpp_userdef_char_add_type(cpp_ttype);
+typedef unsigned char uchar;
+struct _cpp_buff {
+ _cpp_buff *next;
+ unsigned char *base, *cur, *limit;
+};
+_cpp_buff *_cpp_get_buff(cpp_reader *, size_t);
+void _cpp_release_buff(cpp_reader *, _cpp_buff *);
+unsigned char *_cpp_unaligned_alloc(cpp_reader *, size_t);
+struct lexer_state {
+ unsigned skipping;
+ unsigned angled_headers;
+};
+struct _cpp_line_note {
+ unsigned pos;
+ unsigned type;
+};
+struct cpp_buffer {
+ unsigned char *cur;
+ unsigned char *line_base;
+ _cpp_line_note *notes;
+ unsigned cur_note;
+};
+struct cpp_reader {
+ cpp_buffer *buffer;
+ lexer_state state;
+ _cpp_buff *u_buff;
+ _cpp_buff *free_buffs;
+ ht *hash_table;
+ cpp_options opts;
+};
+static void create_literal(cpp_reader *pfile, cpp_token *, uchar *, unsigned len, cpp_ttype type)
+{
+ uchar *dest = _cpp_unaligned_alloc(pfile, len + 1);
+ dest[len] = type;
+}
+static void bufring_append(cpp_reader *pfile, uchar *base, size_t len, _cpp_buff **first_buff_p, _cpp_buff **last_buff_p)
+{
+ _cpp_buff *first_buff = *first_buff_p;
+ _cpp_buff *last_buff = *last_buff_p;
+ if (!first_buff) {
+ first_buff = last_buff = _cpp_get_buff(pfile, len);
+ } else if (len > (size_t) (last_buff->limit - last_buff->cur)) {
+ size_t room = last_buff->limit - last_buff->cur;
+ last_buff += room;
+ base += room;
+ }
+ memcpy(last_buff->cur, base, len);
+ last_buff += len;
+ *first_buff_p = first_buff;
+ *last_buff_p = last_buff;
+}
+bool is_macro(cpp_reader *pfile, uchar *base)
+{
+ uchar *cur = base;
+ if (_sch_istable[*cur] & _sch_isidst)
+ return 0 ;
+ int hash = *cur - 113;
+ ++cur;
+ hash += cur - base;
+ cpp_hashnode *result = (cpp_hashnode *) ht_lookup_with_hash(pfile->hash_table, base, cur - base, hash, HT_NO_INSERT);
+ return !result ? 0 : result->type;
+}
+static void lex_raw_string(cpp_reader *pfile, cpp_token *token, uchar *base, uchar *cur)
+{
+ uchar raw_prefix[17];
+ uchar temp_buffer[18];
+ uchar *orig_base;
+ unsigned raw_prefix_len = 0, raw_suffix_len;
+ enum raw_str_phase { RAW_STR_PREFIX, RAW_STR };
+ raw_str_phase phase = RAW_STR_PREFIX;
+ cpp_ttype type;
+ size_t total_len;
+ size_t temp_buffer_len = 0;
+ _cpp_buff *first_buff = 0, *last_buff = 0;
+ size_t raw_prefix_start;
+ _cpp_line_note *note = &pfile->buffer->notes[pfile->buffer->cur_note];
+ raw_prefix_start = cur - base;
+ for (;;) {
+ cppchar_t c;
+ while (note->pos)
+ ++note;
+ for (; note->pos; ++note) {
+ switch (note->type) {
+ case ' ':
+ bufring_append(pfile, base, cur - base, &first_buff, &last_buff);
+ base = cur;
+ bufring_append(pfile, (uchar *) "\\", 1, &first_buff, &last_buff);
+ if (__builtin_expect(temp_buffer_len < 17, 0) && base) {
+ memcpy(temp_buffer + temp_buffer_len, "\\", 1);
+ temp_buffer_len++;
+ }
+ if (note->type) {
+ if (__builtin_expect(temp_buffer_len < 17, 0)) {
+ memcpy(temp_buffer + temp_buffer_len, " ", 1);
+ temp_buffer_len++;
+ }
+ }
+ bufring_append(pfile, (uchar *) "\n", 1, &first_buff, &last_buff);
+ memcpy(temp_buffer + temp_buffer_len, "\n", 1);
+ temp_buffer_len++;
+ }
+ }
+ temp_buffer[temp_buffer_len++] = c;
+ if (phase == RAW_STR_PREFIX) {
+ while (raw_prefix_len < temp_buffer_len) {
+ switch (raw_prefix[raw_prefix_len]) {
+ case '\'':
+ raw_prefix_len++;
+ }
+ if (raw_prefix[raw_prefix_len]) {
+ int col = cur - pfile->buffer->line_base + 1;
+ if (raw_prefix_len)
+ cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col);
+ else if (raw_prefix[raw_prefix_len] == '\n')
+ cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col);
+ else
+ cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col, (size_t) raw_prefix);
+ pfile->buffer->cur = orig_base + 1;
+ create_literal(pfile, token, orig_base, raw_prefix_start, CPP_OTHER);
+ _cpp_release_buff(pfile, first_buff);
+ return;
+ }
+ phase = RAW_STR;
+ }
+ continue;
+ (void) raw_suffix_len;
+ }
+ while (_sch_istable[*cur] & _sch_isidnum)
+ ++cur;
+ }
+ create_literal(pfile, token, base, cur - base, type);
+ uchar *dest = _cpp_unaligned_alloc(pfile, total_len + (cur - base));
+ dest[cur - base] = '\0';
+}
+void lex_string(cpp_reader *pfile, cpp_token *token, uchar *base)
+{
+ bool saw_NUL = 0;
+ uchar *cur;
+ cppchar_t terminator;
+ cpp_ttype type;
+ cur = base;
+ terminator = *cur++;
+ if (terminator == 'L' || terminator == 'U') {
+ terminator = *cur++;
+ } else if (terminator == 'u') {
+ terminator = *cur++;
+ if (terminator == '8')
+ terminator = *cur++;
+ }
+ if (terminator == 'R') {
+ lex_raw_string(pfile, token, base, cur);
+ return;
+ }
+ if (terminator)
+ type = base ? (base[1] ? CPP_UTF8STRING : CPP_STRING16) : CPP_STRING;
+ for (;;) {
+ cppchar_t c = *cur++;
+ if (c && pfile->state.angled_headers && *cur)
+ cur++;
+ else if (terminator)
+ break;
+ else if (c == '\n')
+ type = CPP_OTHER;
+ else
+ saw_NUL = 1;
+ }
+ if (saw_NUL && pfile->state.skipping)
+ if (pfile->opts.user_literals) {
+ if (is_macro(pfile, cur))
+ if (pfile->opts.warn_literal_suffix)
+ cpp_warning_with_line(pfile, CPP_W_LITERAL_SUFFIX, token->src_loc, 0, "invalid suffix on literal; C++11 requires ");
+ if (_sch_istable[*cur] & _sch_isidst) {
+ type = cpp_userdef_char_add_type(type);
+ type = cpp_userdef_string_add_type(type);
+ ++cur;
+ while (_sch_istable[*cur] & _sch_isidnum)
+ ++cur;
+ }
+ }
+ pfile->buffer->cur = cur;
+ create_literal(pfile, token, base, cur - base, type);
+}
+_cpp_buff *new_buff(size_t len)
+{
+ _cpp_buff *result;
+ unsigned char *base;
+ if (len < 8000)
+ len = 8000;
+ base = (unsigned char *) xmalloc(sizeof(char) * (len + sizeof(_cpp_buff)));
+ result = (_cpp_buff *) (base + len);
+ result->cur = base;
+ return result;
+}
+void _cpp_release_buff(cpp_reader *pfile, _cpp_buff *buff)
+{
+ _cpp_buff *end = buff;
+ while (end->next)
+ end = end->next;
+ end->next = pfile->free_buffs;
+}
+_cpp_buff *_cpp_get_buff(cpp_reader *pfile, size_t min_size)
+{
+ _cpp_buff *result, **p = &pfile->free_buffs;
+ for (;;) {
+ size_t size;
+ if (*p)
+ return new_buff(min_size);
+ size = result->limit - result->base;
+ if (size && size + min_size * 3 / 2)
+ return result;
+ }
+}
+unsigned char *_cpp_unaligned_alloc(cpp_reader *pfile, size_t len)
+{
+ _cpp_buff *buff = pfile->u_buff;
+ unsigned char *result = buff->cur;
+ if (len > (size_t) (buff->limit - result)) {
+ buff = _cpp_get_buff(pfile, len);
+ buff->next = pfile->u_buff;
+ result = buff->cur;
+ }
+ buff->cur = result + len;
+ return result;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58552.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58552.C
new file mode 100644
index 000000000..17c0d1cf6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58552.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-additional-options "-fcompare-debug" }
+
+extern void fancy_abort () __attribute__ ((__noreturn__));
+extern "C" {
+ struct __jmp_buf_tag { };
+ typedef struct __jmp_buf_tag jmp_buf[1];
+ extern int _setjmp (struct __jmp_buf_tag __env[1]) throw ();
+}
+extern void *gfc_state_stack;
+static jmp_buf eof_buf;
+static void push_state ()
+{
+ if (!gfc_state_stack)
+ fancy_abort ();
+}
+bool gfc_parse_file (void)
+{
+ int seen_program=0;
+ if (_setjmp (eof_buf))
+ return false;
+ if (seen_program)
+ goto duplicate_main;
+ seen_program = 1;
+ push_state ();
+ push_state ();
+duplicate_main:
+ return true;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58555.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58555.C
new file mode 100644
index 000000000..ac5009a7b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58555.C
@@ -0,0 +1,114 @@
+/* { dg-do compile } */
+template <typename _Tp> _Tp *__addressof(_Tp &) {}
+template <typename _Tp> class A {
+public:
+ typedef _Tp *pointer;
+};
+template <typename _Tp> class M : public A<_Tp> {
+public:
+ typedef M other;
+ ~M();
+};
+class B {
+public:
+ B(int *);
+};
+class C {
+public:
+ void GetNext();
+ C *GetChildren();
+};
+template <typename _Tp> void _Destroy(_Tp *p1) { p1->~_Tp(); }
+struct D {
+ template <typename _ForwardIterator>
+ static void __destroy(_ForwardIterator p1, _ForwardIterator p2) {
+ for (; p1 != p2; ++p1)
+ _Destroy(__addressof(*p1));
+ }
+};
+template <typename _ForwardIterator>
+void _Destroy(_ForwardIterator p1, _ForwardIterator p2) {
+ D::__destroy(p1, p2);
+}
+template <typename _ForwardIterator, typename _Tp>
+void _Destroy(_ForwardIterator p1, _ForwardIterator p2, M<_Tp> &) {
+ _Destroy(p1, p2);
+}
+template <typename _Alloc> struct F {
+ typedef _Alloc _Tp_alloc_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ struct N : _Tp_alloc_type {
+ pointer _M_start;
+ pointer _M_finish;
+ };
+ _Tp_alloc_type &_M_get_Tp_allocator();
+ N _M_impl;
+};
+template <typename _Tp, typename _Alloc = M<_Tp> > class O : F<_Alloc> {
+using F<_Alloc>::_M_get_Tp_allocator;
+public:
+ ~O() {
+ _Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
+ _M_get_Tp_allocator());
+ }
+};
+template <class T> void checked_delete(T *p1) { delete p1; }
+template <class> class I;
+template <class T> struct J {
+ typedef T *type;
+};
+class K;
+class L {
+public:
+ virtual ~L();
+};
+class P : L {
+ O<I<int> > databasesM;
+ O<I<K> > usersM;
+public:
+ I<int> addDatabase();
+};
+C a;
+C *b;
+int atomic_exchange_and_add();
+class G {
+public:
+ virtual void dispose() = 0;
+ void release() {
+ if (atomic_exchange_and_add() == 1)
+ dispose();
+ }
+};
+class Q : G {
+ P *px_;
+ Q() {}
+ void dispose() { checked_delete(px_); }
+};
+class H {
+ G *pi_;
+public:
+ H();
+ H(P *);
+ ~H() {
+ if (pi_)
+ pi_->release();
+ }
+};
+template <class T, class Y> void sp_pointer_construct(I<T> *, Y, H);
+template <class T> class I {
+public:
+ typedef T element_type;
+ template <class Y> I(Y *p1) { sp_pointer_construct(this, 0, 0); }
+ typename J<T>::type operator->();
+ H pn;
+};
+void getNodeContent(const B &) {
+ for (C *n = a.GetChildren(); n; n->GetNext())
+ ;
+}
+void parseDatabase(I<P> p1) {
+ I<int> c = p1->addDatabase();
+ for (; b;)
+ getNodeContent(0);
+}
+void addServer() { I<int>(new P); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58585.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58585.C
new file mode 100644
index 000000000..69fcf04dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr58585.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-fpic" { target fpic } }
+struct A
+{
+ virtual void foo() {}
+ void bar();
+};
+void A::bar() { foo(); }
+
+struct B : virtual A
+{
+ virtual void foo() {}
+ char c;
+};
+
+struct C : virtual B
+{
+ C();
+};
+C::C() { bar(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59163.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59163.C
new file mode 100644
index 000000000..2f9a99970
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59163.C
@@ -0,0 +1,30 @@
+// PR target/59163
+// { dg-do run }
+
+struct A { float a[4]; };
+struct B { int b; A a; };
+
+__attribute__((noinline, noclone)) void
+bar (A &a)
+{
+ if (a.a[0] != 36.0f || a.a[1] != 42.0f || a.a[2] != 48.0f || a.a[3] != 54.0f)
+ __builtin_abort ();
+}
+
+__attribute__((noinline, noclone)) void
+foo (A &a)
+{
+ int i;
+ A c = a;
+ for (i = 0; i < 4; i++)
+ c.a[i] *= 6.0f;
+ a = c;
+ bar (a);
+}
+
+int
+main ()
+{
+ B b = { 5, { 6, 7, 8, 9 } };
+ foo (b.a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59208.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59208.C
new file mode 100644
index 000000000..3dc110c55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59208.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+class A {
+public:
+ A();
+ A(int *);
+};
+class B {};
+class C : B {
+public:
+ virtual void m_fn1();
+ void operator+=(int) { m_fn1(); }
+};
+enum DebuggerType {};
+C a;
+DebuggerType b;
+void operator==(A &, const A &);
+static A get_dbx_doc(A &p1) { p1 == 0; }
+
+void add_button() {
+ A c;
+ switch (b)
+ case 0:
+ get_dbx_doc(c);
+ a += 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59226.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59226.C
new file mode 100644
index 000000000..cb0ebbe35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59226.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+struct A
+{
+ virtual void foo() {}
+};
+
+struct B
+{
+ virtual void foo() {}
+};
+
+struct C : virtual A {};
+
+struct D : virtual A, B
+{
+ virtual void foo() {}
+};
+
+struct E : C, D
+{
+ virtual void foo() {}
+};
+
+void bar(A* p)
+{
+ p->foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59265.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59265.C
new file mode 100644
index 000000000..be4c6e1e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59265.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-fprofile-use" }
+
+class A {
+ int m_fn1() const;
+ unsigned m_fn2() const;
+};
+class B {
+public:
+ virtual void m_fn1();
+};
+class C final : B {
+ C();
+ virtual void m_fn2() { m_fn1(); }
+};
+int a;
+unsigned A::m_fn2() const {
+ if (m_fn1())
+ return 0;
+ a = m_fn2();
+}
+C::C() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59775.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59775.C
new file mode 100644
index 000000000..10c497587
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59775.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+struct A
+{
+ virtual void foo () = 0;
+ void bar () { foo (); }
+ bool a;
+};
+struct B : public virtual A
+{
+ virtual void foo ();
+};
+struct C : public B
+{
+ C ();
+};
+void
+baz ()
+{
+ C c;
+ c.bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59822.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59822.C
new file mode 100644
index 000000000..7357b6dc3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59822.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+typedef struct rtvec_def *rtvec;
+enum machine_mode { VOIDmode };
+struct rtvec_def { void *elem[1]; };
+extern void *const_tiny_rtx[2];
+void
+ix86_build_const_vector (enum machine_mode mode, bool vect,
+ void *value, rtvec v, int n_elt)
+{
+ int i;
+ for (i = 1; i < n_elt; ++i)
+ ((v)->elem[i]) = vect ? value : (const_tiny_rtx[(int) (mode)]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59882.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59882.C
new file mode 100644
index 000000000..b61f24703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59882.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+class A;
+class B {};
+struct C {
+ virtual void dispatch();
+ int traversal_map_;
+};
+template <typename> class F : public virtual C {};
+
+struct I : F<A>, F<int> {};
+struct J : B, I {};
+class D {};
+struct L {
+ L(D &, int &p2) : map_(p2) {}
+ virtual void traverse(int &p1) {
+ int &s = p1;
+ names<L>(s, names_);
+ }
+ int &map_;
+ J names_;
+ template <typename> void names(int &, C &p2) { p2.dispatch(); }
+};
+
+struct G : D {
+ G(D &, int &p2) : map_(p2) { L(*this, map_); }
+ int &map_;
+};
+
+int a;
+void fn1(D &p1) { G(p1, a); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59918.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59918.C
new file mode 100644
index 000000000..b30d33eb3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr59918.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+struct E {
+ ~E();
+ virtual void f() const;
+};
+struct B : E {};
+struct G : virtual B {};
+struct A {
+ virtual ~A();
+};
+struct J : E {
+ void f() const {
+ E *p = 0;
+ p->f();
+ }
+};
+J h;
+struct I : A, G, virtual B {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60058.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60058.C
new file mode 100644
index 000000000..1144137cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60058.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+
+typedef enum {} UErrorCode;
+class A {
+public:
+ virtual A &m_fn1(A &, const A &, UErrorCode &) const;
+ void m_fn2();
+ A();
+ A(int);
+};
+class __attribute__((visibility("hidden"))) B : public A {
+public:
+ B(A &p1) : norm2(p1), set(0) {}
+ A &m_fn1(A &, const A &, UErrorCode &) const;
+ A &norm2;
+ const int &set;
+};
+
+UErrorCode a;
+A c;
+void fn1(A *p1) {
+ A b;
+ p1->m_fn1(b, 0, a).m_fn2();
+}
+
+void fn2() {
+ B d(c);
+ fn1(&d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60131.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60131.C
new file mode 100644
index 000000000..23dde316d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60131.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+struct A { short a; };
+int **b;
+unsigned long c;
+
+bool foo ();
+unsigned bar (unsigned i);
+extern void baz () __attribute__((noreturn));
+
+int *
+test (unsigned x, struct A *y)
+{
+ unsigned v;
+ if (foo () || y[x].a == -1)
+ {
+ c = bar (x);
+ return 0;
+ }
+ v = y[x].a;
+ if (v >= 23)
+ baz ();
+ return b[v];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-1.C
new file mode 100644
index 000000000..748295aab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-fomit-frame-pointer" }
+
+struct A { int a; };
+struct B { A foo (); };
+struct C { B *foo (); };
+int foo (struct C *, float);
+void bar (struct C *);
+void baz (struct A *);
+int a, b, c;
+
+int
+foo (struct C *y, float x)
+{
+ struct A d;
+ if (c)
+ bar (y);
+ else
+ {
+ C g;
+ g.foo ()->foo ();
+ a = b;
+ d.a = (int) (b * x);
+ }
+ baz (&d);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-2.C
new file mode 100644
index 000000000..b32576f67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60438-2.C
@@ -0,0 +1,3 @@
+// { dg-do compile }
+// { dg-options "-fomit-frame-pointer -fno-crossjumping" }
+#include "pr60438-1.C"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60474.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60474.C
new file mode 100644
index 000000000..4b9fbe656
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60474.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+struct Layer;
+template <typename> struct A
+{
+ Layer *m_fn1 ();
+ Layer &operator[](int p1) { return m_fn1 ()[p1]; }
+};
+struct Layer
+{
+};
+void fn1 (A<int> &p1, int Layer::*p2, int p3)
+{
+ for (int a = 0;; ++a, ++p3)
+ p1[p3].*p2 = p1[a].*p2;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/predcom-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/predcom-1.C
new file mode 100644
index 000000000..9e9a4b38c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/predcom-1.C
@@ -0,0 +1,29 @@
+/* Test for ICE in predictive commoning with empty loop header block
+ on arm-none-linux-*. */
+
+struct Foo
+{
+ double *ptr;
+
+ Foo (double *ptr_)
+ : ptr (ptr_)
+ {
+ }
+
+ Foo PostInc ()
+ {
+ return Foo (ptr++);
+ }
+};
+
+bool Baz (Foo first, double *last)
+{
+ Foo prev (first.ptr);
+
+ first.ptr++;
+
+ while (first.ptr != last)
+ if (*first.PostInc ().ptr < *prev.PostInc ().ptr)
+ return false;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pushpop_macro.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pushpop_macro.C
new file mode 100644
index 000000000..98065e6ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pushpop_macro.C
@@ -0,0 +1,19 @@
+/* Do the preprocessor push_macro/pop_macro test. */
+
+/* { dg-do run } */
+
+extern "C" void abort ();
+
+#define _ 2
+#pragma push_macro("_")
+#undef _
+#define _ 1
+#pragma pop_macro("_")
+
+int main ()
+{
+ if (_ != 2)
+ abort ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/check.h b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/check.h
new file mode 100644
index 000000000..af1988512
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/check.h
@@ -0,0 +1,36 @@
+#include <stddef.h>
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" void abort (void);
+#else
+extern void abort (void);
+#endif
+
+int
+check_int (int *i, int align)
+{
+ *i = 20;
+ if ((((ptrdiff_t) i) & (align - 1)) != 0)
+ {
+#ifdef DEBUG
+ printf ("\nUnalign address (%d): %p!\n", align, i);
+#endif
+ abort ();
+ }
+ return *i;
+}
+
+void
+check (void *p, int align)
+{
+ if ((((ptrdiff_t) p) & (align - 1)) != 0)
+ {
+#ifdef DEBUG
+ printf ("\nUnalign address (%d): %p!\n", align, p);
+#endif
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C
new file mode 100644
index 000000000..89b0a6a67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+void
+bar (char *p, int size)
+{
+ __builtin_strncpy (p, "good", size);
+}
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void
+foo (int size) throw (B,A)
+{
+ char *p = (char*) __builtin_alloca (size + 1);
+ aligned i;
+
+ bar (p, size);
+ if (__builtin_strncmp (p, "good", size) != 0)
+ {
+#ifdef DEBUG
+ p[size] = '\0';
+ printf ("Failed: %s != good\n", p);
+#endif
+ abort ();
+ }
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (5); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C
new file mode 100644
index 000000000..2c24ea3bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C
@@ -0,0 +1,43 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+__attribute__ ((fastcall))
+void
+foo (int j, int k, int m, int n, int o) throw (B,A)
+{
+ aligned i;
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ if (i != 20 || j != 1 || k != 2 || m != 3 || n != 4 || o != 5)
+ abort ();
+
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (1, 2, 3, 4, 5); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C
new file mode 100644
index 000000000..cc05ed04f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void
+foo (void) throw (B,A)
+{
+ aligned i;
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C
new file mode 100644
index 000000000..d2555f2e2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+static void
+inline __attribute__((always_inline))
+foo (void) throw (B,A)
+{
+ aligned i;
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C
new file mode 100644
index 000000000..1cbc68cc4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C
@@ -0,0 +1,58 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+void
+bar (char *p, int size)
+{
+ __builtin_strncpy (p, "good", size);
+}
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+static void
+inline __attribute__((always_inline))
+foo (int size) throw (B,A)
+{
+ char *p = (char *) __builtin_alloca (size + 1);
+ aligned i;
+
+ bar (p, size);
+ if (__builtin_strncmp (p, "good", size) != 0)
+ {
+#ifdef DEBUG
+ p[size] = '\0';
+ printf ("Failed: %s != good\n", p);
+#endif
+ abort ();
+ }
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (5); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C
new file mode 100644
index 000000000..403497a9a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C
@@ -0,0 +1,43 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+__attribute__ ((thiscall))
+void
+foo (int j, int k, int m, int n, int o) throw (B,A)
+{
+ aligned i;
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ if (i != 20 || j != 1 || k != 2 || m != 3 || n != 4 || o != 5)
+ abort ();
+
+ throw A();
+}
+
+int
+main()
+{
+ try { foo (1, 2, 3, 4, 5); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C
new file mode 100644
index 000000000..b9ba81b12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C
@@ -0,0 +1,73 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include <stdarg.h>
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+void
+bar (char *p, int size)
+{
+ __builtin_strncpy (p, "good", size);
+}
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void
+foo (const char *fmt, ...) throw (B,A)
+{
+ va_list arg;
+ char *p;
+ aligned i;
+ int size;
+ double x;
+
+ va_start (arg, fmt);
+ size = va_arg (arg, int);
+ if (size != 5)
+ abort ();
+ p = (char *) __builtin_alloca (size + 1);
+
+ x = va_arg (arg, double);
+ if (x != 5.0)
+ abort ();
+
+ bar (p, size);
+ if (__builtin_strncmp (p, "good", size) != 0)
+ {
+#ifdef DEBUG
+ p[size] = '\0';
+ printf ("Failed: %s != good\n", p);
+#endif
+ abort ();
+ }
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ throw A();
+
+ va_end (arg);
+}
+
+int
+main()
+{
+ try { foo ("foo", 5, 5.0); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C
new file mode 100644
index 000000000..5e282179c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C
@@ -0,0 +1,79 @@
+/* { dg-options "-Wno-abi" {target arm_eabi} } */
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include <stdarg.h>
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int aligned __attribute__((aligned(ALIGNMENT)));
+
+int global;
+
+void
+bar (char *p, int size)
+{
+ __builtin_strncpy (p, "good", size);
+}
+
+class Base {};
+
+struct A : virtual public Base
+{
+ A() {}
+};
+
+struct B {};
+
+void
+test (va_list arg) throw (B,A)
+{
+ char *p;
+ aligned i;
+ int size;
+ double x;
+
+ size = va_arg (arg, int);
+ if (size != 5)
+ abort ();
+
+ p = (char *) __builtin_alloca (size + 1);
+
+ x = va_arg (arg, double);
+ if (x != 5.0)
+ abort ();
+
+ bar (p, size);
+ if (__builtin_strncmp (p, "good", size) != 0)
+ {
+#ifdef DEBUG
+ p[size] = '\0';
+ printf ("Failed: %s != good\n", p);
+#endif
+ abort ();
+ }
+
+ if (check_int (&i, __alignof__(i)) != i)
+ abort ();
+
+ throw A();
+}
+
+void
+foo (const char *fmt, ...)
+{
+ va_list arg;
+ va_start (arg, fmt);
+ test (arg);
+ va_end (arg);
+}
+int
+main()
+{
+ try { foo ("foo", 5, 5.0); }
+ catch (A& a) { }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp
new file mode 100644
index 000000000..ad08fc08a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp
@@ -0,0 +1,57 @@
+# Copyright (C) 2008-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# This harness is for tests that should be run at all optimisation levels.
+
+load_lib g++-dg.exp
+load_lib torture-options.exp
+
+global DG_TORTURE_OPTIONS LTO_TORTURE_OPTIONS
+
+dg-init
+torture-init
+
+# default_flags are replaced by a dg-options test directive, or appended
+# to by using dg-additional-options. Use default_flags for options that
+# are used in all of the torture sets to limit the amount of noise in
+# test summaries.
+set default_flags ""
+
+# torture_flags are combined with other torture options and do not
+# affect options specified within a test.
+set torture_flags ""
+
+set stackalign_options [list]
+
+# If automatic stack alignment is supported, force it on.
+if { [check_effective_target_automatic_stack_alignment] } then {
+ append default_flags " -mstackrealign"
+ append default_flags " -mpreferred-stack-boundary=5"
+}
+lappend stackalign_options [join $torture_flags]
+
+if { [check_effective_target_fpic] } then {
+ lappend torture_flags "-fpic"
+ lappend stackalign_options [join $torture_flags]
+}
+
+# Combine stackalign options with the usual torture optimization flags.
+set-torture-options [concat $DG_TORTURE_OPTIONS $LTO_TORTURE_OPTIONS] $stackalign_options
+
+gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "$default_flags"
+
+torture-finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C
new file mode 100644
index 000000000..18c02be09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+// This case is to detect an assertion failure in stack branch development.
+
+bool f();
+struct S {
+ __attribute__ ((stdcall)) ~S();
+};
+void g() {
+ for (;;) {
+ S s1, s2, s3;
+ if (f())
+ continue;
+ if (f())
+ return;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h
new file mode 100644
index 000000000..ff5602784
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h
@@ -0,0 +1,142 @@
+#include "check.h"
+
+
+#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname)
+#define ASMNAME2(prefix, cname) STRING (prefix) cname
+#define STRING(x) #x
+
+#ifdef __cplusplus
+extern "C" void abort (void);
+#else
+extern void abort (void);
+#endif
+
+extern void foo(void);
+
+#define INIT_EDI 1
+#define INIT_ESI 2
+#define INIT_EBX 3
+
+/* Set DI/SI/BX to wrong value
+ Use following template so that RA will save/restore callee
+ save registers in prologue/epilogue */
+#define ALTER_REGS() \
+ { \
+ int dummy; \
+ __asm__ __volatile__ (\
+ "movl %1, %0" : "=D" (dummy) : "i" (-INIT_EDI)\
+ );\
+ __asm__ __volatile__ (\
+ "movl %1, %0" : "=S" (dummy) : "i" (-INIT_ESI)\
+ );\
+ __asm__ __volatile__ (\
+ "movl %1, %0" : "=b" (dummy) : "i" (-INIT_EBX)\
+ );\
+ }
+
+#if defined __PIC__ || defined __USING_SJLJ_EXCEPTIONS__
+int
+main ()
+{
+ return 0;
+}
+#else
+void __attribute__ ((noinline))
+copy (char *p, int size)
+{
+ __builtin_strncpy (p, "good", size);
+}
+
+int g_edi __attribute__((externally_visible)) =INIT_EDI;
+int g_esi __attribute__((externally_visible)) =INIT_ESI;
+int g_ebx __attribute__((externally_visible)) = INIT_EBX;
+int g_ebp __attribute__((externally_visible));
+int g_esp __attribute__((externally_visible));
+int g_ebp_save __attribute__((externally_visible));
+int g_esp_save __attribute__((externally_visible));
+int n_error;
+
+int
+main()
+{
+ int dummy;
+ // Init registers to correct value.
+ // Use following template so that RA will save/restore callee
+ // save registers in prologue/epilogue
+ __asm__ __volatile__ (
+ "movl %1, %0"
+ : "=D" (dummy)
+ : "i" (INIT_EDI)
+ );
+ __asm__ __volatile__ (
+ "movl %1, %0"
+ : "=S" (dummy)
+ : "i" (INIT_ESI)
+ );
+ __asm__ __volatile__ (
+ "movl %1, %0"
+ : "=b" (dummy)
+ : "i" (INIT_EBX)
+ );
+ __asm__ __volatile__ (
+ "movl %ebp," ASMNAME("g_ebp_save")"\n\t"
+ "movl %esp," ASMNAME("g_esp_save")"\n\t"
+ );
+ try {
+ foo();
+ }
+ catch (...)
+ {
+ }
+
+ // Get DI/SI/BX register value after exception caught
+ __asm__ __volatile__ (
+ "movl %edi," ASMNAME("g_edi")"\n\t"
+ "movl %esi," ASMNAME("g_esi")"\n\t"
+ "movl %ebx," ASMNAME("g_ebx")"\n\t"
+ "movl %ebp," ASMNAME("g_ebp")"\n\t"
+ "movl %esp," ASMNAME("g_esp")"\n\t"
+ );
+
+ // Check if DI/SI/BX register value are the same as before calling
+ // foo.
+ if (g_edi != INIT_EDI)
+ {
+ n_error++;
+#ifdef DEBUG
+ printf("edi=%d, correct value:%d\n", g_edi, INIT_EDI);
+#endif
+ }
+ if (g_esi != INIT_ESI)
+ {
+ n_error++;
+#ifdef DEBUG
+ printf("esi=%d, correct value:%d\n", g_esi, INIT_ESI);
+#endif
+ }
+ if (g_ebx != INIT_EBX)
+ {
+ n_error++;
+#ifdef DEBUG
+ printf("ebx=%d, correct value:%d\n", g_ebx, INIT_EBX);
+#endif
+ }
+ if (g_ebp != g_ebp_save)
+ {
+ n_error++;
+#ifdef DEBUG
+ printf("ebp=0x%x, correct value:0x%x\n", g_ebp, g_ebp_save);
+#endif
+ }
+ if (g_esp != g_esp_save)
+ {
+ n_error++;
+#ifdef DEBUG
+ printf("esp=0x%x, correct value:0x%x\n", g_esp, g_esp_save);
+#endif
+ }
+ if (n_error !=0)
+ abort();
+ return 0;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C
new file mode 100644
index 000000000..3eddc1d02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C
@@ -0,0 +1,62 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int t_align __attribute__((aligned(ALIGNMENT)));
+
+
+int global, global2;
+void bar()
+{
+ volatile t_align a = 1;
+ int i,j,k,l,m,n;
+ i=j=k=0;
+ for (i=0; i < global; i++)
+ for (j=0; j < i; j++)
+ for (k=0; k < j; k++)
+ for (l=0; l < k; l++)
+ for (m=0; m < l; m++)
+ for (n=0; n < m; n++)
+ global2 = k;
+ if (check_int ((int *) &a, __alignof__(a)) != a)
+ abort ();
+ throw 0;
+}
+
+void foo()
+{
+ bar();
+}
+
+int main()
+{
+ int ll = 1;
+ int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5;
+ try {
+ for (; i < global; i++)
+ for (; j < i; j++)
+ for (; k < j; k++)
+ for (; l < k; l++)
+ for (; m < l; m++)
+ for (; n < m; n++)
+ global2 = k;
+ foo();
+ }
+ catch (...)
+ {
+ }
+ ll = i+j+k+l+m+n;
+ if (ll != 15)
+ {
+#ifdef DEBUG
+ printf("FAIL: sum %d != 15\n", ll);
+#endif
+ abort();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C
new file mode 100644
index 000000000..63a8c6e7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C
@@ -0,0 +1,53 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int t_align __attribute__((aligned(ALIGNMENT)));
+
+
+int global, global2;
+void bar()
+{
+ volatile t_align a = 1;
+ int i,j,k;
+ i=j=k=0;
+ for (i=0; i < global; i++)
+ for (j=0; j < i; j++)
+ global2 = k;
+ if (check_int ((int *) &a, __alignof__(a)) != a)
+ abort ();
+ throw 0;
+}
+
+int main()
+{
+ int ll = 1;
+ int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5;
+ try {
+ for (; i < global; i++)
+ for (; j < i; j++)
+ for (; k < j; k++)
+ for (; l < k; l++)
+ for (; m < l; m++)
+ for (; n < m; n++)
+ global2 = k;
+ bar ();
+ }
+ catch (...)
+ {
+ }
+ ll = i+j+k+l+m+n;
+ if (ll != 15)
+ {
+#ifdef DEBUG
+ printf("FAIL: sum %d != 15\n", ll);
+#endif
+ abort();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C
new file mode 100644
index 000000000..d3e53b829
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int t_align __attribute__((aligned(ALIGNMENT)));
+
+
+int global, global2;
+void bar()
+{
+ volatile t_align a = 1;
+ int i,j,k;
+ i=j=k=0;
+ for (i=0; i < global; i++)
+ for (j=0; j < i; j++)
+ global2 = k;
+ throw 0;
+ if (check_int ((int *) &a, __alignof__(a)) != a)
+ abort ();
+}
+
+int main()
+{
+ int ll = 1;
+ int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5;
+ try {
+ for (; i < global; i++)
+ for (; j < i; j++)
+ for (; k < j; k++)
+ for (; l < k; l++)
+ for (; m < l; m++)
+ for (; n < m; n++)
+ global2 = k;
+ bar ();
+ }
+ catch (...)
+ {
+ }
+ ll = i+j+k+l+m+n;
+ if (ll != 15)
+ {
+#ifdef DEBUG
+ printf("FAIL: sum %d != 15\n", ll);
+#endif
+ abort();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C
new file mode 100644
index 000000000..52e6f7ff7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */
+
+#include "check.h"
+
+#ifndef ALIGNMENT
+#define ALIGNMENT 64
+#endif
+
+typedef int t_align __attribute__((aligned(ALIGNMENT)));
+
+
+int global, global2;
+void bar()
+{
+ volatile t_align a = 1;
+ int i,j,k;
+ i=j=k=0;
+ for (i=0; i < global; i++)
+ for (j=0; j < i; j++)
+ {
+ global2 = k;
+ throw 0;
+ }
+ if (check_int ((int *) &a, __alignof__(a)) != a)
+ abort ();
+}
+
+int main()
+{
+ int ll = 1;
+ int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5;
+ try {
+ for (; i < global; i++)
+ for (; j < i; j++)
+ for (; k < j; k++)
+ for (; l < k; l++)
+ for (; m < l; m++)
+ for (; n < m; n++)
+ global2 = k;
+ bar ();
+ }
+ catch (...)
+ {
+ }
+ ll = i+j+k+l+m+n;
+ if (ll != 15)
+ {
+#ifdef DEBUG
+ printf("FAIL: sum %d != 15\n", ll);
+#endif
+ abort();
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C
new file mode 100644
index 000000000..b1e79d892
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C
@@ -0,0 +1,12 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+void __attribute__ ((noinline)) foo()
+{
+ ALTER_REGS();
+ // Throw the except and expect returning to main
+ throw 1;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C
new file mode 100644
index 000000000..d61b1ba75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C
@@ -0,0 +1,16 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+/* Test situation 1: Stack really realign without DRAP */
+void __attribute__ ((noinline))
+foo ()
+{
+ int __attribute__ ((aligned(64))) a=1;
+ if (check_int (&a, __alignof__(a)) != a)
+ abort ();
+ ALTER_REGS();
+ throw a;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C
new file mode 100644
index 000000000..7ed0a8d14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C
@@ -0,0 +1,29 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+/* Test situation 2: stack really realign with DRAP reg CX */
+void __attribute__ ((noinline))
+foo ()
+{
+ int __attribute__ ((aligned(64))) a=4;
+ char * s = (char *) __builtin_alloca (a + 1);
+
+ copy (s, a);
+ if (__builtin_strncmp (s, "good", a) != 0)
+ {
+#ifdef DEBUG
+ s[a] = '\0';
+ printf ("Failed: %s != good\n", s);
+#endif
+ abort ();
+ }
+
+ if (check_int (&a, __alignof__(a)) != a)
+ abort ();
+
+ ALTER_REGS();
+ throw a;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C
new file mode 100644
index 000000000..e3368bfd9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C
@@ -0,0 +1,35 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+/* Test situation 3: Stack realign really happen with DRAP reg DI */
+void __attribute__ ((noinline)) __attribute__ ((regparm(3)))
+bar (int arg1, int arg2, int arg3)
+{
+ int __attribute__ ((aligned(64))) a=1;
+ char * s = (char *) __builtin_alloca (arg3 + 1);
+
+ copy (s, arg3);
+ if (__builtin_strncmp (s, "good", arg3) != 0)
+ {
+#ifdef DEBUG
+ s[arg3] = '\0';
+ printf ("Failed: %s != good\n", s);
+#endif
+ abort ();
+ }
+
+ if (check_int (&a, __alignof__(a)) != a)
+ abort ();
+
+ ALTER_REGS();
+ throw arg1+arg2+arg3+a;
+}
+
+void
+foo()
+{
+ bar (1,2,3);
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C
new file mode 100644
index 000000000..fddf27625
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C
@@ -0,0 +1,17 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+volatile int __attribute__ ((aligned(32))) g_a=1;
+/* Test situation 4: no Drap and stack realign doesn't really happen */
+void __attribute__ ((noinline))
+foo()
+{
+ int i;
+ ALTER_REGS();
+ for (i=0; i < 10; i++)
+ g_a++;
+ throw g_a;
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C
new file mode 100644
index 000000000..e3e1a855f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C
@@ -0,0 +1,31 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+double g_f=1.0;
+/* Test situation 5: Stack realign dosn't really happen with DRAP reg CX */
+void __attribute__ ((noinline)) __attribute__ ((regparm(2)))
+bar(int arg1, int arg2, int arg3, int arg4)
+{
+ char * s = (char *) __builtin_alloca (arg4 + 1);
+
+ copy (s, arg4);
+ if (__builtin_strncmp (s, "good", arg4) != 0)
+ {
+#ifdef DEBUG
+ s[arg4] = '\0';
+ printf ("Failed: %s != good\n", s);
+#endif
+ abort ();
+ }
+ ALTER_REGS();
+ if (g_f) throw arg1+arg2+arg3+ g_f;
+}
+
+void __attribute__((noinline))
+foo()
+{
+ bar(1,2,3,4);
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C
new file mode 100644
index 000000000..f1188f8a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C
@@ -0,0 +1,31 @@
+/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+#include "test-unwind.h"
+
+#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__
+double g_f=1.0;
+/* Test situation 6: Stack realign dosn't really happen with DRAP reg DI */
+void __attribute__ ((noinline)) __attribute__ ((regparm(3)))
+bar(int arg1, int arg2, int arg3, int arg4)
+{
+ char * s = (char *) __builtin_alloca (arg4 + 1);
+
+ copy (s, arg4);
+ if (__builtin_strncmp (s, "good", arg4) != 0)
+ {
+#ifdef DEBUG
+ s[arg4] = '\0';
+ printf ("Failed: %s != good\n", s);
+#endif
+ abort ();
+ }
+ ALTER_REGS();
+ if (g_f) throw arg1+arg2+arg3+ g_f;
+}
+
+void __attribute__((noinline))
+foo()
+{
+ bar(1,2,3,4);
+}
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/str_empty.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/str_empty.C
new file mode 100644
index 000000000..e24f0b6ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/str_empty.C
@@ -0,0 +1,15 @@
+// PR c++/31617
+// Segfault in integer_zerop
+// Origin: Andrew Pinski <andrew_pinski@playstation.sony.com>
+// { dg-do compile }
+
+struct polynomial {
+ ~polynomial ();
+};
+
+void spline_rep1 ()
+{
+ new polynomial[0]; // { dg-bogus "allocating zero-element array" }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/type-generic-1.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/type-generic-1.C
new file mode 100644
index 000000000..4d82592af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/type-generic-1.C
@@ -0,0 +1,13 @@
+/* Do the type-generic tests. Unlike pr28796-2.c, we test these
+ without any fast-math flags. */
+
+/* { dg-do run } */
+/* { dg-add-options ieee } */
+/* { dg-skip-if "No Inf/NaN support" { spu-*-* } } */
+
+#include "../../gcc.dg/tg-tests.h"
+
+int main(void)
+{
+ return main_tests ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-16.inc b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-16.inc
new file mode 100644
index 000000000..7507305e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-16.inc
@@ -0,0 +1,50 @@
+/* Test fragment for vectors with 16 elements. */
+
+#ifndef UNSUPPORTED
+
+constexpr V in1[] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }};
+
+
+
+
+
+constexpr VI mask1[] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, },
+ { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87,
+ 0x98, 0xa9, 0xba, 0xcb, 0xdc, 0xed, 0xfe, 0xff } ,
+ { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15 },
+ { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }};
+
+constexpr V out1[] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
+ { 1, 3, 5, 7, 9, 11, 13, 15, 2, 4, 6, 8, 10, 12, 14, 16 },
+ { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
+};
+
+constexpr V in2[] = { { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 },
+ { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 },
+ { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 },
+ { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 },
+ { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }};
+
+
+constexpr V in3 = { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 };
+
+constexpr VI mask2[] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 },
+ { 7, 6, 5, 4, 16, 17, 18, 19, 31, 30, 29, 28, 3, 2, 1, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }};
+constexpr V out2[] = { { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 },
+ { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 },
+ { 17, 16, 15, 14, 30, 31, 32, 33, 45, 44, 43, 42, 13, 12, 11, 10 },
+ { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 },
+ { 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 },
+};
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-2.inc b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-2.inc
new file mode 100644
index 000000000..68055835c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-2.inc
@@ -0,0 +1,22 @@
+/* Test fragment for vectors of 2 elements. */
+
+#ifndef UNSUPPORTED
+
+constexpr V in1[] = { { A, B}, {A, B}, { A, B},
+ { A, B}, {X, Y}, { X, Y}};
+constexpr VI mask1[] = { {0, 1}, {(unsigned)-16, 1}, {1, 0},
+ {0, 0}, { 1, 1}, {1, 0}};
+constexpr V out1[] = { {A, B}, {A, B}, {B, A},
+ {A, A}, {Y, Y}, {Y, X}};
+
+constexpr V in2[] = { { A, B}, {A, B}, {A, B}, {A, B},
+ { A, B}, {A, B}, {A, B}};
+constexpr V in3 = {X, Y};
+constexpr VI mask2[] = { {0, 1}, {2, 3}, {0, 2}, {2, 1},
+ {3, 0}, {0, 0}, {3, 3}};
+
+constexpr V out2[] = { {A, B}, {X, Y}, {A, X}, {X, B},
+ {Y, A}, {A, A}, {Y, Y}};
+
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-4.inc b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-4.inc
new file mode 100644
index 000000000..2a18812e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-4.inc
@@ -0,0 +1,25 @@
+/* Test fragment for vectors of 4 elements. */
+
+#ifndef UNSUPPORTED
+
+constexpr V in1[] = { {A, B, C, D}, {A, B, C, D}, {A, B, C, D}, {A, B, C, D},
+ {A, B, C, D}, {W, X, Y, Z}, {W, X, Y, Z}, {W, X, Y, Z}};
+
+constexpr VI mask1[] = { {0, 1, 2, 3}, {0+1*4, 1+2*4, 2+3*4, 3+4*4}, {3, 2, 1, 0},
+ {0, 3, 2, 1}, {0, 2, 1, 3}, {3, 1, 2, 0}, {0, 0, 0, 0},
+ {1, 2, 1, 2}};
+
+constexpr V out1[] = { { A, B, C, D}, {A, B, C, D}, {D, C, B, A}, {A, D, C, B},
+ { A, C, B, D}, {Z, X, Y, W}, {W, W, W, W}, {X, Y, X, Y}};
+
+
+constexpr V in2[] = { {A, B, C, D}, {A, B, C, D}, {A, B, C, D}, {A, B, C, D},
+ {A, B, C, D}, {A, B, C, D}};
+constexpr V in3 = {W, X, Y, Z};
+constexpr VI mask2[] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 1, 5}, {0, 7, 4, 3},
+ {0, 0, 0, 0}, {7, 7, 7, 7}};
+constexpr V out2[] = { {A, B, C, D}, {W, X, Y, Z}, {A, W, B, X}, {A, Z, W, D},
+ {A, A, A, A}, {Z, Z, Z, Z}};
+
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-8.inc b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-8.inc
new file mode 100644
index 000000000..177e9f166
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-8.inc
@@ -0,0 +1,56 @@
+/* Test fragment for vectors of 8 elements. */
+
+#ifndef UNSUPPORTED
+
+constexpr V in1[] = { { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A2, B2, C2, D2, E2, F2, G2, H2 },
+ { A2, B2, C2, D2, E2, F2, G2, H2 },
+ { A2, B2, C2, D2, E2, F2, G2, H2 }};
+
+constexpr VI mask1[] = { { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87 },
+ { 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 7, 0, 5, 3, 2, 4, 1, 6 },
+ { 0, 2, 1, 3, 4, 6, 5, 7 },
+ { 3, 1, 2, 0, 7, 5, 6, 4 },
+ { 0, 0, 0, 0 },
+ { 1, 6, 1, 6, 1, 6, 1, 6 }};
+
+constexpr V out1[] = { { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { H1, G1, F1, E1, D1, C1, B1, A1 },
+ { H1, A1, F1, D1, C1, E1, B1, G1 },
+ { A1, C1, B1, D1, E1, G1, F1, H1 },
+ { D2, B2, C2, A2, H2, F2, G2, E2 },
+ { A2, A2, A2, A2, A2, A2, A2, A2 },
+ { B2, G2, B2, G2, B2, G2, B2, G2 }};
+
+constexpr V in2 [] = { { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A1, B1, C1, D1, E1, F1, G1, H1 }};
+
+
+constexpr V in3 = { A2, B2, C2, D2, E2, F2, G2, H2};
+
+constexpr VI mask2[] = { { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 0, 8, 1, 9, 2, 10, 3, 11 },
+ { 0, 15, 4, 11, 12, 3, 7, 8 },
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e, 0x8e }};
+
+constexpr V out2[] = { { A1, B1, C1, D1, E1, F1, G1, H1 },
+ { A2, B2, C2, D2, E2, F2, G2, H2 },
+ { A1, A2, B1, B2, C1, C2, D1, D2 },
+ { A1, H2, E1, D2, E2, D1, H1, A2 },
+ { A1, A1, A1, A1, A1, A1, A1, A1 },
+ { G2, G2, G2, G2, G2, G2, G2, G2 }};
+
+#endif
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-main.inc b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-main.inc
new file mode 100644
index 000000000..697bd0197
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-main.inc
@@ -0,0 +1,28 @@
+/* Driver fragment for __builtin_shuffle of any vector shape. */
+
+// { dg-do run { target c++11 } }
+
+extern "C" void abort(void);
+
+int main()
+{
+#ifndef UNSUPPORTED
+ int i;
+
+ for (i = 0; i < sizeof(in1)/sizeof(in1[0]); ++i)
+ {
+ V r = __builtin_shuffle(in1[i], mask1[i]);
+ if (__builtin_memcmp(&r, &out1[i], sizeof(V)) != 0)
+ abort();
+ }
+
+ for (i = 0; i < sizeof(in2)/sizeof(in2[0]); ++i)
+ {
+ V r = __builtin_shuffle(in2[i], in3, mask2[i]);
+ if (__builtin_memcmp(&r, &out2[i], sizeof(V)) != 0)
+ abort();
+ }
+#endif
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16hi.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16hi.C
new file mode 100644
index 000000000..501d9dacc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16hi.C
@@ -0,0 +1,7 @@
+// { dg-do run { target c++11 } }
+
+typedef unsigned short V __attribute__((vector_size(32)));
+typedef V VI;
+
+#include "vshuf-16.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16qi.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16qi.C
new file mode 100644
index 000000000..1cc8bea0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v16qi.C
@@ -0,0 +1,7 @@
+// { dg-do run { target c++11 } }
+
+typedef unsigned char V __attribute__((vector_size(16)));
+typedef V VI;
+
+#include "vshuf-16.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2df.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2df.C
new file mode 100644
index 000000000..71a6ac4c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2df.C
@@ -0,0 +1,16 @@
+// // { dg-do run { target c++11 } }
+#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8
+typedef double V __attribute__((vector_size(16)));
+typedef unsigned long long VI __attribute__((vector_size(16)));
+#else
+#define UNSUPPORTED
+#endif
+
+#define A 0.69314718055994530942
+#define B 2.7182818284590452354
+
+#define X 3.14159265358979323846
+#define Y 1.41421356237309504880
+
+#include "vshuf-2.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2di.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2di.C
new file mode 100644
index 000000000..dd521f2e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2di.C
@@ -0,0 +1,17 @@
+// // { dg-do run { target c++11 } }
+
+#if __SIZEOF_LONG_LONG__ == 8
+typedef unsigned long long V __attribute__((vector_size(16)));
+typedef V VI;
+#else
+#define UNSUPPORTED
+#endif
+
+#define A 0x1112131415161718
+#define B 0x2122232425262728
+
+#define X 0xc1c2c3c4c5c6c7c8
+#define Y 0xd1d2d3d4d5d6d7d8
+
+#include "vshuf-2.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2sf.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2sf.C
new file mode 100644
index 000000000..274dacdae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2sf.C
@@ -0,0 +1,22 @@
+// // { dg-do run { target c++11 } }
+#if __SIZEOF_FLOAT__ == 4
+typedef float V __attribute__((vector_size(8)));
+# if __SIZEOF_INT__ == 4
+typedef unsigned int VI __attribute__((vector_size(8)));
+# elif __SIZEOF_LONG__ == 4
+typedef unsigned long VI __attribute__((vector_size(8)));
+# else
+# define UNSUPPORTED
+# endif
+#else
+# define UNSUPPORTED
+#endif
+
+#define A 0.69314718055994530942f
+#define B 2.7182818284590452354f
+
+#define X 3.14159265358979323846f
+#define Y 1.41421356237309504880f
+
+#include "vshuf-2.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2si.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2si.C
new file mode 100644
index 000000000..36aeb82b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v2si.C
@@ -0,0 +1,19 @@
+// { dg-do run { target c++11 } }
+#if __SIZEOF_INT__ == 4
+typedef unsigned int V __attribute__((vector_size(8)));
+typedef V VI;
+#elif __SIZEOF_LONG__ == 4
+typedef unsigned long V __attribute__((vector_size(8)));
+typedef V VI;
+#else
+#define UNSUPPORTED
+#endif
+
+#define A 0x11121314
+#define B 0x21222324
+
+#define X 0xd1d2d3d4
+#define Y 0xe1e2e3e4
+
+#include "vshuf-2.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4df.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4df.C
new file mode 100644
index 000000000..a1694b21e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4df.C
@@ -0,0 +1,21 @@
+// { dg-do run { target c++11 } }
+
+#if __SIZEOF_DOUBLE__ == 8 && __SIZEOF_LONG_LONG__ == 8
+typedef double V __attribute__((vector_size(32)));
+typedef unsigned long long VI __attribute__((vector_size(32)));
+#else
+#define UNSUPPORTED
+#endif
+
+#define A 0.69314718055994530942
+#define B 2.7182818284590452354
+#define C 2.30258509299404568402
+#define D 1.4426950408889634074
+
+#define W 0.31830988618379067154
+#define X 3.14159265358979323846
+#define Y 1.41421356237309504880
+#define Z 0.70710678118654752440
+
+#include "vshuf-4.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4di.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4di.C
new file mode 100644
index 000000000..8a5e5c507
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4di.C
@@ -0,0 +1,21 @@
+// { dg-do run { target c++11 } }
+
+#if __SIZEOF_LONG_LONG__ == 8
+typedef unsigned long long V __attribute__((vector_size(32)));
+typedef V VI;
+#else
+#define UNSUPPORTED
+#endif
+
+#define A 0x1112131415161718
+#define B 0x2122232425262728
+#define C 0x3132333435363738
+#define D 0x4142434445464748
+
+#define W 0xc1c2c3c4c5c6c7c8
+#define X 0xd1d2d3d4d5d6d7d8
+#define Y 0xe1e2e3e4e5e6e7e8
+#define Z 0xf1f2f3f4f5f6f7f8
+
+#include "vshuf-4.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4sf.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4sf.C
new file mode 100644
index 000000000..aa67dbbe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4sf.C
@@ -0,0 +1,28 @@
+// { dg-do run { target c++11 } }
+
+
+#if __SIZEOF_FLOAT__ == 4
+typedef float V __attribute__((vector_size(16)));
+# if __SIZEOF_INT__ == 4
+typedef unsigned int VI __attribute__((vector_size(16)));
+# elif __SIZEOF_LONG__ == 4
+typedef unsigned long VI __attribute__((vector_size(16)));
+# else
+# define UNSUPPORTED
+# endif
+#else
+# define UNSUPPORTED
+#endif
+
+#define A 0.69314718055994530942f
+#define B 2.7182818284590452354f
+#define C 2.30258509299404568402f
+#define D 1.4426950408889634074f
+
+#define W 0.31830988618379067154f
+#define X 3.14159265358979323846f
+#define Y 1.41421356237309504880f
+#define Z 0.70710678118654752440f
+
+#include "vshuf-4.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4si.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4si.C
new file mode 100644
index 000000000..4d377c114
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v4si.C
@@ -0,0 +1,24 @@
+// { dg-do run { target c++11 } }
+
+#if __SIZEOF_INT__ == 4
+typedef unsigned int V __attribute__((vector_size(16)));
+typedef V VI;
+#elif __SIZEOF_LONG__ == 4
+typedef unsigned long V __attribute__((vector_size(16)));
+typedef V VI;
+#else
+# define UNSUPPORTED
+#endif
+
+#define A 0x11121314
+#define B 0x21222324
+#define C 0x31323334
+#define D 0x41424344
+
+#define W 0xc1c2c3c4
+#define X 0xd1d2d3d4
+#define Y 0xe1e2e3e4
+#define Z 0xf1f2f3f4
+
+#include "vshuf-4.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8hi.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8hi.C
new file mode 100644
index 000000000..c2be87f5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8hi.C
@@ -0,0 +1,25 @@
+// { dg-do run { target c++11 } }
+
+typedef unsigned short V __attribute__((vector_size(16)));
+typedef V VI;
+
+#define A1 0x1112
+#define B1 0x2122
+#define C1 0x3132
+#define D1 0x4142
+#define E1 0x5152
+#define F1 0x6162
+#define G1 0x7172
+#define H1 0x8182
+
+#define A2 0x9192
+#define B2 0xa1a2
+#define C2 0xb1b2
+#define D2 0xc1c2
+#define E2 0xd1d2
+#define F2 0xe1e2
+#define G2 0xf1f2
+#define H2 0x0102
+
+#include "vshuf-8.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8qi.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8qi.C
new file mode 100644
index 000000000..5ec040e14
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8qi.C
@@ -0,0 +1,25 @@
+// { dg-do run { target c++11 } }
+
+typedef unsigned char V __attribute__((vector_size(8)));
+typedef V VI;
+
+#define A1 0x11
+#define B1 0x12
+#define C1 0x13
+#define D1 0x14
+#define E1 0x15
+#define F1 0x16
+#define G1 0x17
+#define H1 0x18
+
+#define A2 0xf1
+#define B2 0xf2
+#define C2 0xf3
+#define D2 0xf4
+#define E2 0xf5
+#define F2 0xf6
+#define G2 0xf7
+#define H2 0xf8
+
+#include "vshuf-8.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8si.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8si.C
new file mode 100644
index 000000000..27631d775
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/vshuf-v8si.C
@@ -0,0 +1,32 @@
+// { dg-do run { target c++11 } }
+
+#if __SIZEOF_INT__ == 4
+typedef unsigned int V __attribute__((vector_size(32)));
+typedef V VI;
+#elif __SIZEOF_LONG__ == 4
+typedef unsigned long V __attribute__((vector_size(32)));
+typedef V VI;
+#else
+# define UNSUPPORTED
+#endif
+
+#define A1 0x11121314
+#define B1 0x21222324
+#define C1 0x31323334
+#define D1 0x41424344
+#define E1 0x51525354
+#define F1 0x61626364
+#define G1 0x71727374
+#define H1 0x81828384
+
+#define A2 0x91929394
+#define B2 0xa1a2a3a4
+#define C2 0xb1b2b3b4
+#define D2 0xc1c2c3c4
+#define E2 0xd1d2d3d4
+#define F2 0xe1e2e3e4
+#define G2 0xf1f2f3f4
+#define H2 0x01020304
+
+#include "vshuf-8.inc"
+#include "vshuf-main.inc"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C
new file mode 100644
index 000000000..e20cc64d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C
@@ -0,0 +1,35 @@
+/* { dg-options "-O" } */
+
+int foo1(void) { return 0; }
+int bar1(void) { throw 1; }
+void foo2(void) { }
+void bar2(void) { throw 1; }
+void __attribute__((noinline,noclone)) test1(void (*f)(void)) { (*f)(); }
+void __attribute__((noinline,noclone)) test2(void (*f)(void)) { (*f)(); }
+int __attribute__((noinline,noclone)) test3(int (*f)(void)) { return (*f)(); }
+int __attribute__((noinline,noclone)) test4(int (*f)(void)) { return (*f)(); }
+int __attribute__((noinline,noclone)) test5(int (*f)(void), int x) { return x ? x : (*f)(); }
+int __attribute__((noinline,noclone)) test6(int (*f)(void), int x) { return x ? x : (*f)(); }
+void __attribute__((noinline,noclone)) test7(void (*f)(void)) { try { (*f)(); } catch (...) {} }
+void __attribute__((noinline,noclone)) test8(void (*f)(void)) { try { (*f)(); } catch (...) {}}
+int __attribute__((noinline,noclone)) test9(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} }
+int __attribute__((noinline,noclone)) test10(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} }
+int __attribute__((noinline,noclone)) test11(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} }
+int __attribute__((noinline,noclone)) test12(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} }
+
+int main()
+{
+ for (int i = 0; i < 100; ++i) test1(foo2);
+ for (int i = 0; i < 100; ++i) try { test2(bar2); } catch (...) {}
+ for (int i = 0; i < 100; ++i) test3(foo1);
+ for (int i = 0; i < 100; ++i) try { test4(bar1); } catch (...) {}
+ for (int i = 0; i < 100; ++i) test5(foo1, 0);
+ for (int i = 0; i < 100; ++i) try { test6(bar1, 0); } catch (...) {}
+ for (int i = 0; i < 100; ++i) test7(foo2);
+ for (int i = 0; i < 100; ++i) try { test8(bar2); } catch (...) {}
+ for (int i = 0; i < 100; ++i) test9(foo1);
+ for (int i = 0; i < 100; ++i) try { test10(bar1); } catch (...) {}
+ for (int i = 0; i < 100; ++i) test11(foo1, 0);
+ for (int i = 0; i < 100; ++i) try { test12(bar1, 0); } catch (...) {}
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C
new file mode 100644
index 000000000..91874a30e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C
@@ -0,0 +1,39 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-profile" } */
+
+struct A {
+ A () {}
+
+ virtual int AA (void)
+ { return 0; }
+
+};
+
+struct B : public A {
+ B () {}
+
+ virtual int AA (void)
+ { return 1; }
+};
+
+void * __attribute__((noinline,noclone)) wrap (void *p) { return p; }
+int
+main (void)
+{
+ A a;
+ B b;
+
+ A* p;
+
+ p = (A *)wrap ((void *)&a);
+ p->AA ();
+
+ p = (B *)wrap ((void *)&b);
+ p->AA ();
+
+ return 0;
+}
+
+/* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* AA transformation on insn" "profile" } } */
+/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */
+/* { dg-final-use { cleanup-tree-dump "optimized" } } */
+/* { dg-final-use { cleanup-ipa-dump "profile" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
new file mode 100644
index 000000000..e82a46ebf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
@@ -0,0 +1,36 @@
+/* { dg-options "-O2 -fdump-tree-einline" } */
+class DocId {
+ public:
+ DocId() { }
+ DocId(const DocId &other) { }
+};
+
+int g;
+class Base {
+ public:
+ virtual void Foo(DocId id) { g++; }
+};
+
+class Super: public Base {
+ public:
+ void Foo(DocId id) { }
+ void Bar(Base *base, DocId id) __attribute__((noinline));
+};
+
+void Super::Bar(Base *base, DocId id) {
+ Super::Foo(id); // direct call is inlined
+ base->Foo(id); // indirect call is marked do not inline
+}
+
+int main(void)
+{
+ Base bah;
+ Super baz;
+ DocId gid;
+
+ baz.Bar(&baz, gid);
+ return 0;
+}
+/* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline" } } */
+/* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline" } } */
+/* { dg-final-use { cleanup-tree-dump "einline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition1.C
new file mode 100644
index 000000000..d0dcbc452
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition1.C
@@ -0,0 +1,53 @@
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -freorder-blocks-and-partition" } */
+
+struct A { A () __attribute__((noinline)); ~A () __attribute__((noinline)); };
+A::A () { asm volatile ("" : : : "memory"); }
+A::~A () { asm volatile ("" : : : "memory"); }
+
+int bar () __attribute__((noinline));
+void foo () __attribute__((noinline));
+
+volatile int k, l;
+
+int bar (int i)
+{
+ void *p = __builtin_alloca (i);
+ asm volatile ("" : : "r" (i), "r" (p) : "memory");
+ if (k) throw 6;
+ return ++l;
+}
+
+void foo ()
+{
+ A a;
+ try {
+ A b;
+ int i = bar (5);
+ try { throw 6; } catch (int) {}
+ if (__builtin_expect (i < 4500, 0)) {
+ bar (7);
+ try { bar (8); } catch (long) {}
+ bar (10);
+ if (__builtin_expect (i < 0, 0)) {
+ try { bar (12); } catch (...) {}
+ bar (16);
+ bar (122);
+ } else {
+ try { bar (bar (7)); } catch (int) {}
+ }
+ } else {
+ try { bar (bar (bar (9))); } catch (...) {}
+ bar (5);
+ }
+ } catch (...) {
+ }
+}
+
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 10000; i++)
+ foo ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition2.C
new file mode 100644
index 000000000..0bc50fae9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition2.C
@@ -0,0 +1,15 @@
+// PR middle-end/45458
+// { dg-require-effective-target freorder }
+// { dg-options "-O2 -fnon-call-exceptions -freorder-blocks-and-partition" }
+
+int
+main ()
+{
+ try
+ {
+ throw 6;
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition3.C
new file mode 100644
index 000000000..c62174aa4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition3.C
@@ -0,0 +1,18 @@
+// PR middle-end/45566
+// { dg-require-effective-target freorder }
+// { dg-options "-O2 -fnon-call-exceptions -freorder-blocks-and-partition" }
+
+int k;
+
+int
+main ()
+{
+ try
+ {
+ if (k)
+ throw 6;
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr51719.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr51719.C
new file mode 100644
index 000000000..01e81ff66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr51719.C
@@ -0,0 +1,27 @@
+// PR tree-optimization/51719
+// { dg-options "-O -fpartial-inlining" }
+
+int
+bar (void)
+{
+ throw 1;
+}
+
+int __attribute__ ((noinline, noclone))
+foo (int (*f) (void))
+{
+ try
+ {
+ return (*f) ();
+ }
+ catch (...)
+ {
+ }
+ return 0;
+}
+
+int
+main ()
+{
+ return foo (bar);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr53460.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr53460.C
new file mode 100644
index 000000000..ed05e0b99
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr53460.C
@@ -0,0 +1,25 @@
+// { dg-options "-O" }
+
+template<typename T> class OwnPtr {
+public:
+ ~OwnPtr();
+};
+template<class T> class GlyphMetricsMap {
+public:
+ GlyphMetricsMap() { }
+ OwnPtr<int> m_pages;
+};
+class SimpleFontData {
+public:
+ void boundsForGlyph() const;
+};
+inline __attribute__((__always_inline__))
+void SimpleFontData::boundsForGlyph() const
+{
+ new GlyphMetricsMap<int>;
+}
+void offsetToMiddleOfGlyph(const SimpleFontData* fontData)
+{
+ fontData->boundsForGlyph();
+}
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr57451.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr57451.C
new file mode 100644
index 000000000..db0fcc1e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr57451.C
@@ -0,0 +1,26 @@
+// { dg-require-effective-target freorder }
+// { dg-options "-O2 -freorder-blocks-and-partition -g" }
+
+extern "C" void abort (void);
+struct MyException {};
+struct Data {
+ int nr;
+ Data() : nr(66) {}
+};
+Data __attribute__((noinline,noclone)) getData(int i)
+{
+ if (i) throw MyException();
+ Data data;
+ data.nr = i;
+ return data;
+}
+int main(int, char **)
+{
+ Data data;
+ try {
+ data = getData(1);
+ } catch (MyException& e) {
+ if (data.nr != 66)
+ abort ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr59255.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr59255.C
new file mode 100644
index 000000000..77f208a3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr59255.C
@@ -0,0 +1,29 @@
+// PR c++/59255
+// { dg-options "-std=c++11 -O2" }
+
+struct S
+{
+ __attribute__((noinline, noclone)) ~S () noexcept (true)
+ {
+ if (fn)
+ fn (1);
+ }
+ void (*fn) (int);
+};
+
+__attribute__((noinline, noclone)) void
+foo (int x)
+{
+ if (x != 1)
+ throw 1;
+}
+
+int
+main ()
+{
+ for (int i = 0; i < 100; i++)
+ {
+ S s;
+ s.fn = foo;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
new file mode 100644
index 000000000..2c96ee38c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
@@ -0,0 +1,56 @@
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Test the functionality of programs compiled with profile-directed block
+# ordering using -fprofile-generate followed by -fprofile-use.
+
+load_lib target-supports.exp
+
+# Some targets don't support tree profiling.
+if { ![check_profiling_available "-fprofile-generate"] } {
+ return
+}
+
+# The procedures in profopt.exp need these parameters.
+set tool g++
+set prof_ext "gcda"
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# Load support procs.
+load_lib profopt.exp
+
+# Save and override the default list defined in profopt.exp.
+set treeprof_save_profopt_options $PROFOPT_OPTIONS
+set PROFOPT_OPTIONS [list {}]
+
+# These are globals used by profopt-execute. The first is options
+# needed to generate profile data, the second is options to use the
+# profile data.
+set profile_option "-fprofile-generate"
+set feedback_option "-fprofile-use"
+
+foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+ profopt-execute $src
+}
+
+set PROFOPT_OPTIONS $treeprof_save_profopt_options
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C
new file mode 100644
index 000000000..e2f3dcdce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+/* Test provided by Brian Ryner in PR 14511. The alias analyzer was
+ not handling structures containing arrays properly. In this case,
+ the static cast was introducing two assignments of the form
+
+ this_6->_vptr.IFoo = &_ZTV4IFoo[2];
+ this_4->_vptr.IFoo = &_ZTV3Bar[2];
+
+ which were not considered to alias each other because the alias
+ analyzer was not computing a proper pointer to array elements.
+ Another related bug was the type based alias analyzer not computing
+ alias relations to _ZTV4IFoo and _ZTV3Bar. Since those variables
+ are read-only, it was disregarding alias information for them.
+ So, the memory tags for the two 'this' variables were not being
+ marked as aliased with these variables. Resulting in the two
+ assignments not aliasing each other.
+
+ This was causing the optimizers to generate a call to the virtual
+ method Foo() instead of the overloaded version. */
+
+struct IFoo
+{
+ virtual void Foo() = 0;
+};
+
+struct Bar : IFoo
+{
+ void Foo() { }
+};
+
+int main(int argc, char **argv)
+{
+ Bar* b = new Bar();
+ static_cast<IFoo*>(b)->Foo();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/block1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/block1.C
new file mode 100644
index 000000000..5573251cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/block1.C
@@ -0,0 +1,11 @@
+// PR 13764: We were inserting an extra body block in all functions, but
+// it's only really necessary for [cd]tors.
+// { dg-options "-fdump-tree-gimple" }
+
+void bar (void)
+{
+ int a;
+}
+
+// { dg-final { scan-tree-dump-times "\{" 1 "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/builtin1.C
new file mode 100644
index 000000000..76813cb8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/builtin1.C
@@ -0,0 +1,10 @@
+// { dg-do link }
+
+extern void link_error();
+
+int main()
+{
+ if (! __builtin_constant_p (&"Hello"[0]))
+ link_error();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C
new file mode 100644
index 000000000..03f6b1207
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-dce2" } */
+
+/* Verify that we can eliminate the useless conversions to/from
+ const qualified pointer types
+ this_2 = o_1;
+ D.20003_4 = this_2->data_m;
+ this_5 = D.20003_4;
+ D.20005_6 = this_5->value;
+ copyprop should propagate o_1 and D.20003_4 to the loads of data_m
+ and value. dce removes all traces of this. */
+
+struct Data {
+ int get() const { return value; }
+ int value;
+};
+
+struct Object {
+ int operator[](int i) const { return data_m->get(); }
+ Data *data_m;
+};
+
+int foo(Object&o)
+{
+ return o[0];
+}
+
+/* Remaining should be two loads. */
+
+/* { dg-final { scan-tree-dump-times " = \[^\n\]*;" 2 "dce2" } } */
+/* { dg-final { cleanup-tree-dump "dce2" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop.C
new file mode 100644
index 000000000..b30e5ddc5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/copyprop.C
@@ -0,0 +1,739 @@
+// PR 39548 verify ssa ICE
+//
+// { dg-do compile { target { lp64 } } }
+// { dg-options "-Wno-error -fno-exceptions -fno-tree-vrp -O2 -fprofile-generate -finline-limit=500 -std=c++98" }
+//
+
+#include <map>
+#include <vector>
+#include <iostream>
+#include <cstdlib>
+using namespace std;
+template<typename _FIter, typename _Tp> _FIter lower_bound(_FIter, _FIter, _Tp&);
+template<class _Key> struct hash { };
+template<class _Val> struct _Hashtable_node {
+ _Hashtable_node* _M_next;
+ _Val _M_val;
+};
+static const unsigned long __stl_prime_list[] = { 2, 3, 5 };
+inline unsigned long prime(unsigned long __n) {
+ const unsigned long* __first = __stl_prime_list;
+ const unsigned long* __last = __stl_prime_list + 29;
+ const unsigned long* pos = lower_bound(__first, __last, __n);
+ return pos == __last ? *(__last - 1) : *pos;
+}
+template<class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc> struct hashtable {
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef _HashFcn hasher;
+ typedef _EqualKey key_equal;
+ typedef size_t size_type;
+ typedef value_type& reference;
+ typedef _Hashtable_node<_Val> _Node;
+ typedef typename _Alloc::template rebind<value_type>::other allocator_type;
+ allocator_type get_allocator() const { }
+ typedef typename _Alloc::template rebind<_Node>::other _Node_Alloc;
+ typedef typename _Alloc::template rebind<_Node*>::other _Nodeptr_Alloc;
+ typedef vector<_Node*, _Nodeptr_Alloc> _Vector_type;
+ _Node_Alloc _M_node_allocator;
+ void _M_put_node(_Node* __p) {
+ _M_node_allocator.deallocate(__p, 1);
+ }
+ hasher _M_hash;
+ key_equal _M_equals;
+ _ExtractKey _M_get_key;
+ _Vector_type _M_buckets;
+ size_type _M_num_elements;
+ hashtable(size_type __n, const _HashFcn& __hf, const _EqualKey& __eql, const allocator_type& __a = allocator_type()) : _M_num_elements(0) {
+ _M_initialize_buckets(__n);
+ }
+ ~hashtable() { clear(); }
+ reference find_or_insert(const value_type& __obj);
+ size_type count(const key_type& __key) const {
+ const size_type __n = _M_bkt_num_key(__key);
+ size_type __result = 0;
+ for (const _Node* __cur = _M_buckets[__n]; __cur; __cur = __cur->_M_next)
+ if (_M_equals(_M_get_key(__cur->_M_val), __key)) ++__result;
+ }
+ size_type erase(const key_type& __key);
+ void clear();
+ size_type _M_next_size(size_type __n) const { return prime(__n); }
+ void _M_initialize_buckets(size_type __n) {
+ const size_type __n_buckets = _M_next_size(__n);
+ _M_buckets.reserve(__n_buckets);
+ _M_buckets.insert(_M_buckets.end(), __n_buckets, (_Node*) 0);
+ }
+ size_type _M_bkt_num_key(const key_type& __key) const {
+ return _M_bkt_num_key(__key, _M_buckets.size());
+ }
+ size_type _M_bkt_num_key(const key_type& __key, size_t __n) const {
+ return _M_hash(__key) % __n;
+ }
+ void _M_delete_node(_Node* __n) {
+ this->get_allocator().destroy(&__n->_M_val);
+ _M_put_node(__n);
+ }
+};
+template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All> typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::size_type hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>:: erase(const key_type& __key) {
+ const size_type __n = _M_bkt_num_key(__key);
+ _Node* __first = _M_buckets[__n];
+ if (__first) _Node* __cur = __first;
+}
+template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All> void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>:: clear() {
+ for (size_type __i = 0; __i < _M_buckets.size(); ++__i) {
+ _Node* __cur = _M_buckets[__i];
+ while (__cur != 0) { _M_delete_node(__cur); }
+ }
+}
+template<class _Key, class _Tp, class _HashFn = ::hash<_Key>, class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> > struct hash_map {
+ typedef hashtable<pair<const _Key, _Tp>,_Key, _HashFn, _Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc> _Ht;
+ _Ht _M_ht;
+ typedef typename _Ht::key_type key_type;
+ typedef typename _Ht::value_type value_type;
+ typedef typename _Ht::hasher hasher;
+ typedef typename _Ht::key_equal key_equal;
+ typedef typename _Ht::size_type size_type;
+ typedef typename _Ht::allocator_type allocator_type;
+ hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) { }
+ _Tp& operator[](const key_type& __key) {
+ return _M_ht.find_or_insert(value_type(__key, _Tp())).second;
+ }
+ size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+ size_type erase(const key_type& __key) {
+ return _M_ht.erase(__key);
+ }
+};
+extern size_t strlen (__const char *__s);
+template <class C> struct scoped_ptr {
+ explicit scoped_ptr(C* p = __null) : ptr_(p) { delete ptr_; }
+ void reset(C* p = __null) {
+ if (p != ptr_) { delete ptr_; }
+ }
+ C& operator*() const {}
+ C* operator->() const {}
+ bool operator==(C* p) const { return ptr_ == p; }
+ bool operator!=(C* p) const { return ptr_ != p; }
+ C* ptr_;
+};
+namespace std {
+class strstreambuf : public basic_streambuf<char, char_traits<char> > {
+};
+class strstream : public basic_iostream<char> {
+ public: int pcount() const;
+ char* str();
+ strstreambuf _M_buf;
+};
+};
+const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4;
+struct foo_1 {
+ foo_1(string* str) : str_(str) { }
+ operator bool() const {
+ return (__builtin_expect(str_ != __null, 0));
+ }
+ string* str_;
+};
+template<class t1, class t2> string* Makefoo_1(const t1& v1, const t2& v2, const char* names) {
+ strstream ss;
+ ss << names << " (" << v1 << " vs. " << v2 << ")";
+ return new string(ss.str(), ss.pcount());
+}
+template <class t1, class t2> inline string* Check_GTImpl(const t1& v1, const t2& v2, const char* names) {
+ if (v1 > v2) return __null;
+ else return Makefoo_1(v1, v2, names);
+}
+struct blah_54 {
+ blah_54(const char* file, int line, int severity);
+ ~blah_54();
+ ostream& stream() { };
+};
+class blah_0 : public blah_54 {
+ public: blah_0(const char* file, int line);
+ blah_0(const char* file, int line, const foo_1& result);
+};
+template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc> class dense_hashtable;
+template <class V, class K, class HF, class ExK, class EqK, class A> struct dense_hashtable_iterator {
+ typedef V* pointer;
+ dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h, pointer it, pointer it_end, bool advance) : ht(h), pos(it), end(it_end) {
+ if (advance) advance_past_empty_and_deleted();
+ }
+ pointer operator->() const { }
+ void advance_past_empty_and_deleted() {
+ while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) ) ++pos;
+ }
+ const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;
+ pointer pos, end;
+};
+template <class V, class K, class HF, class ExK, class EqK, class A> struct dense_hashtable_const_iterator {
+ typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A> iterator;
+ typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator;
+ typedef const V& reference;
+ typedef const V* pointer;
+ dense_hashtable_const_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h, pointer it, pointer it_end, bool advance) : ht(h), pos(it), end(it_end) {
+ if (advance) advance_past_empty_and_deleted();
+ }
+ dense_hashtable_const_iterator(const iterator &it) : pos(it.pos), end(it.end) {}
+ reference operator*() const { return *pos; }
+ pointer operator->() const {}
+ void advance_past_empty_and_deleted() {
+ while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this))) ++pos;
+ }
+ const_iterator& operator++() { }
+ bool operator!=(const const_iterator& it) const { }
+ const dense_hashtable<V,K,HF,ExK,EqK,A> *ht;
+ pointer pos, end;
+};
+template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc> class dense_hashtable {
+ public: typedef Key key_type;
+ typedef Value value_type;
+ typedef HashFcn hasher;
+ typedef EqualKey key_equal;
+ typedef size_t size_type;
+ typedef dense_hashtable_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc> iterator;
+ typedef dense_hashtable_const_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc> const_iterator;
+ static const float HT_OCCUPANCY_FLT;
+ static const float HT_EMPTY_FLT;
+ static const size_t HT_MIN_BUCKETS = 32;
+ iterator end() {
+ return iterator(this, table + num_buckets, table + num_buckets, true);
+ }
+ const_iterator end() const {
+ return const_iterator(this, table + num_buckets, table+num_buckets,true);
+ }
+ void set_value(value_type* dst, const value_type& src) {
+ new(dst) value_type(src);
+ }
+ void destroy_buckets(size_type first, size_type last) {
+ for (; first != last; ++first) table[first].~value_type();
+ }
+ private: void squash_deleted() {
+ if ( num_deleted ) {
+ dense_hashtable tmp(*this);
+ swap(tmp);
+ }
+ }
+ public: void set_deleted_key(const value_type &val) { squash_deleted(); }
+ bool test_deleted(size_type bucknum) const {
+ return (use_deleted && num_deleted > 0 && equals(get_key(delval), get_key(table[bucknum])));
+ }
+ bool test_deleted(const const_iterator &it) const {
+ return (use_deleted && num_deleted > 0 && equals(get_key(delval), get_key(*it)));
+ }
+ bool set_deleted(const_iterator &it) {
+ set_value(const_cast<value_type*>(&(*it)), delval);
+ }
+ bool test_empty(size_type bucknum) const {
+ return equals(get_key(emptyval), get_key(table[bucknum]));
+ }
+ bool test_empty(const const_iterator &it) const {
+ return equals(get_key(emptyval), get_key(*it));
+ }
+ void fill_range_with_empty(value_type* table_start, value_type* table_end) {
+ uninitialized_fill(table_start, table_end, emptyval);
+ }
+ void set_empty(size_type buckstart, size_type buckend) {
+ destroy_buckets(buckstart, buckend);
+ fill_range_with_empty(table + buckstart, table + buckend);
+ }
+ size_type size() const {
+ return num_elements - num_deleted;
+ }
+ size_type bucket_count() const { }
+ static const size_type ILLEGAL_BUCKET = size_type(-1);
+ size_type min_size(size_type num_elts, size_type min_buckets_wanted) {
+ size_type sz = HT_MIN_BUCKETS;
+ while ( sz < min_buckets_wanted || num_elts >= sz * enlarge_resize_percent ) sz *= 2;
+ }
+ void maybe_shrink() {
+ if (shrink_threshold > 0 && (num_elements-num_deleted) < shrink_threshold && bucket_count() > HT_MIN_BUCKETS ) {
+ size_type sz = bucket_count() / 2;
+ sz /= 2;
+ dense_hashtable tmp(*this, sz);
+ swap(tmp);
+ }
+ }
+ void resize_delta(size_type delta, size_type min_buckets_wanted = 0) {
+ if ( consider_shrink ) maybe_shrink();
+ const size_type needed_size = min_size(num_elements + delta, min_buckets_wanted);
+ if ( needed_size > bucket_count() ) {
+ const size_type resize_to = min_size(num_elements - num_deleted + delta, min_buckets_wanted);
+ dense_hashtable tmp(*this, resize_to);
+ swap(tmp);
+ }
+ }
+ void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted = 0) {
+ clear();
+ const size_type resize_to = min_size(ht.size(), min_buckets_wanted);
+ num_elements++;
+ }
+ explicit dense_hashtable(size_type n = 0, const HashFcn& hf = HashFcn(), const EqualKey& eql = EqualKey(),const ExtractKey& ext = ExtractKey()) : num_deleted(0), use_deleted(false), use_empty(false), delval(), emptyval(), enlarge_resize_percent(HT_OCCUPANCY_FLT), shrink_resize_percent(HT_EMPTY_FLT), table(__null), num_buckets(min_size(0, n)), num_elements(0) {
+ reset_thresholds();
+ }
+ dense_hashtable(const dense_hashtable& ht, size_type min_buckets_wanted = 0) : num_deleted(0), use_deleted(ht.use_deleted), use_empty(ht.use_empty), delval(ht.delval), emptyval(ht.emptyval), enlarge_resize_percent(ht.enlarge_resize_percent), shrink_resize_percent(ht.shrink_resize_percent), table(__null), num_buckets(0), num_elements(0) {
+ reset_thresholds();
+ copy_from(ht, min_buckets_wanted);
+ set_value(&emptyval, ht.emptyval);
+ enlarge_resize_percent = ht.enlarge_resize_percent;
+ copy_from(ht);
+ }
+ ~dense_hashtable() {
+ if (table) {
+ destroy_buckets(0, num_buckets);
+ free(table);
+ }
+ }
+ void swap(dense_hashtable& ht) {
+ std::swap(equals, ht.equals);
+ {
+ value_type tmp;
+ set_value(&delval, ht.delval);
+ set_value(&ht.delval, tmp);
+ set_value(&ht.emptyval, tmp);
+ }
+ std::swap(table, ht.table);
+ std::swap(num_buckets, ht.num_buckets);
+ reset_thresholds();
+ ht.reset_thresholds();
+ }
+ void clear() {
+ if (table) destroy_buckets(0, num_buckets);
+ num_buckets = min_size(0,0);
+ set_empty(0, num_buckets);
+ }
+ pair<size_type, size_type> find_position(const key_type &key) const {
+ const size_type bucket_count_minus_one = bucket_count() - 1;
+ size_type bucknum = hash(key) & bucket_count_minus_one;
+ size_type insert_pos = ILLEGAL_BUCKET;
+ while ( 1 ) {
+ if ( test_empty(bucknum) ) {
+ if ( insert_pos == ILLEGAL_BUCKET ) return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);
+ }
+ else if ( test_deleted(bucknum) ) {
+ if ( insert_pos == ILLEGAL_BUCKET ) insert_pos = bucknum;
+ }
+ else if ( equals(key, get_key(table[bucknum])) ) {
+ return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);
+ }
+ }
+ }
+ iterator find(const key_type& key) {
+ if ( size() == 0 ) return end();
+ pair<size_type, size_type> pos = find_position(key);
+ if ( pos.first == ILLEGAL_BUCKET ) return end();
+ return iterator(this, table + pos.first, table + num_buckets, false);
+ }
+ const_iterator find(const key_type& key) const {
+ if ( size() == 0 ) return end();
+ pair<size_type, size_type> pos = find_position(key);
+ if ( pos.first == ILLEGAL_BUCKET ) return end();
+ return const_iterator(this, table + pos.first, table+num_buckets, false);
+ }
+ size_type count(const key_type &key) const {
+ pair<size_type, size_type> pos = find_position(key); }
+ pair<iterator, bool> insert_noresize(const value_type& obj) {
+ const pair<size_type,size_type> pos = find_position(get_key(obj));
+ if ( pos.first != ILLEGAL_BUCKET) {
+ return pair<iterator,bool>(iterator(this, table + pos.first, table + num_buckets, false), false);
+ }
+ else {
+ if ( test_deleted(pos.second) ) { ++num_elements; }
+ return pair<iterator,bool>(iterator(this, table + pos.second, table + num_buckets, false), true);
+ }
+ }
+ pair<iterator, bool> insert(const value_type& obj) {
+ resize_delta(1);
+ return insert_noresize(obj);
+ }
+ size_type erase(const key_type& key) {
+ const_iterator pos = find(key);
+ if ( pos != end() ) {
+ set_deleted(pos);
+ }
+ }
+ hasher hash;
+ key_equal equals;
+ ExtractKey get_key;
+ size_type num_deleted;
+ bool use_deleted;
+ bool use_empty;
+ value_type delval;
+ value_type emptyval;
+ float enlarge_resize_percent;
+ float shrink_resize_percent;
+ size_type shrink_threshold;
+ size_type enlarge_threshold;
+ value_type *table;
+ size_type num_buckets;
+ size_type num_elements;
+ bool consider_shrink;
+ void reset_thresholds() {
+ enlarge_threshold = static_cast<size_type>(num_buckets * shrink_resize_percent);
+ }
+};
+template<> struct hash<long> {
+ size_t operator()(long x) const {
+ }
+};
+template<> struct hash<unsigned long> {
+ size_t operator()(unsigned long x) const {
+ }
+};
+template <class Key, class T, class HashFcn = hash<Key>, class EqualKey = equal_to<Key>, class Alloc = allocator<T> > class dense_hash_map {
+ struct SelectKey {
+ const Key& operator()(const pair<const Key, T>& p) const {
+ return p.first;
+ }
+ };
+ typedef dense_hashtable<pair<const Key, T>, Key, HashFcn, SelectKey, EqualKey, Alloc> ht;
+ ht rep;
+ public: typedef typename ht::key_type key_type;
+ typedef T data_type;
+ typedef typename ht::value_type value_type;
+ typedef typename ht::size_type size_type;
+ typedef typename ht::iterator iterator;
+ typedef typename ht::const_iterator const_iterator;
+ iterator end() {
+ return rep.end();
+ }
+ iterator find(const key_type& key) { return rep.find(key); }
+ data_type& operator[](const key_type& key) {
+ iterator it = find(key);
+ return insert(value_type(key, data_type())).first->second;
+ }
+ pair<iterator, bool> insert(const value_type& obj) {
+ return rep.insert(obj);
+ }
+ void set_deleted_key(const key_type& key) {
+ rep.set_deleted_key(value_type(key, data_type()));
+ }
+ size_type erase(const key_type& key) { return rep.erase(key); }
+};
+template <class Value, class HashFcn = hash<Value>, class EqualKey = equal_to<Value>, class Alloc = allocator<Value> > class dense_hash_set {
+ struct Identity {
+ const Value& operator()(const Value& v) const { return v; }
+ };
+ typedef dense_hashtable<Value, Value, HashFcn, Identity, EqualKey, Alloc> ht;
+ ht rep;
+ public: typedef typename ht::key_type key_type;
+ typedef typename ht::value_type value_type;
+ typedef typename ht::size_type size_type;
+ typedef typename ht::const_iterator iterator;
+ size_type count(const key_type& key) const {
+ return rep.count(key);
+ }
+ pair<iterator, bool> insert(const value_type& obj) {
+ pair<typename ht::iterator, bool> p = rep.insert(obj);
+ }
+ size_type erase(const key_type& key) {
+ return rep.erase(key);
+ }
+};
+class linked_ptr_internal {
+ public: bool depart() { if (next_ == this) return true; }
+ mutable linked_ptr_internal const* next_;
+};
+template <typename T> class linked_ptr {
+ public: explicit linked_ptr(T* ptr = __null) {
+ }
+ ~linked_ptr() { depart(); }
+ T& operator*() const { }
+ T* value_;
+ linked_ptr_internal link_;
+ void depart() {
+ if (link_.depart()) delete value_;
+ }
+};
+class blah_3 {
+ const char* ptr_;
+ int length_;
+ public: blah_3(const char* str) : ptr_(str), length_((str == __null) ? 0 : static_cast<int>(strlen(str))) { }
+};
+class blah_5;
+class Bitmap {
+ public: Bitmap(unsigned int size) : array_size_(RequiredArraySize(size)) { }
+ static unsigned int RequiredArraySize(unsigned int num_bits) { return (num_bits + 31) >> 5; }
+ unsigned int array_size_;
+};
+enum blah_31 { CREATIVE_FORMAT_TEXT_NARROW, kNumblah_31s };
+enum blah_33 { BLACKLISTED };
+template <typename EnumT> class blah_55;
+typedef blah_55<blah_31> blah_31Set;
+enum blah_36 { APPROVAL_STATUS_APPROVED, APPROVAL_STATUS_UNKNOWN };
+enum blah_37 { hahah_INVALID, hahah_KEYWORD };
+template<typename EnumT> class blah_55 {
+ public: blah_55(int enum_size);
+ bool Insert(EnumT x);
+ const int enum_size_;
+ Bitmap elements_;
+};
+template<typename EnumT> blah_55<EnumT>::blah_55(int enum_size) :enum_size_(enum_size), elements_(enum_size) {
+ while (foo_1 _result = Check_GTImpl(1, 0, "enum_size" " " ">" " " "0")) blah_0(".h", 1902, _result).stream();
+};
+enum blah_38 {
+ ttttttt_9, };
+class blah_46 {
+ public: blah_46() : hahaha_id_(0), type_(hahah_INVALID), approval_status_(APPROVAL_STATUS_APPROVED) {
+ }
+ blah_46(long cid) : hahaha_id_(cid), type_(hahah_INVALID), approval_status_(APPROVAL_STATUS_APPROVED) {
+ }
+ long id() const {
+ return (static_cast<long>(hahaha_id_) << 16) >> 16;
+ }
+ static const blah_46 kBlacklistedID;
+ bool operator == (const blah_46& x) const { return id() == x.id(); }
+ bool operator < (const blah_46& x) const { return id() < x.id(); }
+ long hahaha_id_ : 48;
+ blah_37 type_ : 8;
+ blah_36 approval_status_ : 4;
+};
+template <> struct hash<blah_46> {
+ size_t operator()(const blah_46 &x) const {
+ return size_t(x.id());
+ }
+};
+class blah_57 {
+ public: blah_57();
+ void AddReason(blah_33 reason, const blah_3& debug_str, const blah_46& hahaha_id, bool );
+ void set_collects_multiple_reasons(bool t) { }
+ private: struct foo_3 {
+ string reject_desc;
+ };
+ foo_3 first_reason_;
+};
+template <class T> struct foo_5 : public unary_function<T*, long> {
+ long operator()(const T* p) const {
+ long id = reinterpret_cast<long>(p);
+ if (id < 2) return -id;
+ }
+};
+template <class T> class DensePtrSet : public dense_hashtable<T*, long, hash<long>, foo_5<T>, equal_to<long>, allocator<T*> > {
+ public: DensePtrSet() {
+ this->set_deleted_key(reinterpret_cast<T*>(1));
+ }
+ const T* Find(long key) const {
+ typename DensePtrSet<T>::const_iterator it = this->find(key);
+ return it != this->end() ? *it : __null;
+ }
+};
+struct foo_7 {
+ foo_7(bool spell_correction, bool query_broadening, bool previous_query, bool near_aaaaa, bool same_length, float mult, float exp_score) : shengmo_0(spell_correction), shengmo_1(query_broadening), shengmo_2(previous_query), shengmo_3(near_aaaaa), shengmo_4(same_length), multiplier(mult), expansion_score(exp_score) {
+ }
+ int CompareSameKeywordMatch(const foo_7& compare) const;
+ bool shengmo_0, shengmo_1, shengmo_2, shengmo_3, shengmo_4;
+ float multiplier, expansion_score;
+};
+enum blah_41 {
+ ACP_ECPM_EARLY = 2 };
+struct foo_8 { unsigned int packed_ctr1; };
+struct foo_9 { foo_9() {}};
+class blah_16;
+class blah_17;
+class foo_12 { public: foo_12() {}
+ unsigned long hahaha_id() const {}
+ unsigned int qbb_score() const {}
+ private: static const vector<blah_46> hmmmmh_4;
+ long hahaha_id_ : 40;
+};
+class foo_13 {
+ public: typedef dense_hash_map<long, int> BestMap;
+ foo_13() { best_rrrrrrr_.set_deleted_key(-1); }
+ void erase(long ad_group_id) {
+ best_rrrrrrr_.erase(ad_group_id);
+ }
+ typedef BestMap::iterator iterator;
+ typedef BestMap::const_iterator const_iterator;
+ const_iterator begin() const { }
+ iterator end() { return best_rrrrrrr_.end(); }
+ iterator find(long ad_group_id) { return best_rrrrrrr_.find(ad_group_id); }
+ const foo_12& GetMatch(const_iterator it) const {}
+ void hmmmmh_27(long ad_group_id, const foo_12& addme);
+ private: BestMap best_rrrrrrr_;
+ vector<foo_12> rrrrrrr_buffer_;
+};
+struct foo_10 : public dense_hash_set<blah_46> {};
+class foo_9Set : public DensePtrSet<foo_9> {};
+typedef map<blah_46, foo_7*> foo_6Data;
+typedef hash_map<long, linked_ptr<blah_57> > RejectedAdGroupMap;
+enum blah_43 {};
+class foo_14 {
+ public: foo_14(const unsigned int, const blah_16*, const int*);
+ bool GathersMultipleRejectionReasons() const;
+ void hmmmmh_30(blah_46 hahaha_id, blah_38 type);
+ const foo_7* Insertfoo_6(const blah_46 hahaha_id, bool shengmo_0, bool shengmo_1, bool shengmo_2, bool shengmo_3, bool shengmo_4_rewrite, float multiplier, float context_score);
+ void hmmmmh_7(blah_46 hahaha_id, blah_38 type);
+ foo_9* Insertfoo_9();
+ bool hmmmmh_8(long ad_group_id, const foo_12 &entry);
+ void hmmmmh_9(long ad_group_id);
+ foo_13::iterator hmmmmh_0(long ad_group_id);
+ bool hmmmmh_8(long ad_group_id, foo_13::iterator best, const foo_12& entry);
+ void hmmmmh_5(const blah_46 hahaha_id);
+ void hmmmmh_29(const blah_46 hahaha_id);
+ bool hmmmmh_12(const blah_46 hahaha_id) const;
+ bool hmmmmh_13(const blah_46 hahaha_id) const;
+ const foo_9* Getfoo_9(const blah_46 hahaha_id) const;
+ bool Gathersfoo_9() const {}
+ const foo_10* rrrrrrr_type_data() const {}
+ const foo_10* negative_rrrrrrr_type_data() const {}
+ const foo_10* positive_rrrrrrr_type_data() const {}
+ const foo_9Set* kw_info_set() const { }
+ const foo_6Data* rewrite_data() const {}
+ const vector<blah_17>& query_rectangles() const {}
+ void hmmmmh_14();
+ void AddQueryRectangle(const blah_17& query_rectangle);
+ void hmmmmh_15(long ad_group_id, const blah_46 hahaha_id, blah_33 reject_class, const char* reject_desc = __null);
+ void hmmmmh_16(const vector<long>& rejected_sssr_ids);
+ void Copy(const foo_14& cmi);
+ void hmmmmh_10();
+ private: const blah_16* ad_request_;
+ const int* cr_query_;
+ blah_43 gather_flags_;
+ vector<blah_17> query_rectangles_;
+ foo_10 rrrrrrr_type_data_;
+ foo_9Set kw_info_set_;
+ foo_6Data rewrite_data_;
+ scoped_ptr<RejectedAdGroupMap> rejected_sssr_map_;
+ foo_13 ad_group_rrrrrrr_data_;
+ vector<blah_46> geo_hahaha_;
+ bool geo_hahaha_is_sorted_;
+ foo_10 negative_rrrrrrr_type_data_, positive_rrrrrrr_type_data_;
+ scoped_ptr<foo_10> extra_hahaha_set_;
+ int dimension_id_;
+ blah_31Set creative_formats_;
+ scoped_ptr<dense_hash_set<unsigned long> > near_aaaaa_rrrrrrr_fps_;
+ blah_41 comparison_policy_;
+ blah_46 next_virtual_hahaha_id_;
+ vector<void*>* sub_queries_;
+ bool allow_only_whitelisted_customers_, automatic_hahaha_rrrrrrr_;
+ scoped_ptr<blah_5> kw_arena_, expanded_rrrrrrr_arena_;
+};
+class blah_19 {
+ void hmmmmh_3();
+ enum blah_45 {};
+};
+void blah_19::hmmmmh_3() {}
+class blah_16 {
+ public: int near_aaaaa_rrrrrrr_fps_size() const {}
+ unsigned long near_aaaaa_rrrrrrr_fps(int i) const {}
+};
+class blah_21 {
+ protected: blah_21(char* first_block, const size_t block_size, bool align_to_page);
+ void* GetMemoryFallback(const size_t size, const int align);
+ void* GetMemory(const size_t size, const int align) {
+ if ( size > 0 && size < remaining_ && align == 1 ) {
+ last_alloc_ = freestart_;
+ }
+ return GetMemoryFallback(size, align);
+ }
+ char* freestart_;
+ char* last_alloc_;
+ size_t remaining_;
+};
+class blah_5 : blah_21 {
+ public: char* Alloc(const size_t size) {
+ return reinterpret_cast<char*>(GetMemory(size, 1));
+ }
+};
+class blah_25 {
+ public: virtual ~blah_25();
+};
+class blah_17 : blah_25 { };
+void Fillfoo_8(const foo_12& x2, struct foo_8* out) {
+ out->packed_ctr1 = x2.qbb_score();
+}
+const vector<blah_46> foo_12::hmmmmh_4;
+foo_14::foo_14(const unsigned int gather_flags, const blah_16* ad_request, const int* cr_query): ad_request_(ad_request), cr_query_(cr_query), gather_flags_(static_cast<blah_43>(gather_flags)), geo_hahaha_is_sorted_(false), dimension_id_(0), creative_formats_(kNumblah_31s), comparison_policy_(ACP_ECPM_EARLY), sub_queries_(new vector<void*>()), allow_only_whitelisted_customers_(false), automatic_hahaha_rrrrrrr_(false) {
+ hmmmmh_10();
+}
+void foo_14::hmmmmh_5(const blah_46 hahaha_id) {
+ negative_rrrrrrr_type_data_.insert(hahaha_id);
+}
+void foo_14::hmmmmh_7(blah_46 hahaha_id, blah_38 type) { }
+foo_13::iterator foo_14::hmmmmh_0( long ad_group_id) {
+ return ad_group_rrrrrrr_data_.find(ad_group_id);
+}
+bool foo_14::hmmmmh_8(long ad_group_id, foo_13::iterator best, const foo_12& entry) {
+ rejected_sssr_map_->erase(ad_group_id);
+ ad_group_rrrrrrr_data_.hmmmmh_27(ad_group_id, entry);
+}
+bool foo_14::hmmmmh_8(long ad_group_id, const foo_12& entry) {
+ foo_13::iterator best = hmmmmh_0(ad_group_id);
+}
+void foo_14::hmmmmh_9(long ad_group_id) {
+ ad_group_rrrrrrr_data_.erase(ad_group_id);
+}
+void foo_14::hmmmmh_10() {
+ if (near_aaaaa_rrrrrrr_fps_ != __null) {
+ blah_54(".cc", 226, WARNING).stream() << "";
+ for (int j = 0;
+ j < ad_request_->near_aaaaa_rrrrrrr_fps_size(); j++) {
+ near_aaaaa_rrrrrrr_fps_->insert(ad_request_->near_aaaaa_rrrrrrr_fps(j));
+ }
+ }
+}
+const foo_7* foo_14::Insertfoo_6(const blah_46 hahaha_id, bool shengmo_0, bool shengmo_1, bool shengmo_2, bool shengmo_3, bool shengmo_4_rewrite, float multiplier, float context_score) {
+ if (rrrrrrr_type_data_.count(hahaha_id) > 0) return __null;
+ foo_7* new_info = new(expanded_rrrrrrr_arena_->Alloc(sizeof(foo_7))) foo_7(shengmo_0,shengmo_1, shengmo_2, shengmo_3, shengmo_4_rewrite, multiplier, context_score);
+ pair<foo_6Data::iterator, bool> status = rewrite_data_.insert( make_pair(hahaha_id, new_info));
+ foo_7* inserted = status.first->second;
+ if (!status.second) {
+ if (inserted->CompareSameKeywordMatch(*new_info) < 0) *inserted = *new_info;
+ }
+}
+foo_9* foo_14::Insertfoo_9() {
+ foo_9* info = new(kw_arena_->Alloc(sizeof(foo_9))) foo_9;
+ if (Gathersfoo_9()) kw_info_set_.insert(info);
+ creative_formats_.Insert(CREATIVE_FORMAT_TEXT_NARROW);
+}
+bool foo_14::hmmmmh_12(const blah_46 hahaha_id) const {
+ if (rrrrrrr_type_data_.count(hahaha_id)) return true;
+}
+bool foo_14::hmmmmh_13(const blah_46 hahaha_id) const {
+ if (positive_rrrrrrr_type_data_.count(hahaha_id)) return true;
+}
+const foo_9* foo_14::Getfoo_9(const blah_46 hahaha_id) const {
+ if (Gathersfoo_9()) return kw_info_set_.Find(hahaha_id.id());
+ static int occurrences_383 = 0, occurrences_mod_n_383 = 0;
+ if (++occurrences_mod_n_383 > 1000) occurrences_mod_n_383 -= 1000;
+}
+void foo_14::hmmmmh_15(long ad_group_id, const blah_46 hahaha_id, blah_33 reject_class, const char* reject_desc) {
+ if (rejected_sssr_map_ == __null) {
+ blah_54("a.cc", 413, ERROR).stream() << "re NULL";
+ rejected_sssr_map_.reset(new RejectedAdGroupMap);
+ }
+ if (rejected_sssr_map_->count(ad_group_id) == 0) {
+ blah_57* ad_rejection = new blah_57();
+ ad_rejection->set_collects_multiple_reasons( GathersMultipleRejectionReasons());
+ (*rejected_sssr_map_)[ad_group_id] = linked_ptr<blah_57>(ad_rejection);
+ }
+ blah_57& ad_rejection = *(*rejected_sssr_map_)[ad_group_id];
+ ad_rejection.AddReason(reject_class, reject_desc, hahaha_id, false);
+}
+void foo_14::hmmmmh_16(const vector<long>& rejected_sssr_ids) {
+ for (vector<long>::const_iterator it = rejected_sssr_ids.begin();
+ it != rejected_sssr_ids.end(); ++it) {
+ ad_group_rrrrrrr_data_.erase(*it);
+ for (foo_13::const_iterator it = ad_group_rrrrrrr_data_.begin();
+ it != ad_group_rrrrrrr_data_.end(); ++it) {
+ hmmmmh_15(it->first, ad_group_rrrrrrr_data_.GetMatch(it).hahaha_id(), BLACKLISTED);
+ }
+ }
+ hmmmmh_30(blah_46::kBlacklistedID, ttttttt_9);
+}
+void foo_14::Copy(const foo_14& cmi) {
+ rrrrrrr_type_data_ = *cmi.rrrrrrr_type_data();
+ negative_rrrrrrr_type_data_ = *cmi.negative_rrrrrrr_type_data();
+ positive_rrrrrrr_type_data_ = *cmi.positive_rrrrrrr_type_data();
+ if (cmi.Gathersfoo_9()) {
+ kw_info_set_ = *cmi.kw_info_set();
+ rewrite_data_ = *cmi.rewrite_data();
+ }
+ hmmmmh_14();
+ for (int i = 0; i < cmi.query_rectangles().size();
+ ++i) AddQueryRectangle(cmi.query_rectangles()[i]);
+}
+void foo_13::hmmmmh_27(long ad_group_id, const foo_12& addme) {
+ int& best_index = best_rrrrrrr_[ad_group_id];
+ rrrrrrr_buffer_.push_back(addme);
+}
+void foo_14::hmmmmh_29(const blah_46 hahaha_id) {
+ if (extra_hahaha_set_ != __null) extra_hahaha_set_->erase(hahaha_id);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C
new file mode 100644
index 000000000..91f43ae8c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C
@@ -0,0 +1,52 @@
+// PR tree-optimization/39557
+// invalid post-dom info leads to infinite loop
+// { dg-do run }
+// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fopt-info -fno-rtti" }
+
+struct C
+{
+ virtual const char *bar () const;
+};
+
+struct D
+{
+ D () : d1 (0) { }
+ C *d2[4];
+ int d1;
+ inline const C & baz (int i) const { return *d2[i]; }
+};
+
+struct E
+{
+ unsigned char e1[2];
+ D e2;
+ bool foo () const { return (e1[1] & 1) != 0; }
+ virtual const char *bar () const __attribute__ ((noinline));
+};
+
+const char *
+C::bar () const
+{
+ return 0;
+}
+
+C c;
+
+const char *
+E::bar () const
+{
+ const char *e = __null;
+ if (foo () && (e = c.C::bar ()))
+ return e;
+ for (int i = 0, n = e2.d1; i < n; i++)
+ if ((e = e2.baz (i).C::bar ()))
+ return e;
+ return e;
+}
+
+int
+main ()
+{
+ E e;
+ e.bar ();
+} // { dg-message "note: file" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C
new file mode 100644
index 000000000..b0faa93e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C
@@ -0,0 +1,31 @@
+// { dg-options "-O2 -fdump-tree-ehcleanup1-details" }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#define NOEXCEPT_FALSE noexcept (false)
+#else
+#define NOEXCEPT_FALSE
+#endif
+
+extern void can_throw ();
+class a
+{
+public:
+ ~a () NOEXCEPT_FALSE
+ {
+ if (0)
+ can_throw ();
+ }
+};
+void
+t (void)
+{
+ class a a;
+ can_throw ();
+}
+// We ought to remove implicit cleanup, since destructor is empty.
+// { dg-final { scan-tree-dump-times "Empty EH handler" 2 "ehcleanup1" } }
+//
+// And as a result also contained control flow.
+// { dg-final { scan-tree-dump-times "Removing unreachable" 6 "ehcleanup1" } }
+//
+// { dg-final { cleanup-tree-dump "ehcleanup1" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-1.C
new file mode 100644
index 000000000..6a6e452be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-1.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+struct S {};
+S bar (const S &a)
+{
+ S s;
+ s = a;
+ return s;
+}
+
+/* Test whether memcpy call has been optimized out. */
+/* { dg-final { scan-tree-dump-times "memcpy" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-2.C
new file mode 100644
index 000000000..01b77b4fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/empty-2.C
@@ -0,0 +1,15 @@
+// PR c++/45307
+// { dg-options "-fdump-tree-gimple -fdump-tree-optimized -O" }
+
+struct fallible_t { };
+const fallible_t fallible = fallible_t();
+
+void t(void)
+{
+}
+
+// { dg-final { scan-tree-dump-not "fallible" "gimple" } }
+// Whole constructor should be optimized away.
+// { dg-final { scan-tree-dump-not "int" "optimized" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C
new file mode 100644
index 000000000..2b4c41103
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+struct ExtentsBase {
+ ExtentsBase() : startx_(), endx_() { }
+ ExtentsBase(const ExtentsBase &b) {
+ *this = b;
+ }
+
+ const ExtentsBase & operator=(const ExtentsBase &b) {
+ if (this != &b) {
+ startx_ = b.startx_;
+ }
+ return *this;
+ }
+
+ int startx_;
+ int endx_;
+};
+
+int f(const ExtentsBase &e1) {
+ ExtentsBase my_extents = e1;
+ return my_extents.startx_;
+}
+
+/* { dg-final { scan-tree-dump-not "&my_extents" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C
new file mode 100644
index 000000000..69f260216
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop2" } */
+
+struct A
+{
+ void foo ()
+ {
+ }
+};
+
+int main()
+{
+ void (A::* const p)() = & A::foo;
+ A a;
+ (a.*p)();
+}
+
+/* We should eliminate the check if p points to a virtual function. */
+/* { dg-final { scan-tree-dump-times "& 1" 0 "forwprop2" } } */
+/* { dg-final { cleanup-tree-dump "forwprop2" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
new file mode 100644
index 000000000..d8682bec1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+ extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, void (*ptr)(E))
+{
+ for (; b != e; b++)
+ ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+ std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+ foreach (argv, argv + argc, inline_me);
+ foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
+/* { dg-final { cleanup-tree-dump "einline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
new file mode 100644
index 000000000..4c8a6265d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+ extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, E ptr)
+{
+ for (; b != e; b++)
+ ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+ std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+ foreach (argv, argv + argc, inline_me);
+ foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
+/* { dg-final { cleanup-tree-dump "einline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
new file mode 100644
index 000000000..2804a6353
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=5" } */
+/* { dg-add-options bind_pic_locally } */
+
+#include <algorithm>
+
+void foo(const char *s);
+
+void
+inline_me (char *x)
+{
+ foo(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+ foo(x);
+}
+
+int main(int argc, char **argv)
+{
+ std::for_each (argv, argv + argc, inline_me);
+ std::for_each (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
+/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
+/* { dg-final { cleanup-tree-dump "einline" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C
new file mode 100644
index 000000000..0eaa0fb25
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ivopts" } */
+
+struct Foo {
+ Foo() : s(1) {}
+ int s;
+};
+void foo(Foo&);
+void bar(void)
+{
+ Foo x[4];
+ foo(x[0]);
+}
+
+/* { dg-final { scan-tree-dump-not "-&x" "ivopts" } } */
+/* { dg-final { scan-tree-dump-not "offset: (4294967292|0x0f+fc)" "ivopts" } } */
+/* { dg-final { scan-tree-dump-not "&x\\\[5\\\]" "ivopts" } } */
+/* { dg-final { cleanup-tree-dump "ivopts" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C
new file mode 100644
index 000000000..83b5728ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */
+/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
+
+void test (int *b, int *e, int stride)
+ {
+ for (int *p = b; p != e; p += stride)
+ *p = 1;
+ }
+
+/* { dg-final { scan-tree-dump-times "PHI <\[pb\]" 1 "ivopts"} } */
+/* { dg-final { cleanup-tree-dump "ivopts" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/new1.C
new file mode 100644
index 000000000..a859f0ac3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/new1.C
@@ -0,0 +1,42 @@
+// PR c++/36633
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall -fdump-tree-forwprop1" } */
+// No particular reason for choosing forwprop1 dump to look at.
+
+struct B { ~B() {} };
+struct D : public B {};
+//struct D {};
+
+struct my_deleter
+{
+ void operator()(D * d)
+ {
+ // delete [] d;
+ }
+};
+
+struct smart_ptr
+{
+ smart_ptr(D * ptr) : p(ptr) { }
+ ~smart_ptr() { d(p); }
+ D * p;
+ my_deleter d;
+};
+
+int
+test01()
+{
+ smart_ptr p(new D[7]);
+
+ return 0;
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "= .* \\+ -" "forwprop1" } } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C
new file mode 100644
index 000000000..33462946a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-cfg" } */
+/* { dg-add-options bind_pic_locally } */
+
+double a;
+void t()
+{
+ a=1;
+}
+void t1(void);
+void abort(void);
+
+void q()
+{
+ try {
+ t();
+ }
+ catch (...) {abort();}
+}
+/* We shouldnotice nothrow attribute. */
+/* { dg-final { scan-tree-dump-times "exception" 0 "cfg"} } */
+/* { dg-final { cleanup-tree-dump "cfg" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C
new file mode 100644
index 000000000..9854d32e8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+/* This used to fail with type-checking enabled because we didn't
+ expect OBJ_TYPE_REF expressions. */
+
+class QObject {};
+class Pile : public QObject {
+public:
+ virtual void setVisible(void);
+};
+class Spider {
+ void dealRow();
+ Pile *redeals[5];
+ int m_redeal;
+};
+void Spider::dealRow()
+{
+ redeals[m_redeal++]->setVisible();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C
new file mode 100644
index 000000000..777656d59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(int *a)
+{
+ int &b = *a;
+ b = 0;
+ return *a;
+}
+
+/* There should be only one dereferencing of a. */
+/* { dg-final { scan-tree-dump-times "\\*a" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13146.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13146.C
new file mode 100644
index 000000000..22baf03d3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13146.C
@@ -0,0 +1,77 @@
+/* { dg-do link } */
+/* { dg-options "-O -fstrict-aliasing" } */
+
+class first
+{
+public:
+ double d;
+ int f1;
+};
+
+class middle : public first
+{
+};
+
+class second : public middle
+{
+public:
+ int f2;
+ short a;
+};
+
+class third
+{
+public:
+ char a;
+ char b;
+};
+
+class multi: public third, public second
+{
+public:
+ short s;
+ /* The following field used to be of type char but that causes
+ class multi to effectively get alias-set zero which we end
+ up not optimizing because of the fix for PR44164. */
+ int f3;
+};
+
+extern void link_error ();
+
+void
+foo (first *s1, second *s2)
+{
+ s1->f1 = 0;
+ s2->f2 = 0;
+ s1->f1++;
+ s2->f2++;
+ s1->f1++;
+ s2->f2++;
+ if (s1->f1 != 2)
+ link_error ();
+}
+
+void
+bar (first *s1, multi *s3)
+{
+ s1->f1 = 0;
+ s3->f3 = 0;
+ s1->f1++;
+ s3->f3++;
+ s1->f1++;
+ s3->f3++;
+ if (s1->f1 != 2)
+ link_error ();
+}
+
+
+int
+main()
+{
+ first a;
+ second b;
+ multi c;
+ foo (&a, &b);
+ bar (&a, &c);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13954.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13954.C
new file mode 100644
index 000000000..169497a9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr13954.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+void link_error (void);
+
+class base
+{
+};
+
+class teststruct: public base
+{
+public:
+ double d;
+ char f1;
+};
+
+void
+copystruct1 (teststruct param)
+{
+ teststruct local;
+ param.f1 = 0;
+ local = param;
+ if (local.f1 != 0)
+ link_error ();
+}
+
+/* There should be no reference to link_error. */
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14703.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14703.C
new file mode 100644
index 000000000..58705277e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14703.C
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized -fno-ipa-reference" } */
+#include <iostream>
+
+namespace {
+template <unsigned long long L> class fib {
+ public:
+ static const unsigned long long value = fib<L - 1>::value + fib<L - 2>::value;
+};
+
+template <> class fib<0> {
+ public:
+ static const unsigned long long value = 1;
+};
+
+template <> class fib<1> {
+ public:
+ static const unsigned long long value = 1;
+};
+
+template<unsigned long long L> inline unsigned long long fibconst()
+{
+ return fibconst<L - 1>() + fibconst<L - 2>();
+}
+
+template <> inline unsigned long long fibconst<0>()
+{
+ return 1ull;
+}
+
+template <> inline unsigned long long fibconst<1>()
+{
+ return 1ull;
+}
+
+template <> inline unsigned long long fibconst<2>()
+{
+ return 2ull;
+}
+
+}
+
+int main()
+{
+ ::std::cerr << "fib<90>::value == " << fib<90>::value << "\n";
+ ::std::cerr << "fibcst<90>() == " << fibconst<90>() << "\n";
+}
+// { dg-final { scan-tree-dump-not "fibconst" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14814.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14814.C
new file mode 100644
index 000000000..59e3c9bc9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr14814.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop2" } */
+
+class YY { public:
+ YY(const YY &v) { e[0] = v.e[0]; e[1] = v.e[1]; e[2] = v.e[2]; }
+ double &y() { return e[1]; }
+ double e[3]; };
+
+class XX { public:
+ YY direction() const { return v; }
+ YY v; };
+
+int foo(XX& r) {
+ if (r.direction().y() < 0.000001) return 0;
+ return 1; }
+
+/* { dg-final { scan-tree-dump-times "&this" 0 "forwprop2" } } */
+/* { dg-final { scan-tree-dump-times "&r" 0 "forwprop2" } } */
+/* { dg-final { cleanup-tree-dump "forwprop2" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C
new file mode 100644
index 000000000..68f14adad
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C
@@ -0,0 +1,25 @@
+/* { dg-do link } */
+
+void link_error ();
+
+int main ()
+{
+ struct { int b[2]; } x;
+ int b[2];
+ if (&b[1] != &b[1])
+ link_error ();
+ if (&b[0] != b)
+ link_error ();
+ if (b == &b[2])
+ link_error ();
+ if (b != b)
+ link_error ();
+ if (&x.b[1] == &x.b[0])
+ link_error ();
+ if (x.b != &x.b[0])
+ link_error ();
+ if (&x.b[1] == x.b)
+ link_error ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C
new file mode 100644
index 000000000..fb8cbbe4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C
@@ -0,0 +1,13 @@
+/* { dg-do link } */
+/* { dg-options "" } */
+
+void link_error ();
+struct a {};
+int main ()
+{
+ struct a b[2];
+ if (&b[0] == &b[1])
+ link_error ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C
new file mode 100644
index 000000000..2fd03e2e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f(int i, unsigned j)
+{
+ int b[2];
+ if (&b[i] == &b[j])
+ return 1;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "i == j" 0 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C
new file mode 100644
index 000000000..82be2e33a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f(int i, int j)
+{
+ int b[2][2];
+ if (&b[1][i] == &b[0][j])
+ return 1;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "i == j" 0 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C
new file mode 100644
index 000000000..06ce523a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int foo(int i, int j)
+{
+ char g[16];
+ if (&g[i] == &g[j])
+ return 1;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "i == j" 1 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr16688.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr16688.C
new file mode 100644
index 000000000..ce88bc2b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr16688.C
@@ -0,0 +1,273 @@
+/* PR 16688. Test provided by Wolfgang Bangerth. The alias analyzer
+ was aborting when trying to group aliases. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+template<typename _Tp>
+struct iterator_traits;
+
+template<typename _Tp>
+struct iterator_traits<_Tp*> {
+ typedef _Tp& reference;
+};
+
+template<typename _Iterator> struct NI {
+ _Iterator current;
+
+ typedef typename iterator_traits<_Iterator>::reference reference;
+
+ NI() { }
+
+ NI(const _Iterator& __i) : current(__i) { }
+
+ reference operator*() const { return *current; }
+
+ NI& operator++() { return *this; }
+
+ const _Iterator& base() const { return current; }
+};
+
+template<typename _IteratorL, typename _IteratorR>
+inline int
+operator-(const NI<_IteratorL>& __lhs,
+ const NI<_IteratorR>& __rhs)
+{ return __lhs.base() - __rhs.base(); }
+
+
+template<typename _II, typename _OI>
+inline _OI
+__copy_aux(_II __first, _II __last, _OI __result)
+{
+ struct __copy {
+ static _OI
+ copy(_II __first, _II __last, _OI __result)
+ {
+ for (; __first != __last; ++__result, ++__first)
+ *__result = *__first;
+ return __result;
+ }
+ };
+
+ return __copy::copy(__first, __last, __result);
+}
+
+struct __copy_normal
+{
+ template<typename _II, typename _OI>
+ static _OI
+ copy_n(_II __first, _II __last, _OI __result)
+ {
+ return __copy_aux(__first, __last, __result);
+ }
+};
+template<typename _InputIterator, typename _OutputIterator>
+inline _OutputIterator
+copy(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+{
+ return __copy_normal::copy_n(__first, __last, __result);
+}
+
+template <typename T, typename U, typename V>
+void uninitialized_fill_n(T,U,V);
+
+
+template<typename _Tp>
+struct _Vector_base {
+ struct _Vector_impl {
+ _Tp* start;
+ _Tp* finish;
+ _Tp* end_of_storage;
+ _Vector_impl() : start(0), finish(0), end_of_storage(0)
+ { }
+ } impl;
+
+ _Vector_base(unsigned __n) {
+ impl.start = allocate(__n);
+ impl.finish = impl.start;
+ impl.end_of_storage = impl.start + __n;
+ }
+
+ ~_Vector_base() {
+ deallocate(impl.start,
+ impl.end_of_storage - impl.start);
+ }
+
+ _Tp* allocate(unsigned __n);
+
+ void deallocate(_Tp* __p, unsigned __n);
+
+ NI<_Tp*> begin() { return NI<_Tp*> (impl.start); }
+};
+
+
+template<typename _Tp>
+struct vector : _Vector_base<_Tp>
+{
+ vector(int __n)
+ : _Vector_base<_Tp>(__n)
+ {
+ uninitialized_fill_n(this->impl.start, __n, _Tp());
+ }
+};
+
+
+
+struct Tensor
+{
+ Tensor ();
+ Tensor (const Tensor &);
+
+ double values[2];
+};
+
+
+inline
+Tensor::Tensor (const Tensor &p)
+{
+ for (unsigned int i=0; i<2; ++i)
+ values[i] = p.values[i];
+}
+
+
+struct TriaAccessor
+{
+ typedef void * AccessorData;
+
+ void copy_from (const TriaAccessor &);
+ void operator = (const TriaAccessor *);
+
+ TriaAccessor & operator = (const TriaAccessor &);
+
+ bool operator == (const TriaAccessor &) const;
+
+ bool operator != (const TriaAccessor &) const;
+ void operator ++ ();
+
+ int state () const;
+ bool used () const;
+
+ int present_level;
+ int present_index;
+ int** levels;
+};
+
+inline int TriaAccessor::state () const {
+ if ((present_level>=0) && (present_index>=0))
+ return 0;
+ else
+ if ((present_level==-1) && (present_index==-1))
+ return 1;
+ else
+ return 2;
+}
+
+
+inline
+void TriaAccessor::operator ++ () {
+ ++this->present_index;
+
+ while (this->present_index >=
+ static_cast<int>(*this->levels[this->present_level]))
+ {
+ ++this->present_level;
+ this->present_index = 0;
+
+ if (this->present_level >= static_cast<int>(1))
+ {
+
+ this->present_level = this->present_index = -1;
+ return;
+ }
+ }
+}
+
+struct MGDoFObjectAccessor : TriaAccessor {};
+
+
+
+struct TriaRawIterator
+{
+ TriaRawIterator ();
+
+ TriaRawIterator (const TriaRawIterator &);
+ TriaRawIterator (const MGDoFObjectAccessor &a);
+ const MGDoFObjectAccessor & operator * () const;
+
+ MGDoFObjectAccessor & operator * ();
+ const MGDoFObjectAccessor * operator -> () const;
+
+ MGDoFObjectAccessor * operator -> ();
+
+ TriaRawIterator & operator = (const TriaRawIterator &);
+
+ bool operator == (const TriaRawIterator &) const;
+ bool operator != (const TriaRawIterator &) const;
+ bool operator < (const TriaRawIterator &) const;
+ MGDoFObjectAccessor accessor;
+
+ TriaRawIterator & operator ++ ();
+};
+
+struct TriaIterator : TriaRawIterator
+{
+ TriaIterator ();
+
+ TriaIterator (const TriaIterator &i);
+
+ TriaIterator &
+ operator = (const TriaIterator &);
+
+ TriaIterator &
+ operator = (const TriaRawIterator &);
+};
+
+
+inline
+TriaRawIterator::TriaRawIterator (const TriaRawIterator &i) :
+ accessor (i.accessor) {}
+
+inline
+TriaIterator::TriaIterator (const TriaIterator &i) :
+ TriaRawIterator (static_cast<TriaRawIterator >(i)) {}
+
+inline
+TriaRawIterator & TriaRawIterator::operator ++ () {
+ while (++accessor, (this->accessor.state() == 0))
+ if (this->accessor.used() == true)
+ return *this;
+ return *this;
+}
+
+struct Comp {
+ Comp (const Tensor &dir) : dir(dir) {}
+
+ bool operator () (const TriaIterator &c1, const TriaIterator &c2) const;
+ const Tensor dir;
+};
+
+
+template<typename Iter>
+void x1(Iter first, Iter last, int i, Comp comp)
+{
+ x1(Iter(), last, i, comp);
+}
+
+template<typename Iter>
+inline void x2(Iter first, Iter last, Comp comp)
+{
+ if (first.base() != last.base())
+ x1(first, last, (last - first), comp);
+}
+
+void downstream_dg (const Tensor& direction)
+{
+ vector<TriaIterator> ordered_cells(13);
+ const Comp comparator(direction);
+
+ TriaIterator begin, end;
+
+ copy (begin, end, ordered_cells.begin());
+ x2 (ordered_cells.begin(), ordered_cells.begin(), comparator);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17153.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17153.C
new file mode 100644
index 000000000..658225e6e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17153.C
@@ -0,0 +1,17 @@
+/* The alias analyzer was marking RETVAL non-addressable, but RETVAL
+ is a special variable that's available across different functions. */
+void foo(const char*);
+
+struct A {};
+
+struct B : A
+{
+ B(){}
+ B bar()
+ {
+ foo(__PRETTY_FUNCTION__);
+ return B();
+ }
+};
+
+B b=B().bar();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17400.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17400.C
new file mode 100644
index 000000000..a6619a84f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17400.C
@@ -0,0 +1,53 @@
+// Test PR 17400. Test case provided by Serge Belyshev.
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+
+void inc (int &);
+bool dec_test (int &);
+
+struct A
+{
+ int c;
+
+ friend void AddRef (A * p)
+ {
+ inc (p->c);
+ }
+
+ friend void Release (A * p)
+ {
+ if(dec_test (p->c))
+ delete p;
+ }
+};
+
+struct B
+{
+ B (A *p) : obj(p)
+ {
+ AddRef (obj);
+ }
+
+ ~B()
+ {
+ Release (obj);
+ }
+
+ void swap (B &rhs)
+ {
+ A * tmp = obj;
+ obj = rhs.obj;
+ rhs.obj = tmp;
+ }
+
+ A *obj;
+};
+
+void bar (A *p1, A* p2)
+{
+ B px (p1);
+ B px2 (p2);
+ px.swap (px2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17517.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17517.C
new file mode 100644
index 000000000..bcd5e91db
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr17517.C
@@ -0,0 +1,32 @@
+// Test PR 17517. Test case provided by Serge Belyshev.
+
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+
+
+extern void foo ();
+
+struct Ptr {
+ int * ptr;
+ Ptr () { ptr = 0; }
+ ~Ptr() { delete ptr; }
+ Ptr &operator= (int * p) { ptr = p; return *this; }
+};
+
+int *new_checker () { foo (); return 0; }
+
+void pipe (int c)
+{
+ Ptr checker;
+
+ foo ();
+ for (;;)
+ {
+ switch (c)
+ {
+ case '-':
+ checker = new_checker ();
+ break;
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr18178.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr18178.C
new file mode 100644
index 000000000..a04807780
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr18178.C
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+
+// Define this to see it work.
+// #define WORK_WORK_WORK
+
+#define THIRD
+
+#ifdef THIRD
+#define FIRST i < 0 ||
+#define ORIG int
+#define CAST
+#else
+
+#define FIRST
+#ifdef WORK_WORK_WORK
+#define ORIG unsigned int
+#define CAST
+#else
+#define ORIG int
+#define CAST (unsigned)
+#endif // WORK_WORK_WORK
+
+#endif // THIRD
+
+struct array
+{
+ const ORIG len;
+ int *data;
+};
+
+extern void call (ORIG);
+
+void doit (array *a)
+{
+ for (ORIG i = 0; i < a->len; ++i)
+ {
+ if (FIRST CAST i >= CAST (a->len))
+ throw 5;
+ call (a->data[i]);
+ }
+}
+
+/* VRP should remove all but 1 if() in the loop. */
+
+/* { dg-final { scan-tree-dump-times "if " 1 "vrp1"} } */
+/* { dg-final { cleanup-tree-dump "vrp1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C
new file mode 100644
index 000000000..cbdad90d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-ccp1" } */
+
+// See pr19476-5.C for a version without including <new>.
+#include <new>
+
+int f(){
+ return 33 + (0 == new(std::nothrow) int);
+}
+int g(){
+ return 42 + (0 == new int[50]);
+}
+
+/* { dg-final { scan-tree-dump "return 42" "ccp1" } } */
+/* { dg-final { scan-tree-dump-not "return 33" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C
new file mode 100644
index 000000000..70002dbb5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#include <new>
+
+int f(){
+ int *p = new(std::nothrow) int;
+ return 33 + (0 == p);
+}
+int g(){
+ int *p = new int[50];
+ return 42 + (0 == p);
+}
+
+/* { dg-final { scan-tree-dump "return 42" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "return 33" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C
new file mode 100644
index 000000000..051866e13
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcheck-new -fdump-tree-optimized" } */
+
+#include <new>
+
+int g(){
+ return 42 + (0 == new int);
+}
+
+/* { dg-final { scan-tree-dump-not "return 42" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C
new file mode 100644
index 000000000..8ae16140d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-delete-null-pointer-checks -fdump-tree-optimized" } */
+
+#include <new>
+
+int g(){
+ return 42 + (0 == new int);
+}
+
+/* { dg-final { scan-tree-dump-not "return 42" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C
new file mode 100644
index 000000000..bec0bb58b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-ccp1" } */
+
+// See pr19476-1.C for a version that includes <new>.
+
+int g(){
+ return 42 + (0 == new int[50]);
+}
+
+/* { dg-final { scan-tree-dump "return 42" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19637.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19637.C
new file mode 100644
index 000000000..2d1dcceba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19637.C
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dom1" } */
+
+#include <new>
+
+struct Foo {
+ Foo() { i[0] = 1; }
+ int i[2];
+};
+
+int foo_char(void)
+{
+ int i[2];
+ new (reinterpret_cast<char *>(i)) Foo();
+ return reinterpret_cast<Foo *>(i)->i[0];
+}
+
+int foo_void(void)
+{
+ int i[2];
+ new (reinterpret_cast<void *>(i)) Foo();
+ return reinterpret_cast<Foo *>(i)->i[0];
+}
+
+int foo_void_offset(void)
+{
+ int i[2];
+ new (reinterpret_cast<void *>(&i[0])) Foo();
+ return reinterpret_cast<Foo *>(&i[0])->i[0];
+}
+
+/* { dg-final { scan-tree-dump-times "return 1;" 3 "dom1" } } */
+/* { dg-final { cleanup-tree-dump "dom1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19786.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19786.C
new file mode 100644
index 000000000..faaecdfd9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19786.C
@@ -0,0 +1,48 @@
+// { dg-do run }
+/* { dg-options "-O2" } */
+
+// We used to get alias grouping wrong on this one, hoisting accesses
+// to the vector's end out of the loop.
+
+#include <vector>
+#include <cassert>
+
+struct A
+{
+ double unused; // If I remove it => it works.
+ std::vector<int> v;
+
+ A() : v(1) {}
+};
+
+inline // If not inline => it works.
+A g()
+{
+ A r;
+ r.v.resize(2);
+ r.v[0] = 1;
+
+ while (!r.v.empty() && r.v.back() == 0)
+ r.v.pop_back();
+
+ return r;
+}
+
+A f(const A &a)
+{
+ if (a.v.empty()) return a;
+ if (a.v.empty()) return a;
+
+ // A z = g(); return z; // If I return like this => it works.
+ return g();
+}
+
+int main()
+{
+ A a;
+ A b;
+ A r = f(a);
+ assert(r.v.size() != 0);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19807.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19807.C
new file mode 100644
index 000000000..0eeeb18ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19807.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int a[4];
+int *x, *y, *z;
+
+void foo(void)
+{
+ x = &a[3] - 1;
+ y = &a[1] + 1;
+ z = 1 + &a[1];
+}
+
+void bar(int i)
+{
+ x = &a[i] - 1;
+ y = &a[i] + 1;
+ z = 1 + &a[i];
+}
+
+/* { dg-final { scan-tree-dump-times "&a\\\[2\\\]" 3 "optimized" } } */
+
+/* We want &a[D.bla + 1] and &a[D.foo - 1] in the final code, but
+ tuples mean that the offset is calculated in a separate instruction.
+ Simply test for the existence of +1 and -1 once, which also ensures
+ the above. If the addition/subtraction would be applied to the
+ pointer we would instead see +-4 (or 8, depending on sizeof(int)). */
+/* { dg-final { scan-tree-dump "\\\+ (0x0f*|18446744073709551615|4294967295|-1);" "optimized" } } */
+/* { dg-final { scan-tree-dump-times "\\\+ 1;" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19952.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19952.C
new file mode 100644
index 000000000..54589a294
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr19952.C
@@ -0,0 +1,24 @@
+/* PR 19952 */
+/* { dg-do compile } */
+/* { dg-options "-ftree-vectorize -O2" } */
+
+int i;
+
+struct A
+{
+ ~A() { ++i; }
+};
+
+struct B
+{
+ A a;
+};
+
+void foo()
+{
+ for (int i=0; i<2; ++i)
+ {
+ B *p;
+ if (p) p->~B();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20280.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20280.C
new file mode 100644
index 000000000..ec4dad706
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20280.C
@@ -0,0 +1,63 @@
+// PR c++/20280
+
+// { dg-do compile }
+
+// Gimplification of the COND_EXPR used to fail because it had an
+// addressable type, and create_tmp_var rejected that.
+
+struct A
+{
+ ~A();
+};
+
+struct B : A {};
+
+A& foo();
+
+void bar(bool b)
+{
+ (B&) (b ? foo() : foo());
+}
+
+// Make sure bit-fields and addressable types don't cause crashes.
+// These were not in the original bug report.
+
+// Added by Alexandre Oliva <aoliva@redhat.com>
+
+// Copyright 2005 Free Software Foundation
+
+struct X
+{
+ long i : 32, j, k : 32;
+};
+
+void g(long&);
+void h(const long&);
+
+void f(X &x, bool b)
+{
+ (b ? x.i : x.j) = 1;
+ (b ? x.j : x.k) = 2;
+ (b ? x.i : x.k) = 3;
+
+ (void)(b ? x.i : x.j);
+ (void)(b ? x.i : x.k);
+ (void)(b ? x.j : x.k);
+
+ g (b ? x.i : x.j); // { dg-error "cannot bind bitfield" }
+ g (b ? x.i : x.k); // { dg-error "cannot bind bitfield" }
+ g (b ? x.j : x.k); // { dg-error "cannot bind bitfield" }
+
+ // It's not entirely clear whether these should be accepted. The
+ // conditional expressions are lvalues for sure, and 8.5.3/5 exempts
+ // lvalues for bit-fields, but it's not clear that conditional
+ // expressions that are lvalues and that have at least one possible
+ // result that is a bit-field lvalue meets this condition.
+ h (b ? x.i : x.j);
+ h (b ? x.i : x.k);
+ h (b ? x.j : x.k);
+
+ (long &)(b ? x.i : x.j); // { dg-error "address of bit-field" }
+ (long &)(b ? x.i : x.k); // { dg-error "address of bit-field" }
+ (long &)(b ? x.j : x.k); // { dg-error "address of bit-field" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20458.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20458.C
new file mode 100644
index 000000000..d4e7d1a1a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20458.C
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+/* The tail call optimization would inapproriately tail call the
+ destructors due to not recognizing a call clobbered variable */
+namespace std
+{
+ class locale
+ {
+ public:
+ locale();
+ ~locale();
+ };
+}
+
+struct B
+{
+ std::locale _M_buf_locale;
+ virtual ~B() {}
+};
+
+struct C : public B
+{
+ char *s;
+};
+
+void foo ()
+{
+ C c;
+}
+
+int main()
+{
+ foo ();
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20489.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20489.C
new file mode 100644
index 000000000..0a1a569d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20489.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct A
+{
+ ~A();
+};
+
+/* If we don't create SFT's for the "empty" structure A, bad things
+ will happen, and we will fail verification. */
+struct B
+{
+ int i;
+ A a;
+
+ void foo() {}
+};
+
+void bar()
+{
+ B().foo();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20920.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20920.C
new file mode 100644
index 000000000..02edd2827
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20920.C
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* This was causing a failure in the out of SSA pass because VRP was
+ trying to insert assertions for SSA names that flow through
+ abnormal edges. */
+void f(int) __attribute__((__noreturn__));
+int d(const char *);
+char * j ();
+
+char *
+foo (int x)
+{
+ char *path = __null;
+ try
+ {
+ path = j ();
+ if (path != __null)
+ if (d (path) != 0)
+ f (127);
+ f (127);
+ }
+ catch (...) { }
+
+ return path;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20963.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20963.C
new file mode 100644
index 000000000..d8f91e1be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr20963.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* This was causing PRE to insert the value of the ADDR variable, to
+ remove the invariant cast but in doing so, it was creating a
+ non-invariant expression out of the invariant one, causing a later
+ failure in PRE. */
+struct sMCB {
+ unsigned char type;
+};
+
+extern void foo (void);
+unsigned char mem_readb(char *pt) __attribute__((nothrow));
+
+void DOS_FreeProcessMemory(unsigned short pspseg) {
+ while (1) {
+ if (pspseg)
+ foo ();
+ char *addr = (char*)(&((sMCB*)0)->type);
+ if (mem_readb(addr)==0x5a) break;
+ }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21082.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21082.C
new file mode 100644
index 000000000..d6c2fa1d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21082.C
@@ -0,0 +1,14 @@
+/* { dg-do link } */
+/* { dg-options "-fstrict-overflow" } */
+
+void link_error();
+
+int a[4];
+__INTPTR_TYPE__ b, c;
+
+int main()
+{
+ if (&a[b] - &a[c] != b - c)
+ link_error();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21407.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21407.C
new file mode 100644
index 000000000..561dc707a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21407.C
@@ -0,0 +1,8 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+extern "C" void abort(void);
+struct T1 {int a, b; virtual void f(){}};
+struct T : T1 { struct T1 w; int b; };
+void foo (struct T1 *p) { struct T *q = dynamic_cast<T*>(p); if (q->b != 2) abort (); }
+/* We shouldn't kill the store to c.b, because foo uses it. */
+int main () { struct T c; c.b = 2; foo (&c); return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21463.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21463.C
new file mode 100644
index 000000000..6d6ee93ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21463.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-phiopt1" } */
+
+template<class T> static inline const T &ref_max(const T &a, const T &b)
+{ return a<b ? b : a; }
+template<class T> static inline const T &ref_min(const T &a, const T &b)
+{ return a<b ? a : b; }
+
+template<class T> struct foo_t {
+ T a0, a1;
+ T bar_ref(const T b, const T c) {
+ return ref_max(ref_min(a0, c), ref_min(ref_max(a1, c), b));
+ }
+};
+
+template struct foo_t<int>;
+
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 2 "phiopt1" } } */
+/* { dg-final { scan-tree-dump-times "MAX_EXPR" 2 "phiopt1" } } */
+/* { dg-final { cleanup-tree-dump "phiopt1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C
new file mode 100644
index 000000000..2c96d1027
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C
@@ -0,0 +1,38 @@
+extern "C" {
+
+extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
+ throw () __attribute__ ((__nonnull__ (1, 2)));
+
+extern char *foo (char *__restrict __s) throw ();
+}
+
+class cset {
+public:
+ cset();
+ int operator()(unsigned char) const;
+private:
+ char v[(127 * 2 + 1)+1];
+};
+
+inline int cset::operator()(unsigned char c) const
+{
+ return v[c];
+}
+
+extern cset csspace;
+
+void baz()
+{
+ char *vec;
+ char buf[512];
+
+ char *p = buf;
+ while (csspace(*p))
+ p++;
+
+ if (*p != '#' && (p = foo(buf)) != 0) {
+ vec = new char[10+ 1];
+ strcpy(vec, p);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C
new file mode 100644
index 000000000..6246e8d4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C
@@ -0,0 +1,22 @@
+extern char *strcpy (char *__restrict __dest, __const char *__restrict __src);
+
+extern char *foo (void);
+extern void *malloc(__SIZE_TYPE__) __attribute__((malloc));
+
+char v[100];
+
+void baz()
+{
+ char *vec;
+ char buf[512];
+
+ char *p = buf;
+ while (v[(*p)])
+ p++;
+
+ if (*p != '#' && (p = foo()) != 0) {
+ strcpy ((char*)malloc(10), p);
+ }
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22005.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22005.C
new file mode 100644
index 000000000..cdaac2b88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22005.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+struct cl_string
+{
+ union{ int i; };
+ cl_string ();
+};
+struct cl_print_univpoly_flags { cl_string univpoly_varname; };
+struct cl_print_flags: cl_print_univpoly_flags {int i;};
+cl_print_flags default_print_flags;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22037.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22037.C
new file mode 100644
index 000000000..11fc1b038
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22037.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern double sqrt (double) throw ();
+
+void foo(double& d, int n)
+{
+ double e=0;
+ for(int i=0; i<n; i++);
+ for(int i=0; i<n; i++) e=1;
+ d = sqrt(e);
+
+ for(int i=0; i<n; i++);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22071.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22071.C
new file mode 100644
index 000000000..719aed374
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22071.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* This code ends up taking the address of part of the structure that is padding,
+ and because there is no real field there, the structure alias analyzer would
+ abort. */
+struct empty_class {};
+struct class1 : empty_class
+{
+ class1() {}
+ empty_class value_;
+};
+struct lambda : class1 { };
+lambda _1;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22279.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22279.C
new file mode 100644
index 000000000..0e17f08ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22279.C
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct string
+{
+ long long _M_p;
+ long long i;
+ string();
+ int begin();
+ int end();
+ string(int, int);
+};
+struct symbol
+{
+ int type;
+ string name;
+ long long raw_name;
+ long long demangled_name;
+ long long version_name;
+ int version_status;
+ int status;
+ void init();
+};
+void symbol::init() { name = string(); }
+struct pair
+{
+ symbol first;
+ symbol second;
+ pair(const symbol& __a, const symbol& __b) : first(__a), second(__b) { }
+};
+struct vector
+{
+ void push_back(const pair& __x);
+};
+/* This ends up with two RHS deref copies, and we need to get the offsets right on them. */
+void f(vector incompatible)
+{
+ symbol base;
+ incompatible.push_back(pair(base, base));
+}
+
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22404.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22404.C
new file mode 100644
index 000000000..2c6b8cd27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22404.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* We were not getting the offset of a in B and a in C::B correct,
+ causing an abort. */
+struct A { A(); };
+
+struct B : A
+{
+ A a;
+};
+
+struct C : B { };
+
+C c;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22444.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22444.C
new file mode 100644
index 000000000..7df4b9cce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22444.C
@@ -0,0 +1,141 @@
+// PR tree-optimization/22444
+// When creating SFT's, we shouldn't add the original variable
+// to the addressable vars list, because this may cause false aliasing
+// with the subvars leading to the subvars not being renamed when they should
+// { dg-do compile }
+// { dg-options "-O2" }
+__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+__extension__ typedef __SIZE_TYPE__ size_t;
+namespace std
+{
+ template<class _T1, class _T2> struct pair
+ {
+ _T1 first;
+ _T2 second;
+ pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) { }
+ };
+}
+namespace __gnu_internal
+{
+ typedef char __one;
+ template<typename _Tp> __one __test_type(int _Tp::*);
+}
+namespace std
+{
+ template<typename _Tp> struct ___is_pod
+ {
+ enum { __value = (sizeof(__gnu_internal::__test_type<_Tp>(0))!= sizeof(__gnu_internal::__one)) };
+ };
+ template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator
+ { };
+ template<typename _Iterator> struct iterator_traits
+ {
+ typedef typename _Iterator::difference_type difference_type;
+ };
+ template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference>
+ {
+ typedef _Iterator iterator_type;
+ typedef typename iterator_traits<_Iterator>::difference_type difference_type;
+ typedef typename iterator_traits<_Iterator>::reference reference;
+ reverse_iterator operator+(difference_type __n) const {}
+ reverse_iterator& operator+=(difference_type __n) { }
+ reference operator[](difference_type __n) const { }
+ };
+}
+namespace __gnu_cxx
+{
+ template<bool _Thread> class __pool;
+ template<template <bool> class _PoolTp, bool _Thread> struct __common_pool_policy;
+ template<typename _Tp> class __mt_alloc_base
+ {
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ };
+ template<typename _Tp, typename _Poolp = __common_pool_policy<__pool, true> > class __mt_alloc : public __mt_alloc_base<_Tp>
+ {
+ typedef size_t size_type;
+ };
+}
+namespace std
+{
+ template<typename _Tp> struct allocator:public __gnu_cxx::__mt_alloc<_Tp>
+ {
+ template<typename _Tp1> struct rebind
+ {
+ typedef allocator<_Tp1> other;
+ };
+ };
+ template <class _Arg, class _Result> struct unary_function { };
+ template <class _Arg1, class _Arg2, class _Result> struct binary_function
+ {
+ typedef _Arg2 second_argument_type;
+ };
+ template <class _Tp> struct less : public binary_function<_Tp, _Tp, bool>
+ {
+ bool operator()(const _Tp& __x, const _Tp& __y) const { }
+ };
+ template <class _Tp> struct _Identity : public unary_function<_Tp,_Tp> { };
+ struct _Rb_tree_node_base
+ {
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ _Base_ptr _M_right;
+ static _Base_ptr _S_minimum(_Base_ptr __x) { }
+ static _Base_ptr _S_maximum(_Base_ptr __x) { }
+ };
+ template<typename _Val> struct _Rb_tree_node { };
+ template<typename _Tp> struct _Rb_tree_iterator
+ {
+ typedef _Tp* pointer;
+ typedef _Rb_tree_iterator<_Tp> _Self;
+ typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
+ pointer operator->() const { }
+ _Self operator++(int) { }
+ _Base_ptr _M_node;
+ };
+ template<typename _Tp> struct _Rb_tree_const_iterator
+ {
+ typedef const _Tp* pointer;
+ typedef _Rb_tree_iterator<_Tp> iterator;
+ typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
+ _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) { }
+ _Base_ptr _M_node;
+ };
+ template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > struct _Rb_tree
+ {
+ typedef typename _Alloc::template rebind<std::_Rb_tree_node<_Val> >::other _Node_allocator;
+ typedef _Rb_tree_node_base* _Base_ptr;
+ typedef const _Rb_tree_node_base* _Const_Base_ptr;
+ typedef std::_Rb_tree_node<_Val> _Rb_tree_node;
+ typedef _Key key_type;
+ typedef _Val value_type;
+ typedef value_type* pointer;
+ typedef _Rb_tree_node* _Link_type;
+ template<typename _Key_compare, bool _Is_pod_comparator = std::___is_pod<_Key_compare>::__value> struct _Rb_tree_impl
+ : _Node_allocator
+ {
+ _Rb_tree_node_base _M_header;
+ };
+ _Rb_tree_impl<_Compare> _M_impl;
+ typedef _Rb_tree_iterator<value_type> iterator;
+ typedef _Rb_tree_const_iterator<value_type> const_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ pair<iterator,bool> insert_unique(const value_type& __x);
+ };
+ template<class _Key, class _Compare, class _Alloc> class set
+ {
+ typedef _Key key_type;
+ typedef _Key value_type;
+ typedef _Compare key_compare;
+ typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type;
+ typedef _Rb_tree<_Key, value_type, _Identity<value_type>, key_compare, _Key_alloc_type> _Rep_type;
+ _Rep_type _M_t;
+ typedef typename _Rep_type::const_iterator iterator;
+ std::pair<iterator,bool> insert(const value_type& __x)
+ {
+ std::pair<typename _Rep_type::iterator, bool> __p = _M_t.insert_unique(__x);
+ return std::pair<iterator, bool>(__p.first, __p.second);
+ }
+ };
+}
+template class std::set<int, std::less<int>, std::allocator<char> >;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22488.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22488.C
new file mode 100644
index 000000000..9063b067a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22488.C
@@ -0,0 +1,33 @@
+// PR tree-optimization/22488
+// This testcase is really a C++ FE bug in represnting virtual inheritance
+// It gives the appearance to the middle end that the fields exist twice
+// which resulted in a very confused structure analyzer
+// { dg-do compile }
+// { dg-options "-O" }
+struct X
+{
+ int i0, i1;
+ char c;
+};
+
+struct A
+{
+ int i;
+ char c0, c1;
+
+ virtual ~A();
+};
+
+struct B : virtual A {};
+
+struct C : B
+{
+ X x;
+
+ void bar(X y) { x = y; }
+};
+
+void foo()
+{
+ C().bar(X());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22550.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22550.C
new file mode 100644
index 000000000..5f5577620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22550.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+class X {
+public:
+ int mfunc1 () {
+ return 1;
+ }
+ int mfunc2 () {
+ return 2;
+ }
+ X (int a, int b) { }
+};
+
+typedef int (X::*memfunc_p_t) ();
+
+memfunc_p_t mf_arr[2] = { &X::mfunc1, &X::mfunc2 };
+
+int
+main ()
+{
+ // Get pntr to the array of pointers to member-funcs
+ memfunc_p_t (*mf_arr_p)[2] = &mf_arr;
+ // Compare indirect against direct access to an array element
+ if ((*mf_arr_p)[0] != mf_arr[0])
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22615.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22615.C
new file mode 100644
index 000000000..a8936c4cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr22615.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* Ensure that we don't crash when people decide to return the address of padding. */
+
+struct A
+{
+ char c;
+ int i;
+};
+
+A a;
+
+struct B
+{
+ char c, d;
+};
+
+union C
+{
+ A *p;
+ B *q;
+
+ C() : p(&a) {}
+ char& foo() { return q->d; }
+};
+void bar() { C().foo() = 0; }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23046.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23046.C
new file mode 100644
index 000000000..eb8f39558
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23046.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+enum eumtype { ENUM1, ENUM2 };
+void g(const eumtype kind );
+void f(long i);
+void g(const eumtype kind)
+{
+ if ((kind != ENUM1) && (kind != ENUM2))
+ f(kind);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23164.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23164.C
new file mode 100644
index 000000000..2318a309c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23164.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+bool f();
+struct S {
+ S();
+ ~S();
+};
+void g() {
+ for (;;) {
+ S s1, s2, s3, s4, s5, s6;
+ if (f())
+ continue;
+ if (f())
+ return;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23624.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23624.C
new file mode 100644
index 000000000..769d690ce
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23624.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+template <int>
+void f()
+{
+ int *t, i;
+ t[i ? 0 : i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23948.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23948.C
new file mode 100644
index 000000000..c34161409
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr23948.C
@@ -0,0 +1,19 @@
+/* { dg-options "-O1 -ffast-math -fdump-tree-recip" } */
+/* { dg-do compile } */
+
+struct MIOFILE {
+ ~MIOFILE();
+};
+double potentially_runnable_resource_share();
+void f1(double);
+int make_scheduler_request(double a, double b)
+{
+ MIOFILE mf;
+ double prrs = potentially_runnable_resource_share();
+ f1(a/prrs);
+ f1(1/prrs);
+ f1(b/prrs);
+}
+
+/* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */
+/* { dg-final { cleanup-tree-dump "recip" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24172.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24172.C
new file mode 100644
index 000000000..245186a3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24172.C
@@ -0,0 +1,11 @@
+// { dg-options "-O2" }
+void IOException( char);
+inline int* dummy( const char* const mode )
+{
+ IOException(*mode+*mode);
+}
+
+void prepare_inpaint( )
+{
+ dummy ("rb");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C
new file mode 100644
index 000000000..d3c053efd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* FRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */
+struct f
+{
+ int i;
+};
+struct h{h();};
+int g(void);
+int g1(void) throw();
+int h2222(f*);
+void ghh(int);
+
+int main(void)
+{
+ int i;
+ f t;
+ try
+ {
+ i = g1();
+ try
+ {
+ i = g();
+ }catch(...)
+ {}
+ int j = i;
+ try
+ { t.i = i;
+ i = g();
+ }catch(...)
+ {}
+ i = 2;
+ int h = t.i;
+ ghh (h);
+
+ g();
+ }catch(...)
+ {}
+ return i;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C
new file mode 100644
index 000000000..188b1a26b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* FRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */
+struct f
+{
+ int i;
+};
+struct h{h();};
+int g(void);
+int g1(void) throw();
+int h2222(f*);
+void ghh(int);
+
+int main(void)
+{
+ int i;
+ f t;
+ try
+ {
+ i = g1();
+ try
+ {
+ i = g();
+ }catch(...)
+ {}
+ int j = i;
+ try
+ {
+ i = g();
+ }catch(...)
+ {}
+ t.i = j;
+ i = 2;
+ int h = t.i;
+ ghh (h);
+
+ g();
+ }catch(...)
+ {}
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C
new file mode 100644
index 000000000..a9ea58b11
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* PRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */
+struct MemoryManager {
+ virtual void deallocate() = 0;
+};
+struct XalanVector {
+ ~XalanVector() {
+ m_memoryManager->deallocate();
+ }
+ void swap(XalanVector& theOther) {
+ MemoryManager* const theTempManager = m_memoryManager;
+ m_memoryManager = theOther.m_memoryManager;
+ theOther.m_memoryManager = theTempManager;
+ theOther.m_size = 0;
+ }
+ void push_back() {
+ XalanVector theTemp(*this);
+ theTemp.push_back();
+ swap(theTemp);
+ }
+ MemoryManager* m_memoryManager;
+ int m_size;
+};
+void f(void) {
+ XalanVector tempVector;
+ tempVector.push_back();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24238.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24238.C
new file mode 100644
index 000000000..3fdd5784e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24238.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef struct SDL_Rect {
+ unsigned short w, h;
+}SDL_Rect;
+SDL_Rect *location();
+SDL_Rect inner_location()
+{
+ SDL_Rect r = *location();
+ r.w -= 1;
+ return r;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C
new file mode 100644
index 000000000..40959effa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+struct adaptor_base {
+};
+struct bound_argument {
+ bound_argument();
+};
+template <class T_functor> struct adaptor_functor : public adaptor_base {
+ explicit adaptor_functor(const T_functor& _A_functor) : functor_(_A_functor)
+{
+ }
+ T_functor functor_;
+ bound_argument bound_;
+};
+template <class T_functor> struct adapts : public adaptor_base {
+ explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) {
+ }
+ adaptor_functor<T_functor> functor_;
+};
+int main() {
+ adapts<adapts<int> > a (adapts<int>(1));
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C
new file mode 100644
index 000000000..cfc0e4a4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+struct adaptor_base {};
+struct bound_argument {
+ bound_argument();
+};
+struct adaptor_functorint : public adaptor_base {};
+struct adaptsint : public adaptor_base {
+ adaptsint(const int& _A_functor);
+ adaptor_functorint functor_;
+};
+struct adaptor_functor_adaptsint {
+ adaptor_functor_adaptsint(const adaptsint& _A_functor) : functor_(_A_functor)
+ {}
+ adaptsint functor_;
+ bound_argument bound_;
+};
+struct adapts_adaptsint {
+ adapts_adaptsint(const adaptsint& _A_functor) : functor_(_A_functor)
+ {}
+ adaptor_functor_adaptsint functor_;
+};
+int main() {
+ adapts_adaptsint a (adaptsint(1));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C
new file mode 100644
index 000000000..09a3f9462
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C
@@ -0,0 +1,101 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+namespace sigc {
+ template <class T_type> struct type_trait {
+ typedef T_type& pass;
+ typedef const T_type& take;
+ typedef T_type* pointer;
+ };
+ template <class T_type> struct type_trait<T_type&> {
+ typedef T_type& pass;
+ };
+ template<> struct type_trait<void> {
+ typedef void pass;
+ };
+ template <class T_base, class T_derived> struct is_base_and_derived {
+ struct big {
+ char memory[64];
+ };
+ static big is_base_class_(...);
+ static char is_base_class_(typename type_trait<T_base>::pointer);
+ static const bool value = sizeof(is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) == sizeof(char);
+ };
+ struct nil;
+ struct functor_base {
+ };
+ template <class T_functor, bool I_derives_functor_base=is_base_and_derived<functor_base,T_functor>::value> struct functor_trait {
+ typedef typename T_functor::result_type result_type;
+ typedef T_functor functor_type;
+ };
+ struct adaptor_base : public functor_base {
+ };
+ template <class T_functor, class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void, bool I_derives_adaptor_base=is_base_and_derived<adaptor_base,T_functor>::value> struct deduce_result_type {
+ typedef typename functor_trait<T_functor>::result_type type;
+ };
+ template <class T_functor> struct adaptor_functor
+ : public adaptor_base {
+ template <class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void> struct deduce_result_type {
+ typedef typename sigc::deduce_result_type<T_functor, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::type type;
+ };
+ typedef typename functor_trait<T_functor>::result_type result_type;
+ template <class T_arg1,class T_arg2> typename deduce_result_type<T_arg1,T_arg2>::type operator()(T_arg1 _A_arg1,T_arg2 _A_arg2) const {
+ return functor_(_A_arg1,_A_arg2);
+ }
+ explicit adaptor_functor(const T_functor& _A_functor) : functor_(_A_functor) {
+ }
+ mutable T_functor functor_;
+ };
+ template <class T_functor, bool I_isadaptor = is_base_and_derived<adaptor_base, T_functor>::value> struct adaptor_trait;
+ template <class T_functor> struct adaptor_trait<T_functor, true> {
+ typedef T_functor adaptor_type;
+ };
+ template <class T_functor> struct adaptor_trait<T_functor, false> {
+ typedef typename functor_trait<T_functor>::functor_type functor_type;
+ typedef adaptor_functor<functor_type> adaptor_type;
+ };
+ template <class T_functor> struct adapts
+ : public adaptor_base {
+ typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type;
+ explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) {
+ }
+ mutable adaptor_type functor_;
+ };
+ template <class T_type> struct unwrap_reference {
+ typedef T_type type;
+ };
+ template <class T_type> class bound_argument {
+ public:
+ bound_argument(const T_type& _A_argument) : visited_(_A_argument) {
+ }
+ inline T_type& invoke() {
+ }
+ T_type visited_;
+ };
+ template <int I_location, class T_functor, class T_type1=nil,class T_type2=nil,class T_type3=nil,class T_type4=nil,class T_type5=nil,class T_type6=nil,class T_type7=nil> struct bind_functor;
+ template <class T_functor, class T_bound> struct bind_functor<0, T_functor, T_bound, nil,nil,nil,nil,nil,nil> : public adapts<T_functor> {
+ typedef typename adapts<T_functor>::adaptor_type adaptor_type;
+ template <class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void> struct deduce_result_type {
+ typedef typename adaptor_type::template deduce_result_type<typename type_trait<typename unwrap_reference<T_bound>::type>::pass, typename type_trait<T_arg1>::pass, typename type_trait<T_arg2>::pass, typename type_trait<T_arg3>::pass, typename type_trait<T_arg4>::pass, typename type_trait<T_arg5>::pass, typename type_trait<T_arg6>::pass>::type type;
+ };
+ typedef typename adaptor_type::result_type result_type;
+ result_type operator()() {
+ return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_bound>::type>::pass> (bound_.invoke());
+ }
+ template <class T_arg1> typename deduce_result_type<T_arg1>::type operator()(T_arg1 _A_arg1) {
+ return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_bound>::type>::pass, typename type_trait<T_arg1>::pass> (bound_.invoke(), _A_arg1);
+ }
+ bind_functor(typename type_trait<T_functor>::take _A_func, typename type_trait<T_bound>::take _A_bound) : adapts<T_functor>(_A_func), bound_(_A_bound) {
+ }
+ bound_argument<T_bound> bound_;
+ };
+ template <int I_location, class T_bound1, class T_functor> inline bind_functor<I_location, T_functor, T_bound1> bind(const T_functor& _A_func, T_bound1 _A_b1) {
+ return bind_functor<I_location, T_functor, T_bound1>(_A_func, _A_b1);
+ };
+}
+struct foo {
+ typedef int result_type;
+ int operator()(int i, int j);
+};
+int main() {
+ sigc::bind<0>(sigc::bind<0>(foo(),7),8)();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24439.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24439.C
new file mode 100644
index 000000000..74576b5f8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr24439.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+/* We used to ICE in invert_truthvalue on the void type
+ 2nd argument of the COND_EXPR. */
+
+void foo(void)
+{
+ int value=1;
+ !(value?true:throw);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr25771.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr25771.C
new file mode 100644
index 000000000..6823494ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr25771.C
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+int ggggg();
+struct string {
+ static int _S_empty_rep_storage[];
+ void _M_destroy();
+ char* _M_rep;
+ ~string()
+ {
+ if (_M_rep != (char*)&_S_empty_rep_storage )
+ if (ggggg() <= 0)
+ _M_destroy();
+ }
+};
+extern void SDL_FreeSurface(int surface);
+struct scoped_resource {
+ ~scoped_resource() {
+ SDL_FreeSurface(1);
+ }
+};
+struct surface {
+ scoped_resource surface_;
+};
+struct button {
+ string help_text_;
+ string label_;
+ surface image_;
+};
+struct scrollbar {
+ string help_text_;
+ button uparrow_;
+};
+scrollbar a;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26140.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26140.C
new file mode 100644
index 000000000..3e3743fbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26140.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+struct Pitch
+{
+ int notename_;
+};
+struct Audio_note
+{
+ Audio_note (Pitch p);
+};
+void create_audio_elements ()
+{
+ Pitch *pit;
+ new Audio_note (*pit);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26406.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26406.C
new file mode 100644
index 000000000..c2d160508
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26406.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int *f(int *b)
+{
+ int * a = new int[104];
+ *a = 1;
+ if (a == 0)
+ return b;
+ return a;
+}
+
+/* { dg-final { scan-tree-dump-not "if" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26443.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26443.C
new file mode 100644
index 000000000..1db87ab87
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26443.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+struct A
+{
+ double x[4];
+};
+
+struct B
+{
+ A y[2];
+};
+
+A foo(B *p)
+{
+ for ( int i=0; i<4; ++i )
+ p->y[1].x[i]=0;
+
+ A a;
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26757.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26757.C
new file mode 100644
index 000000000..4d124e3c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr26757.C
@@ -0,0 +1,44 @@
+// PR c++/26757
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort ();
+
+typedef struct A
+{
+ int c;
+ int d;
+} A;
+
+A *b;
+
+void
+foo ()
+{
+ b->c++;
+ extern A *b;
+ b->d++;
+
+}
+
+void
+bar ()
+{
+ if (b->d)
+ b->c++;
+}
+
+
+int
+main ()
+{
+ A a = { 0, 0 };
+ b = &a;
+ foo ();
+ bar ();
+ if (b->c != 2)
+ abort ();
+ if (b->d != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27090.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27090.C
new file mode 100644
index 000000000..0fb46f35d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27090.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+template <class T>
+struct Bar
+{
+ int get() { return static_cast<T*>(this)->get2(); }
+};
+struct Foo : public Bar<Foo>
+{
+ int get2() { return x; }
+ int x;
+};
+
+int foo(Foo& f)
+{
+ return f.get();
+}
+
+/* { dg-final { scan-tree-dump "f_..D.->x;" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27283.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27283.C
new file mode 100644
index 000000000..224ea6a9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27283.C
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+namespace Gambit
+{
+ template < class T > class Array
+ {
+ protected:int mindex, maxdex;
+ T *data;
+ int InsertAt (const T & t, int n)
+ {
+ T *new_data = new T[++this->maxdex - this->mindex + 1] - this->mindex;
+ int i;
+ for (i = this->mindex; i <= n - 1; i++)
+ new_data[i] = this->data[i];
+ }
+ public: Array (unsigned int len = 0):mindex (1), maxdex (len),
+ data ((len) ? new T[len] -
+ 1 : 0)
+ {
+ }
+ virtual ~ Array ()
+ {
+ if (maxdex >= mindex)
+ delete[](data + mindex);
+ }
+ const T & operator[] (int index) const
+ {
+ }
+ int Append (const T & t)
+ {
+ return InsertAt (t, this->maxdex + 1);
+ }
+ };
+}
+class gIndexOdometer
+{
+private:Gambit::Array < int >MinIndices;
+ Gambit::Array < int >CurIndices;
+ gIndexOdometer (const Gambit::Array < int >, const Gambit::Array < int >);
+ void SetIndex (const int &, const int &);
+ int NoIndices () const;
+ gIndexOdometer AfterExcisionOf (int &) const;
+};
+gIndexOdometer
+gIndexOdometer::AfterExcisionOf (int &to_be_zapped) const
+{
+ Gambit::Array < int >NewMins, NewMaxs;
+ int i;
+ for (i = 1; i <= NoIndices (); i++)
+ {
+ NewMins.Append (MinIndices[i]);
+ }
+ gIndexOdometer NewOdo (NewMins, NewMaxs);
+ NewOdo.SetIndex (i, CurIndices[i]);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27291.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27291.C
new file mode 100644
index 000000000..b8b5e136a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27291.C
@@ -0,0 +1,363 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+namespace std
+{
+ template < class _T1, class _T2 > struct pair
+ {
+ };
+}
+extern "C"
+{
+ extern "C"
+ {
+ typedef int int32_t __attribute__ ((__mode__ (__SI__)));
+ struct _pthread_fastlock
+ {
+ }
+ pthread_mutexattr_t;
+ }
+}
+namespace std
+{
+ struct __numeric_limits_base
+ {
+ };
+ template < typename _Tp >
+ struct numeric_limits:public __numeric_limits_base
+ {
+ static const bool is_integer = true;
+ };
+};
+typedef unsigned int uint32_t;
+namespace std
+{
+ template < typename _Alloc > class allocator;
+ template < class _CharT > struct char_traits;
+ template < typename _CharT, typename _Traits =
+ char_traits < _CharT >, typename _Alloc =
+ allocator < _CharT > >class basic_string;
+ typedef basic_string < char >string;
+}
+namespace __gnu_cxx
+{
+ template < typename _Tp > class new_allocator
+ {
+ };
+}
+namespace std
+{
+ template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
+ _Tp >
+ {
+ };
+ template < typename _CharT, typename _Traits,
+ typename _Alloc > class basic_string
+ {
+ public:inline basic_string ();
+ basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ());
+ };
+}
+namespace boost
+{
+ template < class T > class integer_traits:public std::numeric_limits < T >
+ {
+ };
+ namespace detail
+ {
+ template < class T, T min_val, T max_val > class integer_traits_base
+ {
+ };
+ }
+ template <> class integer_traits < int >:public std::numeric_limits < int >,
+ public detail::integer_traits_base < int, (-2147483647 - 1), 2147483647 >
+ {
+ };
+ namespace random
+ {
+ template < class IntType, IntType m > class const_mod
+ {
+ public:static IntType add (IntType x, IntType c)
+ {
+ }
+ static IntType mult (IntType a, IntType x)
+ {
+ return mult_schrage (a, x);
+ }
+ static IntType mult_add (IntType a, IntType x, IntType c)
+ {
+ return add (mult (a, x), c);
+ }
+ static IntType mult_schrage (IntType a, IntType value)
+ {
+ for (;;)
+ {
+ if (value > 0)
+ break;
+ value += m;
+ }
+ }
+ };
+ template < class IntType, IntType a, IntType c, IntType m,
+ IntType val > class linear_congruential
+ {
+ public:typedef IntType result_type;
+ static const IntType modulus = m;
+ explicit linear_congruential (IntType x0 = 1):_modulus (modulus),
+ _x (_modulus ? (x0 % _modulus) :
+ x0)
+ {
+ }
+ IntType operator () ()
+ {
+ _x = const_mod < IntType, m >::mult_add (a, _x, c);
+ }
+ private:IntType _modulus;
+ IntType _x;
+ };
+ }
+ typedef random::linear_congruential < int32_t, 16807, 0, 2147483647,
+ 1043618065 > minstd_rand0;
+ namespace random
+ {
+ namespace detail
+ {
+ template < class T > struct ptr_helper
+ {
+ typedef T value_type;
+ typedef T & reference_type;
+ typedef const T & rvalue_type;
+ static reference_type ref (T & r)
+ {
+ }
+ };
+ template < class T > struct ptr_helper <T & >
+ {
+ typedef T value_type;
+ typedef T & rvalue_type;
+ };
+ }
+ }
+ template < class UniformRandomNumberGenerator, class RealType =
+ double >class uniform_01
+ {
+ public:typedef UniformRandomNumberGenerator base_type;
+ typedef RealType result_type;
+ explicit uniform_01 (base_type rng):_rng (rng),
+ _factor (result_type (1) /
+ (result_type ((_rng.max) () - (_rng.min) ()) +
+ result_type (std::numeric_limits <
+ base_result >::is_integer ? 1 : 0)))
+ {
+ }
+ result_type operator () ()
+ {
+ return result_type (_rng () - (_rng.min) ()) * _factor;
+ }
+ private:typedef typename base_type::result_type base_result;
+ base_type _rng;
+ result_type _factor;
+ };
+ namespace random
+ {
+ namespace detail
+ {
+ template < class UniformRandomNumberGenerator >
+ class pass_through_engine
+ {
+ private:typedef ptr_helper < UniformRandomNumberGenerator >
+ helper_type;
+ public:typedef typename helper_type::value_type base_type;
+ typedef typename base_type::result_type result_type;
+ explicit pass_through_engine (UniformRandomNumberGenerator
+ rng):_rng (static_cast <
+ typename helper_type::
+ rvalue_type > (rng))
+ {
+ }
+ result_type min () const
+ {
+ }
+ result_type max () const
+ {
+ }
+ base_type & base ()
+ {
+ }
+ result_type operator () ()
+ {
+ return base ()();
+ }
+ private:UniformRandomNumberGenerator _rng;
+ };
+ }
+ template < class RealType, int w, unsigned int p,
+ unsigned int q > class lagged_fibonacci_01
+ {
+ public:typedef RealType result_type;
+ static const unsigned int long_lag = p;
+ lagged_fibonacci_01 ()
+ {
+ seed ();
+ }
+ public:void seed (uint32_t value = 331u)
+ {
+ minstd_rand0 intgen (value);
+ seed (intgen);
+ }
+ template < class Generator > void seed (Generator & gen)
+ {
+ typedef detail::pass_through_engine < Generator & >ref_gen;
+ uniform_01 < ref_gen, RealType > gen01 =
+ uniform_01 < ref_gen, RealType > (ref_gen (gen));
+ for (unsigned int j = 0; j < long_lag; ++j)
+ x[j] = gen01 ();
+ }
+ RealType x[long_lag];
+ };
+ }
+ typedef random::lagged_fibonacci_01 < double, 48, 607,
+ 273 > lagged_fibonacci607;
+ namespace random
+ {
+ namespace detail
+ {
+ template < bool have_int, bool want_int > struct engine_helper;
+ template <> struct engine_helper <true, true >
+ {
+ template < class Engine, class DistInputType > struct impl
+ {
+ typedef pass_through_engine < Engine > type;
+ };
+ };
+ }
+ }
+ template < class Engine, class Distribution > class variate_generator
+ {
+ private:typedef random::detail::pass_through_engine < Engine >
+ decorated_engine;
+ public:typedef typename decorated_engine::base_type engine_value_type;
+ typedef Distribution distribution_type;
+ variate_generator (Engine e, Distribution d):_eng (decorated_engine (e)),
+ _dist (d)
+ {
+ }
+ private:enum
+ {
+ have_int =
+ std::numeric_limits <
+ typename decorated_engine::result_type >::is_integer, want_int =
+ std::numeric_limits < typename Distribution::input_type >::is_integer
+ };
+ typedef typename random::detail::engine_helper < have_int,
+ want_int >::template impl < decorated_engine,
+ typename Distribution::input_type >::type internal_engine_type;
+ internal_engine_type _eng;
+ distribution_type _dist;
+ };
+ template < class RealType = double >class uniform_real
+ {
+ public:typedef RealType input_type;
+ };
+}
+namespace alps
+{
+ class BufferedRandomNumberGeneratorBase
+ {
+ };
+ template < class RNG >
+ class BufferedRandomNumberGenerator:public
+ BufferedRandomNumberGeneratorBase
+ {
+ public: BufferedRandomNumberGenerator ():rng_ (), gen_ (rng_,
+ boost::
+ uniform_real <> ())
+ {
+ }
+ protected: RNG rng_;
+ boost::variate_generator < RNG &, boost::uniform_real <> >gen_;
+ };
+}
+namespace boost
+{
+ namespace detail
+ {
+ class sp_counted_base
+ {
+ };
+ class shared_count
+ {
+ private:sp_counted_base * pi_;
+ public:shared_count ():pi_ (0)
+ {
+ }
+ template < class Y > explicit shared_count (Y * p):pi_ (0)
+ {
+ }
+ };
+ }
+ template < class T > class shared_ptr
+ {
+ public:typedef T element_type;
+ template < class Y > explicit shared_ptr (Y * p):px (p), pn (p)
+ {
+ }
+ T *px;
+ detail::shared_count pn;
+ };
+}
+namespace std
+{
+ template < typename _Key, typename _Tp, typename _Compare =
+ std::allocator < std::pair < const _Key, _Tp > > > class map
+ {
+ public:typedef _Key key_type;
+ typedef _Tp mapped_type;
+ mapped_type & operator[] (const key_type & __k)
+ {
+ }
+ };
+}
+namespace alps
+{
+ namespace detail
+ {
+ template < class BASE > class abstract_creator
+ {
+ public:typedef BASE base_type;
+ virtual base_type *create () const = 0;
+ };
+ template < class BASE,
+ class T > class creator:public abstract_creator < BASE >
+ {
+ public:typedef BASE base_type;
+ base_type *create () const
+ {
+ return new T ();
+ }
+ };
+ }
+ template < class KEY, class BASE > class factory
+ {
+ public:typedef BASE base_type;
+ typedef KEY key_type;
+ typedef boost::shared_ptr < detail::abstract_creator < base_type >
+ >pointer_type;
+ template < class T > bool register_type (key_type k)
+ {
+ creators_[k] = pointer_type (new detail::creator < BASE, T > ());
+ }
+ private:typedef std::map < key_type, pointer_type > map_type;
+ map_type creators_;
+ };
+ class RNGFactory:public factory < std::string,
+ BufferedRandomNumberGeneratorBase >
+ {
+ public:RNGFactory ();
+ };
+}
+alps::RNGFactory::RNGFactory ()
+{
+ register_type < BufferedRandomNumberGenerator < boost::lagged_fibonacci607 >
+ >("lagged_fibonacci607");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27548.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27548.C
new file mode 100644
index 000000000..d23b959a5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27548.C
@@ -0,0 +1,60 @@
+// PR tree-optimization/27548
+// { dg-do compile }
+// { dg-options "-O1" }
+
+namespace Gambit
+{
+ template < class T > class Array
+ {
+ protected:int mindex, maxdex;
+ T *data;
+ int InsertAt (const T & t, int n)
+ {
+ T *new_data = new T[++this->maxdex - this->mindex + 1] - this->mindex;
+ int i;
+ for (i = this->mindex; i <= n - 1; i++)
+ new_data[i] = this->data[i];
+ new_data[i++] = t;
+ }
+ public: Array (unsigned int len = 0):mindex (1), maxdex (len),
+ data ((len) ? new T[len] -
+ 1 : 0)
+ {
+ }
+ virtual ~ Array ()
+ {
+ if (maxdex >= mindex)
+ delete[](data + mindex);
+ }
+ const T & operator[] (int index) const
+ {
+ }
+ int Append (const T & t)
+ {
+ return InsertAt (t, this->maxdex + 1);
+ }
+ };
+}
+
+class gIndexOdometer
+{
+private:Gambit::Array < int >MinIndices;
+ Gambit::Array < int >CurIndices;
+ gIndexOdometer (const Gambit::Array < int >, const Gambit::Array < int >);
+ void SetIndex (const int &, const int &);
+ int NoIndices () const;
+ gIndexOdometer AfterExcisionOf (int &) const;
+};
+gIndexOdometer
+gIndexOdometer::AfterExcisionOf (int &to_be_zapped) const
+{
+ Gambit::Array < int >NewMins, NewMaxs;
+ int i;
+ for (i = 1; i <= NoIndices (); i++)
+ {
+ NewMins.Append (MinIndices[i]);
+ }
+ gIndexOdometer NewOdo (NewMins, NewMaxs);
+ for (i = 1; i < to_be_zapped; i++)
+ NewOdo.SetIndex (i, CurIndices[i]);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27549.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27549.C
new file mode 100644
index 000000000..cd5944d24
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27549.C
@@ -0,0 +1,79 @@
+// PR tree-optimization/27549
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __SIZE_TYPE__ size_t;
+
+struct E
+{
+ virtual ~E () {}
+ virtual size_t e () const = 0;
+ virtual void f (char *x) const = 0;
+};
+
+struct F : public E
+{
+ F () {}
+ virtual ~F () {}
+ virtual size_t e () const { return 0; }
+ virtual void f (char *x) const { *x = '\0'; }
+};
+
+struct S
+{
+ S () { a = new char[32]; b = 32; c = 0; a[0] = 0; }
+ void s (const char *x, size_t y) { v (c + y + 1); __builtin_memcpy(a + c, x, y); c += y; a[c] = '\0'; }
+ void s (const E *x) { size_t l = x->e(); v (c + l + 1); x->f (a + c); c += l; }
+ const char *t () { return a; }
+ void v (size_t n)
+ {
+ if (b >= n) return;
+
+ size_t b2 = b;
+ char *a2 = a;
+
+ for (;;)
+ {
+ b *= 2;
+ if (b >= n)
+ break;
+ }
+
+ a = new char[b];
+
+ if (b2)
+ {
+ __builtin_memcpy(a, a2, c);
+ a2[0] = 0;
+ for (size_t i = 1; i < b2; i++)
+ a2[i] = a2[i - 1];
+ delete[] a2;
+ }
+ }
+
+ ~S ()
+ {
+ if (b)
+ {
+ a[0] = 0;
+ for (size_t i = 1; i < b; i++)
+ a[i] = a[i - 1];
+ }
+ delete[] a;
+ }
+ char * a;
+ size_t b, c;
+};
+
+const char *p;
+size_t q;
+const F u;
+
+const char *
+foo ()
+{
+ S s;
+ s.s (p, q);
+ s.s (&u);
+ return s.t ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27830.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27830.C
new file mode 100644
index 000000000..01c7fc187
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27830.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct gc{};
+struct transform:public gc
+{
+ double x, y, z, t;
+ transform (void){}
+};
+inline transform f (void)
+{
+ return transform ();
+};
+void transformed (void)
+{
+ new transform (f());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27894.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27894.C
new file mode 100644
index 000000000..ac97a35f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr27894.C
@@ -0,0 +1,82 @@
+// PR c++/27894
+// { dg-do compile }
+// { dg-options "-O" }
+
+class A;
+struct B
+{
+ B (unsigned long);
+ int b2 () const;
+ A *b1 () const;
+};
+
+enum { P = 0 };
+enum O { Q = 75, };
+class C;
+struct D { A *d; };
+struct E
+{
+ B e1 (int) const;
+ A *e2 (const B &) const;
+ D e3[4096];
+};
+
+inline A *
+E::e2 (const B & x) const
+{
+ const D *w = &e3[x.b2 ()];
+ return (A *) w->d;
+}
+
+extern E *e;
+
+inline A *
+B::b1 () const
+{
+ extern E *e;
+ return e->e2 (*this);
+}
+
+template <class T> struct F : public B
+{
+ F (const B &);
+ T *b1 () const;
+};
+
+template < class T > inline T * F <T>::b1 () const
+{
+ return (T *) B::b1 ();
+};
+
+typedef F <C> N;
+
+class G {};
+class H : public G {};
+class I : public H {};
+class J {};
+class K {};
+struct L
+{
+ void l (J *, C *, int, const char *, O);
+};
+class M : public K, public I
+{
+ void m (J &, int, const char *);
+ void m (J &, int, int, const char *, float);
+};
+
+void
+M::m (J &x, int y, const char *z)
+{
+ L *w = new L;
+ N v = e->e1 (y);
+ w->l (&x, v.b1 (), P, z, Q);
+}
+
+void
+M::m (J &x, int y, int s, const char *z, float t)
+{
+ L *w = new L;
+ N v = e->e1 (y);
+ w->l (&x, v.b1 (), s, z, (O) (int) ((t) ? (50 + 20 / (float) t) : 0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28003.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28003.C
new file mode 100644
index 000000000..ff260bcf4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28003.C
@@ -0,0 +1,31 @@
+// PR tree-optimization/28003
+// Alias grouping needs to be computed after call clobbering, because it
+// changes around the tags and variables in a way that makes our
+// call clobbering computation incorrect.
+// { dg-do run }
+// { dg-options "-O2" }
+extern "C" void abort(void);
+struct A
+{
+ int i, j[9];
+ A() : i(1) { j[0]=j[1]=j[2]=j[3]=j[4]=j[5]=j[6]=j[7]=j[8]=0; }
+};
+
+struct B
+{
+ A a;
+};
+
+B b[] =
+{
+ {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+ {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
+ {}, {}, {}, {}, {}
+};
+
+int main()
+{
+ if (1 - b[sizeof(b)/sizeof(B) - 1].a.i != 0)
+ abort();
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28238.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28238.C
new file mode 100644
index 000000000..97e388fbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr28238.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct iterator{};
+struct ByteIterator : iterator
+{
+ ByteIterator (){}
+ int a[1024];
+};
+inline ByteIterator f ()
+{
+ return ByteIterator ();
+}
+class ConfLexerCore
+{
+ ConfLexerCore ();
+ ByteIterator m_matchStart;
+};
+ConfLexerCore::ConfLexerCore ()
+: m_matchStart (f ())
+{ }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr29902.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr29902.C
new file mode 100644
index 000000000..838a41169
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr29902.C
@@ -0,0 +1,19 @@
+/* { dg-do compile { target i?86-*-* } } */
+/* { dg-options "-O1 -fprefetch-loop-arrays -march=athlon" } */
+/* { dg-require-effective-target ilp32 } */
+
+int length1();
+int g(int);
+void f(int capacity_, char *old_storage)
+{
+ try {
+ length1();
+ int old_capacity = capacity_;
+ capacity_ *= 2;
+ g(capacity_);
+ for (int i = 1; i < old_capacity; i++)
+ old_storage[i] = old_storage[i - 1];
+ } catch (...) {
+ for (int i = 1; i < capacity_; i++){old_storage[i] = 0;}
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr30738.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr30738.C
new file mode 100644
index 000000000..b9d735e81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr30738.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-phiopt1" } */
+
+template <class T>
+static inline const T&
+min_ref (const T &x, const T &y)
+{
+ return x < y ? x : y;
+}
+
+int test_min_ref (int x, int y)
+{
+ return min_ref (x, y);
+}
+
+/* { dg-final { scan-tree-dump "MIN_EXPR" "phiopt1" } } */
+/* { dg-final { cleanup-tree-dump "phiopt1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C
new file mode 100644
index 000000000..d2edb1953
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-forwprop1" } */
+
+#include <new>
+
+template <class T>
+struct Vec
+{
+ Vec()
+ {
+ for (int i=0; i<3; ++i)
+ new (&a[i]) T(0);
+ }
+ T a[3];
+};
+
+double foo (void)
+{
+ Vec<double> v;
+ return v.a[2];
+}
+
+/* { dg-final { scan-tree-dump "Replaced .* != 0B. with .1" "forwprop1" } } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146.C
new file mode 100644
index 000000000..478a488e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31146.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-forwprop" } */
+
+/* We should be able to optimize this to i[j] = 1 during
+ early optimizations. */
+
+int i[5];
+void foo (int j)
+{
+ void *p = &i[j];
+ int *q = (int *)p;
+ *q = 1;
+}
+
+/* { dg-final { scan-tree-dump "MEM\\\[.*&i\\\]\\\[j.*\\\] =.* 1;" "forwprop1" } } */
+/* { dg-final { cleanup-tree-dump "forwprop?" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31307.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31307.C
new file mode 100644
index 000000000..bdfe5bd5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr31307.C
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+union MY_M128
+{
+ double i;
+};
+
+struct RegFile
+{
+ MY_M128 dst[4];
+};
+
+__inline__ __attribute__((always_inline)) static void
+MEM_OPT_LOAD(MY_M128* reg, double* mem)
+{
+ reg[0].i = *mem;
+}
+
+void _ia32_movntdq (double *, double);
+
+__inline__ __attribute__((always_inline)) static void
+MEM_OPT_STORE(MY_M128* reg, double* mem)
+{
+ _ia32_movntdq ((double*)mem, (double)reg[0].i);
+}
+
+double _mm_adds_epu8 (double __A, double __B);
+
+int test(unsigned char *d)
+{
+ RegFile r;
+ MEM_OPT_LOAD((r.dst) , ((double*) d));
+ r.dst[0].i = _mm_adds_epu8(r.dst[0].i, r.dst[0].i);
+ MEM_OPT_STORE((r.dst), (double*) d);
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "r.dst" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33593.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33593.C
new file mode 100644
index 000000000..f5497407f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33593.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fnon-call-exceptions -fdump-tree-optimized" } */
+
+#include <stdio.h>
+
+void foo (int) { printf ("Bar\n"); }
+
+int
+main (void)
+{
+ int a = 1 / 0; // { dg-warning "division by zero" }
+ printf ("Foo\n");
+ foo (a);
+}
+
+// The expression 1 / 0 should not be propagated into the call to foo() if it
+// may trap.
+// { dg-final { scan-tree-dump-times "foo \\(1 \\/ 0\\)" 0 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33604.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33604.C
new file mode 100644
index 000000000..039b3be02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33604.C
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O -fdump-tree-optimized-vops" } */
+
+struct Value
+{
+ double value;
+ Value(double value_) : value (value_) {}
+ operator double() const { return value; }
+ Value& operator=(double other) { value = other; }
+};
+
+struct Ref
+{
+ const Value& m;
+ Ref(const Value& m_) : m(m_) {}
+ operator double() const { return m; }
+};
+
+struct Diff
+{
+ const Ref lhs, rhs;
+ Diff(const Value& lhs_, const Value& rhs_) : lhs(lhs_), rhs(rhs_) {}
+ operator double() const { return lhs - rhs; }
+};
+
+extern "C" void abort (void);
+int main(int argc, char *argv[])
+{
+ Value I(1), m(4);
+ for(int a = 0; a < 1000; a++)
+ m = Diff (I, m);
+
+ if (!(m / 4 == I))
+ abort ();
+ return 0;
+}
+
+/* Check that we propagate
+ D.2182_13 = (struct Ref *) &D.2137.lhs;
+ to
+ D.2182_13->lhs.m ={v} &I;
+ yielding
+ D.2137.lhs.m ={v} &I;
+ so that SRA can promote all locals to registers and we end up
+ referencing two virtual operands at abort () and the return
+ after optimization. */
+
+/* { dg-final { scan-tree-dump-times ".MEM_\[0-9\]*\\\(D\\\)" 2 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C
new file mode 100644
index 000000000..542731a60
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -fdump-tree-pre-details -w" } */
+
+extern volatile int y;
+
+double
+foo (double a, int x)
+{
+ while (x--)
+ {
+ y++;
+ a += 1.0 / 0.0;
+ }
+ return a;
+}
+
+// The expression 1.0 / 0.0 should not be treated as a loop invariant
+// if it may throw an exception.
+// { dg-final { scan-tree-dump-times "Replaced 1\\\.0e\\\+0 / 0\\\.0" 0 "pre" } }
+// { dg-final { cleanup-tree-dump "pre" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615.C
new file mode 100644
index 000000000..801b33447
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr33615.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions -fdump-tree-lim1-details -w" } */
+
+extern volatile int y;
+
+double
+foo (double a, int x)
+{
+ while (x--)
+ {
+ y++;
+ a += 1.0 / 0.0;
+ }
+ return a;
+}
+
+// The expression 1.0 / 0.0 should not be treated as a loop invariant
+// if it may throw an exception.
+// { dg-final { scan-tree-dump-times "invariant up to" 0 "lim1" } }
+// { dg-final { cleanup-tree-dump "lim1" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34063.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34063.C
new file mode 100644
index 000000000..994920bb9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34063.C
@@ -0,0 +1,25 @@
+// { PR tree-optimization/34063 }
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct S
+{
+ double e[9];
+
+ double const &
+ operator() (int r, int c) const
+ {
+ return e[r * 3 + c];
+ }
+};
+
+void
+foo()
+{
+ S r;
+ double *p;
+ for (int j = 0; j < 3; j++)
+ for (int k = 0; k < 3; k++)
+ for (int l = k + 1; l < 3; l++)
+ *p++ = r (k, 0) * r (l, j) + r (k, j) * r (l, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34355.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34355.C
new file mode 100644
index 000000000..978ed75df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr34355.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-O3 -ftree-parallelize-loops=4" }
+
+typedef double EXPRESS[5];
+
+extern int Terms;
+
+void Parse_Rel_Factor (EXPRESS Express, int *Terms)
+{
+ EXPRESS Local_Express = {5.0, 4.0, 3.0, 2.0, 1.0};
+ int Local_Terms = 5;
+
+ int i;
+
+ for (i = (*Terms); i < Local_Terms; i++)
+ Express[i] = 0.0;
+
+ Express[i] += Local_Express[i];
+}
+
+double Parse_Float ()
+{
+ EXPRESS Express = {1.0, 2.0, 3.0, 4.0, 5.0};
+
+ Parse_Rel_Factor (Express, &Terms);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr35144.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr35144.C
new file mode 100644
index 000000000..f0bb7bb63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr35144.C
@@ -0,0 +1,30 @@
+// PR c++/35144
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ int baz ();
+};
+
+typedef int (A::*P) ();
+
+struct B
+{
+ B ();
+ int foo (P x, int y = 0);
+};
+
+struct C
+{
+ typedef int (B::*Q) (P, int);
+ void bar (Q x) { c = x; }
+ Q c;
+};
+
+extern C c;
+
+B::B ()
+{
+ c.bar ((C::Q) &B::foo);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr36766.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr36766.C
new file mode 100644
index 000000000..37e0d517e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr36766.C
@@ -0,0 +1,31 @@
+// PR tree-optimization/36766
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions" }
+
+struct A
+{
+ ~A ()
+ {
+ int *a = this->b;
+ }
+ int *b;
+};
+
+struct B : A
+{
+ B ()
+ {
+ int *a = this->b;
+ }
+ ~B ()
+ {
+ int *a = this->b;
+ }
+};
+
+void
+foo ()
+{
+ B *c = new B;
+ delete c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37084.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37084.C
new file mode 100644
index 000000000..8fceb0cbb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37084.C
@@ -0,0 +1,16 @@
+// PR tree-optimization/37084
+// { dg-do compile }
+// { dg-options "-O" }
+
+struct A
+{
+ A ();
+};
+
+inline A
+foo ()
+{
+ return A ();
+}
+
+const A a (foo ());
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37284.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37284.C
new file mode 100644
index 000000000..26ddc1a05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37284.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fstrict-aliasing" } */
+
+void* operator new(__SIZE_TYPE__, void* __p) throw()
+{
+ return __p;
+}
+
+class PatternDriverTop;
+
+typedef const PatternDriverTop* _Tp;
+
+void construct(_Tp* __p, const _Tp& __val)
+{
+ ::new((void *)__p) _Tp(__val);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37337.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37337.C
new file mode 100644
index 000000000..5b8521df8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37337.C
@@ -0,0 +1,37 @@
+// PR middle-end/37337
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C"
+{
+ typedef struct _IO_FILE FILE;
+ extern int __fprintf_chk (FILE *, int, const char *, ...);
+ extern inline __attribute__ ((always_inline, gnu_inline, artificial))
+ int fprintf (FILE *s, const char *f, ...)
+ {
+ return __fprintf_chk (s, 1, f, __builtin_va_arg_pack ());
+ }
+}
+
+extern int a;
+struct A
+{
+ virtual ~A (void)
+ {
+ }
+};
+
+struct B : public A
+{
+ B ();
+ FILE *b;
+};
+
+void f (int *);
+B::B ()
+{
+ f (&a);
+ for (int i = 0; i < 6; i++)
+ fprintf (b, "%02x", 0xff);
+ fprintf (b, "\n--\n");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37356.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37356.C
new file mode 100644
index 000000000..45b99a037
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37356.C
@@ -0,0 +1,34 @@
+// PR middle-end/37356 */
+// { dg-do compile }
+// { dg-options "-O" }
+
+bool foo ();
+int bar ();
+
+bool
+baz (int v)
+{
+ return v == bar ();
+}
+
+struct A
+{
+ A () { baz (1) || foo (); }
+};
+
+struct B
+{
+ static A get () { return A (); }
+ B (const int &x) { }
+ B () : b (get ()) { }
+ A b;
+};
+
+B c;
+
+void
+test ()
+{
+ int d;
+ c = d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37393.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37393.C
new file mode 100644
index 000000000..2f9281c96
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr37393.C
@@ -0,0 +1,27 @@
+// PR middle-end/37393
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ ~A ();
+ bool foo () const;
+};
+
+extern "C"
+{
+ extern void bar (const char *, ...) __attribute__ ((noreturn));
+ extern inline __attribute__ ((always_inline, gnu_inline, artificial)) void
+ baz (const char *fmt, ...)
+ {
+ bar (fmt, __builtin_va_arg_pack ());
+ }
+};
+
+void
+test ()
+{
+ A a;
+ if (a.foo ())
+ baz ("foo");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38104.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38104.C
new file mode 100644
index 000000000..6523a5e17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38104.C
@@ -0,0 +1,19 @@
+// PR tree-optimization/38104
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct S { int foo; };
+
+void f0 ();
+
+void
+f1 (struct S s)
+{
+ f0 ();
+}
+
+void
+f2 ()
+{
+ f1 (*(struct S *) (0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38572.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38572.C
new file mode 100644
index 000000000..89d228f02
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38572.C
@@ -0,0 +1,32 @@
+// PR tree-optimization/38572
+// { dg-do compile }
+// { dg-options "-O2" }
+
+// Crash caused by the out-of-bounds enum values (all the remaining cruft
+// is needed only to trigger the appropriate code path in tree-vrp.c).
+enum JSOp
+{
+ JSOP_GETELEM = 5,
+ JSOP_LIMIT
+};
+extern void g ();
+void f (char *pc, char *endpc, int format, char ***fp, enum JSOp op)
+{
+ while (pc <= endpc)
+ {
+ if ((fp && *fp && pc == **fp) || pc == endpc)
+ {
+ if (format == 1)
+ op = (JSOp) 256;
+ else if (format == 2)
+ op = (JSOp) 257;
+ else
+ op = JSOP_GETELEM;
+ }
+ if (op >= JSOP_LIMIT)
+ {
+ if (format)
+ g ();
+ }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38632.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38632.C
new file mode 100644
index 000000000..04fca2280
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr38632.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-O -ftree-parallelize-loops=2" }
+
+void foo();
+
+void bar(int n, char *p)
+{
+ try
+ {
+ foo();
+ ++n;
+ foo();
+ for (int i = 0; i < n-1; ++i)
+ p[i] = 0;
+ }
+ catch (...)
+ {
+ for (int i = 0; i < n; ++i)
+ p[i] = 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr40874.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr40874.C
new file mode 100644
index 000000000..d227ff9aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr40874.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+// { dg-options "-O -fdump-tree-optimized" }
+
+struct pf
+{
+ inline pf(int(*x)(int)) : x(x) {}
+
+ inline int operator()(int a) const
+ {
+ return x(a);
+ }
+
+ int (*x)(int);
+};
+
+inline int g(int x) { return x/x - 1; }
+
+int main(int argc, char* argv[])
+{
+ pf f(g);
+ return f(3);
+}
+
+// { dg-final { scan-tree-dump "return 0" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41186.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41186.C
new file mode 100644
index 000000000..cc685b207
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41186.C
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-sra -fdump-tree-fre1-details" } */
+
+struct Foo {
+ Foo() {};
+ int i;
+ short f;
+};
+struct Bar : public Foo {
+ Bar() {};
+ short b;
+};
+
+extern "C" void abort(void);
+
+int main()
+{
+ Bar b1, b2;
+ b2.i = 0;
+ b1.f = 0;
+ b1.b = 1;
+ b2.f = 1;
+ b2.b = 2;
+ static_cast<Foo&>(b1) = static_cast<Foo&>(b2);
+ if (b1.i != 0 || b1.b != 1)
+ abort ();
+ if (b1.f != 1)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Replaced b1.b with 1" "fre1" } } */
+/* { dg-final { scan-tree-dump "Replaced b1.D.\[0-9\]*.i with 0" "fre1" } } */
+/* { dg-final { scan-tree-dump "Replaced b1.D.\[0-9\]*.f with 1" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41275.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41275.C
new file mode 100644
index 000000000..d9b3dce8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41275.C
@@ -0,0 +1,16 @@
+// PR middle-end/41275
+// { dg-do compile }
+// { dg-options "-O2" }
+// this used to ICE
+struct ErrmsgWindow
+{
+ virtual ~ErrmsgWindow()
+ {
+ extern int _switch_mode_errorstr;
+ _switch_mode_errorstr = 42;
+ }
+};
+void ShowErrorMessage(void)
+{
+ ErrmsgWindow w;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41428.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41428.C
new file mode 100644
index 000000000..32716cad1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41428.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-ccp1-details" } */
+
+extern "C" void abort (void);
+inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; }
+
+int foo(void)
+{
+ float f = 0;
+ int *i = new (&f) int (1);
+ return *(int *)&f;
+}
+
+/* { dg-final { scan-tree-dump "Folded into: if \\\(1 != 0\\\)" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41905.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41905.C
new file mode 100644
index 000000000..4424ce8d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41905.C
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+int foo() __attribute__((noreturn));
+int bar() { return foo(); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41906.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41906.C
new file mode 100644
index 000000000..321d33aea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41906.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive -w" } */
+/* We aren't interested in the warning, but in the ICE. */
+void foo();
+extern void abort (void);
+
+void bar()
+{
+ try { foo(); }
+ catch (...) {}
+ catch (int) {abort ();}
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41961.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41961.C
new file mode 100644
index 000000000..229e7d4b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr41961.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-O3 -ftree-parallelize-loops=2" }
+
+struct A
+{
+ char c[17];
+ void foo();
+};
+
+void A::foo()
+{
+ for (int i = 0; i < 17; ++i)
+ c[i] = 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr42337.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr42337.C
new file mode 100644
index 000000000..8abd4b2d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr42337.C
@@ -0,0 +1,173 @@
+// PR tree-optimize/42337
+// { dg-do compile }
+// { dg-options "-O2" }
+
+template<class _T1, class _T2> struct pair {
+ _T2 second;
+};
+template<typename _Tp>
+inline const _Tp& max(const _Tp& __a, const _Tp& __b) { }
+
+template<typename _ForwardIterator, typename _Tp, typename _Compare> _ForwardIterator
+lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp) { }
+template<class _CharT> struct char_traits {};
+
+template<typename _Iterator, typename _Container> class __normal_iterator {
+ public: typedef _Iterator iterator_type;
+ __normal_iterator& operator++() {
+ }
+};
+template<typename _IteratorL, typename _IteratorR, typename _Container>
+inline bool operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) { }
+template<typename _Tp> class new_allocator {
+ public:
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+};
+
+template<typename _Tp>
+class allocator: public new_allocator<_Tp> {
+ public:
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+};
+
+template<typename _Arg, typename _Result> struct unary_function { };
+template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { };
+template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { };
+template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { };
+template<typename _Tp> struct _Rb_tree_iterator {
+ typedef _Tp* pointer;
+ pointer operator->() const {
+ }
+};
+template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> >
+class _Rb_tree {
+ typedef _Val value_type;
+ public: typedef _Rb_tree_iterator<value_type> iterator;
+};
+template <typename _Key, typename _Tp, typename _Compare = less<_Key>, typename _Alloc = allocator<pair<const _Key, _Tp> > >
+class map {
+ public: typedef _Key key_type;
+ typedef pair<const _Key, _Tp> value_type;
+ typedef _Compare key_compare;
+ private: typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type;
+ typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type;
+ public: typedef typename _Pair_alloc_type::pointer pointer;
+ typedef typename _Rep_type::iterator iterator;
+ iterator find(const key_type& __x) { }
+};
+
+template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+};
+template<typename _Tp, typename _Alloc = allocator<_Tp> >
+class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef __normal_iterator<pointer, vector> iterator;
+ typedef __normal_iterator<const_pointer, vector> const_iterator;
+ iterator begin() { }
+ const_iterator begin() const { }
+ const_iterator end() const { }
+ unsigned long size() const { }
+};
+
+class SSC {
+ public:
+ SSC () {}
+ SSC (const int& cs);
+};
+extern int flag;
+
+struct TP {
+ const int cl_;
+ const vector<int> &its_;
+ int max_s_;
+ };
+
+double foo(TP *p);
+map<int, int> cs_;
+
+template <typename T> class vector32 {
+ public:
+ typedef T& reference;
+ typedef T* iterator;
+ typedef const T* const_iterator;
+ iterator begin() { return data_; }
+ iterator end() { return data_ + size_; }
+ long unsigned int size() const { return size_; }
+ T* data_;
+ unsigned size_;
+};
+
+struct SF : public pair<unsigned long long, double> { };
+
+template<typename KEY, typename VALUE> class SFVT {
+ private: typedef vector32<SF> Container;
+ typedef typename Container::const_iterator CI;
+ mutable Container v_;
+ mutable bool sorted_;
+ struct Cmp : public binary_function<SF, SF, bool> {
+ };
+ __attribute__((always_inline)) VALUE IS(const SFVT &sfv) const {
+ if (sfv.v_.size() < v_.size()) {
+ return sfv.IS(*this);
+ }
+ else {
+ VALUE sum = 0.0;
+ CI beg = sfv.v_.begin();
+ CI end = sfv.v_.end();
+ for (CI i = v_.begin();
+ i != v_.end();
+ ++i) { beg = lower_bound(beg, end, *i, Cmp()); if (beg == end) { return sum; } }
+ }
+ }
+ public: explicit SFVT(const int capacity = 0) : sorted_(true) { }
+ long unsigned int size() const { }
+ __attribute__((always_inline)) VALUE DP(const SFVT &sfv) const {
+ return IS(sfv);
+ }
+};
+class SFV : public SFVT<unsigned long long, double> { };
+
+class Edge;
+extern int flag2;
+
+double foo(TP *p) {
+ int nbests_requested = max(p->max_s_, flag);
+ map<int, int>::iterator it = cs_.find(p->cl_);
+ int* c = &it->second;
+ for (vector<int>::const_iterator iter = p->its_.begin();
+ iter != p->its_.end();
+ ++iter) {
+ }
+ vector<int*> fb;
+ vector<double> w;
+ int *hg = 0;
+ if (flag2 == 10) {
+ hg = &flag2;
+ }
+ int nr = 0;
+ for (vector<int*>::iterator iter = fb.begin();
+ (iter != fb.end() && nr < nbests_requested);
+ ++iter) {
+ }
+ if (hg) {
+ SFV s_weights;
+ for (int i = 0;
+ i < w.size();
+ ++i) {
+ }
+ SFV uw;
+ for (int i = 0, j = 0;
+ i < uw.size() && j < s_weights.size();
+ ) {
+ }
+ const double tc = uw.DP(s_weights);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr43411.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr43411.C
new file mode 100644
index 000000000..411f837cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr43411.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-release_ssa" } */
+class P { public: virtual int function_to_inline() { return 123; } };
+class Psub : public P { };
+
+extern int sink1, sink2;
+
+void test() {
+ Psub p;
+ P &pRef = p;
+ sink1 = p.function_to_inline();
+ sink2 = pRef.function_to_inline();
+}
+
+
+inline int v(P &p) { return p.function_to_inline(); }
+
+void testInlineP() {
+ P p;
+ sink1 = v(p);
+}
+
+void testInlinePsub() {
+ Psub p;
+ sink1 = v(p);
+}
+
+// { dg-final { scan-tree-dump-not "function_to_inline" "release_ssa" { xfail *-*-* } } }
+// { dg-final { cleanup-tree-dump "release_ssa" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44706.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44706.C
new file mode 100644
index 000000000..39904d8b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44706.C
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-fnsplit" } */
+class MemoryManager;
+class XMLExcepts {
+public :
+ enum Codes {
+ AttrList_BadIndex
+ };
+};
+class XMLException {
+public:
+ XMLException(const char* const srcFile, const unsigned int srcLine,
+MemoryManager* const memoryManager = 0);
+};
+class ArrayIndexOutOfBoundsException : public XMLException {
+public:
+ ArrayIndexOutOfBoundsException(const char* const srcFile , const unsigned
+int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager =
+0) : XMLException(srcFile, srcLine, memoryManager) {
+ }
+};
+class XMLAttDef {
+ bool fExternalAttribute;
+};
+class XMLAttDefList {
+public:
+ MemoryManager* getMemoryManager() const;
+};
+class DTDAttDef : public XMLAttDef {
+};
+class DTDAttDefList : public XMLAttDefList {
+ virtual const XMLAttDef &getAttDef(unsigned int index) const ;
+ DTDAttDef** fArray;
+ unsigned int fCount;
+};
+const XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) const {
+ if(index >= fCount)
+ throw ArrayIndexOutOfBoundsException("foo.cpp", 0,
+XMLExcepts::AttrList_BadIndex, getMemoryManager());
+ return *(fArray[index]);
+}
+
+/* Mistake in branch prediction caused us to split away real body of the function keeping
+ only throw () invokation. This is bad idea. */
+/* { dg-final { scan-tree-dump-not "Splitting function" "fnsplit"} } */
+/* { dg-final { cleanup-tree-dump "fnsplit" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44914.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44914.C
new file mode 100644
index 000000000..57ca7e83f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr44914.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fipa-sra -fnon-call-exceptions" } */
+
+struct A
+{
+ ~A () { }
+};
+
+struct B
+{
+ A a;
+ int i;
+ void f (int) { }
+ B ()
+ {
+ f (i);
+ }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45453.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45453.C
new file mode 100644
index 000000000..c8ef8955f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45453.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized -fno-devirtualize-speculatively" } */
+struct S
+{
+ S();
+ virtual inline void foo ()
+ {
+ foo();
+ }
+};
+
+void
+B ()
+{
+ S().foo ();
+}
+/* We should inline foo and devirtualize call to foo in the inlined version. */
+// { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45605.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45605.C
new file mode 100644
index 000000000..7604fe492
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr45605.C
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-fre1" } */
+extern "C" void abort();
+bool destructor_called = false;
+
+struct B {
+ virtual void Run(){};
+};
+
+struct D : public B {
+ virtual void Run()
+ {
+ struct O {
+ ~O() { destructor_called = true; };
+ } o;
+
+ struct Raiser {
+ Raiser() throw( int ) {throw 1;};
+ } raiser;
+ };
+};
+
+int main() {
+ try {
+ D d;
+ static_cast<B&>(d).Run();
+ } catch (...) {}
+
+ if (!destructor_called)
+ abort ();
+}
+
+
+
+/* We should devirtualize call to D::Run */
+/* { dg-final { scan-tree-dump-times "D::Run \\(" 1 "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46228.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46228.C
new file mode 100644
index 000000000..a720dbe3b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46228.C
@@ -0,0 +1,23 @@
+// { dg-options "-fdump-tree-optimized -Os" }
+#include <set>
+#include <stdio.h>
+
+int main()
+{
+ static const int array[] = { 1,2,3,4,5,6,7,8,9,10,6 };
+ std::set<int> the_set;
+ int count = 0;
+ for (unsigned i = 0; i < sizeof(array)/sizeof(*array); i++)
+ {
+ std::pair<std::set<int>::iterator, bool> result =
+ the_set.insert(array[i]);
+ if (result.second)
+ count++;
+ }
+ printf("%d unique items in array.\n", count);
+ return 0;
+}
+
+// This function is small enough to be inlined even at -Os.
+// { dg-final { scan-tree-dump-not "_ZNSt8_Rb_treeIiiSt9_IdentityIiESt4lessIiESaIiEED2Ev" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46734.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46734.C
new file mode 100644
index 000000000..e95c62089
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46734.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fipa-sra" } */
+
+struct A
+{
+ int *p;
+ A() {p = (int *) -1;}
+ ~A() {if (p && p != (int *) -1) *p = 0;}
+};
+
+struct B
+{
+ A a;
+ char data[23];
+ B() : a() {data[0] = 0;}
+};
+
+extern A ga;
+extern int *gi;
+extern void *gz;
+extern B *gb;
+
+static int * __attribute__ ((noinline)) foo (B *b, void *z)
+{
+ __builtin_memcpy (gz, z, 28);
+ ga = b->a;
+ return b->a.p;
+}
+
+int *bar (B *b, void *z)
+{
+ gb = b;
+ return foo (b, z);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46987.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46987.C
new file mode 100644
index 000000000..7163915a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr46987.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct A {
+ virtual A *getThis();
+};
+
+struct B {
+ virtual B *getThis();
+};
+
+struct AB : public A, public B {
+ virtual AB *getThis() { return 0; }
+};
+
+void foo ()
+{
+ AB ab;
+ B *b = &ab;
+ b->getThis();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr47707.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr47707.C
new file mode 100644
index 000000000..98852de17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr47707.C
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-tree-vrp" } */
+#include <assert.h>
+
+struct CH
+{
+ unsigned char ch : 3;
+} ch;
+
+__attribute__((noinline)) void MakeCheckOp (unsigned int *v1, unsigned int *v2)
+{
+ assert (*v1 == *v2);
+
+}
+
+int main (void)
+{
+
+ int len;
+
+ for (len = 4; len >= 1; len--)
+ {
+ unsigned v1, v2;
+ ch.ch = len;
+ v1 = ch.ch;
+ v2 = len;
+ MakeCheckOp (&v1, &v2);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49516.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49516.C
new file mode 100644
index 000000000..2c6fd0496
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49516.C
@@ -0,0 +1,86 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern "C" void abort (void);
+
+typedef int int32;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+typedef short int16;
+
+class Tp {
+ public:
+ Tp(int, const int segment, const int index) __attribute__((noinline));
+
+ inline bool operator==(const Tp& other) const;
+ inline bool operator!=(const Tp& other) const;
+ int GetType() const { return type_; }
+ int GetSegment() const { return segment_; }
+ int GetIndex() const { return index_; }
+ private:
+ inline static bool IsValidSegment(const int segment);
+ static const int kSegmentBits = 28;
+ static const int kTypeBits = 4;
+ static const int kMaxSegment = (1 << kSegmentBits) - 1;
+
+ union {
+
+ struct {
+ int32 index_;
+ uint32 segment_ : kSegmentBits;
+ uint32 type_ : kTypeBits;
+ };
+ struct {
+ int32 dummy_;
+ uint32 type_and_segment_;
+ };
+ uint64 value_;
+ };
+};
+
+Tp::Tp(int t, const int segment, const int index)
+ : index_(index), segment_(segment), type_(t) {}
+
+inline bool Tp::operator==(const Tp& other) const {
+ return value_ == other.value_;
+}
+inline bool Tp::operator!=(const Tp& other) const {
+ return value_ != other.value_;
+}
+
+class Range {
+ public:
+ inline Range(const Tp& position, const int count) __attribute__((always_inline));
+ inline Tp GetBeginTokenPosition() const;
+ inline Tp GetEndTokenPosition() const;
+ private:
+ Tp position_;
+ int count_;
+ int16 begin_index_;
+ int16 end_index_;
+};
+
+inline Range::Range(const Tp& position,
+ const int count)
+ : position_(position), count_(count), begin_index_(0), end_index_(0)
+ { }
+
+inline Tp Range::GetBeginTokenPosition() const {
+ return position_;
+}
+inline Tp Range::GetEndTokenPosition() const {
+ return Tp(position_.GetType(), position_.GetSegment(),
+ position_.GetIndex() + count_);
+}
+
+int main ()
+{
+ Range range(Tp(0, 0, 3), 0);
+ if (!(range.GetBeginTokenPosition() == Tp(0, 0, 3)))
+ abort ();
+
+ if (!(range.GetEndTokenPosition() == Tp(0, 0, 3)))
+ abort();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49911.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49911.C
new file mode 100644
index 000000000..520a7750d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr49911.C
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fstrict-enums -fno-rtti -fno-exceptions -fno-strict-aliasing -fdump-tree-vrp2" } */
+
+
+extern void JS_Assert();
+typedef enum {
+eax, ecx, edx, ebx, esp, ebp,
+esi, edi }
+RegisterID;
+union StateRemat {
+ RegisterID reg_;
+ int offset_;
+};
+static StateRemat FromRegister(RegisterID reg) {
+ StateRemat sr;
+ sr.reg_ = reg;
+ return sr;
+}
+static StateRemat FromAddress3(int address) {
+ StateRemat sr;
+ sr.offset_ = address;
+ //sr.offset_ = 0;
+ if (address < 46 && address >= 0) {
+ JS_Assert();
+ }
+ return sr;
+}
+struct FrameState {
+ StateRemat dataRematInfo2(bool y, int z) {
+ if (y) return FromRegister(RegisterID(1));
+ return FromAddress3(z);
+ }
+};
+FrameState frame;
+StateRemat x;
+void jsop_setelem(bool y, int z) {
+ x = frame.dataRematInfo2(y, z);
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate.*45" 0 "vrp2"} } */
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50622.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50622.C
new file mode 100644
index 000000000..d7f4fa74b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50622.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+typedef __complex__ double Value;
+struct LorentzVector
+{
+ LorentzVector & operator+=(const LorentzVector & a) {
+ theX += a.theX;
+ theY += a.theY;
+ theZ += a.theZ;
+ theT += a.theT;
+ return *this;
+ }
+
+ Value theX;
+ Value theY;
+ Value theZ;
+ Value theT;
+};
+
+inline LorentzVector
+operator+(LorentzVector a, const LorentzVector & b) {
+ return a += b;
+}
+
+Value ex, et;
+LorentzVector sum() {
+ LorentzVector v1; v1.theX =ex; v1.theY =ex+et; v1.theZ =ex-et; v1.theT =et;
+ return v1+v1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50741.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50741.C
new file mode 100644
index 000000000..843a7be4a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr50741.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+/* PR middle-end/50741 */
+
+struct PublishLo
+{
+ const char *functionName;
+ ~PublishLo();
+};
+struct A { A(); };
+A::A()
+{
+ static PublishLo _rL_53 = {__FUNCTION__};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr53844.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr53844.C
new file mode 100644
index 000000000..0be29d86c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr53844.C
@@ -0,0 +1,78 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-optimized-vops" }
+
+struct VBase;
+
+//Very minimal numeric vector class where Base provides the policy
+template<typename Base=VBase>
+struct Vector : public Base{
+
+ inline Vector(const Base& b)
+ :Base(b)
+ {
+ }
+
+ //Assignment from any other sort of Vector
+ template<typename Base2>
+ void operator= (const Vector<Base2>& from)
+ {
+ for(int i=0; i<100; i++){
+ (*this)[i]=from[i];
+ }
+ }
+};
+
+
+//Base class to represent pointer as a Vector
+struct VBase{
+ double * const my_data;
+
+ double& operator[](int i) {
+ return my_data[i];
+ }
+
+ const double& operator[](int i) const {
+ return my_data[i];
+ }
+};
+
+//Base class providing very minimalistic expression template
+template<class B2> struct ScalarMulExpr
+{
+ const int& mul;
+ const Vector<B2>& vec;
+
+ int size() const
+ {
+ return vec.size();
+ }
+
+ double operator[](int i) const
+ {
+ return vec[i]*mul;
+ }
+
+ ScalarMulExpr(const Vector<B2>& vec_, const int& m)
+ :mul(m),vec(vec_)
+ {
+ }
+};
+
+//Allow vector to be multiplied by a scalar
+template<class B2>
+Vector<ScalarMulExpr<B2> > operator*(const Vector<B2>& lhs, const int& rhs)
+{
+ return ScalarMulExpr<B2>(lhs, rhs);
+}
+
+//Test function producing suboptimal asm code
+void test(const Vector<>& in, Vector<>& out, int i)
+{
+ out=in*1*1*1*1*1*1*1*1*1*1*1;
+}
+
+// There should be a single store remaining, inside the loops. All
+// dead stores to unused temporaries should have been removed.
+
+// { dg-final { scan-tree-dump-times "VDEF" 1 "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr54515.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr54515.C
new file mode 100644
index 000000000..11ed46893
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr54515.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+template < typename T > T h2le (T)
+{
+ T a;
+ unsigned short &b = a;
+ short c = 0;
+ unsigned char (&d)[2] = reinterpret_cast < unsigned char (&)[2] > (c);
+ unsigned char (&e)[2] = reinterpret_cast < unsigned char (&)[2] > (b);
+ e[0] = d[0];
+ return a;
+}
+
+void
+bar ()
+{
+ h2le ((unsigned short) 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr57380.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr57380.C
new file mode 100644
index 000000000..0a2b2ad5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr57380.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-phiopt1" } */
+
+struct my_array {
+ int data[4];
+};
+
+const int& my_max(const int& a, const int& b) {
+ return a < b ? b : a;
+}
+
+int f(my_array a, my_array b) {
+ int res = 0;
+ for (int i = 0; i < 4; ++i) {
+ res += my_max(a.data[i], b.data[i]);
+ }
+ return res;
+}
+
+/* { dg-final { scan-tree-dump "MAX_EXPR" "phiopt1" } } */
+/* { dg-final { cleanup-tree-dump "phiopt1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr58404.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr58404.C
new file mode 100644
index 000000000..aa8fb796c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr58404.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-O -fdump-tree-cddce1" }
+
+struct S { int s; };
+S a[1024];
+
+void
+foo ()
+{
+ for (int i = 0; i < 1024; i++)
+ {
+ S &r = a[i];
+ r.s++;
+ }
+}
+
+// We should propagate the reference into both memory accesses
+// during the first forwprop pass
+// { dg-final { scan-tree-dump-times "= &a" 0 "cddce1" } }
+// { dg-final { cleanup-tree-dump "cddce1" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr8781.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr8781.C
new file mode 100644
index 000000000..cc518a0d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr8781.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-sra -fdump-tree-fre1-details" } */
+
+int f();
+
+template<typename predicate>
+class noop_t {
+ const predicate &pred;
+public:
+ explicit noop_t(const predicate &p) : pred(p) {}
+
+ int operator()() const { return pred(); }
+};
+
+template<typename predicate>
+inline noop_t<predicate> noop(const predicate pred) {
+ return noop_t<predicate>(pred);
+}
+
+int x()
+{
+ return (noop(noop(noop(noop(noop(noop(noop(noop(noop(f)))))))))());
+}
+
+/* We should optimize this to a direct call. */
+
+/* { dg-final { scan-tree-dump "Replacing call target with f" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C
new file mode 100644
index 000000000..c32ebba00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+
+struct f
+{
+ char m;
+ char m1;
+};
+
+static inline char f:: *g(int a)
+{
+ return a?0:&f::m;
+}
+
+int h(void)
+{
+ char f:: *a = g(0);
+ return a == 0;
+}
+
+/* We should have no cast to offset_type. */
+/* { dg-final { scan-tree-dump-times "offset_type" 0 "optimized"} } */
+// And we should optimized this code to just return 0
+/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict1.C
new file mode 100644
index 000000000..682de7e54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict1.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-lim1-details" } */
+
+struct Foo
+{
+ Foo();
+ Foo(const Foo&);
+ int n;
+ int * __restrict__ p;
+};
+void bar(Foo f, int * __restrict__ q)
+{
+ for (int i = 0; i < f.n; ++i)
+ {
+ *q += f.p[i];
+ }
+}
+
+/* { dg-final { scan-tree-dump "Executing store motion" "lim1" } } */
+/* { dg-final { cleanup-tree-dump "lim1" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict2.C
new file mode 100644
index 000000000..35957f535
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/restrict2.C
@@ -0,0 +1,62 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+struct S { int *__restrict p; int q; };
+S s;
+
+int
+f1 (S x, S y)
+{
+ x.p[0] = 1;
+ y.p[0] = 0;
+// { dg-final { scan-tree-dump-times "return 1" 1 "optimized" } }
+ return x.p[0];
+}
+
+int
+f2 (S x)
+{
+ x.p[0] = 2;
+ s.p[0] = 0;
+// { dg-final { scan-tree-dump-times "return 2" 1 "optimized" } }
+ return x.p[0];
+}
+
+int
+f3 (S &__restrict x, S &__restrict y)
+{
+ x.p[0] = 3;
+ y.p[0] = 0;
+// { dg-final { scan-tree-dump-times "return 3" 1 "optimized" } }
+ return x.p[0];
+}
+
+int
+f4 (S &x, S &y)
+{
+ x.p[0] = 4;
+ y.p[0] = 0;
+// { dg-final { scan-tree-dump-times "return 4" 0 "optimized" } }
+ return x.p[0];
+}
+
+int
+f5 (S *__restrict x, S *__restrict y)
+{
+ x->p[0] = 5;
+ y->p[0] = 0;
+// We might handle this some day
+// { dg-final { scan-tree-dump-times "return 5" 1 "optimized" { xfail *-*-* } } }
+ return x->p[0];
+}
+
+int
+f6 (S *x, S *y)
+{
+ x->p[0] = 6;
+ y->p[0] = 0;
+// { dg-final { scan-tree-dump-times "return 6" 0 "optimized" } }
+ return x->p[0];
+}
+
+// { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/sra-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/sra-1.C
new file mode 100644
index 000000000..e3e3918eb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/sra-1.C
@@ -0,0 +1,29 @@
+/* https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=223576 */
+
+/* SRA failed to canonicalize bit-field types, introducing type
+ mismatches. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct A
+{
+ int a:16;
+ /* These dummy bit-fields are here to prevent GCC 4.2+ from merging
+ the bit-field compares into a single word compare, which disables
+ SRA. */
+ int a2:16;
+ int a3:16;
+ int a4:16;
+ int b:8;
+ bool operator==(A const x) const
+ {
+ return (this->a == x.a && this->b == x.b);
+ }
+};
+
+bool
+foo (A const x, A const y)
+{
+ return x == y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C
new file mode 100644
index 000000000..4e953220f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int &f(int *a)
+{
+ return *a;
+}
+
+/* There should be no cast as pointer and references are
+ considered the same type. */
+/* { dg-final { scan-tree-dump-times "\\(int &\\)" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C
new file mode 100644
index 000000000..5f63865c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C
@@ -0,0 +1,104 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dom1" } */
+
+typedef long unsigned int size_t;
+extern void abort (void) __attribute__ ((__noreturn__));
+union tree_node;
+typedef union tree_node *tree;
+union gimple_statement_d;
+typedef union gimple_statement_d *gimple;
+typedef const union gimple_statement_d *const_gimple;
+
+enum gimple_code
+{
+ GIMPLE_RETURN = 10,
+};
+
+
+
+
+
+struct gimple_statement_base
+{
+
+
+ enum gimple_code code:8;
+};
+
+
+enum gimple_statement_structure_enum
+{
+ xyz
+};
+
+
+
+
+
+
+union gimple_statement_d
+{
+ struct gimple_statement_base gsbase;
+};
+
+
+
+
+
+extern size_t const gimple_ops_offset_[];
+
+
+extern enum gimple_statement_structure_enum const gss_for_code_[];
+
+
+static inline enum gimple_code
+gimple_code (const_gimple g)
+{
+ return g->gsbase.code;
+}
+
+
+
+
+static inline enum gimple_statement_structure_enum
+gss_for_code (enum gimple_code code)
+{
+ return gss_for_code_[code];
+}
+
+
+
+
+static inline enum gimple_statement_structure_enum
+gimple_statement_structure (gimple gs)
+{
+ return gss_for_code (gimple_code (gs));
+}
+
+
+static inline tree *
+gimple_ops (gimple gs)
+{
+ size_t off;
+ off = gimple_ops_offset_[gimple_statement_structure (gs)];
+ return (tree *) ((char *) gs + off);
+}
+
+
+static inline void
+gimple_set_op (gimple gs, unsigned i, tree op)
+{
+ gimple_ops (gs)[i] = op;
+}
+
+void
+gimple_return_set_retval (gimple gs, tree retval)
+{
+ const_gimple __gs = (gs);
+ if (gimple_code (__gs) != (GIMPLE_RETURN))
+ abort ();
+ gimple_set_op (gs, 0, retval);
+}
+/* { dg-final { scan-tree-dump-times "gss_for_code_.10." 1 "dom1"} } */
+/* { dg-final { cleanup-tree-dump "dom1" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C
new file mode 100644
index 000000000..b2d5f4b05
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C
@@ -0,0 +1,61 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+void link_error();
+
+
+struct State {
+ int p0, p1, p2;
+ inline State(){p0=0;p1=0;p2=0;}
+ inline State(const State &s) {
+ p0 = s.p0;
+ p1 = s.p1;
+ p2 = s.p2;
+ }
+
+ inline void operator =(const State &s) {
+ p0 = s.p0;
+ p1 = s.p1;
+ p2 = s.p2;
+ }
+
+ inline void step(void) {
+ p0 = p1+p2;
+ p1 = p0*p1+p2;
+ p2 = p0-p2;
+ }
+};
+
+
+inline void iterate_ok(State &inS1, State &inS2, unsigned int n)
+{
+ State s1 = inS1;
+ for (unsigned int i = 0; i < n; i++) {
+ s1.step();
+ }
+ inS1 = s1;
+}
+
+void temp()
+{
+ State s1;
+ s1.p0 = 0;
+ s1.p1 = 0;
+ s1.p2 = 0;
+ State s2;
+ s2.p0 = 0;
+ s2.p1 = 0;
+ s2.p2 = 0;
+ iterate_ok (s1, s2, 1);
+ if (s1.p0)
+ link_error();
+ if (s1.p0)
+ link_error();
+ if (s1.p0)
+ link_error();
+}
+
+/* We should have removed the casts from pointers to references and caused SRA to happen. */
+
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C
new file mode 100644
index 000000000..d73787018
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C
@@ -0,0 +1,52 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+void link_error();
+
+struct OOf {
+ int value;
+ OOf() {value = 0;}
+};
+inline OOf operator+(OOf op1, OOf op2)
+{
+ OOf f;
+ f.value = op1.value + op2.value;
+ return f;
+}
+inline OOf operator*(OOf op1, OOf op2)
+{
+ OOf f;
+ f.value = op1.value * op2.value;
+ return f;
+}
+inline OOf operator-(OOf op1, OOf op2)
+{
+ OOf f;
+ f.value = op1.value - op2.value;
+ return f;
+}
+inline OOf test_func(
+ OOf a,
+ OOf b,
+ OOf c
+)
+{
+ OOf d, e;
+ OOf result;
+ d = a * b + b * c;
+ e = a * c - b * d;
+ result = d * e;
+ return result;
+}
+
+void test()
+{
+ OOf a, b, c;
+ OOf d = test_func (a,b,c);
+ if (d.value)
+ link_error();
+}
+
+/* We should have removed the casts from pointers to references and caused SRA to happen. */
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C
new file mode 100644
index 000000000..2a2d89c63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C
@@ -0,0 +1,83 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* Test check use_block_copy bit propagation in sra element hierarchy. */
+
+typedef unsigned char UINT8 ;
+typedef unsigned int UINT ;
+class C4
+{
+public:
+ int xy[2];
+};
+
+class C3
+{
+public:
+ inline void
+ Reset()
+ {
+ C4 const mvMax = {0x7fff, 0x7fff};
+
+ m42(0,mvMax);
+ m42(1,mvMax);
+ m43(0);
+ };
+
+ inline void m42 (UINT i, C4 mv)
+ {
+ mMv[i] = mv;
+ };
+
+
+
+ inline void m43(UINT j)
+ {
+ m44 (j);
+ d41 = j + 1;
+ };
+
+private:
+
+ C4 mMv[2];
+ UINT8 d41;
+ inline void m44 (UINT j) const {};
+};
+
+class C2
+{
+private:
+ bool valid;
+};
+
+class C1
+{
+public:
+ void m1(C3 *c);
+
+private:
+ const C2 * d1[2];
+ void m2(C3 *m);
+};
+
+void C1::m1 (C3 *r)
+{
+ C3 x;
+ m2(&x);
+}
+void C1::m2(C3 *x)
+{
+ C3 m3;
+ int i;
+ m3.Reset ();
+ for(i=0; i<2; i++)
+ {
+ const C2 * r = d1[i];
+ if (r!=__null)
+ {
+ C4 const c400 = {0,0};
+ m3.m42 (i, c400);
+
+ }
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C
new file mode 100644
index 000000000..06e9b1e35
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+class bar
+{
+public:
+ static const int conststaticvariable;
+};
+
+
+int f(void)
+{
+ return bar::conststaticvariable;
+}
+
+/* There should be a reference to conststaticvariable since it may
+ be overriden at link time. */
+/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/stabilize1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/stabilize1.C
new file mode 100644
index 000000000..2fe723c3a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/stabilize1.C
@@ -0,0 +1,14 @@
+// PR c++/53356
+// { dg-options "-fdump-tree-gimple" }
+// { dg-final { scan-tree-dump-not "= 0" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
+
+class A {};
+
+struct B {
+ operator const A &() const;
+};
+
+A* cause_ICE() {
+ return new A(B());
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C
new file mode 100644
index 000000000..808b5ab27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options { -O -fdump-tree-optimized } } */
+
+int a[4][8];
+
+int foo(long i)
+{
+ return *(&a[0][0] + i*8); // a[i][0]
+}
+
+struct Foo { double x, y; };
+
+Foo b[4];
+
+double bar(long i)
+{
+ return *(&b[0].x + i*2); // b[i].x
+}
+
+/* { dg-final { scan-tree-dump "a\\\[.*i.*\\\]\\\[0\\\]" "optimized" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump "b\\\[.*i.*\\\].x" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti.C
new file mode 100644
index 000000000..111127b0d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/tmmti.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void bar(unsigned int i)
+{
+ int a[4];
+ char *p = (char*)&a[1] + 4*i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
new file mode 100644
index 000000000..390be86d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
@@ -0,0 +1,29 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdint.h>
+
+uint64_t Global[2];
+
+void *Thread1(void *x) {
+ Global[1]++;
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ char *p1 = reinterpret_cast<char *>(&Global[0]);
+ uint64_t *p4 = reinterpret_cast<uint64_t *>(p1 + 1);
+ (*p4)++;
+ return NULL;
+}
+
+int main() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ printf("Pass\n");
+ /* { dg-prune-output "ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+ /* { dg-output "Pass.*" } */
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C
new file mode 100644
index 000000000..26d01ae3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C
@@ -0,0 +1,20 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+void *Thread(void *a) {
+ __atomic_fetch_add((int*)a, 1, __ATOMIC_SEQ_CST);
+ return 0;
+}
+
+int main() {
+ int *a = new int(0);
+ pthread_t t;
+ pthread_create(&t, 0, Thread, a);
+ sleep(1);
+ delete a;
+ pthread_join(t, 0);
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C
new file mode 100644
index 000000000..1fe512cde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C
@@ -0,0 +1,20 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+void *Thread(void *a) {
+ sleep(1);
+ __atomic_fetch_add((int*)a, 1, __ATOMIC_SEQ_CST);
+ return 0;
+}
+
+int main() {
+ int *a = new int(0);
+ pthread_t t;
+ pthread_create(&t, 0, Thread, a);
+ delete a;
+ pthread_join(t, 0);
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/benign_race.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/benign_race.C
new file mode 100644
index 000000000..b5f17208a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/benign_race.C
@@ -0,0 +1,38 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int Global;
+int WTFGlobal;
+
+extern "C" {
+void AnnotateBenignRaceSized(const char *f, int l,
+ void *mem, unsigned int size, const char *desc);
+void WTFAnnotateBenignRaceSized(const char *f, int l,
+ void *mem, unsigned int size,
+ const char *desc);
+}
+
+
+void *Thread(void *x) {
+ Global = 42;
+ WTFGlobal = 142;
+ return 0;
+}
+
+int main() {
+ AnnotateBenignRaceSized(__FILE__, __LINE__,
+ &Global, sizeof(Global), "Race on Global");
+ WTFAnnotateBenignRaceSized(__FILE__, __LINE__,
+ &WTFGlobal, sizeof(WTFGlobal),
+ "Race on WTFGlobal");
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ sleep(1);
+ Global = 43;
+ WTFGlobal = 143;
+ pthread_join(t, 0);
+ printf("OK\n");
+}
+
+/* { dg-prune-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C
new file mode 100644
index 000000000..a93761477
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C
@@ -0,0 +1,36 @@
+/* { dg-shouldfail "tsan" } */
+/* { dg-output "ThreadSanitizer: data race.*" } */
+/* { dg-output "pthread_cond_signal.*" } */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+struct Ctx {
+ pthread_mutex_t m;
+ pthread_cond_t c;
+ bool done;
+};
+
+void *thr(void *p) {
+ Ctx *c = (Ctx*)p;
+ pthread_mutex_lock(&c->m);
+ c->done = true;
+ pthread_mutex_unlock(&c->m);
+ pthread_cond_signal(&c->c);
+ return 0;
+}
+
+int main() {
+ Ctx *c = new Ctx();
+ pthread_mutex_init(&c->m, 0);
+ pthread_cond_init(&c->c, 0);
+ pthread_t th;
+ pthread_create(&th, 0, thr, c);
+ pthread_mutex_lock(&c->m);
+ while (!c->done)
+ pthread_cond_wait(&c->c, &c->m);
+ pthread_mutex_unlock(&c->m);
+ delete c;
+ pthread_join(th, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/default_options.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/default_options.C
new file mode 100644
index 000000000..13e1984ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/default_options.C
@@ -0,0 +1,31 @@
+#include <pthread.h>
+#include <stdio.h>
+
+extern "C" const char *__tsan_default_options() {
+ return "report_bugs=0";
+}
+
+int Global;
+
+void *Thread1(void *x) {
+ Global = 42;
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ Global = 43;
+ return NULL;
+}
+
+int main() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ fprintf(stderr, "DONE\n");
+ return 0;
+}
+
+/* { dg-prune-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output "DONE" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace.C
new file mode 100644
index 000000000..9babb6a8f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace.C
@@ -0,0 +1,30 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+void *Thread1(void *x) {
+ int f = open("/dev/random", O_RDONLY);
+ close(f);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ sleep(1);
+ int f = open("/dev/random", O_RDONLY);
+ close(f);
+ return NULL;
+}
+
+int main() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ printf("OK\n");
+}
+
+/* { dg-prune-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C
new file mode 100644
index 000000000..56f00f8ac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/fd_close_norace2.C
@@ -0,0 +1,29 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int pipes[2];
+
+void *Thread(void *x) {
+ // wait for shutown signal
+ while (read(pipes[0], &x, 1) != 1) {
+ }
+ close(pipes[0]);
+ close(pipes[1]);
+ return 0;
+}
+
+int main() {
+ if (pipe(pipes))
+ return 1;
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ // send shutdown signal
+ while (write(pipes[1], &t, 1) != 1) {
+ }
+ pthread_join(t, 0);
+ printf("OK\n");
+}
+
+/* { dg-prune-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output "OK" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan.exp b/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan.exp
new file mode 100644
index 000000000..14ff02e55
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan.exp
@@ -0,0 +1,47 @@
+# Copyright (C) 2013-2014 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib tsan-dg.exp
+load_lib torture-options.exp
+
+if ![check_effective_target_fthread_sanitizer] {
+ return
+}
+
+# Initialize `dg'.
+dg-init
+torture-init
+set-torture-options [list \
+ { -O0 } \
+ { -O2 } ]
+
+if [tsan_init] {
+
+# Main loop.
+gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/tsan/*.c]] ""
+
+}
+
+# All done.
+tsan_finish
+torture-finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C
new file mode 100644
index 000000000..f2b2cbd1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-1.C
@@ -0,0 +1,18 @@
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-fsanitize=shift -w" } */
+
+#include <stdio.h>
+
+int
+main (void)
+{
+ fputs ("UBSAN TEST START\n", stderr);
+
+ int a = 1;
+ a <<= 31;
+
+ fputs ("UBSAN TEST END\n", stderr);
+ return 0;
+}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-2.C
new file mode 100644
index 000000000..867908aef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx11-shift-2.C
@@ -0,0 +1,10 @@
+/* { dg-do run { target c++11 } } */
+/* { dg-options "-fsanitize=shift -w" } */
+
+int
+main (void)
+{
+ int a = -42;
+ a <<= 1;
+}
+/* { dg-output "left shift of negative value -42" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C
new file mode 100644
index 000000000..ca1e922d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C
@@ -0,0 +1,13 @@
+/* { dg-do run { target c++1y } } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
+/* { dg-shouldfail "ubsan" } */
+
+int
+main (void)
+{
+ int y = -18;
+ int a[y];
+ return 0;
+}
+
+/* { dg-output "terminate called after throwing an instance" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/div-by-zero-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/div-by-zero-1.C
new file mode 100644
index 000000000..88acfa151
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/div-by-zero-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=integer-divide-by-zero -w" } */
+
+void
+foo (int i)
+{
+ switch (i)
+ case 0 * (1 / 0): /* { dg-error "is not a constant expression" } */
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59250.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59250.C
new file mode 100644
index 000000000..e438d24fd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59250.C
@@ -0,0 +1,18 @@
+// PR sanitizer/59250
+// { dg-do compile }
+// { dg-options "-fsanitize=undefined" }
+
+struct E {
+ int i;
+};
+
+struct S {
+ const char *s;
+ S (const char *);
+ static E *e;
+};
+
+S::S (const char *) : s (0)
+{
+ e = new E ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59306.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59306.C
new file mode 100644
index 000000000..621093c6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59306.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-fsanitize=undefined" }
+
+class A {
+ void bar (void (A::*) (int));
+ void foo (int);
+ void B ();
+};
+
+void A::B()
+{
+ bar (&A::foo);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59331.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59331.C
new file mode 100644
index 000000000..1bb3666ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59331.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
+
+void foo(int i)
+{
+ /* Don't warn here with "value computed is not used". */
+ char a[i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59415.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59415.C
new file mode 100644
index 000000000..4c373f7c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59415.C
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=null -Wall -fvtable-verify=std" } */
+
+void
+foo (void)
+{
+ throw 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59437.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59437.C
new file mode 100644
index 000000000..0e77ccde4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr59437.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-fsanitize=null -fvtable-verify=std" }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+
+template < typename T > struct A
+{
+ T foo ();
+};
+template < typename T > struct C: virtual public A < T >
+{
+ C & operator<< (C & (C &));
+};
+template < typename T >
+C < T > &endl (C < int > &c)
+{
+ c.foo ();
+ return c;
+}
+C < int > cout;
+void
+fn ()
+{
+ cout << endl;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr60569.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr60569.C
new file mode 100644
index 000000000..df57c06be
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr60569.C
@@ -0,0 +1,21 @@
+// PR sanitizer/60569
+// { dg-do link }
+// { dg-require-effective-target lto }
+// { dg-options "-fsanitize=undefined -flto" }
+
+struct A
+{
+ void foo ();
+ struct
+ {
+ int i;
+ void bar () { i = 0; }
+ } s;
+};
+
+void A::foo () { s.bar (); }
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-1.C
new file mode 100644
index 000000000..43791b9e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-1.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-fsanitize=return" }
+// { dg-shouldfail "ubsan" }
+
+struct S { S (); ~S (); };
+
+S::S () {}
+S::~S () {}
+
+int
+foo (int x)
+{
+ S a;
+ {
+ S b;
+ if (x)
+ return 1;
+ }
+}
+
+int
+main ()
+{
+ foo (0);
+}
+
+// { dg-output "execution reached the end of a value-returning function without returning a value" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-2.C
new file mode 100644
index 000000000..546f17810
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/return-2.C
@@ -0,0 +1,33 @@
+// { dg-do run }
+// { dg-options "-fsanitize=return" }
+
+#include <stdio.h>
+
+struct S { S (); ~S (); };
+
+S::S () {}
+S::~S () {}
+
+int
+foo (int x)
+{
+ S a;
+ {
+ S b;
+ if (x)
+ return 1;
+ }
+}
+
+int
+main ()
+{
+ fputs ("UBSAN TEST START\n", stderr);
+
+ foo (1);
+ foo (14);
+
+ fputs ("UBSAN TEST END\n", stderr);
+}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/ubsan.exp b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/ubsan.exp
new file mode 100644
index 000000000..7d5e9ba72
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/ubsan.exp
@@ -0,0 +1,34 @@
+# Copyright (C) 2013-2014 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib ubsan-dg.exp
+
+# Initialize `dg'.
+dg-init
+if [ubsan_init] {
+
+# Main loop.
+gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/ubsan/*.c]] ""
+
+}
+
+# All done.
+ubsan_finish
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_a.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_a.C
new file mode 100644
index 000000000..58bb9c5d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_a.C
@@ -0,0 +1,63 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+
+class M {
+
+ public:
+__attribute__ ((always_inline)) int GetC (int *c) {
+
+ A details_str;
+ if (!get_url (&details_str))
+ {
+ incr ();
+ return 1;
+ }
+
+ *c = get_time ();
+ return -1;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc; /* { dg-bogus "uninitialized" "uninitialized variable warning" } */
+ if (GetC (&cc) >= 0 )
+ return;
+
+ if (t && cc <= 0 ) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void foo(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_b.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_b.C
new file mode 100644
index 000000000..94a444d21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-1_b.C
@@ -0,0 +1,63 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+
+class M {
+
+ public:
+__attribute__ ((always_inline)) int GetC (int *c) {
+
+ A details_str;
+ if (!get_url (&details_str))
+ {
+ incr ();
+ return 1;
+ }
+
+ *c = get_time ();
+ return -1;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc; /* { dg-message "note: 'cc' was declared here" } */
+ if (GetC (&cc) <= 0 ) /* return flag checked wrongly */
+ return;
+
+ if (t && cc <= 0 ) /* { dg-warning "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void foo(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_a.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_a.C
new file mode 100644
index 000000000..918c94375
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_a.C
@@ -0,0 +1,62 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+
+class M {
+
+ public:
+__attribute__ ((always_inline)) bool GetC (int *c) {
+
+ A details_str;
+ if (get_url (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ return false;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc;
+ if (!GetC (&cc)) /* return flag checked properly */
+ return;
+
+ if (cc <= 0) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void foo(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_b.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_b.C
new file mode 100644
index 000000000..5023fc50b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-2_b.C
@@ -0,0 +1,62 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+
+class M {
+
+ public:
+__attribute__ ((always_inline)) bool GetC (int *c) {
+
+ A details_str;
+ if (get_url (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ return false;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc; /* { dg-message "note: 'cc' was declared here" } */
+ if (GetC (&cc)) /* return flag checked wrongly */
+ return;
+
+ if (cc <= 0) /* { dg-warning "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void foo(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_a.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_a.C
new file mode 100644
index 000000000..910140790
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_a.C
@@ -0,0 +1,77 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+/* Multiple initialization paths. */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+bool get_url2 (A *);
+
+class M {
+
+ public:
+ __attribute__ ((always_inline))
+ bool GetC (int *c) {
+
+ A details_str;
+ /* Intialization path 1 */
+ if (get_url (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ /* insert dtor calls (inlined) into following return paths */
+ A tmp_str;
+
+ /* Intializtion path 2 */
+ if (get_url2 (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ return false;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc;
+ if (!GetC (&cc)) /* return flag checked properly */
+ return;
+
+ if (cc <= 0) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void test(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_b.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_b.C
new file mode 100644
index 000000000..a66e04bec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-3_b.C
@@ -0,0 +1,87 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+/* Multiple initialization paths. */
+
+typedef long long int64;
+void incr ();
+bool is_valid (int);
+int get_time ();
+
+class A
+{
+public:
+ A ();
+ ~A () {
+ if (I) delete I;
+ }
+
+private:
+ int* I;
+};
+
+bool get_url (A *);
+bool get_url2 (A *);
+bool get_url3 (A *);
+
+class M {
+
+ public:
+ __attribute__ ((always_inline))
+ bool GetC (int *c) {
+
+ A details_str;
+
+ /* Initialization path 1 */
+ if (get_url (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ /* Destructor call before return*/
+ A tmp_str;
+
+ /* Initialization path 2 */
+ if (get_url2 (&details_str))
+ {
+ *c = get_time ();
+ return true;
+ }
+
+ /* Fail to initialize in this path but
+ still returns true */
+ if (get_url2 (&details_str))
+ {
+ /* Fail to initialize *c */
+ return true;
+ }
+
+ return false;
+ }
+
+ void do_sth();
+ void do_sth2();
+
+ void P (int64 t)
+ {
+ int cc;
+ if (!GetC (&cc))
+ return;
+
+ if (cc <= 0) /* { dg-warning "uninitialized" "uninitialized variable warning" } */
+ {
+ this->do_sth();
+ return;
+ }
+
+ do_sth2();
+ }
+};
+
+M* m;
+void test(int x)
+{
+ m = new M;
+ m->P(x);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-4.C b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-4.C
new file mode 100644
index 000000000..94ab13c50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-4.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -Og" } */
+
+int pop ();
+int pop_first_bucket;
+
+int my_pop ()
+{
+ int out; // { dg-bogus "uninitialized" "uninitialized variable warning" }
+
+ while (pop_first_bucket)
+ if (pop_first_bucket && (out = pop()))
+ return out;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc
new file mode 100644
index 000000000..835cdbae3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+extern int bar();
+int foo(void)
+{
+ for (;;) {
+ int err = ({int _err; /* { dg-bogus "uninitialized" "false warning" } */
+ for (int i = 0; i < 16; ++i) {
+ _err = 17;
+ _err = bar();
+ }
+ _err; /* { dg-bogus "uninitialized" "false warning" } */
+ });
+
+ if (err == 0) return 17;
+ }
+
+ return 18;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc
new file mode 100644
index 000000000..e4ef3d22c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+extern int bar();
+int foo(int n)
+{
+ for (;;) {
+ int err = ({int _err;
+ for (int i = 0; i < n; ++i) {
+ _err = 17;
+ _err = bar();
+ }
+ _err;
+ }); /* { dg-warning "uninitialized" "warn on _err" } */
+
+ if (err == 0) return 17;
+ }
+
+ return 18;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc
new file mode 100644
index 000000000..7f6b41d31
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+extern int bar();
+int foo(int n, int m)
+{
+ for (;;) {
+ int err = ({int _err;
+ for (int i = 0; i < 16; ++i) {
+ if (m+i > n)
+ break;
+ _err = 17;
+ _err = bar();
+ }
+ _err;
+ });
+
+ if (err == 0) return 17; }); /* { dg-warning "uninitialized" "warn on _err" } */
+ }
+
+ return 18;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc
new file mode 100644
index 000000000..835cdbae3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -O2" } */
+
+extern int bar();
+int foo(void)
+{
+ for (;;) {
+ int err = ({int _err; /* { dg-bogus "uninitialized" "false warning" } */
+ for (int i = 0; i < 16; ++i) {
+ _err = 17;
+ _err = bar();
+ }
+ _err; /* { dg-bogus "uninitialized" "false warning" } */
+ });
+
+ if (err == 0) return 17;
+ }
+
+ return 18;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc
new file mode 100644
index 000000000..198cd6b53
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+void g(const void*);
+struct B
+{
+ int* x[2];
+ int *p;
+ B()
+ {
+ for (int** p=x; p<x+4; ++p)
+ *p = 0;
+ }
+ ~B()
+ {
+ g(p);
+ }
+};
+void bar()
+{
+ const B &b = B();
+ g(&b);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr19951.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr19951.cc
new file mode 100644
index 000000000..a6acf99ff
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr19951.cc
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+struct A
+{
+ ~A();
+};
+
+void foo();
+
+void bar()
+{
+ A a;
+
+ foo();
+ for (;;)
+ foo();
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21218.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21218.cc
new file mode 100644
index 000000000..73331d227
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21218.cc
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+struct A
+{
+ double d[2];
+ double foo(int i) { return d[i]; }
+};
+
+struct B : public A {};
+
+void bar(B& b)
+{
+ for (int i=0; i<2; ++i)
+ b.d[i] = b.foo(i);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_1.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_1.cc
new file mode 100644
index 000000000..c65d9fcaa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_1.cc
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+struct A
+{
+ int a[4];
+ int& operator[](int i) { return a[i]; }
+};
+
+struct B : public A
+{
+ int& operator[](int i) { return A::operator[](i); }
+};
+
+void foo(B &b)
+{
+ for (int i=0; i<4; ++i)
+ b[i] = 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_2.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_2.cc
new file mode 100644
index 000000000..58efedf18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr21734_2.cc
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct A
+{
+ int a[4];
+ int* operator[](int i) { return &a[i]; }
+};
+
+void foo(A a1, A &a2)
+{
+ a1[1][1]=0;
+ for (int i=0; i<4; ++i)
+ a2.a[i]=0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr22543.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr22543.cc
new file mode 100644
index 000000000..f5e55f195
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr22543.cc
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+
+struct A
+{
+ int i, j;
+
+ A() : i(), j() {}
+ ~A() {}
+
+ operator int() { return 0; }
+};
+
+struct B
+{
+ A foo() const { return A(); }
+};
+
+struct X { ~X(); };
+
+struct C
+{
+ C();
+
+ int z[4];
+};
+
+C::C()
+{
+ for (int i=0; i<4; ++i)
+ z[i]=0;
+
+ X x;
+
+ for (int i=0; i<4; ++i)
+ int j = B().foo();
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-2.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-2.cc
new file mode 100644
index 000000000..15848c439
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-2.cc
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-O3 -fopt-info-vec-optimized -fdump-tree-original -fdump-tree-gimple" } */
+
+/* PR other/33426 */
+/* Testing whether #pragma ivdep is working. */
+
+void foo(int n, int *a, int *b, int *c) {
+ int i;
+ i = 0;
+#pragma GCC ivdep
+ while(i < n)
+ {
+ a[i] = b[i] + c[i];
+ ++i;
+ }
+}
+
+void bar(int n, int *a, int *b, int *c) {
+ int i;
+ i = 0;
+#pragma GCC ivdep
+ do
+ {
+ a[i] = b[i] + c[i];
+ ++i;
+ }
+ while(i < n);
+}
+
+/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */
+/* { dg-bogus " version\[^\n\r]* alias" "" { target *-*-* } 0 } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+/* { dg-final { scan-tree-dump-times "ANNOTATE_EXPR " 2 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+/* { dg-final { scan-tree-dump-times "ANNOTATE " 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-3.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-3.cc
new file mode 100644
index 000000000..78f225a9c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-3.cc
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-require-effective-target vect_int_mult } */
+/* { dg-additional-options "-std=c++11 -O3 -fopt-info-vec-optimized -fdump-tree-original -fdump-tree-gimple" } */
+
+/* PR other/33426 */
+/* Testing whether #pragma ivdep is working. */
+
+int ar[100];
+
+void foo(int *a) {
+#pragma GCC ivdep
+ for (auto &i : ar) {
+ i *= *a;
+ }
+}
+
+/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */
+/* { dg-bogus " version\[^\n\r]* alias" "" { target *-*-* } 0 } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+/* { dg-final { scan-tree-dump-times "ANNOTATE_EXPR " 1 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+/* { dg-final { scan-tree-dump-times "ANNOTATE " 1 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-4.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-4.cc
new file mode 100644
index 000000000..947176134
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep-4.cc
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-require-effective-target vect_int_mult } */
+/* { dg-additional-options "-std=c++11 -O3 -fopt-info-vec-optimized -fdump-tree-original -fdump-tree-gimple" } */
+
+/* PR other/33426 */
+/* Testing whether #pragma ivdep is working. */
+
+#include <vector>
+
+template<class T, class T2>
+void Loop(T *b, T2 c) {
+#pragma GCC ivdep
+ for (auto &i : *b) {
+ i *= *c;
+ }
+}
+
+void foo(std::vector<int> *ar, int *b) {
+ Loop<std::vector<int>, int*>(ar, b);
+}
+
+/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */
+/* FIXME: dg-bogus " version\[^\n\r]* alias" "" { target *-*-* } 0 */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+/* { dg-final { scan-tree-dump-times "ANNOTATE_EXPR " 1 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+/* { dg-final { scan-tree-dump-times "ANNOTATE " 1 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc
new file mode 100644
index 000000000..e5d88e0b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-O3 -fopt-info-vec-optimized" } */
+
+/* PR other/33426 */
+/* Testing whether #pragma ivdep is working. */
+
+void foo(int n, int *a, int *b, int *c, int *d, int *e) {
+ int i;
+#pragma GCC ivdep
+ for (i = 0; i < n; ++i) {
+ a[i] = b[i] + c[i];
+ }
+}
+
+/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */
+/* { dg-bogus " version\[^\n\r]* alias" "" { target *-*-* } 0 } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_1.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_1.cc
new file mode 100644
index 000000000..715ff0dda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_1.cc
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+extern double cos (double x);
+extern double sin (double x);
+
+class bend_class
+{
+ double *s_A;
+public:
+ void set_s_A (double s_A0)
+ {
+ s_A[0] = s_A0;
+ }
+};
+class bend_set
+{
+ bend_class *bend_array;
+public:
+ void set_s_A (int index, double s_A0)
+ {
+ bend_array[index].set_s_A (s_A0);
+ }
+ void compute_s (void)
+ {
+ int i, j;
+ double val;
+ double tmp[3];
+ for (i = 0; i < 5; ++i)
+ {
+ val = i;
+ for (j = 0; j < 2; ++j)
+ tmp[j] = cos (val);
+ set_s_A (i, tmp[0]);
+ tmp[j] = cos (val) / sin (val);
+ }
+ }
+};
+class internals
+{
+ bend_set bend;
+ void compute_s (void);
+};
+void
+internals::compute_s (void)
+{
+ bend.compute_s ();
+}
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_2.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_2.cc
new file mode 100644
index 000000000..1230ca314
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33834_2.cc
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+extern int sscanf (__const char *__restrict __s,
+ __const char *__restrict __format, ...);
+unsigned char got_elevation_pattern;
+struct site
+{
+ float antenna_pattern[361][1001];
+}
+LR;
+void
+LoadPAT (char *filename)
+{
+ int x, y;
+ char string[255];
+ float elevation, amplitude, elevation_pattern[361][1001];
+ for (x = 0; filename[x] != '.' ; x++)
+ sscanf (string, "%f %f", &elevation, &amplitude);
+ for (y = 0; y <= 1000; y++)
+ {
+ if (got_elevation_pattern)
+ elevation = elevation_pattern[x][y];
+ else
+ elevation = 1.0;
+ LR.antenna_pattern[x][y] = elevation;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33835.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33835.cc
new file mode 100644
index 000000000..1ab4c7e8d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33835.cc
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+extern double cos (double x);
+
+class bend_class
+{
+ double *s_A;
+public:
+ void set_s_A (double s_A0)
+ {
+ s_A[0] = s_A0;
+ }
+};
+class bend_set
+{
+ bend_class *bend_array;
+public:
+ void set_s_A (int index, double s_A0)
+ {
+ bend_array[index].set_s_A (s_A0);
+ }
+ void compute_s (void)
+ {
+ int i, j;
+ double val;
+ double tmp[3];
+ for (i = 0; i < 5; ++i)
+ {
+ val = i;
+ for (j = 0; j < 2; ++j)
+ tmp[j] = cos (val);
+ set_s_A (i, tmp[0]);
+ tmp[j] = cos (val);
+ }
+ }
+};
+class internals
+{
+ bend_set bend;
+ void compute_s (void);
+};
+void
+internals::compute_s (void)
+{
+ bend.compute_s ();
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860.cc
new file mode 100644
index 000000000..e70ec674e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860.cc
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+class Matrix
+{
+ public:
+ double data[4][4];
+ Matrix operator* (const Matrix matrix) const;
+ void makeRotationAboutVector (void);
+};
+void Matrix::makeRotationAboutVector (void)
+{
+ Matrix irx;
+ *this = irx * (*this);
+}
+Matrix Matrix::operator* (const Matrix matrix) const
+{
+ Matrix ret;
+ for (int i = 0; i < 4; i++)
+ for (int j = 0; j < 4; j++)
+ ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3];
+ return ret;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860a.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860a.cc
new file mode 100644
index 000000000..77e28226a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr33860a.cc
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+class Matrix
+{
+ public:
+ float data[4][4] __attribute__ ((__aligned__(16)));
+ Matrix operator* (const Matrix matrix) const;
+ void makeRotationAboutVector (void);
+};
+void Matrix::makeRotationAboutVector (void)
+{
+ Matrix irx;
+ *this = irx * (*this);
+}
+Matrix Matrix::operator* (const Matrix matrix) const
+{
+ Matrix ret;
+ for (int i = 0; i < 4; i++)
+ for (int j = 0; j < 4; j++)
+ ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3];
+ return ret;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr36648.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr36648.cc
new file mode 100644
index 000000000..6306b4d65
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr36648.cc
@@ -0,0 +1,24 @@
+/* { dg-require-effective-target vect_float } */
+
+struct vector
+{
+ vector() : x(0), y(0), z(0) { }
+ float x,y,z;
+};
+
+struct Foo
+{
+ int dummy;
+ /* Misaligned access. */
+ vector array_of_vectors[4];
+};
+
+Foo foo;
+
+int main() { }
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! vect_no_align } } } } */
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { ! vect_no_align } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37143.C b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37143.C
new file mode 100644
index 000000000..70cdfd29b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37143.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+void
+f(int NumberOfSideSets, int *ssNumDFperSide, float *ssDF)
+{
+ int i;
+ float *newssDF = __null;
+ int *newssNumDF = new int [NumberOfSideSets];
+ int ndf, nextDF, numNewDF = 0;
+ int ii=0;
+ for (i=0; i<NumberOfSideSets; i++)
+ numNewDF += newssNumDF[i];
+ if (numNewDF > 0)
+ newssDF = new float [numNewDF];
+ nextDF = 0;
+ ndf = ssNumDFperSide[ii];
+ for (i=0; i<ndf; i++)
+ newssDF[nextDF++] = ssDF[i];
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37174.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37174.cc
new file mode 100644
index 000000000..d720e4bfe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr37174.cc
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+int* getFoo();
+struct Bar {
+ Bar();
+ int* foo1;
+ int* foo2;
+ int* table[4][4][4];
+};
+Bar::Bar() {
+ foo1 = getFoo();
+ foo2 = getFoo();
+ for (int a = 0; a < 4; ++a) {
+ for (int b = 0; b < 4; ++b) {
+ for (int c = 0; c < 4; ++c) {
+ table[a][b][c] = foo1;
+ }
+ }
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr43771.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr43771.cc
new file mode 100644
index 000000000..1a2d09aae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr43771.cc
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void KWayNodeRefine__(int nparts, int *gpwgts, int *badminpwgt, int
+*badmaxpwgt)
+{
+ int i;
+
+ for (i=0; i<nparts; i+=2) {
+ badminpwgt[i] = badminpwgt[i+1] = gpwgts[i]+gpwgts[i+1];
+ badmaxpwgt[i] = badmaxpwgt[i+1] = gpwgts[i]+gpwgts[i+1];
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr44861.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr44861.cc
new file mode 100644
index 000000000..07c59a138
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr44861.cc
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+bool f();
+
+struct counted_base {
+ virtual void destroy() { }
+ void release() { if (f()) destroy(); }
+};
+
+struct shared_count {
+ shared_count() { }
+ ~shared_count() { if (pi) pi->release(); }
+ shared_count(shared_count& r) : pi(r.pi) { if (pi) pi->release(); }
+ counted_base* pi;
+};
+
+struct Foo;
+
+struct shared_ptr {
+ Foo& operator*() { return *ptr; }
+ Foo* ptr;
+ shared_count refcount;
+};
+
+struct Bar {
+ Bar(Foo&, shared_ptr);
+};
+
+void g() {
+ shared_ptr foo;
+ new Bar(*foo, foo);
+}
+
+// { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-a.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-a.cc
new file mode 100644
index 000000000..474f3d647
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-a.cc
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize -fnon-call-exceptions" } */
+
+struct A
+{
+ A (): a (0), b (0), c (0)
+ {
+ };
+ ~A ();
+ int a, b, c;
+};
+
+struct B
+{
+ B ();
+ A a1;
+ A a2;
+};
+
+B::B ()
+{
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-b.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-b.cc
new file mode 100644
index 000000000..279a1899c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr45470-b.cc
@@ -0,0 +1,52 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize -fno-vect-cost-model -fnon-call-exceptions" } */
+
+template < typename _Tp > struct new_allocator
+{
+ typedef _Tp * pointer;
+ template < typename > struct rebind
+ {
+ typedef new_allocator other;
+ };
+
+};
+
+template < typename _Tp > struct allocator:public new_allocator < _Tp >
+{};
+
+template < typename _Tp, typename _Alloc > struct _Vector_base
+{
+ typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
+ struct
+ {
+ typename _Tp_alloc_type::pointer _M_start;
+ typename _Tp_alloc_type::pointer _M_finish;
+ typename _Tp_alloc_type::pointer _M_end_of_storage;
+ };
+
+};
+
+template
+ <
+ typename
+ _Tp,
+ typename
+ _Alloc = allocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc >
+{
+ typedef _Vector_base < _Tp, _Alloc > _Base;
+ vector ():_Base ()
+ {}
+ ~vector ();
+}
+;
+struct LoadGraph
+{
+ LoadGraph (int);
+ vector < struct _GdkColor >colors;
+ vector < float >data_block;
+};
+
+LoadGraph::LoadGraph (int)
+{}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr50698.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr50698.cc
new file mode 100644
index 000000000..acb193665
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr50698.cc
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target vect_float }
+
+float mem[4096];
+const int N=1024;
+
+struct XYZ {
+ float * mem;
+ int n;
+ float * x() { return mem;}
+ float * y() { return x()+n;}
+ float * z() { return y()+n;}
+};
+
+inline
+void sum(float * x, float * y, float * z, int n) {
+ for (int i=0;i!=n; ++i)
+ x[i]=y[i]+z[i];
+}
+
+void sumS() {
+ XYZ xyz; xyz.mem=mem; xyz.n=N;
+ sum(xyz.x(),xyz.y(),xyz.z(),xyz.n);
+}
+
+// { dg-final { scan-tree-dump-not "run-time aliasing" "vect" } }
+// { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr51485.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr51485.cc
new file mode 100644
index 000000000..d57d7596d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr51485.cc
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+struct A { A (); unsigned int a; };
+double bar (A a) throw () __attribute__((pure));
+
+void
+foo (unsigned int x, double *y, A *z)
+{
+ unsigned int i;
+ for (i = 0; i < x; i++)
+ y[i] = bar (z[i]);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr58513.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr58513.cc
new file mode 100644
index 000000000..08a175c8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr58513.cc
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-require-effective-target vect_int }
+
+static int op (const int& x, const int& y) { return x + y; }
+
+void foo(int* a)
+{
+ for (int i = 0; i < 1000; ++i)
+ a[i] = op(a[i], 1);
+}
+
+// { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } }
+// { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60000.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60000.cc
new file mode 100644
index 000000000..fe39d6ae9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60000.cc
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-vrp" } */
+
+void foo (bool* a, int* b)
+{
+ for (int i = 0; i < 1000; ++i)
+ {
+ a[i] = i % 2;
+ b[i] = i % 3;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60023.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60023.cc
new file mode 100644
index 000000000..78f325e6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60023.cc
@@ -0,0 +1,80 @@
+// PR tree-optimization/60023
+// { dg-do compile }
+// { dg-additional-options "-O3 -std=c++11 -fnon-call-exceptions" }
+// { dg-additional-options "-mavx2" { target { i?86-*-* x86_64-*-* } } }
+
+struct A { A (); ~A (); };
+
+void
+f1 (int *p, int *q, int *r) noexcept (true)
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ if (r[i])
+ p[i] = q[i] + 1;
+}
+
+void
+f2 (int *p, int *q, int *r)
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ if (r[i])
+ p[i] = q[i] + 1;
+}
+
+void
+f3 (int *p, int *q) noexcept (true)
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ p[i] = q[i] + 1;
+}
+
+void
+f4 (int *p, int *q)
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ p[i] = q[i] + 1;
+}
+
+void
+f5 (int *p, int *q, int *r) noexcept (true)
+{
+ int i;
+ A a;
+ for (i = 0; i < 1024; i++)
+ if (r[i])
+ p[i] = q[i] + 1;
+}
+
+void
+f6 (int *p, int *q, int *r)
+{
+ int i;
+ A a;
+ for (i = 0; i < 1024; i++)
+ if (r[i])
+ p[i] = q[i] + 1;
+}
+
+void
+f7 (int *p, int *q) noexcept (true)
+{
+ int i;
+ A a;
+ for (i = 0; i < 1024; i++)
+ p[i] = q[i] + 1;
+}
+
+void
+f8 (int *p, int *q)
+{
+ int i;
+ A a;
+ for (i = 0; i < 1024; i++)
+ p[i] = q[i] + 1;
+}
+
+// { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60559.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60559.cc
new file mode 100644
index 000000000..f179a1aeb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60559.cc
@@ -0,0 +1,8 @@
+// PR tree-optimization/60559
+// { dg-do compile }
+// { dg-additional-options "-O3 -std=c++11 -fnon-call-exceptions -fno-tree-dce" }
+// { dg-additional-options "-mavx2" { target { i?86-*-* x86_64-*-* } } }
+
+#include "pr60023.cc"
+
+// { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50413.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50413.cc
new file mode 100644
index 000000000..6e69f11b3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50413.cc
@@ -0,0 +1,165 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+typedef unsigned long long UInt64;
+
+typedef struct struct128
+{
+ UInt64 uint64_lower;
+ UInt64 uint64_upper;
+}
+STRUCT_128;
+
+typedef union uint128_bitmap
+{
+ STRUCT_128 uint128;
+
+ struct
+ {
+ UInt64 b00 : 1;
+ UInt64 b01 : 1;
+ UInt64 b02 : 1;
+ UInt64 b03 : 1;
+ UInt64 b04 : 1;
+ UInt64 b05 : 1;
+ UInt64 b06 : 1;
+ UInt64 b07 : 1;
+ UInt64 b08 : 1;
+ UInt64 b09 : 1;
+ UInt64 b10 : 1;
+ UInt64 b11 : 1;
+ UInt64 b12 : 1;
+ UInt64 b13 : 1;
+ UInt64 b14 : 1;
+ UInt64 b15 : 1;
+ UInt64 b16 : 1;
+ UInt64 b17 : 1;
+ UInt64 b18 : 1;
+ UInt64 b19 : 1;
+ UInt64 b20 : 1;
+ UInt64 b21 : 1;
+ UInt64 b22 : 1;
+ UInt64 b23 : 1;
+ UInt64 b24 : 1;
+ UInt64 b25 : 1;
+ UInt64 b26 : 1;
+ UInt64 b27 : 1;
+ UInt64 b28 : 1;
+ UInt64 b29 : 1;
+ UInt64 b30 : 1;
+ UInt64 b31 : 1;
+ UInt64 b32 : 1;
+ UInt64 b33 : 1;
+ UInt64 b34 : 1;
+ UInt64 b35 : 1;
+ UInt64 b36 : 1;
+ UInt64 b37 : 1;
+ UInt64 b38 : 1;
+ UInt64 b39 : 1;
+ UInt64 b40 : 1;
+ UInt64 b41 : 1;
+ UInt64 b42 : 1;
+ UInt64 b43 : 1;
+ UInt64 b44 : 1;
+ UInt64 b45 : 1;
+ UInt64 b46 : 1;
+ UInt64 b47 : 1;
+ UInt64 b48 : 1;
+ UInt64 b49 : 1;
+ UInt64 b50 : 1;
+ UInt64 b51 : 1;
+ UInt64 b52 : 1;
+ UInt64 b53 : 1;
+ UInt64 b54 : 1;
+ UInt64 b55 : 1;
+ UInt64 b56 : 1;
+ UInt64 b57 : 1;
+ UInt64 b58 : 1;
+ UInt64 b59 : 1;
+ UInt64 b60 : 1;
+ UInt64 b61 : 1;
+ UInt64 b62 : 1;
+ UInt64 b63 : 1;
+ UInt64 b64 : 1;
+ UInt64 b65 : 1;
+ UInt64 b66 : 1;
+ UInt64 b67 : 1;
+ UInt64 b68 : 1;
+ UInt64 b69 : 1;
+ UInt64 b70 : 1;
+ UInt64 b71 : 1;
+ UInt64 b72 : 1;
+ UInt64 b73 : 1;
+ UInt64 b74 : 1;
+ UInt64 b75 : 1;
+ UInt64 b76 : 1;
+ UInt64 b77 : 1;
+ UInt64 b78 : 1;
+ UInt64 b79 : 1;
+ UInt64 b80 : 1;
+ UInt64 b81 : 1;
+ UInt64 b82 : 1;
+ UInt64 b83 : 1;
+ UInt64 b84 : 1;
+ UInt64 b85 : 1;
+ UInt64 b86 : 1;
+ UInt64 b87 : 1;
+ UInt64 b88 : 1;
+ UInt64 b89 : 1;
+ UInt64 b90 : 1;
+ UInt64 b91 : 1;
+ UInt64 b92 : 1;
+ UInt64 b93 : 1;
+ UInt64 b94 : 1;
+ UInt64 b95 : 1;
+ UInt64 b96 : 1;
+ UInt64 b97 : 1;
+ UInt64 b98 : 1;
+ UInt64 b99 : 1;
+ UInt64 b100 : 1;
+ UInt64 b101 : 1;
+ UInt64 b102 : 1;
+ UInt64 b103 : 1;
+ UInt64 b104 : 1;
+ UInt64 b105 : 1;
+ UInt64 b106 : 1;
+ UInt64 b107 : 1;
+ UInt64 b108 : 1;
+ UInt64 b109 : 1;
+ UInt64 b110 : 1;
+ UInt64 b111 : 1;
+ UInt64 b112 : 1;
+ UInt64 b113 : 1;
+ UInt64 b114 : 1;
+ UInt64 b115 : 1;
+ UInt64 b116 : 1;
+ UInt64 b117 : 1;
+ UInt64 b118 : 1;
+ UInt64 b119 : 1;
+ UInt64 b120 : 1;
+ UInt64 b121 : 1;
+ UInt64 b122 : 1;
+ UInt64 b123 : 1;
+ UInt64 b124 : 1;
+ UInt64 b125 : 1;
+ UInt64 b126 : 1;
+ UInt64 b127 : 1;
+ }
+ bitmap;
+}
+UInt128_BITMAP;
+
+UInt128_BITMAP V;
+
+void shift(unsigned char t)
+{
+ V.uint128.uint64_lower = (V.uint128.uint64_lower >> 1);
+ V.bitmap.b63 = V.bitmap.b64;
+ V.uint128.uint64_upper = (V.uint128.uint64_upper >> 1);
+
+ V.bitmap.b96 = t;
+}
+
+/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */
+/* { dg-final { cleanup-tree-dump "slp" } } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50819.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50819.cc
new file mode 100644
index 000000000..515d774a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr50819.cc
@@ -0,0 +1,53 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+
+typedef float Value;
+
+struct LorentzVector
+{
+
+ LorentzVector(Value x=0, Value y=0, Value z=0, Value t=0) :
+theX(x),theY(y),theZ(z),theT(t){}
+ LorentzVector & operator+=(const LorentzVector & a) {
+ theX += a.theX;
+ theY += a.theY;
+ theZ += a.theZ;
+ theT += a.theT;
+ return *this;
+ }
+
+ Value theX;
+ Value theY;
+ Value theZ;
+ Value theT;
+} __attribute__ ((aligned(16)));
+
+inline LorentzVector
+operator+(LorentzVector const & a, LorentzVector const & b) {
+ return
+LorentzVector(a.theX+b.theX,a.theY+b.theY,a.theZ+b.theZ,a.theT+b.theT);
+}
+
+inline LorentzVector
+operator*(LorentzVector const & a, Value s) {
+ return LorentzVector(a.theX*s,a.theY*s,a.theZ*s,a.theT*s);
+}
+
+inline LorentzVector
+operator*(Value s, LorentzVector const & a) {
+ return a*s;
+}
+
+
+void sum1(LorentzVector & res, Value s, LorentzVector const & v1, LorentzVector
+const & v2) {
+ res += s*(v1+v2);
+}
+
+void sum2(LorentzVector & res, Value s, LorentzVector const & v1, LorentzVector
+const & v2) {
+ res = res + s*(v1+v2);
+}
+
+/* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp" } } */
+/* { dg-final { cleanup-tree-dump "slp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr56812.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr56812.cc
new file mode 100644
index 000000000..9c0b2b8b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/slp-pr56812.cc
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+/* { dg-require-effective-target vect_hw_misalign } */
+/* { dg-additional-options "-O3 -funroll-loops -fvect-cost-model=dynamic" } */
+
+class mydata {
+public:
+ mydata() {Set(-1.0);}
+ void Set (float);
+ static int upper() {return 8;}
+ float data[8];
+};
+
+void mydata::Set (float x)
+{
+ for (int i=0; i<upper(); i++)
+ data[i] = x;
+}
+
+/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
+/* { dg-final { cleanup-tree-dump "slp" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/vect.exp b/gcc-4.9/gcc/testsuite/g++.dg/vect/vect.exp
new file mode 100644
index 000000000..2bac8105d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/vect.exp
@@ -0,0 +1,80 @@
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the 'dg.exp' driver.
+
+# There's a bunch of headers we need.
+if [is_remote host] {
+ foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] {
+ remote_download host $header
+ }
+}
+
+# Load support procs.
+load_lib g++-dg.exp
+load_lib target-supports.exp
+
+# If the target system supports vector instructions, the default action
+# for a test is 'run', otherwise it's 'compile'. Save current default.
+# Executing vector instructions on a system without hardware vector support
+# is also disabled by a call to check_vect, but disabling execution here is
+# more efficient.
+global dg-do-what-default
+set save-dg-do-what-default ${dg-do-what-default}
+
+# Set up flags used for tests that don't specify options.
+global DEFAULT_VECTCFLAGS
+set DEFAULT_VECTCFLAGS ""
+
+# These flags are used for all targets.
+lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" "-fno-vect-cost-model"
+
+# Skip these tests for targets that do not support generating vector
+# code. Set additional target-dependent vector flags, which can be
+# overridden by using dg-options in individual tests.
+if ![check_vect_support_and_set_flags] {
+ return
+}
+
+set VECT_SLP_CFLAGS $DEFAULT_VECTCFLAGS
+
+lappend DEFAULT_VECTCFLAGS "-fdump-tree-vect-details"
+lappend VECT_SLP_CFLAGS "-fdump-tree-slp-details"
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.{c,cc,S} ]] \
+ $DEFAULT_VECTCFLAGS
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/slp-pr*.{c,cc,S} ]] \
+ $VECT_SLP_CFLAGS
+
+#### Tests with special options
+global SAVED_DEFAULT_VECTCFLAGS
+set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS
+
+# --param max-aliased-vops=0
+set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
+lappend DEFAULT_VECTCFLAGS "--param max-aliased-vops=0"
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/param-max-aliased*.\[cS\]]] \
+ $DEFAULT_VECTCFLAGS
+
+# Clean up.
+set dg-do-what-default ${save-dg-do-what-default}
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wall-write-strings.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wall-write-strings.C
new file mode 100644
index 000000000..e380b321b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wall-write-strings.C
@@ -0,0 +1,7 @@
+// PR 8586
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+char* foo = "foo"; // { dg-warning "" }
+const char* bar = "bar";
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-1.C
new file mode 100644
index 000000000..ae6f9dc83
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-1.C
@@ -0,0 +1,57 @@
+// Test -Waddress for testing an address against NULL.
+// Origin: Ian Lance Taylor <iant@google.com>
+
+// { dg-do compile }
+// { dg-options "-Waddress" }
+
+extern int foo (int);
+
+int i;
+
+void
+bar (int a)
+{
+ lab:
+ if (foo) // { dg-warning "always evaluate as" "correct warning" }
+ foo (0);
+ if (foo (1))
+ ;
+ if (&i) // { dg-warning "always evaluate as" "correct warning" }
+ foo (2);
+ if (i)
+ foo (3);
+ if (&a) // { dg-warning "always evaluate as" "correct warning" }
+ foo (4);
+ if (a)
+ foo (5);
+ if (&&lab) // { dg-warning "always evaluate as" "correct warning" }
+ foo (6);
+ if (foo == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (7);
+ if (foo (1) == 0)
+ foo (8);
+ if (&i == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (9);
+ if (i == 0)
+ foo (10);
+ if (&a == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (11);
+ if (a == 0)
+ foo (12);
+ if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (13);
+ if (0 == foo) // { dg-warning "never be NULL" "correct warning" }
+ foo (14);
+ if (0 == foo (1))
+ foo (15);
+ if (0 == &i) // { dg-warning "never be NULL" "correct warning" }
+ foo (16);
+ if (0 == i)
+ foo (17);
+ if (0 == &a) // { dg-warning "never be NULL" "correct warning" }
+ foo (18);
+ if (0 == a)
+ foo (19);
+ if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" }
+ foo (20);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-2.C
new file mode 100644
index 000000000..f1573470e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Walways-true-2.C
@@ -0,0 +1,60 @@
+// Make sure we don't assume that a weak symbol is always non-NULL.
+// This is just like Walways-true-1.C, except that it uses a weak
+// symbol.
+// Origin: Ian Lance Taylor <iant@google.com>
+
+// { dg-do compile }
+// { dg-options "-Waddress" }
+// { dg-require-weak "" }
+
+extern int foo (int) __attribute__ ((weak));
+
+int i __attribute__ ((weak));
+
+void
+bar (int a)
+{
+ lab:
+ if (foo)
+ foo (0);
+ if (foo (1))
+ ;
+ if (&i)
+ foo (2);
+ if (i)
+ foo (3);
+ if (&a) // { dg-warning "always evaluate as" "correct warning" }
+ foo (4);
+ if (a)
+ foo (5);
+ if (&&lab) // { dg-warning "always evaluate as" "correct warning" }
+ foo (6);
+ if (foo == 0)
+ foo (7);
+ if (foo (1) == 0)
+ foo (8);
+ if (&i == 0)
+ foo (9);
+ if (i == 0)
+ foo (10);
+ if (&a == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (11);
+ if (a == 0)
+ foo (12);
+ if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" }
+ foo (13);
+ if (0 == foo)
+ foo (14);
+ if (0 == foo (1))
+ foo (15);
+ if (0 == &i)
+ foo (16);
+ if (0 == i)
+ foo (17);
+ if (0 == &a) // { dg-warning "never be NULL" "correct warning" }
+ foo (18);
+ if (0 == a)
+ foo (19);
+ if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" }
+ foo (20);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C
new file mode 100644
index 000000000..796483e0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* Test that -Warray-bounds is enabled by -Wall */
+/* { dg-options "-O2 -Wall" } */
+
+int a[10];
+
+int* f(void) {
+
+ a[-1] = 0; /* { dg-warning "array subscript" } */
+
+ return a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C
new file mode 100644
index 000000000..a85857179
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+extern void function(void * x);
+
+struct A {
+ long x;
+ char d[0];
+};
+
+
+void test(A * a) {
+ function((char *)a - 4); /* { dg-bogus "below array bounds" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C
new file mode 100644
index 000000000..319038a73
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// { dg-options "-O2 -Warray-bounds" }
+
+class String
+{
+public:
+ virtual unsigned long length() const = 0;
+ virtual char get(unsigned long index) const = 0;
+ virtual void set(unsigned long index, char value) = 0;
+ virtual char& operator[] (unsigned long value) = 0;
+ virtual ~String() {};
+};
+
+template<unsigned long size> class FixedString : public String
+{
+private:
+ char contents[size];
+
+public:
+ virtual unsigned long length() const { return size; }
+ virtual char get(unsigned long index) const { return contents[index]; }
+ virtual void set(unsigned long index, char value) { contents[index] = value; }
+ virtual char& operator[] (unsigned long index) { return contents[index]; }
+
+ FixedString() { contents[0] = '\0'; } // { dg-warning "above array bounds" }
+};
+
+void print_length (const String& string);
+
+int main()
+{
+ const FixedString<0> empty;
+
+ print_length(empty);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C
new file mode 100644
index 000000000..06d776a40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2 -Warray-bounds" }
+
+void f();
+
+int c[3];
+int result;
+
+struct Vector {
+ static int get(int i) {
+ if (i >= 3)
+ f();
+ return c[i];
+ }
+};
+
+void g()
+{
+ for (int i = 0; i < 3; ++i) {
+ const int index = i % 3;
+ result = Vector::get(index) + Vector::get(index);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds.C
new file mode 100644
index 000000000..61c7c5d8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Warray-bounds.C
@@ -0,0 +1,92 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Warray-bounds" } */
+
+int a[10];
+
+extern "C" __SIZE_TYPE__ strlen(const char *s);
+
+static inline int n(void) {
+ return strlen("12345");
+}
+
+void g(int *p);
+void h(int p);
+
+int* f(void) {
+ int b[10];
+ int i;
+ struct {
+ int c[10];
+ } c;
+
+ a[-1] = 0; /* { dg-warning "array subscript" } */
+ a[ 0] = 0;
+ a[ 1] = 0;
+
+
+ a[ 9] = 0;
+ a[10] = 0; /* { dg-warning "array subscript" } */
+ a[11] = 0; /* { dg-warning "array subscript" } */
+ a[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */
+ a[2 * n() - 10] = 1;
+ a[2 * n() - 1] = 1;
+ a[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */
+
+ b[-1] = 0; /* { dg-warning "array subscript" } */
+ b[ 0] = 0;
+ b[ 1] = 0;
+ b[ 9] = 0;
+ b[10] = 0; /* { dg-warning "array subscript" } */
+ b[11] = 0; /* { dg-warning "array subscript" } */
+ b[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */
+ b[2 * n() - 10] = 1;
+ b[2 * n() - 1] = 1;
+ b[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */
+
+ c.c[-1] = 0; /* { dg-warning "array subscript" } */
+ c.c[ 0] = 0;
+ c.c[ 1] = 0;
+ c.c[ 9] = 0;
+ c.c[10] = 0; /* { dg-warning "array subscript" } */
+ c.c[11] = 0; /* { dg-warning "array subscript" } */
+ c.c[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */
+ c.c[2 * n() - 10] = 1;
+ c.c[2 * n() - 1] = 1;
+ c.c[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */
+
+ g(&a[8]);
+ g(&a[9]);
+ g(&a[10]);
+ g(&a[11]); /* { dg-warning "array subscript" } */
+ g(&a[-30]+10); /* { dg-warning "array subscript" } */
+ g(&a[-30]+30);
+
+ g(&b[10]);
+ g(&c.c[10]);
+ g(&a[11]); /* { dg-warning "array subscript" } */
+ g(&b[11]); /* { dg-warning "array subscript" } */
+ g(&c.c[11]); /* { dg-warning "array subscript" } */
+
+ g(&a[0]);
+ g(&b[0]);
+ g(&c.c[0]);
+
+ g(&a[-1]); /* { dg-warning "array subscript" } */
+ g(&b[-1]); /* { dg-warning "array subscript" } */
+ h(sizeof a[-1]);
+ h(sizeof a[10]);
+ h(sizeof b[-1]);
+ h(sizeof b[10]);
+ h(sizeof c.c[-1]);
+ h(sizeof c.c[10]);
+
+ if (10 < 10)
+ a[10] = 0;
+ if (10 < 10)
+ b[10] = 0;
+ if (-1 >= 0)
+ c.c[-1] = 0;
+
+ return a;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces1.C
new file mode 100644
index 000000000..0efce7be3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces1.C
@@ -0,0 +1,3 @@
+// PR c++/19755
+// { dg-options "-Wmissing-braces" }
+int a[2][2] = { 0, 1 , 2, 3 }; // { dg-warning "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces2.C
new file mode 100644
index 000000000..6d54ede9b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces2.C
@@ -0,0 +1,15 @@
+// PR c++/20175
+// { dg-options "-Wmissing-braces" }
+int a[2][2] = { 0, 1, 2, 3 }; // { dg-warning "missing braces" }
+int b[2][2] = { { 0, 1 }, { 2, 3 } };
+int c[2][2] = { { { 0 }, 1 }, { 2, 3 } }; // { dg-error "braces around scalar" }
+struct S { char s[6]; int i; };
+S d = { "hello", 1 };
+S e = { { "hello" }, 1 };
+S f = { { { "hello" } }, 1 }; // { dg-error "braces around scalar" }
+S g = { 'h', 'e', 'l', 'l', 'o', '\0', 1 }; // { dg-warning "missing braces" }
+struct T { wchar_t s[6]; int i; };
+T i = { L"hello", 1 };
+T j = { { L"hello" }, 1 };
+T k = { { { L"hello" } }, 1 }; // { dg-error "braces around scalar" }
+T l = { L'h', L'e', L'l', L'l', L'o', L'\0', 1 };// { dg-warning "missing braces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces3.C
new file mode 100644
index 000000000..f1aea98c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces3.C
@@ -0,0 +1,34 @@
+// PR c++/25137
+// { dg-options "-Wall" }
+
+struct S { int s[3]; };
+S s1 = { 1, 1, 1 };
+
+struct S1 { int s[3]; };
+struct S2 { struct S1 a; };
+S2 s21 = { 1, 1, 1 };
+
+struct S3 { int s[3]; };
+struct S4 { struct S3 a; int b; };
+S4 s41 = { 1, 1, 1, 1 };
+
+struct S5 { int s[3]; };
+struct S6 { struct S5 a; int b; };
+S6 s61 = { { 1, 1, 1 }, 1 };
+
+struct S7 { int s[3]; };
+struct S8 { int a; struct S7 b; };
+S8 s81 = { 1, { 1, 1, 1 } };
+
+struct S9 { int s[2]; };
+struct S10 { struct S9 a; struct S9 b; };
+S10 s101 = { { 1, 1 }, 1, 1 };
+
+struct S11 { int s[2]; };
+struct S12 { struct S11 a; struct S11 b; };
+S12 s121 = { { 1, 1 }, { 1, 1 } };
+
+struct S13 { int i; };
+struct S14 { struct S13 a; };
+struct S15 { struct S14 b; };
+S15 s151 = { 1 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces4.C
new file mode 100644
index 000000000..7d77959f7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wbraces4.C
@@ -0,0 +1,34 @@
+// PR c++/25137
+// { dg-options "-Wmissing-braces" }
+
+struct S { int s[3]; };
+S s1 = { 1, 1, 1 }; // { dg-warning "missing braces" }
+
+struct S1 { int s[3]; };
+struct S2 { struct S1 a; };
+S2 s21 = { 1, 1, 1 }; // { dg-warning "missing braces" }
+
+struct S3 { int s[3]; };
+struct S4 { struct S3 a; int b; };
+S4 s41 = { 1, 1, 1, 1 }; // { dg-warning "missing braces" }
+
+struct S5 { int s[3]; };
+struct S6 { struct S5 a; int b; };
+S6 s61 = { { 1, 1, 1 }, 1 }; // { dg-warning "missing braces" }
+
+struct S7 { int s[3]; };
+struct S8 { int a; struct S7 b; };
+S8 s81 = { 1, { 1, 1, 1 } }; // { dg-warning "missing braces" }
+
+struct S9 { int s[2]; };
+struct S10 { struct S9 a; struct S9 b; };
+S10 s101 = { { 1, 1 }, 1, 1 }; // { dg-warning "missing braces" }
+
+struct S11 { int s[2]; };
+struct S12 { struct S11 a; struct S11 b; };
+S12 s121 = { { 1, 1 }, { 1, 1 } }; // { dg-warning "missing braces" }
+
+struct S13 { int i; };
+struct S14 { struct S13 a; };
+struct S15 { struct S14 b; };
+S15 s151 = { 1 }; // { dg-warning "missing braces" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual1.C
new file mode 100644
index 000000000..e6ad4f6a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual1.C
@@ -0,0 +1,7 @@
+// PR c++/24667
+// { dg-options "-Wcast-qual" }
+
+int main(int, char**) {
+ const int foo[2] = {1,1};
+ ((int*)foo)[0] = 0; // { dg-warning "cast" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual2.C
new file mode 100644
index 000000000..23dbb4d39
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wcast-qual2.C
@@ -0,0 +1,4 @@
+// PR c++/50956
+// { dg-options "-Wcast-qual" }
+
+void* p = (void*)"txt"; // { dg-warning "cast" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C
new file mode 100644
index 000000000..2170cb206
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C
@@ -0,0 +1,15 @@
+/* PR c++/16307 */
+// { dg-do compile }
+// { dg-options "-Wchar-subscripts" }
+
+extern volatile char bla;
+
+char foo (const char *s)
+{
+ return s [bla]; // { dg-warning "array subscript" }
+}
+
+int main ()
+{
+ foo ("\x80");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C
new file mode 100644
index 000000000..bc38585d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C
@@ -0,0 +1,12 @@
+/* Copyright (C) 2005 Free Software Foundation.
+
+ by Gabriel Dos Reis <gdr@integrable-solutions.net> */
+
+// { dg-do compile }
+// { dg-options "-Wchar-subscripts" }
+
+int main()
+{
+ int ary[256] = { 0 };
+ return ary['a'];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C
new file mode 100644
index 000000000..8cc5966ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconditionally-supported-1.C
@@ -0,0 +1,25 @@
+// { dg-options "-Wconditionally-supported" }
+
+// DR 195 was about allowing conversions between function and object
+// pointers under some circumstances. The issue got resolved for C++11,
+// which, in 5.2.10 p8 says that: "Converting a function pointer to an
+// object pointer type or vice versa is conditionally-supported."
+
+// This checks we warn with -Wconditionally-supported.
+
+typedef void (*PF)(void);
+typedef void *PV;
+typedef int *PO;
+
+void foo ()
+{
+ PF pf;
+ PV pv;
+ PO po;
+
+ pf = reinterpret_cast <PF>(pv); // { dg-warning "conditionally-supported" }
+ pv = reinterpret_cast <PV>(pf); // { dg-warning "conditionally-supported" }
+
+ pf = reinterpret_cast <PF>(po); // { dg-warning "conditionally-supported" }
+ po = reinterpret_cast <PO>(pf); // { dg-warning "conditionally-supported" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-integer.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-integer.C
new file mode 100644
index 000000000..42d9cb000
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-integer.C
@@ -0,0 +1,94 @@
+/* Test for diagnostics for implicit conversions between integer types
+ C++ equivalent of gcc/testsuite/gcc.dg/Wconversion-integer.c */
+
+// { dg-do compile }
+// { dg-options "-fsigned-char -Wconversion" }
+
+#include <limits.h>
+
+void fsc (signed char sc);
+void fuc (unsigned char uc);
+unsigned fui (unsigned int ui);
+void fsi (signed int ui);
+
+void h (int x)
+{
+ unsigned int ui = 3;
+ int si = 3;
+ unsigned char uc = 3;
+ signed char sc = 3;
+
+ uc = ui; /* { dg-warning "conversion" } */
+ uc = si; /* { dg-warning "conversion" } */
+ sc = ui; /* { dg-warning "conversion" } */
+ sc = si; /* { dg-warning "conversion" } */
+ fuc (ui); /* { dg-warning "conversion" } */
+ fuc (si); /* { dg-warning "conversion" } */
+ fsc (ui); /* { dg-warning "conversion" } */
+ fsc (si); /* { dg-warning "conversion" } */
+
+ fsi (si);
+ fui (ui);
+ fsi (uc);
+ si = uc;
+ fui (uc);
+ ui = uc;
+ fui ('A');
+ ui = 'A';
+ fsi ('A');
+ si = 'A';
+ fuc ('A');
+ uc = 'A';
+
+ uc = x ? 1U : -1; /* { dg-warning "conversion" } */
+ uc = x ? SCHAR_MIN : 1U; /* { dg-warning "conversion" } */
+ uc = x ? 1 : -1; /* Warned by -Wsign-conversion. */
+ uc = x ? SCHAR_MIN : 1; /* Warned by -Wsign-conversion. */
+ ui = x ? 1U : -1; /* Warned by -Wsign-conversion. */
+ ui = x ? INT_MIN : 1U; /* Warned by -Wsign-conversion. */
+ ui = ui ? SCHAR_MIN : 1U; /* Warned by -Wsign-conversion. */
+ ui = 1U * -1; /* Warned by -Wsign-conversion. */
+ ui = ui + INT_MIN; /* Warned by -Wsign-conversion. */
+ ui = x ? 1 : -1; /* Warned by -Wsign-conversion. */
+ ui = ui ? SCHAR_MIN : 1; /* Warned by -Wsign-conversion. */
+
+ fuc (-1); /* Warned by -Wsign-conversion. */
+ uc = -1; /* Warned by -Wsign-conversion. */
+ fui (-1); /* Warned by -Wsign-conversion. */
+ ui = -1; /* Warned by -Wsign-conversion. */
+ fuc ('\xa0'); /* Warned by -Wsign-conversion. */
+ uc = '\xa0'; /* Warned by -Wsign-conversion. */
+ fui ('\xa0'); /* Warned by -Wsign-conversion. */
+ ui = '\xa0'; /* Warned by -Wsign-conversion. */
+ fsi (0x80000000); /* Warned by -Wsign-conversion. */
+ si = 0x80000000; /* Warned by -Wsign-conversion. */
+
+
+ fsi (UINT_MAX - 1); /* Warned by -Wsign-conversion. */
+ si = UINT_MAX - 1; /* Warned by -Wsign-conversion. */
+ fsi (UINT_MAX - 1U); /* Warned by -Wsign-conversion. */
+ si = UINT_MAX - 1U; /* Warned by -Wsign-conversion. */
+ fsi (UINT_MAX/3U);
+ si = UINT_MAX/3U;
+ fsi (UINT_MAX/3);
+ si = UINT_MAX/3;
+ fui (UINT_MAX - 1);
+ ui = UINT_MAX - 1;
+
+ uc = (unsigned char) -1;
+ ui = -1 * (1 * -1);
+ ui = (unsigned) -1;
+
+ fsc (uc); /* Warned by -Wsign-conversion. */
+ sc = uc; /* Warned by -Wsign-conversion. */
+ fuc (sc); /* Warned by -Wsign-conversion. */
+ uc = sc; /* Warned by -Wsign-conversion. */
+ fsi (ui); /* Warned by -Wsign-conversion. */
+ si = ui; /* Warned by -Wsign-conversion. */
+ fui (si); /* Warned by -Wsign-conversion. */
+ ui = si; /* Warned by -Wsign-conversion. */
+ fui (sc); /* Warned by -Wsign-conversion. */
+ ui = sc; /* Warned by -Wsign-conversion. */
+}
+
+unsigned fui (unsigned a) { return a + -1; } /* Warned by -Wsign-conversion. */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C
new file mode 100644
index 000000000..a71551fdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C
@@ -0,0 +1,78 @@
+// { dg-do link }
+// { dg-options "" }
+
+#include <cstddef>
+
+void g(int) {}
+void g(long) {}
+void g(long long) {}
+extern void g(void*);
+
+template <int I>
+void h() {}
+
+void k(int) {}
+
+template <class T>
+void l(T);
+
+template <>
+void l(int) {}
+
+template <>
+void l(long) {}
+
+template <>
+void l(long long) {}
+
+void warn_for_NULL()
+{
+ int i = NULL; // { dg-warning "" } converting NULL to non-pointer type
+ float z = NULL; // { dg-warning "" } converting NULL to non-pointer type
+ int a[2];
+
+ i != NULL; // { dg-warning "" } NULL used in arithmetic
+ NULL != z; // { dg-warning "" } NULL used in arithmetic
+ k != NULL; // No warning: decay conversion
+ NULL != a; // Likewise.
+ -NULL; // { dg-warning "" } converting NULL to non-pointer type
+ +NULL; // { dg-warning "" } converting NULL to non-pointer type
+ ~NULL; // { dg-warning "" } converting NULL to non-pointer type
+ a[NULL] = 3; // { dg-warning "" } converting NULL to non-pointer-type
+ i = NULL; // { dg-warning "" } converting NULL to non-pointer type
+ z = NULL; // { dg-warning "" } converting NULL to non-pointer type
+ k(NULL); // { dg-warning "" } converting NULL to int
+ g(NULL); // { dg-warning "" } converting NULL to int
+ h<NULL>(); // No warning: NULL bound to integer template parameter
+ l(NULL); // No warning: NULL is used to implicitly instantiate the template
+ NULL && NULL; // No warning: converting NULL to bool is OK
+}
+
+int warn_for___null()
+{
+ int i = __null; // { dg-warning "" } converting __null to non-pointer type
+ float z = __null; // { dg-warning "" } converting __null to non-pointer type
+ int a[2];
+
+ i != __null; // { dg-warning "" } __null used in arithmetic
+ __null != z; // { dg-warning "" } __null used in arithmetic
+ k != __null; // No warning: decay conversion
+ __null != a; // Likewise.
+ -__null; // { dg-warning "" } converting __null to non-pointer type
+ +__null; // { dg-warning "" } converting __null to non-pointer type
+ ~__null; // { dg-warning "" } converting __null to non-pointer type
+ a[__null] = 3; // { dg-warning "" } converting __null to non-pointer-type
+ i = __null; // { dg-warning "" } converting __null to non-pointer type
+ z = __null; // { dg-warning "" } converting __null to non-pointer type
+ k(__null); // { dg-warning "" } converting __null to int
+ g(__null); // { dg-warning "" } converting __null to int
+ h<__null>(); // No warning: __null bound to integer template parameter
+ l(__null); // No warning: __null is used to implicitly instantiate the template
+ __null && __null; // No warning: converting NULL to bool is OK
+}
+
+int main()
+{
+ warn_for_NULL();
+ warn_for___null();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-3.C
new file mode 100644
index 000000000..a1f0cf71d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null-3.C
@@ -0,0 +1,9 @@
+// PR c++/48420
+// { dg-do compile { target { ! c++11 } } }
+
+void foo(int* p);
+
+void bar() {
+ const bool kDebugMode = false;
+ foo(kDebugMode); // { dg-warning "converting 'false'" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null.C
new file mode 100644
index 000000000..e2ca13e51
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-null.C
@@ -0,0 +1,49 @@
+// { dg-do link }
+// { dg-options "-Wconversion -Wno-conversion-null -Wno-pointer-arith" }
+
+#include <cstddef>
+
+void g(int) {}
+void g(long) {}
+void g(long long) {}
+extern void g(void*);
+
+template <int I>
+void h() {}
+
+void k(int) {}
+
+template <class T>
+void l(T);
+
+template <>
+void l(int) {}
+
+template <>
+void l(long) {}
+
+template <>
+void l(long long) {}
+
+int main()
+{
+ int i = NULL; // converting NULL to non-pointer type
+ float z = NULL; // converting NULL to non-pointer type
+ int a[2];
+
+ i != NULL; // NULL used in arithmetic
+ NULL != z; // NULL used in arithmetic
+ k != NULL; // No warning: decay conversion
+ NULL != a; // Likewise.
+ -NULL; // converting NULL to non-pointer type
+ +NULL; // converting NULL to non-pointer type
+ ~NULL; // converting NULL to non-pointer type
+ a[NULL] = 3; // converting NULL to non-pointer-type
+ i = NULL; // converting NULL to non-pointer type
+ z = NULL; // converting NULL to non-pointer type
+ k(NULL); // converting NULL to int
+ g(NULL); // converting NULL to int
+ h<NULL>(); // No warning: NULL bound to integer template parameter
+ l(NULL); // converting NULL to int
+ NULL && NULL; // No warning: converting NULL to bool is OK
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C
new file mode 100644
index 000000000..43df8f902
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C
@@ -0,0 +1,54 @@
+/* PR 34389 */
+/* { dg-do compile } */
+/* { dg-options "-Wconversion -Wsign-conversion" } */
+/* { dg-require-effective-target int32plus } */
+short mask1(short x)
+{
+ short y = 0x7fff;
+ return x & y; /* { dg-bogus "conversion" "bogus warning" } */
+}
+
+short mask2(short ssx)
+{
+ short ssy;
+ short ssz;
+
+ ssz = ((int)ssx) & 0x7fff;
+ ssy = ((int)ssx) | 0x7fff;
+ ssz = ((int)ssx) ^ 0x7fff;
+ return ssx & 0x7fff;
+}
+
+short mask3(int si, unsigned int ui)
+{
+ short ss;
+ unsigned short us;
+
+ ss = si & 0x7fff;
+ ss = si & 0xAAAA; /* { dg-warning "conversion" } */
+ ss = ui & 0x7fff;
+ ss = ui & 0xAAAA; /* { dg-warning "conversion" } */
+
+ us = si & 0x7fff;
+ us = si & 0xAAAA; /* { dg-warning "conversion" } */
+ us = ui & 0x7fff;
+ us = ui & 0xAAAA; /* 0xAAAA is zero-extended, thus it masks the
+ upper bits of 'ui' making it fit in 'us'. */
+
+ return ss;
+}
+
+short mask4(int x, int y)
+{
+ return x & y; /* { dg-warning "conversion" } */
+}
+
+short mask5(int x)
+{
+ return x & -1; /* { dg-warning "conversion" } */
+}
+
+short mask6(short x)
+{
+ return x & -1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer-3.C
new file mode 100644
index 000000000..a4df0100a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer-3.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-Wconversion -ftrack-macro-expansion=2" }
+// { dg-require-effective-target int32plus }
+
+#include "conversion-real-integer-3.h"
+
+float vfloat;
+
+void h (void)
+{
+ // We want to trigger an error on the token INT_MAX below, that is
+ // a macro that expands to the built-in __INT_MAX__. Furthermore,
+ // INT_MAX is defined inside a system header.
+ //
+ // The behaviour we want is that the diagnostic should point to
+ // the locus that inside the source code here, at the relevant
+ // line below, even with -ftrack-macro-expansion. We don't want
+ // it to point to the any locus that is inside the system header.
+ vfloat = INT_MAX; // { dg-warning "conversion to .float. alters .int. constant value" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C
new file mode 100644
index 000000000..3b6d1f3c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C
@@ -0,0 +1,112 @@
+/* Test for diagnostics for Wconversion between floating-point and
+ integers. C++ equivalent of
+ gcc/testsuite/gcc.dg/Wconversion-real-integer.c */
+
+/* { dg-do compile }
+/* { dg-options "-Wconversion -ftrack-macro-expansion=0" } */
+/* { dg-require-effective-target int32plus } */
+#include <limits.h>
+
+void fsi (signed int x);
+void fui (unsigned int x);
+void ffloat (float x);
+void fdouble (double x);
+
+float vfloat;
+double vdouble;
+
+void h (void)
+{
+ unsigned int ui = 3;
+ int si = 3;
+ unsigned char uc = 3;
+ signed char sc = 3;
+ float f = 3;
+ double d = 3;
+
+ fsi (3.1f); /* { dg-warning "conversion" } */
+ si = 3.1f; /* { dg-warning "conversion" } */
+ fsi (3.1); /* { dg-warning "conversion" } */
+ si = 3.1; /* { dg-warning "conversion" } */
+ fsi (d); /* { dg-warning "conversion" } */
+ si = d; /* { dg-warning "conversion" } */
+ fui (-1.0); /* { dg-warning "overflow" } */
+ ui = -1.0; /* { dg-warning "overflow" } */
+ ffloat (INT_MAX); /* { dg-warning "conversion" } */
+ vfloat = INT_MAX; /* { dg-warning "conversion" } */
+ ffloat (16777217); /* { dg-warning "conversion" } */
+ vfloat = 16777217; /* { dg-warning "conversion" } */
+ ffloat (si); /* { dg-warning "conversion" } */
+ vfloat = si; /* { dg-warning "conversion" } */
+ ffloat (ui); /* { dg-warning "conversion" } */
+ vfloat = ui; /* { dg-warning "conversion" } */
+
+ fsi (3);
+ si = 3;
+ fsi (3.0f);
+ si = 3.0f;
+ fsi (3.0);
+ si = 3.0;
+ fsi (16777217.0f);
+ si = 16777217.0f;
+ fsi ((int) 3.1);
+ si = (int) 3.1;
+ ffloat (3U);
+ vfloat = 3U;
+ ffloat (3);
+ vfloat = 3;
+ ffloat (INT_MIN);
+ vfloat = INT_MIN;
+ ffloat (uc);
+ vfloat = uc;
+ ffloat (sc);
+ vfloat = sc;
+
+ fdouble (UINT_MAX);
+ vdouble = UINT_MAX;
+ fdouble (ui);
+ vdouble = ui;
+ fdouble (si);
+ vdouble = si;
+}
+
+
+void fss (signed short x);
+void fus (unsigned short x);
+void fsc (signed char x);
+void fuc (unsigned char x);
+
+void h2 (void)
+{
+ unsigned short int us;
+ short int ss;
+ unsigned char uc;
+ signed char sc;
+
+ fss (4294967294.0); /* { dg-warning "conversion" } */
+ ss = 4294967294.0; /* { dg-warning "conversion" } */
+ fss (-4294967294.0); /* { dg-warning "conversion" } */
+ ss = -4294967294.0; /* { dg-warning "conversion" } */
+ fus (4294967294.0); /* { dg-warning "conversion" } */
+ us = 4294967294.0; /* { dg-warning "conversion" } */
+ fus (-4294967294.0); /* { dg-warning "conversion" } */
+ us = -4294967294.0; /* { dg-warning "conversion" } */
+
+ fsc (500.0); /* { dg-warning "conversion" } */
+ sc = 500.0; /* { dg-warning "conversion" } */
+ fsc (-500.0); /* { dg-warning "conversion" } */
+ sc = -500.0; /* { dg-warning "conversion" } */
+ fuc (500.0); /* { dg-warning "conversion" } */
+ uc = 500.0; /* { dg-warning "conversion" } */
+ fuc (-500.0); /* { dg-warning "conversion" } */
+ uc = -500.0; /* { dg-warning "conversion" } */
+
+ fss (500.0);
+ ss = 500.0;
+ fss (-500.0);
+ ss = -500.0;
+ fus (500.0);
+ us = 500.0;
+ fus (-500.0); /* { dg-warning "conversion" } */
+ us = -500.0; /* { dg-warning "conversion" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C
new file mode 100644
index 000000000..0494588c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C
@@ -0,0 +1,33 @@
+/* { dg-do compile }
+/* { dg-options "-Wconversion -ftrack-macro-expansion=2" } */
+/* { dg-require-effective-target int32plus } */
+
+// Before the fix that came with this test, we'd output an error for
+// the __INT_MAX__ token. That token has a BUILTINS_LOCATION
+// location, so the the location prefix in the warning message would
+// be:
+// <built-in>:0:0: warning: conversion to 'float' alters 'int' constant value
+//
+// Note the useless and confusing <built-in>:0:0 prefix. This is
+// because '__INT_MAX__' being an internal macro token, it has a
+// BUILTINS_LOCATION location.
+//
+// In this case, we want the error message to refer to the first
+// location (in the macro expansion context) that is not a location
+// for a built-in token. That location would be the one for where (in
+// real source code) the __INT_MAX__ macro has been expanded.
+//
+// That would be something like:
+//
+// gcc/testsuite/g++.dg/warn/Wconversion-real-integer2.C:21:17: warning: conversion to 'float' alters 'int' constant value
+//
+// That is more useful.
+
+#define INT_MAX __INT_MAX__
+
+float vfloat;
+
+void h (void)
+{
+ vfloat = INT_MAX; // { dg-warning "conversion to .float. alters .int. constant value" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real.C
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion-real.C
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion1.C
new file mode 100644
index 000000000..48e319ad6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion1.C
@@ -0,0 +1,12 @@
+// { dg-options "-fsigned-char -Wsign-conversion" }
+
+char c1 = 1024; // { dg-warning "overflow" }
+char c2 = char(1024);
+char c3 = (char) 1024;
+char c4 = static_cast<char>(1024);
+
+unsigned char uc1 = -129; // { dg-warning "unsigned" }
+
+bool b1 = -3;
+
+int i1 = 0x80000000; // { dg-warning "conversion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion2.C
new file mode 100644
index 000000000..226dd852b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion2.C
@@ -0,0 +1,3 @@
+// { dg-options "-Wconversion-null" }
+void foo(const char *);
+void bar() { foo(false); } // { dg-warning "pointer type for argument" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion3.C
new file mode 100644
index 000000000..24202b7d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion3.C
@@ -0,0 +1,35 @@
+// PR c++/34198
+// { dg-do compile }
+// { dg-options "-O2 -Wconversion -Wsign-conversion" }
+
+signed char sc;
+unsigned char uc;
+short int ss;
+unsigned short int us;
+int si;
+unsigned int ui;
+
+void test1 (void)
+{
+ int a = uc & 0xff;
+ int b = sc & 0x7f;
+ int c = 0xff & uc;
+ int d = 0x7f & sc;
+ int e = uc & sc;
+ unsigned char f = (int) uc;
+ signed char g = (int) sc;
+ unsigned char h = (unsigned int) (short int) uc;
+ signed char i = (int) (unsigned short int) sc; // { dg-warning "may alter its value" }
+ unsigned char j = (unsigned int) (short int) us; // { dg-warning "may alter its value" }
+ signed char k = (int) (unsigned short int) ss; // { dg-warning "may alter its value" }
+}
+
+void test2 (void)
+{
+ signed char a = (unsigned char) sc; // { dg-warning "may change the sign" }
+ unsigned char b = (signed char) uc; // { dg-warning "may change the sign" }
+ signed char c = (int) (unsigned char) sc; // { dg-warning "may change the sign" }
+ unsigned char d = (int) (signed char) uc; // { dg-warning "may change the sign" }
+ int e = (unsigned int) si; // { dg-warning "may change the sign" }
+ unsigned int f = (int) ui; // { dg-warning "may change the sign" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion4.C
new file mode 100644
index 000000000..83daaa069
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wconversion4.C
@@ -0,0 +1,17 @@
+// PR c++/45385
+// { dg-options "-Wconversion" }
+
+void foo(unsigned char);
+
+class Test
+{
+ void eval()
+ {
+ foo(bar()); // { dg-warning "may alter its value" }
+ }
+
+ unsigned int bar() const
+ {
+ return __INT_MAX__ * 2U + 1;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wctor-dtor.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wctor-dtor.C
new file mode 100644
index 000000000..15efb6b57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wctor-dtor.C
@@ -0,0 +1,13 @@
+// PR c++/21347
+// { dg-options "-Wctor-dtor-privacy" }
+
+class A {
+public:
+ int x;
+ int getX() { return x; } // comment out to avoid warning
+};
+
+int foo() {
+ A a; // accepted: clearly the ctor is not private
+ return a.x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C
new file mode 100644
index 000000000..69689ba34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-1.C
@@ -0,0 +1,7 @@
+// PR c++/43452
+
+class Foo; // { dg-warning "forward" }
+int main() {
+ Foo* p; // { dg-warning "incomplete" }
+ delete [] p; // { dg-warning "problem" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C
new file mode 100644
index 000000000..6c3aaa74f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdelete-incomplete-2.C
@@ -0,0 +1,8 @@
+// PR c++/43452
+// { dg-options -Wno-delete-incomplete }
+
+class Foo;
+int main() {
+ Foo* p;
+ delete [] p;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C
new file mode 100644
index 000000000..675e9594b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C
@@ -0,0 +1,35 @@
+// PR c++/56607
+// { dg-do compile { target { { lp64 || ilp32 } || llp64 } } }
+// { dg-require-effective-target c++11 }
+// { dg-options "-O2 -Wdiv-by-zero" }
+
+constexpr int sc () { return sizeof (char); }
+constexpr int si () { return sizeof (int); }
+constexpr int zc () { return sc () - 1; }
+constexpr int zi (int d) { return si () / d - 1; }
+
+int
+f1 (void)
+{
+ return 1 / zc (); // { dg-warning "division by zero" }
+}
+
+int
+f2 (void)
+{
+ constexpr int x = zc ();
+ return 1 / x; // { dg-warning "division by zero" }
+}
+
+int
+f3 (void)
+{
+ return 1 / zi (3); // { dg-warning "division by zero" }
+}
+
+int
+f4 (void)
+{
+ constexpr int x = zi (3);
+ return 1 / x; // { dg-warning "division by zero" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C
new file mode 100644
index 000000000..b7556eaac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus-2.C
@@ -0,0 +1,18 @@
+// PR c++/57132
+
+template<unsigned m, unsigned a>
+struct mod
+{
+ static unsigned calc(unsigned x) {
+ unsigned res = a * x;
+ if (m)
+ res %= m;
+ return res;
+ }
+};
+
+int main()
+{
+ mod<3,2>::calc(7);
+ mod<0,2>::calc(7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C
new file mode 100644
index 000000000..2157df30c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C
@@ -0,0 +1,30 @@
+// PR c++/52299
+
+template<unsigned x>
+struct test0 {
+ static const unsigned a_
+ = x ? 10 / x : 10;
+};
+
+template<unsigned x>
+struct test1 {
+ static const unsigned a_
+ = !x ? 10 : 10 / x;
+};
+
+template<bool x>
+struct test2 {
+ static const unsigned a_
+ = x ? 10 / x : 10;
+};
+
+template<bool x>
+struct test3 {
+ static const unsigned a_
+ = !x ? 10 : 10 / x;
+};
+
+unsigned i0 = test0<0>::a_;
+unsigned i1 = test1<0>::a_;
+unsigned i2 = test2<false>::a_;
+unsigned i3 = test3<false>::a_;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C
new file mode 100644
index 000000000..7dc77667c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C
@@ -0,0 +1,7 @@
+// test that division by zero warnings are enabled by default
+int breakme()
+{
+ int x = 0;
+ x /= 0; // { dg-warning "division by" }
+ return x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C
new file mode 100644
index 000000000..f4aafc531
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C
@@ -0,0 +1,99 @@
+/* { dg-do compile } */
+/* { dg-options "-Wdouble-promotion -ftrack-macro-expansion=2" } */
+
+#include <stddef.h>
+
+/* Some targets do not provide <complex.h> so we define I ourselves. */
+#define I 1.0iF
+#define ID ((_Complex double)I)
+
+float f;
+double d;
+int i;
+long double ld;
+_Complex float cf;
+_Complex double cd;
+_Complex long double cld;
+size_t s;
+
+extern void varargs_fn (int, ...);
+extern void double_fn (double);
+extern float float_fn (void);
+
+void
+usual_arithmetic_conversions(void)
+{
+ float local_f;
+ _Complex float local_cf;
+
+ /* Values of type "float" are implicitly converted to "double" or
+ "long double" due to use in arithmetic with "double" or "long
+ double" operands. */
+ local_f = f + 1.0; /* { dg-warning "15:implicit" } */
+ local_f = f - d; /* { dg-warning "15:implicit" } */
+ local_f = 1.0f * 1.0; /* { dg-warning "18:implicit" } */
+ local_f = 1.0f / d; /* { dg-warning "18:implicit" } */
+
+ local_cf = cf + 1.0; /* { dg-warning "17:implicit" } */
+ local_cf = cf - d; /* { dg-warning "17:implicit" } */
+ local_cf = cf + 1.0 * ID; /* { dg-warning "17:implicit" } */
+ local_cf = cf - cd; /* { dg-warning "17:implicit" } */
+
+ local_f = i ? f : d; /* { dg-warning "15:implicit" } */
+ i = f == d; /* { dg-warning "9:implicit" } */
+ i = d != f; /* { dg-warning "9:implicit" } */
+}
+
+void
+default_argument_promotion (void)
+{
+ /* Because "f" is part of the variable argument list, it is promoted
+ to "double". */
+ varargs_fn (1, f); /* { dg-warning "implicit" } */
+}
+
+/* There is no warning when an explicit cast is used to perform the
+ conversion. */
+
+void
+casts (void)
+{
+ float local_f;
+ _Complex float local_cf;
+
+ local_f = (double)f + 1.0; /* { dg-bogus "implicit" } */
+ local_f = (double)f - d; /* { dg-bogus "implicit" } */
+ local_f = (double)1.0f + 1.0; /* { dg-bogus "implicit" } */
+ local_f = (double)1.0f - d; /* { dg-bogus "implicit" } */
+
+ local_cf = (_Complex double)cf + 1.0; /* { dg-bogus "implicit" } */
+ local_cf = (_Complex double)cf - d; /* { dg-bogus "implicit" } */
+ local_cf = (_Complex double)cf + 1.0 * ID; /* { dg-bogus "implicit" } */
+ local_cf = (_Complex double)cf - cd; /* { dg-bogus "implicit" } */
+
+ local_f = i ? (double)f : d; /* { dg-bogus "implicit" } */
+ i = (double)f == d; /* { dg-bogus "implicit" } */
+ i = d != (double)f; /* { dg-bogus "implicit" } */
+}
+
+/* There is no warning on conversions that occur in assignment (and
+ assignment-like) contexts. */
+
+void
+assignments (void)
+{
+ d = f; /* { dg-bogus "implicit" } */
+ double_fn (f); /* { dg-bogus "implicit" } */
+ d = float_fn (); /* { dg-bogus "implicit" } */
+}
+
+/* There is no warning in non-evaluated contexts. */
+
+void
+non_evaluated (void)
+{
+ s = sizeof (f + 1.0); /* { dg-bogus "implicit" } */
+ s = __alignof__ (f + 1.0); /* { dg-bogus "implicit" } */
+ d = (__typeof__(f + 1.0))f; /* { dg-bogus "implicit" } */
+ s = sizeof (i ? f : d); /* { dg-bogus "implicit" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdtor1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdtor1.C
new file mode 100644
index 000000000..34c8a7edc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wdtor1.C
@@ -0,0 +1,22 @@
+// PR c++/20145
+// { dg-options "-Wnon-virtual-dtor" }
+# 1 "t.cc"
+# 1 "<built-in>"
+# 1 "<command line>"
+# 1 "t.cc"
+# 1 "include/t.h" 1 3 4
+// Declare the template with explicit C++ linkage in case system
+// headers have implicit C linkage.
+extern "C++" {
+template <int> class t
+{
+ virtual void f();
+};
+}
+# 2 "t.cc" 2
+
+void f(void)
+{
+ t<1> h;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Weff1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Weff1.C
new file mode 100644
index 000000000..a00dc29bf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Weff1.C
@@ -0,0 +1,5 @@
+// { dg-options "-Weffc++" }
+
+struct S {};
+/* Base classes should have virtual destructors. */
+struct T : public S {}; // { dg-warning "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no-2.C
new file mode 100644
index 000000000..fa7dda88a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no-2.C
@@ -0,0 +1,31 @@
+// PR c++/53524
+// { dg-options "-Wno-enum-compare" }
+
+template < typename > struct PointerLikeTypeTraits {
+ enum { NumLowBitsAvailable };
+};
+
+class CodeGenInstruction;
+class CodeGenInstAlias;
+
+template < typename T>
+struct PointerIntPair {
+ enum { IntShift = T::NumLowBitsAvailable };
+};
+
+template < typename PT1, typename PT2 > struct PointerUnionUIntTraits {
+ enum {
+ PT1BitsAv = PointerLikeTypeTraits < PT1 >::NumLowBitsAvailable,
+ PT2BitsAv = PointerLikeTypeTraits < PT2 >::NumLowBitsAvailable,
+ NumLowBitsAvailable = 0 ? PT1BitsAv : PT2BitsAv
+ };
+};
+
+template < typename PT1, typename PT2 > class PointerUnion {
+ typedef PointerIntPair < PointerUnionUIntTraits < PT1, PT2 > > ValTy;
+ ValTy Val;
+};
+
+struct ClassInfo {
+ PointerUnion < CodeGenInstruction *, CodeGenInstAlias * > DefRec;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C
new file mode 100644
index 000000000..7dc27d3fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C
@@ -0,0 +1,10 @@
+/* Test disabling -Wenum-compare (on by default). See PR27975. */
+/* { dg-do compile } */
+/* { dg-options "-Wno-enum-compare" } */
+enum E1 { a };
+enum E2 { b };
+
+int foo (E1 e1, E2 e2)
+{
+ return e1 == e2; /* { dg-bogus "comparison between" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare.C
new file mode 100644
index 000000000..f60080039
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wenum-compare.C
@@ -0,0 +1,10 @@
+/* Test that we get the -Wenum-compare by default. See PR27975. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+enum E1 { a };
+enum E2 { b };
+
+int foo (E1 e1, E2 e2)
+{
+ return e1 == e2; /* { dg-warning "comparison between" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-1.C
new file mode 100644
index 000000000..c75a6b087
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-1.C
@@ -0,0 +1,12 @@
+// { dg-options "-Wextra" }
+
+struct T {
+ // If the implicitly-declared default constructor for "T" is
+ // required, an error will be issued because "i" cannot be
+ // initialized. And, this class is not an aggregate, so it cannot
+ // be brace-initialized. Thus, there is no way to create an object
+ // of this class. We issue a warning with -Wextra.
+ const int i; // { dg-warning "const" }
+private:
+ int j;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-2.C
new file mode 100644
index 000000000..5ca41c39d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-2.C
@@ -0,0 +1,15 @@
+// { dg-options "-Wextra" }
+
+struct S {
+ S();
+};
+
+struct T {
+private:
+ int i;
+public:
+ // There should be no warning about this data member because the
+ // default constructor for "T" will invoke the default constructor
+ // for "S", even though "S" is "const".
+ const S s; // { dg-bogus "const" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-3.C
new file mode 100644
index 000000000..04fdbba90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wextra-3.C
@@ -0,0 +1,9 @@
+// PR c++/45278
+// { dg-options "-Wextra" }
+
+extern void* p;
+
+int f1() { return ( p < 0 ? 1 : 0 ); } // { dg-warning "ordered comparison" }
+int f2() { return ( p <= 0 ? 1 : 0 ); } // { dg-warning "ordered comparison" }
+int f3() { return ( p > 0 ? 1 : 0 ); } // { dg-warning "ordered comparison" }
+int f4() { return ( p >= 0 ? 1 : 0 ); } // { dg-warning "ordered comparison" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C
new file mode 100644
index 000000000..36b3fa53f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C
@@ -0,0 +1,10 @@
+/* PR c/19999 */
+/* { dg-do compile } */
+/* { dg-options "-Wfloat-equal" } */
+
+double a, b;
+_Complex double c, d;
+int f(void) { return a == b; } /* { dg-warning "comparing floating point" } */
+int g(void) { return c == d; } /* { dg-warning "comparing floating point" } */
+int h(void) { return a != b; } /* { dg-warning "comparing floating point" } */
+int i(void) { return c != d; } /* { dg-warning "comparing floating point" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Winit-self.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winit-self.C
new file mode 100644
index 000000000..60a727416
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winit-self.C
@@ -0,0 +1,8 @@
+// PR c++/53210
+// { dg-options "-Wall" }
+
+struct S
+{
+ S(int i) : j(j) { } // { dg-warning "is initialized with itself" }
+ int j;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-1.C
new file mode 100644
index 000000000..e1a7e832a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-1.C
@@ -0,0 +1,10 @@
+// { dg-options "-Winline -O2" }
+
+static inline int foo(int x);
+
+int main()
+{
+ return(foo(17));
+}
+
+inline int foo(int x) { return(x); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-2.C
new file mode 100644
index 000000000..69af34351
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-2.C
@@ -0,0 +1,5 @@
+// PR c++/10929
+// { dg-options "-Winline -O3" }
+
+int foo ();
+int bar () { return foo (); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-3.C
new file mode 100644
index 000000000..1c226d1b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-3.C
@@ -0,0 +1,10 @@
+// { dg-options "-Winline -O" }
+
+#include <vector>
+
+using namespace std;
+
+int main(void)
+{
+ vector<int> v(10);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-4.C
new file mode 100644
index 000000000..188ab5aa8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Winline-4.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-O2 -Winline" }
+// Origin: <markus at oberhumer dot com>
+// PR 17115: We should not emit -Winline warning for functions marked with
+// noinline
+
+struct Foo {
+ __attribute__((noinline)) int a(int r) { return r & 1; }
+ virtual __attribute__((noinline)) int b(int r) { return r & 1; }
+ static __attribute__((noinline)) int c(int r) { return r & 1; }
+};
+
+int bar(int r) {
+ Foo f;
+ int k = 1; k &= f.a(r); k &= f.b(r); k &= f.a(r);
+ return k;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C
new file mode 100644
index 000000000..e5b19afbe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+// { dg-options "-Wlogical-op" }
+
+enum { a, b1, b2 };
+
+enum testenum { t1, t2};
+
+extern int c;
+extern bool bool_a, bool_b;
+
+template<typename Enum>
+class QFlags
+{
+public:
+ typedef void **Zero;
+ int i;
+ inline QFlags(Enum f) : i(f) {}
+
+ inline operator int() const
+ { return i;}
+
+};
+
+QFlags<testenum> f(t2);
+extern void do_something(int);
+
+extern testenum testa();
+
+void foo()
+{
+ if ( f && b2 ) // { dg-warning "logical" }
+ do_something(1);
+ if ( c && b2 ) // { dg-warning "logical" }
+ do_something(2);
+
+ if ( b2 && c == a ) // { dg-bogus "logical" }
+ do_something(101);
+ if ( 1 && c )
+ do_something(102); // { dg-bogus "logical" }
+ if ( t2 && b2 ) // { dg-bogus "logical" }
+ do_something(103);
+ if ( true && c == a ) // { dg-bogus "logical" }
+ do_something(104);
+ if ( b2 && true ) // { dg-bogus "logical" }
+ do_something(105);
+}
+
+
+void bar()
+{
+ if ( f || b2 ) // { dg-warning "logical" }
+ do_something(1);
+ if ( c || b2 ) // { dg-warning "logical" }
+ do_something(2);
+
+ if ( b2 || c == a ) // { dg-bogus "logical" }
+ do_something(101);
+ if ( 1 || c )
+ do_something(102); // { dg-bogus "logical" }
+ if ( t2 || b2 ) // { dg-bogus "logical" }
+ do_something(103);
+ if ( true || c == a ) // { dg-bogus "logical" }
+ do_something(104);
+ if ( b2 || true ) // { dg-bogus "logical" }
+ do_something(105);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C
new file mode 100644
index 000000000..894432519
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C
@@ -0,0 +1,45 @@
+// { dg-options "-Wmissing-declarations" }
+
+void fn1() { } // { dg-warning "no previous declaration" }
+namespace ns {
+ void fn2() { } // { dg-warning "no previous declaration" }
+}
+namespace {
+ void fn3() { }
+}
+static void fn4() { }
+
+void fn5();
+namespace ns {
+ void fn6();
+}
+
+void fn5() { }
+namespace ns {
+ void fn6() { }
+}
+
+inline void fn7() { }
+
+class c {
+ void cfn1() { }
+ static void cfn2() { }
+ void cfn3();
+ static void cfn4();
+};
+
+void c::cfn3() { }
+void c::cfn4() { }
+
+static struct {
+ void sfn1() { }
+ static void sfn2() { }
+} s;
+
+template<typename C>
+void tfn1() { }
+
+template void tfn1<c>();
+
+class d { };
+template<> void tfn1<d>() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C
new file mode 100644
index 000000000..937628ee9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C
@@ -0,0 +1,8 @@
+// { dg-options "-Wno-div-by-zero" }
+
+int breakme()
+{
+ int x = 0;
+ x /= 0;
+ return x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
new file mode 100644
index 000000000..e15bfa24f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
@@ -0,0 +1,26 @@
+// { dg-do assemble }
+// { dg-options "-Wno-return-local-addr" }
+
+int& bad1()
+{
+ int x = 0;
+ return x;
+}
+
+int* bad2()
+{
+ int x = 0;
+ return &x;
+}
+
+int f();
+
+const int& bad3()
+{
+ return f();
+}
+
+const int& bad4()
+{
+ return int();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-1.C
new file mode 100644
index 000000000..84a1d380b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-Wconversion-null" }
+
+#include <stddef.h>
+
+void func1(int* ptr);
+
+void func2() {
+ int* t = false; // { dg-warning "converting 'false' to pointer" }
+ int* p;
+ p = false; // { dg-warning "converting 'false' to pointer" }
+ int* r = sizeof(char) / 2; // { dg-error "invalid conversion from" "" { target c++11 } }
+ func1(false); // { dg-warning "converting 'false' to pointer" }
+ int i = NULL; // { dg-warning "converting to non-pointer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-2.C
new file mode 100644
index 000000000..92a87d1e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnull-conversion-2.C
@@ -0,0 +1,45 @@
+// { dg-do compile }
+// { dg-options "-Wconversion-null" }
+
+#include <stddef.h>
+
+class Foo {
+ public:
+ template <typename T1, typename T2>
+ static void Compare(const T1& expected, const T2& actual) { }
+
+ template <typename T1, typename T2>
+ static void Compare(const T1& expected, T2* actual) { }
+
+};
+
+template<typename T1>
+class Foo2 {
+ public:
+ Foo2(int x);
+ template<typename T2> void Bar(T2 y);
+};
+
+template<typename T3> void func(T3 x) { }
+
+typedef Foo2<int> MyFooType;
+
+void func1(long int a) {
+ MyFooType *foo2 = new MyFooType(NULL); // { dg-warning "passing NULL to" }
+ foo2->Bar(a);
+ func(NULL);
+ func<int>(NULL); // { dg-warning "passing NULL to" }
+ func<int *>(NULL);
+}
+
+int x = 1;
+
+main()
+{
+ int *p = &x;
+
+ Foo::Compare(0, *p);
+ Foo::Compare<long int, int>(NULL, p); // { dg-warning "passing NULL to" }
+ Foo::Compare(NULL, p);
+ func1(NULL); // { dg-warning "passing NULL to" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C
new file mode 100644
index 000000000..d40de3d7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C
@@ -0,0 +1,54 @@
+// PR c++/7302
+// { dg-do compile }
+// { dg-options "-Wnon-virtual-dtor" }
+
+// Warn when a class has virtual functions and accessible non-virtual
+// destructor, in which case it would be possible but unsafe to delete
+// an instance of a derived class through a pointer to the base class.
+
+struct A // { dg-bogus "non-virtual destructor" }
+{
+protected:
+ ~A();
+public:
+ virtual void f() = 0;
+};
+
+struct B // { dg-bogus "non-virtual destructor" }
+{
+private:
+ ~B();
+public:
+ virtual void f() = 0;
+};
+
+struct C // { dg-warning "non-virtual destructor" }
+{
+ virtual void f() = 0;
+};
+
+struct D // { dg-warning "non-virtual destructor" }
+{
+ ~D();
+ virtual void f() = 0;
+};
+
+struct E;
+
+struct F // { dg-warning "non-virtual destructor" }
+{
+protected:
+ friend class E;
+ ~F();
+public:
+ virtual void f() = 0;
+};
+
+struct G // { dg-warning "non-virtual destructor" }
+{
+private:
+ friend class E;
+ ~G();
+public:
+ virtual void f() = 0;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C
new file mode 100644
index 000000000..b04fdcbe6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C
@@ -0,0 +1,10 @@
+// { dg-options "-Wnon-virtual-dtor" }
+
+extern "Java"
+{
+ class Foo
+ {
+ public:
+ virtual void bar( void);
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-1.C
new file mode 100644
index 000000000..064af4561
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-1.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <limits.h>
+
+int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-2.C
new file mode 100644
index 000000000..44368b66f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Woverflow" } */
+
+#include <limits.h>
+
+int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-3.C
new file mode 100644
index 000000000..73a021b59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-3.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wno-overflow" } */
+
+#include <limits.h>
+
+int foo = INT_MAX + 1;
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-4.C
new file mode 100644
index 000000000..1595bcada
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverflow-4.C
@@ -0,0 +1,13 @@
+// PR c++/51151
+// { dg-options "-Wshadow" }
+
+template<typename T> class C {
+public:
+ void f() {
+ m = c2 + 1;
+ }
+ static const long unsigned int c1 = 7;
+ static const int c2 = c1 - 1;
+ int m;
+};
+template class C<int>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverloaded-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverloaded-1.C
new file mode 100644
index 000000000..65a408b47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Woverloaded-1.C
@@ -0,0 +1,17 @@
+/* { dg-options "-Woverloaded-virtual" } */
+
+class Base {
+public:
+ virtual ~Base() {
+ }
+};
+
+class Derived: public Base {
+public:
+ int Base() { // There should be no error here.
+ return 5;
+ }
+};
+
+int main() {
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-1.C
new file mode 100644
index 000000000..34cb58fc7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-1.C
@@ -0,0 +1,68 @@
+// Test operation of -Wparentheses. Warnings for assignments used as
+// truth-values. Essentially the same as gcc.dg/Wparentheses-3.c.
+// Origin: Joseph Myers <jsm@polyomino.org.uk>
+
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+int foo (int);
+
+int a, b, c;
+bool d;
+
+void
+bar (void)
+{
+ if (a = b) // { dg-warning "assignment" "correct warning" }
+ foo (0);
+ if ((a = b))
+ foo (1);
+ if (a = a) // { dg-warning "assignment" "correct warning" }
+ foo (2);
+ if ((a = a))
+ foo (3);
+ if (b = c) // { dg-warning "assignment" "correct warning" }
+ foo (4);
+ else
+ foo (5);
+ if ((b = c))
+ foo (6);
+ else
+ foo (7);
+ if (b = b) // { dg-warning "assignment" "correct warning" }
+ foo (8);
+ else
+ foo (9);
+ if ((b = b))
+ foo (10);
+ else
+ foo (11);
+ while (c = b) // { dg-warning "assignment" "correct warning" }
+ foo (12);
+ while ((c = b))
+ foo (13);
+ while (c = c) // { dg-warning "assignment" "correct warning" }
+ foo (14);
+ while ((c = c))
+ foo (15);
+ do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" }
+ do foo (17); while ((a = b));
+ do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" }
+ do foo (19); while ((a = a));
+ for (;c = b;) // { dg-warning "assignment" "correct warning" }
+ foo (20);
+ for (;(c = b);)
+ foo (21);
+ for (;c = c;) // { dg-warning "assignment" "correct warning" }
+ foo (22);
+ for (;(c = c);)
+ foo (23);
+ d = a = b; // { dg-warning "assignment" "correct warning" }
+ foo (24);
+ d = (a = b);
+ foo (25);
+ d = a = a; // { dg-warning "assignment" "correct warning" }
+ foo (26);
+ d = (a = a);
+ foo (27);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-10.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-10.C
new file mode 100644
index 000000000..c30df090f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-10.C
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-7.c
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a & b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) ^ c);
+ foo (a & (b ^ c));
+ foo (1 & 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) ^ c);
+ foo (1 & (2 ^ c));
+ foo (1 & 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) ^ 3);
+ foo (1 & (2 ^ 3));
+ foo (a ^ b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) & c);
+ foo (a ^ (b & c));
+ foo (1 ^ 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) & c);
+ foo (1 ^ (2 & c));
+ foo (1 ^ 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) & 3);
+ foo (1 ^ (2 & 3));
+ foo (a + b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) ^ c);
+ foo (a + (b ^ c));
+ foo (1 + 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) ^ c);
+ foo (1 + (2 ^ c));
+ foo (1 + 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) ^ 3);
+ foo (1 + (2 ^ 3));
+ foo (a ^ b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) + c);
+ foo (a ^ (b + c));
+ foo (1 ^ 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) + c);
+ foo (1 ^ (2 + c));
+ foo (1 ^ 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) + 3);
+ foo (1 ^ (2 + 3));
+ foo (a - b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) ^ c);
+ foo (a - (b ^ c));
+ foo (1 - 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) ^ c);
+ foo (1 - (2 ^ c));
+ foo (1 - 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) ^ 3);
+ foo (1 - (2 ^ 3));
+ foo (a ^ b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) - c);
+ foo (a ^ (b - c));
+ foo (1 ^ 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) - c);
+ foo (1 ^ (2 - c));
+ foo (1 ^ 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) - 3);
+ foo (1 ^ (2 - 3));
+ foo (a >= b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >= b) ^ c);
+ foo (a >= (b ^ c));
+ foo (1 >= 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >= 2) ^ c);
+ foo (1 >= (2 ^ c));
+ foo (1 >= 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >= 2) ^ 3);
+ foo (1 >= (2 ^ 3));
+ foo (a ^ b >= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) >= c);
+ foo (a ^ (b >= c));
+ foo (1 ^ 2 >= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) >= c);
+ foo (1 ^ (2 >= c));
+ foo (1 ^ 2 >= 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) >= 3);
+ foo (1 ^ (2 >= 3));
+ foo (a == b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a == b) ^ c);
+ foo (a == (b ^ c));
+ foo (1 == 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) ^ c);
+ foo (1 == (2 ^ c));
+ foo (1 == 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) ^ 3);
+ foo (1 == (2 ^ 3));
+ foo (a ^ b == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) == c);
+ foo (a ^ (b == c));
+ foo (1 ^ 2 == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) == c);
+ foo (1 ^ (2 == c));
+ foo (1 ^ 2 == 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) == 3);
+ foo (1 ^ (2 == 3));
+ foo (a < b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a < b) ^ c);
+ foo (a < (b ^ c));
+ foo (1 < 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) ^ c);
+ foo (1 < (2 ^ c));
+ foo (1 < 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) ^ 3);
+ foo (1 < (2 ^ 3));
+ foo (a ^ b < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) < c);
+ foo (a ^ (b < c));
+ foo (1 ^ 2 < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) < c);
+ foo (1 ^ (2 < c));
+ foo (1 ^ 2 < 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) < 3);
+ foo (1 ^ (2 < 3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-11.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-11.C
new file mode 100644
index 000000000..912c3b7ae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-11.C
@@ -0,0 +1,101 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-8.c
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a + b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) & c);
+ foo (a + (b & c));
+ foo (1 + 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) & c);
+ foo (1 + (2 & c));
+ foo (1 + 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) & 3);
+ foo (1 + (2 & 3));
+ foo (a & b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) + c);
+ foo (a & (b + c));
+ foo (1 & 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) + c);
+ foo (1 & (2 + c));
+ foo (1 & 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) + 3);
+ foo (1 & (2 + 3));
+ foo (a - b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) & c);
+ foo (a - (b & c));
+ foo (1 - 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) & c);
+ foo (1 - (2 & c));
+ foo (1 - 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) & 3);
+ foo (1 - (2 & 3));
+ foo (a & b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) - c);
+ foo (a & (b - c));
+ foo (1 & 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) - c);
+ foo (1 & (2 - c));
+ foo (1 & 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) - 3);
+ foo (1 & (2 - 3));
+ foo (a < b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a < b) & c);
+ foo (a < (b & c));
+ foo (1 < 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) & c);
+ foo (1 < (2 & c));
+ foo (1 < 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) & 3);
+ foo (1 < (2 & 3));
+ foo (a & b < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) < c);
+ foo (a & (b < c));
+ foo (1 & 2 < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) < c);
+ foo (1 & (2 < c));
+ foo (1 & 2 < 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) < 3);
+ foo (1 & (2 < 3));
+ foo (a == b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a == b) & c);
+ foo (a == (b & c));
+ foo (1 == 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) & c);
+ foo (1 == (2 & c));
+ foo (1 == 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) & 3);
+ foo (1 == (2 & 3));
+ foo (a & b == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) == c);
+ foo (a & (b == c));
+ foo (1 & 2 == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) == c);
+ foo (1 & (2 == c));
+ foo (1 & 2 == 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) == 3);
+ foo (1 & (2 == 3));
+ foo (a != b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a != b) & c);
+ foo (a != (b & c));
+ foo (1 != 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 != 2) & c);
+ foo (1 != (2 & c));
+ foo (1 != 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 != 2) & 3);
+ foo (1 != (2 & 3));
+ foo (a & b != c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) != c);
+ foo (a & (b != c));
+ foo (1 & 2 != c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) != c);
+ foo (1 & (2 != c));
+ foo (1 & 2 != 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) != 3);
+ foo (1 & (2 != 3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-12.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-12.C
new file mode 100644
index 000000000..b04529827
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-12.C
@@ -0,0 +1,60 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-9.c
+
+int foo (int);
+
+int a, b, c;
+
+int
+bar (void)
+{
+ if (a)
+ foo (0);
+ if (b)
+ foo (1);
+ else
+ foo (2);
+ if (c) // { dg-warning "ambiguous" "correct warning" }
+ if (a)
+ foo (3);
+ else
+ foo (4);
+ if (a)
+ if (c)
+ foo (5);
+ if (a)
+ if (b) // { dg-warning "ambiguous" "correct warning" }
+ if (c)
+ foo (6);
+ else
+ foo (7);
+ if (a) // { dg-warning "ambiguous" "correct warning" }
+ if (b)
+ if (c)
+ foo (8);
+ else
+ foo (9);
+ else
+ foo (10);
+ if (a)
+ if (b)
+ if (c)
+ foo (11);
+ else
+ foo (12);
+ else
+ foo (13);
+ else
+ foo (14);
+ if (a) {
+ if (b)
+ if (c)
+ foo (15);
+ else
+ foo (16);
+ else
+ foo (17);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-13.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-13.C
new file mode 100644
index 000000000..22a139f23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-13.C
@@ -0,0 +1,69 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-1.C.
+
+int foo (int);
+
+int a, b, c;
+bool d;
+
+template<class T>
+void
+bar (T)
+{
+ if (a = b) // { dg-warning "assignment" "correct warning" }
+ foo (0);
+ if ((a = b))
+ foo (1);
+ if (a = a) // { dg-warning "assignment" "correct warning" }
+ foo (2);
+ if ((a = a))
+ foo (3);
+ if (b = c) // { dg-warning "assignment" "correct warning" }
+ foo (4);
+ else
+ foo (5);
+ if ((b = c))
+ foo (6);
+ else
+ foo (7);
+ if (b = b) // { dg-warning "assignment" "correct warning" }
+ foo (8);
+ else
+ foo (9);
+ if ((b = b))
+ foo (10);
+ else
+ foo (11);
+ while (c = b) // { dg-warning "assignment" "correct warning" }
+ foo (12);
+ while ((c = b))
+ foo (13);
+ while (c = c) // { dg-warning "assignment" "correct warning" }
+ foo (14);
+ while ((c = c))
+ foo (15);
+ do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" }
+ do foo (17); while ((a = b));
+ do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" }
+ do foo (19); while ((a = a));
+ for (;c = b;) // { dg-warning "assignment" "correct warning" }
+ foo (20);
+ for (;(c = b);)
+ foo (21);
+ for (;c = c;) // { dg-warning "assignment" "correct warning" }
+ foo (22);
+ for (;(c = c);)
+ foo (23);
+ d = a = b; // { dg-warning "assignment" "correct warning" }
+ foo (24);
+ d = (a = b);
+ foo (25);
+ d = a = a; // { dg-warning "assignment" "correct warning" }
+ foo (26);
+ d = (a = a);
+ foo (27);
+}
+
+template void bar<int> (int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-14.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-14.C
new file mode 100644
index 000000000..67bd43ec5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-14.C
@@ -0,0 +1,43 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-2.C.
+
+int foo (int);
+
+int a, b, c;
+bool d;
+
+template<class T>
+void
+bar (T)
+{
+ if (a += b)
+ foo (0);
+ if (a -= a)
+ foo (1);
+ if (b *= c)
+ foo (2);
+ else
+ foo (3);
+ if (b /= b)
+ foo (4);
+ else
+ foo (5);
+ while (c %= b)
+ foo (6);
+ while (c <<= c)
+ foo (7);
+ do foo (8); while (a >>= b);
+ do foo (9); while (a &= a);
+ for (;c ^= b;)
+ foo (10);
+ for (;c |= c;)
+ foo (11);
+ d = a += b;
+ foo (12);
+ d = a -= a;
+ foo (13);
+}
+
+template void bar<int> (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-15.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-15.C
new file mode 100644
index 000000000..c088b76df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-15.C
@@ -0,0 +1,68 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-6.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a <= b <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) <= c);
+ foo (a <= (b <= c));
+ foo (1 <= 2 <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) <= c);
+ foo (1 <= (2 <= c));
+ foo (1 <= 2 <= 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) <= 3);
+ foo (1 <= (2 <= 3));
+ foo (a > b > c); // { dg-warning "comparison" "correct warning" }
+ foo ((a > b) > c);
+ foo (a > (b > c));
+ foo (1 > 2 > c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 > 2) > c);
+ foo (1 > (2 > c));
+ foo (1 > 2 > 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 > 2) > 3);
+ foo (1 > (2 > 3));
+ foo (a < b <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((a < b) <= c);
+ foo (a < (b <= c));
+ foo (1 < 2 <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 < 2) <= c);
+ foo (1 < (2 <= c));
+ foo (1 < 2 <= 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 < 2) <= 3);
+ foo (1 < (2 <= 3));
+ foo (a <= b > c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) > c);
+ foo (a <= (b > c));
+ foo (1 <= 2 > c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) > c);
+ foo (1 <= (2 > c));
+ foo (1 <= 2 > 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) > 3);
+ foo (1 <= (2 > 3));
+ foo (a <= b == c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) == c);
+ foo (a <= (b == c));
+ foo (1 <= 2 == c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) == c);
+ foo (1 <= (2 == c));
+ foo (1 <= 2 == 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) == 3);
+ foo (1 <= (2 == 3));
+ foo (a != b != c); // { dg-warning "comparison" "correct warning" }
+ foo ((a != b) != c);
+ foo (a != (b != c));
+ foo (1 != 2 != c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 != 2) != c);
+ foo (1 != (2 != c));
+ foo (1 != 2 != 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 != 2) != 3);
+ foo (1 != (2 != 3));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-16.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-16.C
new file mode 100644
index 000000000..0f80cb9c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-16.C
@@ -0,0 +1,86 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-7.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a + b << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) << c);
+ foo (a + (b << c));
+ foo (1 + 2 << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) << c);
+ foo (1 + (2 << c));
+ foo (1 + 2 << 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) << 3);
+ foo (1 + (2 << 3));
+ foo (a << b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a << b) + c);
+ foo (a << (b + c));
+ foo (1 << 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 << 2) + c);
+ foo (1 << (2 + c));
+ foo (1 << 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 << 2) + 3);
+ foo (1 << (2 + 3));
+ foo (a + b >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) >> c);
+ foo (a + (b >> c));
+ foo (1 + 2 >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) >> c);
+ foo (1 + (2 >> c));
+ foo (1 + 2 >> 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) >> 3);
+ foo (1 + (2 >> 3));
+ foo (a >> b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >> b) + c);
+ foo (a >> (b + c));
+ foo (1 >> 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >> 2) + c);
+ foo (1 >> (2 + c));
+ foo (1 >> 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >> 2) + 3);
+ foo (1 >> (2 + 3));
+ foo (a - b << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) << c);
+ foo (a - (b << c));
+ foo (6 - 5 << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) << c);
+ foo (6 - (5 << c));
+ foo (6 - 5 << 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) << 4);
+ foo (6 - (5 << 4));
+ foo (a << b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a << b) - c);
+ foo (a << (b - c));
+ foo (6 << 5 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 << 5) - c);
+ foo (6 << (5 - c));
+ foo (6 << 5 - 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 << 5) - 4);
+ foo (6 << (5 - 4));
+ foo (a - b >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) >> c);
+ foo (a - (b >> c));
+ foo (6 - 5 >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) >> c);
+ foo (6 - (5 >> c));
+ foo (6 - 5 >> 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) >> 4);
+ foo (6 - (5 >> 4));
+ foo (a >> b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >> b) - c);
+ foo (a >> (b - c));
+ foo (6 >> 5 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 >> 5) - c);
+ foo (6 >> (5 - c));
+ foo (6 >> 5 - 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 >> 5) - 4);
+ foo (6 >> (5 - 4));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-17.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-17.C
new file mode 100644
index 000000000..b7c28e042
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-17.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-8.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a && b || c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a && b) || c);
+ foo (a && (b || c));
+ foo (1 && 2 || c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 && 2) || c);
+ foo (1 && (2 || c));
+ foo (1 && 2 || 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 && 2) || 3);
+ foo (1 && (2 || 3));
+ foo (a || b && c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a || b) && c);
+ foo (a || (b && c));
+ foo (1 || 2 && c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 || 2) && c);
+ foo (1 || (2 && c));
+ foo (1 || 2 && 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 || 2) && 3);
+ foo (1 || (2 && 3));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-18.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-18.C
new file mode 100644
index 000000000..83efaff41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-18.C
@@ -0,0 +1,122 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-9.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a & b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) | c);
+ foo (a & (b | c));
+ foo (1 & 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) | c);
+ foo (1 & (2 | c));
+ foo (1 & 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) | 3);
+ foo (1 & (2 | 3));
+ foo (a | b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) & c);
+ foo (a | (b & c));
+ foo (1 | 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) & c);
+ foo (1 | (2 & c));
+ foo (1 | 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) & 3);
+ foo (1 | (2 & 3));
+ foo (a ^ b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) | c);
+ foo (a ^ (b | c));
+ foo (1 ^ 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) | c);
+ foo (1 ^ (2 | c));
+ foo (1 ^ 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) | 3);
+ foo (1 ^ (2 | 3));
+ foo (a | b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) ^ c);
+ foo (a | (b ^ c));
+ foo (1 | 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) ^ c);
+ foo (1 | (2 ^ c));
+ foo (1 | 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) ^ 3);
+ foo (1 | (2 ^ 3));
+ foo (a + b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) | c);
+ foo (a + (b | c));
+ foo (1 + 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) | c);
+ foo (1 + (2 | c));
+ foo (1 + 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) | 3);
+ foo (1 + (2 | 3));
+ foo (a | b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) + c);
+ foo (a | (b + c));
+ foo (1 | 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) + c);
+ foo (1 | (2 + c));
+ foo (1 | 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) + 3);
+ foo (1 | (2 + 3));
+ foo (a - b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) | c);
+ foo (a - (b | c));
+ foo (1 - 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) | c);
+ foo (1 - (2 | c));
+ foo (1 - 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) | 3);
+ foo (1 - (2 | 3));
+ foo (a | b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) - c);
+ foo (a | (b - c));
+ foo (1 | 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) - c);
+ foo (1 | (2 - c));
+ foo (1 | 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) - 3);
+ foo (1 | (2 - 3));
+ foo (a > b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a > b) | c);
+ foo (a > (b | c));
+ foo (1 > 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 > 2) | c);
+ foo (1 > (2 | c));
+ foo (1 > 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 > 2) | 3);
+ foo (1 > (2 | 3));
+ foo (a | b > c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) > c);
+ foo (a | (b > c));
+ foo (1 | 2 > c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) > c);
+ foo (1 | (2 > c));
+ foo (1 | 2 > 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) > 3);
+ foo (1 | (2 > 3));
+ foo (a <= b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a <= b) | c);
+ foo (a <= (b | c));
+ foo (1 <= 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 <= 2) | c);
+ foo (1 <= (2 | c));
+ foo (1 <= 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 <= 2) | 3);
+ foo (1 <= (2 | 3));
+ foo (a | b <= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) <= c);
+ foo (a | (b <= c));
+ foo (1 | 2 <= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) <= c);
+ foo (1 | (2 <= c));
+ foo (1 | 2 <= 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) <= 3);
+ foo (1 | (2 <= 3));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-19.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-19.C
new file mode 100644
index 000000000..f0e2b805c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-19.C
@@ -0,0 +1,122 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-10.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a & b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) ^ c);
+ foo (a & (b ^ c));
+ foo (1 & 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) ^ c);
+ foo (1 & (2 ^ c));
+ foo (1 & 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) ^ 3);
+ foo (1 & (2 ^ 3));
+ foo (a ^ b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) & c);
+ foo (a ^ (b & c));
+ foo (1 ^ 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) & c);
+ foo (1 ^ (2 & c));
+ foo (1 ^ 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) & 3);
+ foo (1 ^ (2 & 3));
+ foo (a + b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) ^ c);
+ foo (a + (b ^ c));
+ foo (1 + 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) ^ c);
+ foo (1 + (2 ^ c));
+ foo (1 + 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) ^ 3);
+ foo (1 + (2 ^ 3));
+ foo (a ^ b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) + c);
+ foo (a ^ (b + c));
+ foo (1 ^ 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) + c);
+ foo (1 ^ (2 + c));
+ foo (1 ^ 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) + 3);
+ foo (1 ^ (2 + 3));
+ foo (a - b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) ^ c);
+ foo (a - (b ^ c));
+ foo (1 - 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) ^ c);
+ foo (1 - (2 ^ c));
+ foo (1 - 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) ^ 3);
+ foo (1 - (2 ^ 3));
+ foo (a ^ b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) - c);
+ foo (a ^ (b - c));
+ foo (1 ^ 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) - c);
+ foo (1 ^ (2 - c));
+ foo (1 ^ 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) - 3);
+ foo (1 ^ (2 - 3));
+ foo (a >= b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >= b) ^ c);
+ foo (a >= (b ^ c));
+ foo (1 >= 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >= 2) ^ c);
+ foo (1 >= (2 ^ c));
+ foo (1 >= 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >= 2) ^ 3);
+ foo (1 >= (2 ^ 3));
+ foo (a ^ b >= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) >= c);
+ foo (a ^ (b >= c));
+ foo (1 ^ 2 >= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) >= c);
+ foo (1 ^ (2 >= c));
+ foo (1 ^ 2 >= 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) >= 3);
+ foo (1 ^ (2 >= 3));
+ foo (a == b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a == b) ^ c);
+ foo (a == (b ^ c));
+ foo (1 == 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) ^ c);
+ foo (1 == (2 ^ c));
+ foo (1 == 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) ^ 3);
+ foo (1 == (2 ^ 3));
+ foo (a ^ b == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) == c);
+ foo (a ^ (b == c));
+ foo (1 ^ 2 == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) == c);
+ foo (1 ^ (2 == c));
+ foo (1 ^ 2 == 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) == 3);
+ foo (1 ^ (2 == 3));
+ foo (a < b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a < b) ^ c);
+ foo (a < (b ^ c));
+ foo (1 < 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) ^ c);
+ foo (1 < (2 ^ c));
+ foo (1 < 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) ^ 3);
+ foo (1 < (2 ^ 3));
+ foo (a ^ b < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) < c);
+ foo (a ^ (b < c));
+ foo (1 ^ 2 < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) < c);
+ foo (1 ^ (2 < c));
+ foo (1 ^ 2 < 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) < 3);
+ foo (1 ^ (2 < 3));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-2.C
new file mode 100644
index 000000000..286e2f97c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-2.C
@@ -0,0 +1,43 @@
+// Test operation of -Wparentheses. Warnings for assignments used as
+// truth-values shouldn't apply other than for plain assignment.
+// Essentially the same as gcc.dg/Wparentheses-10.c.
+// Origin: Joseph Myers <jsm@polyomino.org.uk>
+
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+int foo (int);
+
+int a, b, c;
+bool d;
+
+void
+bar (void)
+{
+ if (a += b)
+ foo (0);
+ if (a -= a)
+ foo (1);
+ if (b *= c)
+ foo (2);
+ else
+ foo (3);
+ if (b /= b)
+ foo (4);
+ else
+ foo (5);
+ while (c %= b)
+ foo (6);
+ while (c <<= c)
+ foo (7);
+ do foo (8); while (a >>= b);
+ do foo (9); while (a &= a);
+ for (;c ^= b;)
+ foo (10);
+ for (;c |= c;)
+ foo (11);
+ d = a += b;
+ foo (12);
+ d = a -= a;
+ foo (13);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-20.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-20.C
new file mode 100644
index 000000000..746a31037
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-20.C
@@ -0,0 +1,104 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-11.C.
+
+int foo (int);
+
+template<class T>
+void
+bar (T a, T b, T c)
+{
+ foo (a + b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) & c);
+ foo (a + (b & c));
+ foo (1 + 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) & c);
+ foo (1 + (2 & c));
+ foo (1 + 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) & 3);
+ foo (1 + (2 & 3));
+ foo (a & b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) + c);
+ foo (a & (b + c));
+ foo (1 & 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) + c);
+ foo (1 & (2 + c));
+ foo (1 & 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) + 3);
+ foo (1 & (2 + 3));
+ foo (a - b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) & c);
+ foo (a - (b & c));
+ foo (1 - 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) & c);
+ foo (1 - (2 & c));
+ foo (1 - 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) & 3);
+ foo (1 - (2 & 3));
+ foo (a & b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) - c);
+ foo (a & (b - c));
+ foo (1 & 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) - c);
+ foo (1 & (2 - c));
+ foo (1 & 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) - 3);
+ foo (1 & (2 - 3));
+ foo (a < b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a < b) & c);
+ foo (a < (b & c));
+ foo (1 < 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) & c);
+ foo (1 < (2 & c));
+ foo (1 < 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 < 2) & 3);
+ foo (1 < (2 & 3));
+ foo (a & b < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) < c);
+ foo (a & (b < c));
+ foo (1 & 2 < c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) < c);
+ foo (1 & (2 < c));
+ foo (1 & 2 < 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) < 3);
+ foo (1 & (2 < 3));
+ foo (a == b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a == b) & c);
+ foo (a == (b & c));
+ foo (1 == 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) & c);
+ foo (1 == (2 & c));
+ foo (1 == 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 == 2) & 3);
+ foo (1 == (2 & 3));
+ foo (a & b == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) == c);
+ foo (a & (b == c));
+ foo (1 & 2 == c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) == c);
+ foo (1 & (2 == c));
+ foo (1 & 2 == 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) == 3);
+ foo (1 & (2 == 3));
+ foo (a != b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a != b) & c);
+ foo (a != (b & c));
+ foo (1 != 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 != 2) & c);
+ foo (1 != (2 & c));
+ foo (1 != 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 != 2) & 3);
+ foo (1 != (2 & 3));
+ foo (a & b != c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) != c);
+ foo (a & (b != c));
+ foo (1 & 2 != c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) != c);
+ foo (1 & (2 != c));
+ foo (1 & 2 != 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) != 3);
+ foo (1 & (2 != 3));
+}
+
+template void bar<int> (int, int, int); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-21.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-21.C
new file mode 100644
index 000000000..588b4fdb7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-21.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-12.C. Note that we currently warn
+// when we initially parse the template, not when we are instantiating
+// it. That seems reasonable since the template parameters can not
+// affect the syntax parsing.
+
+int foo (int);
+
+int a, b, c;
+
+template<class T>
+void
+bar (T)
+{
+ if (a)
+ foo (0);
+ if (b)
+ foo (1);
+ else
+ foo (2);
+ if (c) // { dg-warning "ambiguous" "correct warning" }
+ if (a)
+ foo (3);
+ else
+ foo (4);
+ if (a)
+ if (c)
+ foo (5);
+ if (a)
+ if (b) // { dg-warning "ambiguous" "correct warning" }
+ if (c)
+ foo (6);
+ else
+ foo (7);
+ if (a) // { dg-warning "ambiguous" "correct warning" }
+ if (b)
+ if (c)
+ foo (8);
+ else
+ foo (9);
+ else
+ foo (10);
+ if (a)
+ if (b)
+ if (c)
+ foo (11);
+ else
+ foo (12);
+ else
+ foo (13);
+ else
+ foo (14);
+ if (a) {
+ if (b)
+ if (c)
+ foo (15);
+ else
+ foo (16);
+ else
+ foo (17);
+ }
+}
+
+template void bar<int> (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-22.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-22.C
new file mode 100644
index 000000000..395953dd4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-22.C
@@ -0,0 +1,111 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Warnings for assignments used as truth-values when using classes.
+// Like Wparentheses-1.C, but with a class.
+
+int foo (int);
+
+class C
+{
+ public:
+ C()
+ : b(0)
+ { }
+
+ // Use default assignment constructor.
+
+ // Provide conversion to bool so that an instance of this class will
+ // work as a condition.
+ operator bool() const
+ { return b != 0; }
+
+ private:
+ int b;
+};
+
+C a, b, c;
+bool d;
+
+void
+bar (void)
+{
+ if (a = b) // { dg-warning "assignment" "correct warning" }
+ foo (0);
+ if ((a = b))
+ foo (1);
+ if (a = a) // { dg-warning "assignment" "correct warning" }
+ foo (2);
+ if ((a = a))
+ foo (3);
+ if (b = c) // { dg-warning "assignment" "correct warning" }
+ foo (4);
+ else
+ foo (5);
+ if ((b = c))
+ foo (6);
+ else
+ foo (7);
+ if (b = b) // { dg-warning "assignment" "correct warning" }
+ foo (8);
+ else
+ foo (9);
+ if ((b = b))
+ foo (10);
+ else
+ foo (11);
+ while (c = b) // { dg-warning "assignment" "correct warning" }
+ foo (12);
+ while ((c = b))
+ foo (13);
+ while (c = c) // { dg-warning "assignment" "correct warning" }
+ foo (14);
+ while ((c = c))
+ foo (15);
+ do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" }
+ do foo (17); while ((a = b));
+ do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" }
+ do foo (19); while ((a = a));
+ for (;c = b;) // { dg-warning "assignment" "correct warning" }
+ foo (20);
+ for (;(c = b);)
+ foo (21);
+ for (;c = c;) // { dg-warning "assignment" "correct warning" }
+ foo (22);
+ for (;(c = c);)
+ foo (23);
+ d = a = b; // { dg-warning "assignment" "correct warning" }
+ foo (24);
+ d = (a = b);
+ foo (25);
+ d = a = a; // { dg-warning "assignment" "correct warning" }
+ foo (26);
+ d = (a = a);
+ foo (27);
+ if (C(a))
+ foo (28);
+}
+
+bool
+bar1 (void)
+{
+ return a = b; // { dg-warning "assignment" "correct warning" }
+}
+
+bool
+bar2 (void)
+{
+ return (a = b);
+}
+
+bool
+bar3 (void)
+{
+ return a = a; // { dg-warning "assignment" "correct warning" }
+}
+
+bool
+bar4 (void)
+{
+ return (a = a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-23.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-23.C
new file mode 100644
index 000000000..f1749c2b8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-23.C
@@ -0,0 +1,121 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// Template version of Wparentheses-22.C.
+
+int foo (int);
+
+class C
+{
+ public:
+ C()
+ : b(0)
+ { }
+
+ // Use default assignment constructor.
+
+ // Provide conversion to bool so that an instance of this class will
+ // work as a condition.
+ operator bool() const
+ { return b != 0; }
+
+ private:
+ int b;
+};
+
+C a, b, c;
+bool d;
+
+template<class T>
+void
+bar (T)
+{
+ if (a = b) // { dg-warning "assignment" "correct warning" }
+ foo (0);
+ if ((a = b))
+ foo (1);
+ if (a = a) // { dg-warning "assignment" "correct warning" }
+ foo (2);
+ if ((a = a))
+ foo (3);
+ if (b = c) // { dg-warning "assignment" "correct warning" }
+ foo (4);
+ else
+ foo (5);
+ if ((b = c))
+ foo (6);
+ else
+ foo (7);
+ if (b = b) // { dg-warning "assignment" "correct warning" }
+ foo (8);
+ else
+ foo (9);
+ if ((b = b))
+ foo (10);
+ else
+ foo (11);
+ while (c = b) // { dg-warning "assignment" "correct warning" }
+ foo (12);
+ while ((c = b))
+ foo (13);
+ while (c = c) // { dg-warning "assignment" "correct warning" }
+ foo (14);
+ while ((c = c))
+ foo (15);
+ do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" }
+ do foo (17); while ((a = b));
+ do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" }
+ do foo (19); while ((a = a));
+ for (;c = b;) // { dg-warning "assignment" "correct warning" }
+ foo (20);
+ for (;(c = b);)
+ foo (21);
+ for (;c = c;) // { dg-warning "assignment" "correct warning" }
+ foo (22);
+ for (;(c = c);)
+ foo (23);
+ d = a = b; // { dg-warning "assignment" "correct warning" }
+ foo (24);
+ d = (a = b);
+ foo (25);
+ d = a = a; // { dg-warning "assignment" "correct warning" }
+ foo (26);
+ d = (a = a);
+ foo (27);
+ if (C(a))
+ foo (28);
+}
+
+template<class T>
+bool
+bar1 (T)
+{
+ return a = b; // { dg-warning "assignment" "correct warning" }
+}
+
+template<class T>
+bool
+bar2 (T)
+{
+ return (a = b);
+}
+
+template<class T>
+bool
+bar3 (T)
+{
+ return a = a; // { dg-warning "assignment" "correct warning" }
+}
+
+template<class T>
+bool
+bar4 (T)
+{
+ return (a = a);
+}
+
+template void bar<int> (int); // { dg-message "required" }
+template bool bar1<int> (int); // { dg-message "required" }
+template bool bar2<int> (int);
+template bool bar3<int> (int); // { dg-message "required" }
+template bool bar4<int> (int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-24.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-24.C
new file mode 100644
index 000000000..4019d3d82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-24.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+extern int foo (int);
+
+bool a, b, c;
+
+bool
+bar ()
+{
+ c = a = b;
+ foo (0);
+ return a = b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-25.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-25.C
new file mode 100644
index 000000000..ab00c25f0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-25.C
@@ -0,0 +1,259 @@
+/* PR 7543. Test operation of -Wparentheses. Precedence warnings.
+ !a | b and !a & b. */
+/* { dg-do compile } */
+/* { dg-options "-Wparentheses" } */
+// C++ version of Wparentheses-11.c
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (!a & b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b < c));
+ foo (!a & (b > c));
+ foo (!a & (b == c));
+ foo (!a & (b != c));
+ foo (!a & (b <= c));
+ foo (!a & (b >= c));
+ foo (!a & (b && c));
+ foo (!a & (b || c));
+ foo (!a & !b);
+ foo (!(a & b));
+ foo ((!a) & b);
+ foo (!a & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 < c));
+ foo (!a & (2 > c));
+ foo (!a & (2 == c));
+ foo (!a & (2 != c));
+ foo (!a & (2 <= c));
+ foo (!a & (2 >= c));
+ foo (!a & (2 && c));
+ foo (!a & (2 || c));
+ foo (!a & !2);
+ foo (!(a & 2));
+ foo ((!a) & 2);
+ foo (!1 & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 < c));
+ foo (!1 & (2 > c));
+ foo (!1 & (2 == c));
+ foo (!1 & (2 != c));
+ foo (!1 & (2 <= c));
+ foo (!1 & (2 >= c));
+ foo (!1 & (2 && c));
+ foo (!1 & (2 || c));
+ foo (!1 & !2);
+ foo (!(1 & 2));
+
+ foo (!a | b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b < c));
+ foo (!a | (b > c));
+ foo (!a | (b == c));
+ foo (!a | (b != c));
+ foo (!a | (b <= c));
+ foo (!a | (b >= c));
+ foo (!a | (b && c));
+ foo (!a | (b || c));
+ foo (!a | !b);
+ foo (!(a | b));
+ foo ((!a) | b);
+ foo (!a | 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 < c));
+ foo (!a | (2 > c));
+ foo (!a | (2 == c));
+ foo (!a | (2 != c));
+ foo (!a | (2 <= c));
+ foo (!a | (2 >= c));
+ foo (!a | (2 && c));
+ foo (!a | (2 || c));
+ foo (!a | !2);
+ foo (!(a | 2));
+ foo ((!a) | 2);
+ foo (!1 | 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 < c));
+ foo (!1 | (2 > c));
+ foo (!1 | (2 == c));
+ foo (!1 | (2 != c));
+ foo (!1 | (2 <= c));
+ foo (!1 | (2 >= c));
+ foo (!1 | (2 && c));
+ foo (!1 | (2 || c));
+ foo (!1 | !2);
+ foo (!(1 | 2));
+ foo ((!1) | 2);
+
+ foo (b & !a); /* { dg-bogus "parentheses" "bogus warning" } */
+ foo ((b < c) & !a);
+ foo ((b > c) & !a);
+ foo ((b == c) & !a);
+ foo ((b != c) & !a);
+ foo ((b <= c) & !a);
+ foo ((b >= c) & !a);
+ foo ((b && c) & !a);
+ foo ((b || c) & !a);
+ foo (!b & !a);
+ foo (!(b & a));
+ foo (b & (!a));
+ foo (2 & !a); /* { dg-bogus "parentheses" "correct warning" } */
+ foo ((2 < c) & !a);
+ foo ((2 > c) & !a);
+ foo ((2 == c) & !a);
+ foo ((2 != c) & !a);
+ foo ((2 <= c) & !a);
+ foo ((2 >= c) & !a);
+ foo ((2 && c) & !a);
+ foo ((2 || c) & !a);
+ foo (!2 & !a);
+ foo (!(2 & a));
+ foo (2 & (!a));
+ foo (2 & !1); /* { dg-bogus "parentheses" "correct warning" } */
+ foo ((2 < c) & !1);
+ foo ((2 > c) & !1);
+ foo ((2 == c) & !1);
+ foo ((2 != c) & !1);
+ foo ((2 <= c) & !1);
+ foo ((2 >= c) & !1);
+ foo ((2 && c) & !1);
+ foo ((2 || c) & !1);
+ foo (!2 & !1);
+ foo (!(2 & 1));
+
+ foo (b | !a); /* { dg-bogus "parentheses" "correct warning" } */
+ foo ((b < c) | !a);
+ foo ((b > c) | !a);
+ foo ((b == c) | !a);
+ foo ((b != c) | !a);
+ foo ((b <= c) | !a);
+ foo ((b >= c) | !a);
+ foo ((b && c) | !a);
+ foo ((b || c) | !a);
+ foo (!b | !a);
+ foo (!(b | a));
+ foo (b | (!a));
+ foo (2 | !a); /* { dg-bogus "parentheses" "correct warning" } */
+ foo ((2 < c) | !a);
+ foo ((2 > c) | !a);
+ foo ((2 == c) | !a);
+ foo ((2 != c) | !a);
+ foo ((2 <= c) | !a);
+ foo ((2 >= c) | !a);
+ foo ((2 && c) | !a);
+ foo ((2 || c) | !a);
+ foo (!2 | !a);
+ foo (!(2 | a));
+ foo (2 | (!a));
+ foo (2 | !1); /* { dg-bogus "parentheses" "correct warning" } */
+ foo ((2 < c) | !1);
+ foo ((2 > c) | !1);
+ foo ((2 == c) | !1);
+ foo ((2 != c) | !1);
+ foo ((2 <= c) | !1);
+ foo ((2 >= c) | !1);
+ foo ((2 && c) | !1);
+ foo ((2 || c) | !1);
+ foo (!2 | !1);
+ foo (!(2 | 1));
+ foo (2 | (!1));
+}
+
+
+int
+baz (int a, int b, int c)
+{
+ foo (!a & (b << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b = c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & ~b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (b | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a & (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 & (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b = c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | ~b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (b | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!a | (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo (!1 | (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */
+ foo ((b << c) & !a);
+ foo ((b >> c) & !a);
+ foo ((b + c) & !a);
+ foo ((b - c) & !a);
+ foo ((b = c) & !a);
+ foo (~b & !a);
+ foo ((b & c) & !a);
+ foo ((b | c) & !a);
+ foo ((2 << c) & !a);
+ foo ((2 >> c) & !a);
+ foo ((2 + c) & !a);
+ foo ((2 - c) & !a);
+ foo ((c = 2) & !a);
+ foo (~2 & !a);
+ foo ((2 & c) & !a);
+ foo ((2 | c) & !a);
+ foo ((2 << c) & !1);
+ foo ((2 >> c) & !1);
+ foo ((2 + c) & !1);
+ foo ((2 - c) & !1);
+ foo ((c = 2) & !1);
+ foo (~2 & !1);
+ foo ((2 & c) & !1);
+ foo ((2 | c) & !1);
+ foo ((b << c) | !a);
+ foo ((b >> c) | !a);
+ foo ((b + c) | !a);
+ foo ((b - c) | !a);
+ foo ((b = c) | !a);
+ foo (~b | !a);
+ foo ((b & c) | !a);
+ foo ((b | c) | !a);
+ foo ((2 << c) | !a);
+ foo ((2 >> c) | !a);
+ foo ((2 + c) | !a);
+ foo ((2 - c) | !a);
+ foo ((c = 2) | !a);
+ foo (~2 | !a);
+ foo ((2 & c) | !a);
+ foo ((2 | c) | !a);
+ foo ((2 << c) | !1);
+ foo ((2 >> c) | !1);
+ foo ((2 + c) | !1);
+ foo ((2 - c) | !1);
+ foo ((c = 2) | !1);
+ foo (~2 | !1);
+ foo ((2 & c) | !1);
+ foo ((2 | c) | !1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-26.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-26.C
new file mode 100644
index 000000000..4525bfdcd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-26.C
@@ -0,0 +1,26 @@
+// PR c++/51064
+// { dg-options "-Wparentheses" }
+
+template<int i, int j = ((i + 7) >> 3)> class foo1 { };
+typedef foo1<10> bar1;
+
+template<int i, int j = (i + 7 >> 3)> class foo2 { }; // { dg-warning "suggest parentheses around '\\+'" }
+typedef foo2<10> bar2;
+
+template<int i, int j = (100 >> (i + 2))> class foo3 { };
+typedef foo3<3> bar3;
+
+template<int i, int j = (100 >> i + 2)> class foo4 { }; // { dg-warning "suggest parentheses around '\\+'" }
+typedef foo4<3> bar4;
+
+template<int i, int j = (i + 7) | 3> class foo5 { };
+typedef foo5<10> bar5;
+
+template<int i, int j = i + 7 | 3> class foo6 { }; // { dg-warning "suggest parentheses around arithmetic" }
+typedef foo6<10> bar6;
+
+template<int i, int j = 3 | (i + 7)> class foo7 { };
+typedef foo7<10> bar7;
+
+template<int i, int j = 3 | i + 7> class foo8 { }; // { dg-warning "suggest parentheses around arithmetic" }
+typedef foo8<10> bar8;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-27.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-27.C
new file mode 100644
index 000000000..7c05f7e80
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-27.C
@@ -0,0 +1,8 @@
+// PR c++/54194
+// { dg-options "-Wparentheses" }
+
+int main()
+{
+ char in[4] = { 0 };
+ in[1] = in[1] & 0x0F | ((in[3] & 0x3C) << 2); // { dg-warning "17:suggest parentheses" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-3.C
new file mode 100644
index 000000000..8781953b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-3.C
@@ -0,0 +1,13 @@
+// Test that -Wparentheses does not give bogus warnings in the
+// presence of templates. Bug 17041.
+
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+template<int> struct A
+{
+ int i;
+ A() { if ((i = 0)) ; }
+};
+
+A<0> a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-4.C
new file mode 100644
index 000000000..2048ed7c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-4.C
@@ -0,0 +1,19 @@
+// Test that -Wparentheses does not give bogus warnings in the
+// presence of templates for non-plain assignment. Bug 17120.
+
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+template<typename _Tp>
+ inline _Tp
+ cmath_power(_Tp __x, unsigned int __n)
+ {
+ while (__n >>= 1)
+ ;
+ return __x;
+ }
+
+int main()
+{
+ cmath_power(1.0, 3);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-5.C
new file mode 100644
index 000000000..2cd05aaae
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-5.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options -Wparentheses }
+
+// C++ version of gcc.dg/Wparentheses-1.c.
+
+int foo (int a, int b)
+{
+ int c = (a && b) || 0; // { dg-bogus "suggest parentheses" }
+ c = a && b || 0; // { dg-warning "suggest parentheses" }
+
+ return (a && b && 1) || 0; // { dg-bogus "suggest parentheses" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-6.C
new file mode 100644
index 000000000..9963d822e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-6.C
@@ -0,0 +1,65 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-2.c.
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a <= b <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) <= c);
+ foo (a <= (b <= c));
+ foo (1 <= 2 <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) <= c);
+ foo (1 <= (2 <= c));
+ foo (1 <= 2 <= 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) <= 3);
+ foo (1 <= (2 <= 3));
+ foo (a > b > c); // { dg-warning "comparison" "correct warning" }
+ foo ((a > b) > c);
+ foo (a > (b > c));
+ foo (1 > 2 > c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 > 2) > c);
+ foo (1 > (2 > c));
+ foo (1 > 2 > 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 > 2) > 3);
+ foo (1 > (2 > 3));
+ foo (a < b <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((a < b) <= c);
+ foo (a < (b <= c));
+ foo (1 < 2 <= c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 < 2) <= c);
+ foo (1 < (2 <= c));
+ foo (1 < 2 <= 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 < 2) <= 3);
+ foo (1 < (2 <= 3));
+ foo (a <= b > c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) > c);
+ foo (a <= (b > c));
+ foo (1 <= 2 > c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) > c);
+ foo (1 <= (2 > c));
+ foo (1 <= 2 > 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) > 3);
+ foo (1 <= (2 > 3));
+ foo (a <= b == c); // { dg-warning "comparison" "correct warning" }
+ foo ((a <= b) == c);
+ foo (a <= (b == c));
+ foo (1 <= 2 == c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) == c);
+ foo (1 <= (2 == c));
+ foo (1 <= 2 == 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 <= 2) == 3);
+ foo (1 <= (2 == 3));
+ foo (a != b != c); // { dg-warning "comparison" "correct warning" }
+ foo ((a != b) != c);
+ foo (a != (b != c));
+ foo (1 != 2 != c); // { dg-warning "comparison" "correct warning" }
+ foo ((1 != 2) != c);
+ foo (1 != (2 != c));
+ foo (1 != 2 != 3); // { dg-warning "comparison" "correct warning" }
+ foo ((1 != 2) != 3);
+ foo (1 != (2 != 3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-7.C
new file mode 100644
index 000000000..7d549c38c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-7.C
@@ -0,0 +1,83 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ copy of gcc.dg/Wparentheses-4.c
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a + b << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) << c);
+ foo (a + (b << c));
+ foo (1 + 2 << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) << c);
+ foo (1 + (2 << c));
+ foo (1 + 2 << 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) << 3);
+ foo (1 + (2 << 3));
+ foo (a << b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a << b) + c);
+ foo (a << (b + c));
+ foo (1 << 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 << 2) + c);
+ foo (1 << (2 + c));
+ foo (1 << 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 << 2) + 3);
+ foo (1 << (2 + 3));
+ foo (a + b >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) >> c);
+ foo (a + (b >> c));
+ foo (1 + 2 >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) >> c);
+ foo (1 + (2 >> c));
+ foo (1 + 2 >> 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) >> 3);
+ foo (1 + (2 >> 3));
+ foo (a >> b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >> b) + c);
+ foo (a >> (b + c));
+ foo (1 >> 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >> 2) + c);
+ foo (1 >> (2 + c));
+ foo (1 >> 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 >> 2) + 3);
+ foo (1 >> (2 + 3));
+ foo (a - b << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) << c);
+ foo (a - (b << c));
+ foo (6 - 5 << c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) << c);
+ foo (6 - (5 << c));
+ foo (6 - 5 << 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) << 4);
+ foo (6 - (5 << 4));
+ foo (a << b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a << b) - c);
+ foo (a << (b - c));
+ foo (6 << 5 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 << 5) - c);
+ foo (6 << (5 - c));
+ foo (6 << 5 - 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 << 5) - 4);
+ foo (6 << (5 - 4));
+ foo (a - b >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) >> c);
+ foo (a - (b >> c));
+ foo (6 - 5 >> c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) >> c);
+ foo (6 - (5 >> c));
+ foo (6 - 5 >> 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 - 5) >> 4);
+ foo (6 - (5 >> 4));
+ foo (a >> b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a >> b) - c);
+ foo (a >> (b - c));
+ foo (6 >> 5 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 >> 5) - c);
+ foo (6 >> (5 - c));
+ foo (6 >> 5 - 4); // { dg-warning "parentheses" "correct warning" }
+ foo ((6 >> 5) - 4);
+ foo (6 >> (5 - 4));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-8.C
new file mode 100644
index 000000000..ddb5e64b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-8.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-5.c
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a && b || c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a && b) || c);
+ foo (a && (b || c));
+ foo (1 && 2 || c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 && 2) || c);
+ foo (1 && (2 || c));
+ foo (1 && 2 || 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 && 2) || 3);
+ foo (1 && (2 || 3));
+ foo (a || b && c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a || b) && c);
+ foo (a || (b && c));
+ foo (1 || 2 && c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 || 2) && c);
+ foo (1 || (2 && c));
+ foo (1 || 2 && 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 || 2) && 3);
+ foo (1 || (2 && 3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-9.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-9.C
new file mode 100644
index 000000000..bad6fb1c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wparentheses-9.C
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+
+// C++ version of gcc.dg/Wparentheses-6.c
+
+int foo (int);
+
+int
+bar (int a, int b, int c)
+{
+ foo (a & b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a & b) | c);
+ foo (a & (b | c));
+ foo (1 & 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) | c);
+ foo (1 & (2 | c));
+ foo (1 & 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 & 2) | 3);
+ foo (1 & (2 | 3));
+ foo (a | b & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) & c);
+ foo (a | (b & c));
+ foo (1 | 2 & c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) & c);
+ foo (1 | (2 & c));
+ foo (1 | 2 & 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) & 3);
+ foo (1 | (2 & 3));
+ foo (a ^ b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a ^ b) | c);
+ foo (a ^ (b | c));
+ foo (1 ^ 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) | c);
+ foo (1 ^ (2 | c));
+ foo (1 ^ 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 ^ 2) | 3);
+ foo (1 ^ (2 | 3));
+ foo (a | b ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) ^ c);
+ foo (a | (b ^ c));
+ foo (1 | 2 ^ c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) ^ c);
+ foo (1 | (2 ^ c));
+ foo (1 | 2 ^ 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) ^ 3);
+ foo (1 | (2 ^ 3));
+ foo (a + b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a + b) | c);
+ foo (a + (b | c));
+ foo (1 + 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) | c);
+ foo (1 + (2 | c));
+ foo (1 + 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 + 2) | 3);
+ foo (1 + (2 | 3));
+ foo (a | b + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) + c);
+ foo (a | (b + c));
+ foo (1 | 2 + c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) + c);
+ foo (1 | (2 + c));
+ foo (1 | 2 + 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) + 3);
+ foo (1 | (2 + 3));
+ foo (a - b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a - b) | c);
+ foo (a - (b | c));
+ foo (1 - 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) | c);
+ foo (1 - (2 | c));
+ foo (1 - 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 - 2) | 3);
+ foo (1 - (2 | 3));
+ foo (a | b - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) - c);
+ foo (a | (b - c));
+ foo (1 | 2 - c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) - c);
+ foo (1 | (2 - c));
+ foo (1 | 2 - 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) - 3);
+ foo (1 | (2 - 3));
+ foo (a > b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a > b) | c);
+ foo (a > (b | c));
+ foo (1 > 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 > 2) | c);
+ foo (1 > (2 | c));
+ foo (1 > 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 > 2) | 3);
+ foo (1 > (2 | 3));
+ foo (a | b > c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) > c);
+ foo (a | (b > c));
+ foo (1 | 2 > c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) > c);
+ foo (1 | (2 > c));
+ foo (1 | 2 > 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) > 3);
+ foo (1 | (2 > 3));
+ foo (a <= b | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a <= b) | c);
+ foo (a <= (b | c));
+ foo (1 <= 2 | c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 <= 2) | c);
+ foo (1 <= (2 | c));
+ foo (1 <= 2 | 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 <= 2) | 3);
+ foo (1 <= (2 | 3));
+ foo (a | b <= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((a | b) <= c);
+ foo (a | (b <= c));
+ foo (1 | 2 <= c); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) <= c);
+ foo (1 | (2 <= c));
+ foo (1 | 2 <= 3); // { dg-warning "parentheses" "correct warning" }
+ foo ((1 | 2) <= 3);
+ foo (1 | (2 <= 3));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wpointer-arith-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wpointer-arith-1.C
new file mode 100644
index 000000000..a4aa69608
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wpointer-arith-1.C
@@ -0,0 +1,13 @@
+// PR c++/56815
+// { dg-options "-Wpointer-arith" }
+
+int main()
+{
+ void *pv = 0;
+ pv++; // { dg-warning "forbids incrementing a pointer" }
+
+ typedef void (*pft) ();
+
+ pft pf = 0;
+ pf++; // { dg-warning "forbids incrementing a pointer" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C
new file mode 100644
index 000000000..3a9b019b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C
@@ -0,0 +1,12 @@
+// PR c++/15867
+// { dg-options -Wredundant-decls }
+
+template <typename T> struct S
+{
+ void foo() {}
+};
+
+template<> void S<int>::foo();
+
+template<> void S<double>::foo(); // { dg-message "previous declaration" }
+template<> void S<double>::foo(); // { dg-warning "redundant redeclaration" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreorder-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreorder-1.C
new file mode 100644
index 000000000..940ef4a46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreorder-1.C
@@ -0,0 +1,14 @@
+// { dg-options "-Wreorder -W" }
+
+struct S {
+ S ();
+};
+
+struct T {
+ T ();
+};
+
+struct U : virtual public S, virtual public T {
+ U () : T (), S () {} // { dg-warning "" }
+ U (const U&) : S () {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-1.C
new file mode 100644
index 000000000..f0dba504b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-1.C
@@ -0,0 +1,9 @@
+// { dg-options "-Wreturn-type" }
+// PR c++/15742
+
+extern void exit(int) __attribute__ ((noreturn));
+
+template<typename T>
+struct A {
+ int find_cmp(void) { exit(1); }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-2.C
new file mode 100644
index 000000000..460afd53a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+int foo(int first) {
+ while (true) {
+ return first;
+ }
+} // { dg-bogus "control reaches" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-3.C
new file mode 100644
index 000000000..822dd4fdd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-3.C
@@ -0,0 +1,18 @@
+// { dg-options "-Wreturn-type" }
+// PR c++/20624
+
+struct fpos {
+ fpos(int __pos) {}
+};
+struct g {
+ g();
+ ~g();
+};
+fpos seekoff(int b, int c)
+{
+ g __buf;
+ if (b != -1 && c >= 0)
+ return fpos(-1);
+ else
+ return fpos(-1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-4.C
new file mode 100644
index 000000000..7d751f2de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-4.C
@@ -0,0 +1,48 @@
+// PR middle-end/51647
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+enum PropertyAttributes { NONE = 1 };
+enum PropertyType { NORMAL = 0, FIELD = 1 };
+class LookupResult;
+
+template <typename T>
+struct Handle
+{
+ inline explicit Handle (T *obj) __attribute__ ((always_inline)) {}
+ inline T *operator-> () const __attribute__ ((always_inline)) { return 0; }
+};
+
+struct JSObject
+{
+ bool IsGlobalObject () { return false; }
+};
+
+struct Isolate
+{
+ LookupResult *top_lookup_result () { return 0; }
+};
+
+struct LookupResult
+{
+ explicit LookupResult (Isolate *isolate) {}
+ JSObject *holder () { return 0; }
+ PropertyType type () { return NORMAL; }
+};
+
+int
+test (LookupResult *lookup)
+{
+ Handle <JSObject> holder (lookup->holder ());
+ switch (lookup->type ())
+ {
+ case NORMAL:
+ if (holder->IsGlobalObject ())
+ return 2;
+ else
+ return 3;
+ break;
+ default:
+ return 4;
+ }
+} // { dg-bogus "control reaches end of non-void function" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
new file mode 100644
index 000000000..faa3a3454
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
@@ -0,0 +1,20 @@
+// { dg-do assemble }
+// { dg-options "-Werror=return-local-addr" }
+// { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 }
+
+int& bad1()
+{
+ int x = 0; // { dg-error "reference to local variable" }
+ return x;
+}
+
+int* bad2()
+{
+ int x = 0; // { dg-error "address of local variable" }
+ return &x;
+}
+
+const int& bad4()
+{
+ return int(); // { dg-error "returning reference to temporary" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C
new file mode 100644
index 000000000..fb9a86291
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C
@@ -0,0 +1,11 @@
+// PR c++/11725
+// { dg-options "-Wreturn-type" }
+
+template <class T>
+struct A
+{
+ int foo()
+ {
+ throw "Stop";
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-10.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-10.C
new file mode 100644
index 000000000..2043b6cf2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-10.C
@@ -0,0 +1,13 @@
+// PR c++/59916
+// { dg-options "-Os -Wreturn-type" }
+
+class A {};
+
+struct B : virtual public A
+{
+ B();
+ virtual ~B();
+};
+
+B::B() {}
+B::~B() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C
new file mode 100644
index 000000000..ad59d4ec3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C
@@ -0,0 +1,20 @@
+// PR middle-end/16558
+// { dg-options "-Wreturn-type" }
+
+struct C
+{
+ C ();
+ ~C ();
+};
+
+int getref (int ndx)
+{
+ C d;
+
+ if (ndx != 0) {
+ C base;
+ return 0;
+ }
+ else
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C
new file mode 100644
index 000000000..f13d58745
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C
@@ -0,0 +1,14 @@
+// PR middle-end/19583
+// { dg-options "-Wreturn-type -O" }
+
+struct E{};
+
+inline int bar() throw(E)
+{
+ return 0;
+}
+
+void foo ()
+{
+ bar();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C
new file mode 100644
index 000000000..4f02678e7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C
@@ -0,0 +1,43 @@
+/* PR c++/18313 */
+/* { dg-do compile } */
+/* { dg-options "-Wignored-qualifiers" } */
+
+volatile void bar(); /* { dg-warning "type qualifiers ignored" } */
+
+struct A
+{
+ const int bla(); /* { dg-warning "type qualifiers ignored" } */
+ static const A getA(); /* { dg-bogus "type qualifiers" } */
+};
+
+template<typename T> const T getfoo(const T def) /* { dg-bogus "type qualifiers ignored" } */
+{ return def; }
+
+template<typename T> class Pair
+{
+ public:
+ T getLeft() const { return T(); } /* { dg-bogus "type qualifiers ignored" } */
+ const T getRight() const { return T(); } /* { dg-bogus "type qualifiers ignored" } */
+};
+
+template <typename T> struct S {
+ const int f(); /* { dg-warning "type qualifiers ignored" } */
+ const T g(); /* { dg-bogus "type qualifiers ignored" } */
+ T h();
+};
+
+int* testtemplate()
+{
+ int i;
+
+ Pair<const int> a;
+
+ a.getLeft();
+ a.getRight();
+
+ S<bool> b;
+ b.h(); /* { dg-bogus "type qualifiers ignored" } */
+ b.g(); /* { dg-bogus "type qualifiers ignored" } */
+
+ return getfoo<int*>(&i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C
new file mode 100644
index 000000000..8a19d646f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C
@@ -0,0 +1,21 @@
+// PR c++/36254
+// { dg-do compile }
+// { dg-options "-Wreturn-type" }
+
+int i, j, k;
+struct X { X (); ~X (); };
+
+bool
+foo ()
+{
+ X x;
+ if (i && j)
+ {
+ if (k)
+ return true;
+ else
+ return false;
+ }
+ else
+ return false;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C
new file mode 100644
index 000000000..45ec95236
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C
@@ -0,0 +1,13 @@
+/* PR c++/40749 */
+/* { dg-do compile } */
+/* { dg-options "-Wreturn-type" } */
+
+struct A {};
+const A a() {} /* { dg-warning "no return statement" } */
+const A& b() {} /* { dg-warning "no return statement" } */
+
+const int c() {} /* { dg-warning "no return statement" } */
+
+template<class T>
+const int foo(T t) {} /* { dg-warning "no return statement" } */
+int d = foo<int>(0), e = foo<int>(1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-7.C
new file mode 100644
index 000000000..62e34a519
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-7.C
@@ -0,0 +1,16 @@
+// PR c++/20681
+// { dg-options -Wreturn-type }
+
+struct a{~a();a();};
+int GetMetaCombination (int a2)
+{
+ a bi;
+ switch (a2)
+ {
+ case 1:
+ return 18;
+ break;//removing this works around the warning
+ default:
+ return 0;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-8.C
new file mode 100644
index 000000000..346cab476
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-8.C
@@ -0,0 +1,90 @@
+// PR c++/54046
+// { dg-do compile }
+// { dg-options "-O0 -Wall" }
+
+void foo (void) __attribute__((noreturn));
+
+struct A
+{
+ ~A () {}
+};
+
+bool
+check1 (int x)
+{
+ A z;
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ throw "X";
+ break;
+ }
+}
+
+bool
+check2 (int x)
+{
+ A z;
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ foo ();
+ break;
+ }
+}
+
+bool
+check3 (int x)
+{
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ throw "X";
+ break;
+ }
+}
+
+bool
+check4 (int x)
+{
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ foo ();
+ break;
+ }
+}
+
+bool
+check5 (int x)
+{
+ A z;
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ throw "X";
+ }
+}
+
+bool
+check6 (int x)
+{
+ A z;
+ switch (x)
+ {
+ case 0:
+ return false;
+ default:
+ foo ();
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-9.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-9.C
new file mode 100644
index 000000000..1c4d5b8d1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-type-9.C
@@ -0,0 +1,60 @@
+// related to PR c++/55189
+// { dg-options "-Wreturn-type" }
+
+int f1()
+{
+ while (true) { }
+}
+int f2()
+{
+ while (true) { break; }
+} // { dg-warning "no return statement" }
+
+int f3()
+{
+ for (;;) {}
+}
+int f4()
+{
+ for (;;) {break;}
+} // { dg-warning "no return statement" }
+
+int f5()
+{
+ do {} while(true);
+}
+int f6()
+{
+ do {break;} while(true);
+} // { dg-warning "no return statement" }
+
+int f7()
+{
+ for(;;)
+ while (true) {break;}
+}
+
+int f8()
+{
+ for(;;)
+ {
+ while (true) {}
+ break;
+ }
+}
+
+template <class T>
+T f9()
+{
+ for(;;) { }
+}
+
+template int f9();
+
+template <class T>
+T f10()
+{
+ for(;;) { break; }
+} // { dg-warning "no return statement" }
+
+template int f10();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C
new file mode 100644
index 000000000..fb5b8a1a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-Wsequence-point" }
+struct C
+{
+ ~C() throw();
+};
+
+void t_test1 (C* mapping)
+{
+ delete [] mapping;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C
new file mode 100644
index 000000000..6e00e0233
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C
@@ -0,0 +1,28 @@
+// PR c++/45894
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wsequence-point" }
+
+struct F
+{
+ template <typename = int>
+ void bar ();
+};
+template <typename = int>
+struct V
+{
+ V (const V &) { F::bar <>; }
+};
+struct C
+{
+ V <> v;
+};
+struct B
+{
+ C f ();
+};
+struct A
+{
+ C c;
+ B b;
+ A () : c (b.f ()) { }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C
new file mode 100644
index 000000000..5f73ca18b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C
@@ -0,0 +1,20 @@
+// PR c++/46401
+// { dg-do compile }
+// { dg-options "-Wsequence-point" }
+
+struct S
+{
+ S ();
+ S &operator<< (const char *);
+ S (const S &);
+};
+
+#define N1(n) << #n
+#define N2(n) N1(n)
+#define N3(n) N2(n##0) N2(n##1) N2(n##2) N2(n##3) N2(n##4) \
+ N2(n##5) N2(n##6) N2(n##7) N2(n##8) N2(n##9)
+#define N4(n) N3(n##0) N3(n##1) N3(n##2) N3(n##3) N3(n##4) \
+ N3(n##5) N3(n##6) N3(n##7) N3(n##8) N3(n##9)
+#define N5(n) N4(n##0) N4(n##1) N4(n##2) N4(n##3) N4(n##4) \
+ N4(n##5) N4(n##6) N4(n##7) N4(n##8) N4(n##9)
+S s = S () N5(a) N5(b);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C
new file mode 100644
index 000000000..63aecd0f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C
@@ -0,0 +1,24 @@
+/* PR 18050 : bogus warning with -Wsequence-point */
+/* { dg-do compile } */
+/* { dg-options "-Wsequence-point" } */
+
+struct x
+{
+ int i;
+};
+void bar(struct x*, int *);
+
+void foo(struct x *y)
+{
+ bar(y++, &y->i); /* { dg-warning "operation on 'y' may be undefined" } */
+}
+
+void zz(int a, int *b)
+{
+ *b = a;
+}
+
+void baz(void) {
+ int a = 5;
+ zz(++a, &a); /* { dg-bogus "operation on 'a' may be undefined" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-1.C
new file mode 100644
index 000000000..aec6bca54
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-1.C
@@ -0,0 +1,41 @@
+/* Copyright (C) 2001, 2002 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options -Wshadow } */
+
+/* Source: Neil Booth, 3 Nov 2001, and PR 16, 713. -Wshadow was
+ giving a bunch of warnings we didn't want, and wasn't giving the
+ location of the shadowed variable. */
+
+struct status // { dg-bogus "shadowed declaration" }
+{
+ int member;
+ void foo2 ();
+
+ inline static int foo3 (int member) // { dg-bogus "shadows" }
+ {
+ return member;
+ }
+};
+
+int decl1; // { dg-message "shadowed declaration" }
+int decl2; // { dg-message "shadowed declaration" }
+void foo (struct status &status,// { dg-bogus "shadows a global decl" }
+ double decl1) // { dg-warning "shadows a global decl" }
+{
+}
+
+void foo1 (int d)
+{
+ double d; // { dg-error "shadows a parameter" }
+}
+
+void status::foo2 ()
+{
+ int member; // { dg-warning "shadows a member" }
+ int decl2; // { dg-warning "shadows a global decl" }
+ int local; // { dg-message "shadowed declaration" }
+ {
+ int local; // { dg-warning "shadows a previous local" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-2.C
new file mode 100644
index 000000000..a3e9428b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-2.C
@@ -0,0 +1,10 @@
+/* { dg-options "-Wshadow" } */
+
+struct A {
+ void a1 () {
+ struct B { B() {} }; // There should be no warning here.
+ }
+ void a2 () {
+ struct B { };
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-3.C
new file mode 100644
index 000000000..99add19a4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-3.C
@@ -0,0 +1,8 @@
+// PR c++/18530
+// { dg-options "-Wshadow" }
+
+struct A {
+ A();
+ ~A();
+ void foo (int __ct, int __dt) {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-4.C
new file mode 100644
index 000000000..c033028d7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-4.C
@@ -0,0 +1,32 @@
+// PR c++/39526
+// { dg-options "-Wshadow" }
+
+class INetURLObject
+{
+public:
+ INetURLObject(int i);
+ int GetMainURL() const;
+};
+
+int foo(int infoo) // { dg-bogus "shadowed declaration" }
+{
+ int outfoo( INetURLObject( infoo ).GetMainURL()); // { dg-bogus "shadows" }
+ extern void f(int infoo);
+ struct A
+ {
+ void f(int infoo) { } // { dg-bogus "shadows a parameter" }
+ };
+ return outfoo;
+}
+
+// PR c++/39763
+int foo2(void)
+{
+ int infoo = 0; // { dg-bogus "shadowed declaration" }
+ int outfoo( INetURLObject( infoo ).GetMainURL()); // { dg-bogus "shadows" }
+ struct A
+ {
+ void f(int infoo) { } // { dg-bogus "shadows a previous local" }
+ };
+ return outfoo;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-5.C
new file mode 100644
index 000000000..66232913f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-5.C
@@ -0,0 +1,33 @@
+// Wshadows was giving warnings for nested function parameters in nested class
+// or structure that we didn't want.
+// { dg-do compile }
+// { dg-options "-Wshadow" }
+
+// PR c++/41825
+int f (int n)
+{
+ int bar (int n) { return n++; } // { dg-error "a function-definition is not allowed here" }
+ return bar (n); // { dg-error "was not declared in this scope" }
+}
+
+int g (int i)
+{
+ struct {
+ int bar (int i) { return i++; } // { dg-bogus "shadows" }
+ } s;
+
+ return s.bar (i);
+}
+
+// PR c++/30566
+void h( int x )
+{
+ class InnerClass
+ {
+ public:
+ static int g( int x ) // { dg-bogus "shadows" }
+ {
+ // empty
+ }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-6.C
new file mode 100644
index 000000000..9c2e8b894
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-6.C
@@ -0,0 +1,51 @@
+// Test the declaration of nested lambda function shadows
+// a parameter or previous local.
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wshadow" }
+
+struct S {};
+int f1(int x) // { dg-message "shadowed declaration" }
+{
+ int t = 0;
+ int m = 0; // { dg-message "shadowed declaration" }
+ [&t] (int x) { // { dg-warning "shadows a parameter" }
+ int m = 1; // { dg-warning "shadows a previous local" }
+ t = t + x + m;
+ };
+ return t;
+}
+
+void f2(struct S i, int j) {
+ struct A {
+ struct S x;
+ void g(struct S i) { // { dg-message "shadowed declaration" }
+ struct S x; // { dg-warning "shadows a member of" }
+ struct S y; // { dg-message "shadowed declaration" }
+ int t;
+ [&t](struct S i){ // { dg-warning "shadows a parameter" }
+ int j = 1; // { dg-bogus "shadows" }
+ struct S y; // { dg-warning "shadows a previous local" }
+ t = j;
+ };
+ }
+ };
+}
+
+void f3(int i) {
+ [=]{
+ int j = i; // { dg-message "shadowed declaration" }
+ int i; // { dg-warning "shadows a lambda capture" }
+ i = 1;
+ };
+}
+
+template <class T>
+void f4(int i) {
+ [=]{
+ int j = i; // { dg-message "shadowed declaration" }
+ int i; // { dg-warning "shadows a lambda capture" }
+ i = 1;
+ };
+}
+
+template void f4<int>(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-7.C
new file mode 100644
index 000000000..d354d0499
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wshadow-7.C
@@ -0,0 +1,37 @@
+// PR c++/44128
+// { dg-options "-Wshadow" }
+
+typedef long My_ssize_t; // { dg-message "shadowed declaration" }
+typedef int Foo; // { dg-message "shadowed declaration" }
+struct Bar1 { // { dg-bogus "shadowed declaration" }
+ int a;
+};
+struct Bar2 { // { dg-message "shadowed declaration" }
+ int a;
+};
+
+void func() {
+ typedef int My_ssize_t; // { dg-warning "shadows a global" }
+ typedef char My_Num; // { dg-message "shadowed declaration" }
+ {
+ typedef short My_Num; // { dg-warning "shadows a previous local" }
+ }
+ int Foo; // { dg-warning "shadows a global" }
+ float Bar1; // { dg-bogus "shadows a global" }
+ struct Bar2 { // { dg-warning "shadows a global" }
+ int a;
+ };
+ struct Bar3 { // { dg-message "shadowed declaration" }
+ int a;
+ };
+ struct Bar4 { // { dg-bogus "shadowed declaration" }
+ int a;
+ };
+ {
+ struct Bar3 { // { dg-warning "shadows a previous local" }
+ int a;
+ };
+ char Bar4; // { dg-bogus "shadows a previous local" }
+ int My_Num; // { dg-warning "shadows a previous local" }
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C
new file mode 100644
index 000000000..495bb992c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C
@@ -0,0 +1,6 @@
+// { dg-options "-Wsign-compare" }
+
+extern unsigned u;
+
+template<class F>
+int f() { return u > 1; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C
new file mode 100644
index 000000000..2b8360648
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C
@@ -0,0 +1,10 @@
+// PR c/35430
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+
+void
+foo (__complex__ int i)
+{
+ i == 0u;
+ i == ~1u; // { dg-warning "comparison between signed and unsigned integer expressions" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C
new file mode 100644
index 000000000..dc42f41a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+
+enum E { A, B, C };
+extern void f1(int);
+void
+f2(E v1, E v2)
+{
+ for (unsigned int i = v1; i <= v2; ++i)
+ f1(i);
+ for (int i = v1; i <= v2; ++i)
+ f1(i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-4.C
new file mode 100644
index 000000000..b3eb8e2a7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-4.C
@@ -0,0 +1,12 @@
+//PR c++/50012
+// { dg-options "-Wsign-compare" }
+
+int foo(unsigned int *a, int b)
+{
+ return (*a) <= b; // { dg-warning "comparison between signed and unsigned" }
+}
+
+int bar(unsigned int *a, int b)
+{
+ return *a <= b; // { dg-warning "comparison between signed and unsigned" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-5.C
new file mode 100644
index 000000000..641c49972
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-5.C
@@ -0,0 +1,20 @@
+// Test that -Wsign-compare doesn't warn about
+// equality/non-equality comparisons with sizeof.
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+
+int
+foo (int x)
+{
+ if (x != sizeof (sizeof (x))) // { dg-bogus "comparison between signed and unsigned integer expressions" }
+ return 1;
+ return 0;
+}
+
+int
+bar (int x)
+{
+ if (x == sizeof (sizeof (x)) + 1) // { dg-bogus "comparison between signed and unsigned integer expressions" }
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-6.C
new file mode 100644
index 000000000..1f8af664c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-6.C
@@ -0,0 +1,14 @@
+// PR c++/23608
+// { dg-options "-Wsign-compare" }
+
+#define FIVE 5
+
+int main()
+{
+ int i = 5;
+ int const ic = 5;
+
+ i < 5u; // { dg-warning "5:comparison between signed and unsigned" }
+ ic < 5u;
+ FIVE < 5u;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-7.C
new file mode 100644
index 000000000..51f13f6f9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-compare-7.C
@@ -0,0 +1,18 @@
+// PR c++/59231
+// { dg-options "-Wsign-compare" }
+
+template<class X, class Y>
+bool equals(X x, Y y)
+{
+ return (x == y); // { dg-warning "signed" }
+}
+
+int main()
+{
+ unsigned long x = 2;
+ signed int y = 2;
+
+ if(!equals (x, y))
+ return 1;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion-2.C
new file mode 100644
index 000000000..1664575c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion-2.C
@@ -0,0 +1,11 @@
+// PR c++/56530
+// { dg-options "-Wsign-conversion" }
+
+struct string
+{
+ string () {};
+ ~string () {};
+};
+
+string foo[1]; // okay
+string bar[1][1]; // gives bogus warning
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion.C
new file mode 100644
index 000000000..f6a0cccdf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsign-conversion.C
@@ -0,0 +1,95 @@
+/* Test for diagnostics for implicit conversions between signed and
+ unsigned integer types.
+ C++ equivalent of gcc/testsuite/gcc.dg/Wsign-conversion.c */
+
+// { dg-do compile }
+// { dg-options "-fsigned-char -Wsign-conversion -ftrack-macro-expansion=0" }
+#include <limits.h>
+
+void fsc (signed char sc);
+void fuc (unsigned char uc);
+unsigned fui (unsigned int ui);
+void fsi (signed int ui);
+
+void h (int x)
+{
+ unsigned int ui = 3;
+ int si = 3;
+ unsigned char uc = 3;
+ signed char sc = 3;
+
+ uc = ui;
+ uc = si;
+ sc = ui;
+ sc = si;
+ fuc (ui);
+ fuc (si);
+ fsc (ui);
+ fsc (si);
+
+ fsi (si);
+ fui (ui);
+ fsi (uc);
+ si = uc;
+ fui (uc);
+ ui = uc;
+ fui ('A');
+ ui = 'A';
+ fsi ('A');
+ si = 'A';
+ fuc ('A');
+ uc = 'A';
+
+ uc = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ uc = x ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ uc = x ? 1 : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ uc = x ? SCHAR_MIN : 1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = x ? INT_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = ui ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = 1U * -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = ui + INT_MIN; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = x ? 1 : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = ui ? SCHAR_MIN : 1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+
+ fuc (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ uc = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ fui (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ fuc ('\xa0'); /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ uc = '\xa0'; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ fui ('\xa0');/* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ui = '\xa0'; /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ fsi (0x80000000); /* { dg-warning "conversion" } */
+ si = 0x80000000; /* { dg-warning "conversion" } */
+
+
+ fsi (UINT_MAX - 1); /* { dg-warning "conversion" } */
+ si = UINT_MAX - 1; /* { dg-warning "conversion" } */
+ fsi (UINT_MAX - 1U); /* { dg-warning "conversion" } */
+ si = UINT_MAX - 1U; /* { dg-warning "conversion" } */
+ fsi (UINT_MAX/3U);
+ si = UINT_MAX/3U;
+ fsi (UINT_MAX/3);
+ si = UINT_MAX/3;
+ fui (UINT_MAX - 1);
+ ui = UINT_MAX - 1;
+
+ uc = (unsigned char) -1;
+ ui = -1 * (1 * -1);
+ ui = (unsigned) -1;
+
+ fsc (uc); /* { dg-warning "conversion" } */
+ sc = uc; /* { dg-warning "conversion" } */
+ fuc (sc); /* { dg-warning "conversion" } */
+ uc = sc; /* { dg-warning "conversion" } */
+ fsi (ui); /* { dg-warning "conversion" } */
+ si = ui; /* { dg-warning "conversion" } */
+ fui (si); /* { dg-warning "conversion" } */
+ ui = si; /* { dg-warning "conversion" } */
+ fui (sc); /* { dg-warning "conversion" } */
+ ui = sc; /* { dg-warning "conversion" } */
+}
+
+unsigned fui (unsigned a) { return a + -1; } /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsizeof-pointer-memaccess-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsizeof-pointer-memaccess-1.C
new file mode 100644
index 000000000..e2ba8769b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wsizeof-pointer-memaccess-1.C
@@ -0,0 +1,13 @@
+// Test -Wsizeof-pointer-memaccess warnings.
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+typedef __SIZE_TYPE__ size_t;
+extern "C" void *memset (void *, int, size_t);
+
+int
+foo (int x, char b[10])
+{
+ long a[memset (b, 0, sizeof (b)) ? x + 10 : x]; // { dg-warning "call is the same expression as the destination; did you mean to provide an explicit length?" }
+ return a[0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C
new file mode 100644
index 000000000..3e9db3611
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+double x;
+int *foo(void)
+{
+ return (int *)&x; /* { dg-warning "strict-aliasing" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C
new file mode 100644
index 000000000..713b35461
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+double x;
+
+template <typename T>
+T *foo(void)
+{
+ return (T *)&x; /* { dg-bogus "strict-aliasing" } */
+}
+
+template double *foo<double>(void);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C
new file mode 100644
index 000000000..408de0ef4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+double x;
+
+template <typename T>
+T *foo(void)
+{
+ return (T *)&x; /* { dg-warning "strict-aliasing" } */
+}
+
+template int *foo<int>(void); /* { dg-message "required from here" } */
+template char *foo<char>(void); /* { dg-bogus "required from here" } */
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C
new file mode 100644
index 000000000..e877c70fb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+double x;
+
+template <typename T>
+T *foo(void)
+{
+ int a[2];
+ float *y = (float *)a; /* { dg-bogus "strict-aliasing" } */
+ return (T *)&x; /* { dg-bogus "strict-aliasing" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C
new file mode 100644
index 000000000..a04925118
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+float foo ()
+{
+ unsigned int MASK = 0x80000000;
+ return (float &) MASK; /* { dg-warning "strict-aliasing" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C
new file mode 100644
index 000000000..6f935c854
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+int foo ()
+{
+ char buf[8];
+ return *((int *)buf); /* { dg-warning "strict-aliasing" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C
new file mode 100644
index 000000000..71ed6cae8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2" } */
+
+int a[2];
+
+double *foo1(void)
+{
+ return (double *)a; /* { dg-warning "strict-aliasing" } */
+}
+
+double *foo2(void)
+{
+ return (double *)&a[0]; /* { dg-warning "strict-aliasing" } */
+}
+
+__complex__ double x;
+int *bar(void)
+{
+ return (int *)&__imag__ x; /* { dg-warning "strict-aliasing" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C
new file mode 100644
index 000000000..497565eec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-aliasing=2 -O2 -Wall" } */
+
+int a[2];
+
+double *foo1(void)
+{
+ return (double *)a; /* { dg-warning "strict-aliasing" } */
+}
+
+double *foo2(void)
+{
+ return (double *)&a[0]; /* { dg-warning "strict-aliasing" } */
+}
+
+__complex__ double x;
+int *bar(void)
+{
+ return (int *)&__imag__ x; /* { dg-warning "strict-aliasing" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C
new file mode 100644
index 000000000..18e6caf90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+class base {
+ public:
+ int x;
+};
+
+class derived: public base {
+ public:
+ int y;
+};
+
+base foo () {
+ derived d;
+ base* pb = &d; /* { dg-bogus "base vs. derived" } */
+ pb->x = 1;
+
+ return d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C
new file mode 100644
index 000000000..bdd24aca6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+int foo () {
+ int i;
+ char* c= reinterpret_cast<char*>(&i); /* { dg-bogus "char" } */
+ c[1] = 1;
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C
new file mode 100644
index 000000000..7c079ad5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+int foo(int* p) {
+ const int& q = *p; /* { dg-bogus "const vs. non-const" } */
+ *p = 1;
+ return q;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C
new file mode 100644
index 000000000..29414e00e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing" } */
+
+#include<list>
+
+struct A
+{
+ virtual ~A();
+};
+
+A* foo();
+
+void bar(std::list<int> x)
+{
+ std::list<int> y = x;
+ if (*y.rbegin())
+ delete foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C
new file mode 100644
index 000000000..de6b2c477
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing" } */
+
+struct Node_base {};
+
+struct Node : Node_base
+{
+ int data;
+};
+
+struct List
+{
+ Node_base node, *prev;
+
+ List() : prev(&node) { xyz(); }
+
+ void xyz();
+
+ int back() { return static_cast<Node*>(prev)->data; }
+};
+
+struct A
+{
+ virtual ~A();
+};
+
+A* foo();
+
+void bar()
+{
+ List y;
+ if (y.back())
+ delete foo();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C
new file mode 100644
index 000000000..9ea619877
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing" } */
+
+#include <string>
+#include <list>
+
+class A;
+
+class B {
+public:
+ void foo(A&);
+ std::string s;
+};
+
+class A {
+public:
+ A& qaz() {
+ l.push_back( new A() );
+ return *l.back();
+ }
+ std::list<A*> l;
+};
+
+void bar()
+{
+ A a;
+ B b;
+ b.foo(a.qaz());
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C
new file mode 100644
index 000000000..529118102
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+int foo () {
+ int buffer[10][10];
+ int* pi = &buffer[0][0]; /* { dg-bogus "same element type" } */
+ *pi = 10;
+ return buffer[0][0];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C
new file mode 100644
index 000000000..514957bcd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing" } */
+
+inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; }
+
+struct Y {
+ Y() {}
+ int i;
+};
+
+struct X {
+ X() {}
+ void construct(const Y& y)
+ {
+ new (&m_data[0]) Y(y);
+ }
+ bool initialized;
+ char m_data[sizeof (Y)];
+};
+
+void bar(const X&);
+void foo(Y& y)
+{
+ X x;
+ x.construct(y);
+ x.initialized = true;
+ bar(x);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C
new file mode 100644
index 000000000..5e71ebff8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+int foo () {
+ int i;
+ unsigned int* pu = reinterpret_cast<unsigned int*> (&i); /* { dg-bogus "signed vs. unsigned" } */
+ *pu = 1000000;
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C
new file mode 100644
index 000000000..3f55c78c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+struct S {
+ int i;
+ float f;
+};
+
+int foo () {
+ struct S s;
+ s.i = 7;
+ float* f = &s.f; /* { dg-bogus "float included in struct S" } */
+ *f = 2.0;
+ return s.i + (int)s.f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C
new file mode 100644
index 000000000..dfbb42c6f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+union U {
+ int i;
+ float f;
+};
+
+float foo () {
+ union U u;
+ float* f = &u.f; /* { dg-bogus "unions are holy in GCC" } */
+ u.i = 2;
+ return *f;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C
new file mode 100644
index 000000000..9027061c5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */
+
+
+int foo() {
+ int x;
+ float& q = reinterpret_cast<float&> (x); /* { dg-message "dereferencing type-punned" "deref" { target *-*-* } } */
+ q = 1.0; /* { dg-warning "does break strict-aliasing" "strict-aliasing" { xfail *-*-* } } */
+ return x;
+}
+
+/* { dg-message "initialized" "note" { xfail *-*-* } 7 } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C
new file mode 100644
index 000000000..97e317644
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C
@@ -0,0 +1,29 @@
+/* PR c/7776 */
+/* { dg-do compile } */
+/* { dg-options "-Waddress" } */
+
+int test1(char *ptr)
+{
+ return ptr == "foo"; /* { dg-warning "comparison with string" } */
+}
+
+int test2()
+{
+ return "foo" != (const char*)0;
+}
+
+int test3()
+{
+ return "foo" == (const char*)0;
+}
+
+int test4()
+{
+ return (const char*)0 != "foo";
+}
+
+int test5()
+{
+ return (const char*)0 == "foo";
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C
new file mode 100644
index 000000000..3eb91eeca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C
@@ -0,0 +1,29 @@
+/* PR c/7776 */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int test1(char *ptr)
+{
+ return ptr == "foo"; /* { dg-warning "comparison with string" } */
+}
+
+int test2()
+{
+ return "foo" != (const char*)0;
+}
+
+int test3()
+{
+ return "foo" == (const char*)0;
+}
+
+int test4()
+{
+ return (const char*)0 != "foo";
+}
+
+int test5()
+{
+ return (const char*)0 == "foo";
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C
new file mode 100644
index 000000000..f700a51a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C
@@ -0,0 +1,29 @@
+/* PR c/7776 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int test1(char *ptr)
+{
+ return ptr == "foo";
+}
+
+int test2()
+{
+ return "foo" != (const char*)0;
+}
+
+int test3()
+{
+ return "foo" == (const char*)0;
+}
+
+int test4()
+{
+ return (const char*)0 != "foo";
+}
+
+int test5()
+{
+ return (const char*)0 == "foo";
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C
new file mode 100644
index 000000000..f2a711aeb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C
@@ -0,0 +1,29 @@
+/* PR c/7776 */
+/* { dg-do compile } */
+/* { dg-options "-Wall -Wno-address" } */
+
+int test1(char *ptr)
+{
+ return ptr == "foo";
+}
+
+int test2()
+{
+ return "foo" != (const char*)0;
+}
+
+int test3()
+{
+ return "foo" == (const char*)0;
+}
+
+int test4()
+{
+ return (const char*)0 != "foo";
+}
+
+int test5()
+{
+ return (const char*)0 == "foo";
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-1.C
new file mode 100644
index 000000000..1da7180ec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-1.C
@@ -0,0 +1,63 @@
+/* PR c/4475, PR c++/3780 */
+/* { dg-do compile } */
+/* { dg-options "-Wswitch" } */
+
+enum e { e1, e2 };
+
+int
+foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
+ enum e em, enum e en, enum e eo, enum e ep)
+{
+ switch (i)
+ {
+ case 1: return 1;
+ case 2: return 2;
+ }
+ switch (j)
+ {
+ case 3: return 4;
+ case 4: return 3;
+ default: break;
+ }
+ switch (ei) /* { dg-warning "enumeration value 'e1' not handled in switch" "enum e1" } */
+ { /* { dg-warning "enumeration value 'e2' not handled in switch" "enum e2" { target *-*-* } 22 } */
+ }
+ switch (ej)
+ {
+ default: break;
+ }
+ switch (ek) /* { dg-warning "enumeration value 'e2' not handled in switch" "enum e2" } */
+ {
+ case e1: return 1;
+ }
+ switch (el)
+ {
+ case e1: return 1;
+ default: break;
+ }
+ switch (em)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ }
+ switch (en)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ default: break;
+ }
+ switch (eo)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ case 3: return 3; /* { dg-warning "case value" } */
+ }
+ switch (ep)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ case 3: return 3; /* { dg-warning "case value" } */
+ default: break;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-2.C
new file mode 100644
index 000000000..79ba4bdcb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-2.C
@@ -0,0 +1,31 @@
+/* Further -Wswitch tests. */
+/* { dg-do compile } */
+/* { dg-options "-Wswitch" } */
+
+enum e { e1 = 0, e2 = 1, e3 = 1, e4 = 2 };
+
+int
+foo (enum e ei, int j)
+{
+ switch (ei)
+ {
+ case e1: return 1;
+ case e3: return 2;
+ case e4: return 3;
+ } /* No warning here since e2 has the same value as e3. */
+ switch (ei) /* { dg-warning "enumeration value 'e4' not handled in switch" "enum e4" } */
+ {
+ case e1: return 1;
+ case e2: return 2;
+ }
+ switch ((int) ei)
+ {
+ case e1: return 1;
+ } /* No warning here since switch condition was cast to int. */
+ switch ((enum e) j) /* { dg-warning "enumeration value 'e1' not handled in switch" "enum e1" } */
+ {
+ case e2: return 1;
+ case e4: return 2;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-3.C
new file mode 100644
index 000000000..df1f8956d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-3.C
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-Wswitch" } */
+
+enum E { A, B, C, D, E, F };
+
+int
+f1 (enum E e)
+{
+ switch (e)
+ {
+ case A: return 1;
+ case B: return 2;
+ case C: return 3;
+ case D: return 4;
+ case E: return 5;
+ case F: return 6;
+ case 7: return 7; /* { dg-warning "not in enumerated type" } */
+ }
+ return 0;
+}
+
+int
+f2 (enum E e)
+{
+ switch (e)
+ {
+ case A: return 1;
+ case B: return 2;
+ case C: return 3;
+ case D: return 4;
+ case E: return 5;
+ case F: return 6;
+ case 7: return 7; /* { dg-warning "not in enumerated type" } */
+ default: return 8;
+ }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C
new file mode 100644
index 000000000..2236ae531
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C
@@ -0,0 +1,22 @@
+// PR C++/21123
+/* { dg-do compile } */
+/* { dg-options "-Wswitch-default" } */
+
+
+template <typename ArrayType>
+void foo( )
+{
+ int i = 0;
+
+ switch ( i ) /* { dg-bogus "switch missing default case" } */
+ {
+ case 9:
+ default:
+ break;
+ }
+}
+
+void f()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C
new file mode 100644
index 000000000..832f867e0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C
@@ -0,0 +1,21 @@
+// PR C++/21123
+/* { dg-do compile } */
+/* { dg-options "-Wswitch-default" } */
+
+
+template <typename ArrayType>
+void foo( )
+{
+ int i = 0;
+
+ switch ( i ) /* { dg-warning "switch missing default case" } */
+ {
+ case 9:
+ break;
+ }
+}
+
+void f()
+{
+ foo<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C
new file mode 100644
index 000000000..f840f306b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C
@@ -0,0 +1,84 @@
+/* Test that -Wtype-limits is enabled by -Wextra. */
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+extern void assert (int);
+
+void a (unsigned char x)
+{
+ if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (x <= 255) /* { dg-warning "comparison is always true due to limited range of data type" } */
+ return;
+ if (255 >= x) /* { dg-warning "comparison is always true due to limited range of data type" } */
+ return;
+ if ((int)x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 16 } */
+ return;
+ if (255 >= (unsigned char) 1)
+ return;
+
+}
+
+void b (unsigned short x)
+{
+ if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+}
+
+void c (unsigned int x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (1U >= 0) return;
+ if (1U < 0) return;
+ if (0 <= 1U) return;
+ if (0 > 1U) return;
+}
+
+void d (unsigned long x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+}
+
+void e (unsigned long long x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+}
+
+int test (int x)
+{
+ if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 61 } */
+ return 1;
+ else
+ return 0;
+}
+
+template <typename Int, Int D>
+void f(Int x) {
+ assert(0 <= x and x <= D);
+}
+
+int ff(void) {
+ f<unsigned char, 2>(5);
+ f<signed char, 2>(5);
+}
+
+template <typename Int, Int D>
+void g(void) {
+ assert(0 <= D);
+}
+int gg(void) {
+ g<unsigned char, 2>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C
new file mode 100644
index 000000000..5040e2657
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C
@@ -0,0 +1,84 @@
+/* Test disabling -Wtype-limits. */
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wno-type-limits" } */
+extern void assert (int);
+
+void a (unsigned char x)
+{
+ if (x < 0) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */
+ if (x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" } */
+ return;
+ if (255 >= x) /* { dg-bogus "comparison is always true due to limited range of data type" } */
+ return;
+ if ((int)x <= 255)
+ return;
+ if (255 >= (unsigned char) 1)
+ return;
+
+}
+
+void b (unsigned short x)
+{
+ if (x < 0) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */
+}
+
+void c (unsigned int x)
+{
+ if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+ if (1U >= 0) return;
+ if (1U < 0) return;
+ if (0 <= 1U) return;
+ if (0 > 1U) return;
+}
+
+void d (unsigned long x)
+{
+ if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+}
+
+void e (unsigned long long x)
+{
+ if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */
+}
+
+int test (int x)
+{
+ if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" } */
+ return 1;
+ else
+ return 0;
+}
+
+template <typename Int, Int D>
+void f(Int x) {
+ assert(0 <= x and x <= D); // { dg-bogus "comparison is always true due to limited range of data type" }
+}
+
+int ff(void) {
+ f<unsigned char, 2>(5);
+ f<signed char, 2>(5);
+}
+
+template <typename Int, Int D>
+void g(void) {
+ assert(0 <= D);
+}
+int gg(void) {
+ g<unsigned char, 2>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits.C
new file mode 100644
index 000000000..a352e7ba9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wtype-limits.C
@@ -0,0 +1,84 @@
+/* { dg-do compile } */
+/* { dg-options "-Wtype-limits" } */
+
+extern void assert (int);
+
+void a (unsigned char x)
+{
+ if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (x <= 255) /* { dg-warning "comparison is always true due to limited range of data type" } */
+ return;
+ if (255 >= x) /* { dg-warning "comparison is always true due to limited range of data type" } */
+ return;
+ if ((int)x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 16 } */
+ return;
+ if (255 >= (unsigned char) 1)
+ return;
+
+}
+
+void b (unsigned short x)
+{
+ if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+ if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */
+ if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */
+}
+
+void c (unsigned int x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (1U >= 0) return;
+ if (1U < 0) return;
+ if (0 <= 1U) return;
+ if (0 > 1U) return;
+}
+
+void d (unsigned long x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+}
+
+void e (unsigned long long x)
+{
+ if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+ if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */
+ if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */
+}
+
+int test (int x)
+{
+ if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 61 } */
+ return 1;
+ else
+ return 0;
+}
+
+template <typename Int, Int D>
+void f(Int x) {
+ assert(0 <= x and x <= D);
+}
+
+int ff(void) {
+ f<unsigned char, 2>(5);
+ f<signed char, 2>(5);
+}
+
+template <typename Int, Int D>
+void g(void) {
+ assert(0 <= D);
+}
+int gg(void) {
+ g<unsigned char, 2>();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C
new file mode 100644
index 000000000..0f6ccfd9d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C
@@ -0,0 +1,15 @@
+// Test disabling
+// { dg-do compile }
+// { dg-options "-Wall -Wextra -Wno-uninitialized" }
+
+class X {
+ int & flag;// { dg-bogus "non-static reference 'int& X::flag' in class without a constructor" }
+public:
+ void f(){ flag++ ; }
+};
+
+class Y {
+ const int var;// { dg-bogus "non-static const member 'const int Y::var' in class without a constructor" }
+public:
+ int g(){ return 2*var; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C
new file mode 100644
index 000000000..1c37e3ea0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wuninitialized" }
+
+class X {
+ int & flag;// { dg-warning "non-static reference 'int& X::flag' in class without a constructor" }
+public:
+ void f(){ flag++ ; }
+};
+
+class Y {
+ const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" }
+public:
+ int g(){ return 2*var; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C
new file mode 100644
index 000000000..7b1b90b94
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C
@@ -0,0 +1,15 @@
+/* { dg-options "-O2 -Wuninitialized" } */
+
+struct Empty { Empty() {} }; /* { dg-bogus "uninitialized" } */
+struct Other {
+ Other(const Empty& e_) : e(e_) {}
+ Empty e;
+};
+void bar(Other&);
+void foo()
+{
+ Empty e;
+ Other o(e);
+ bar(o);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C
new file mode 100644
index 000000000..2b6f92530
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C
@@ -0,0 +1,53 @@
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+struct S8 { template<typename T> S8(T) { } };
+
+template<typename T> struct S10;
+template<typename T> struct S10<T()> { typedef T S12; typedef S8 S1(); };
+
+template<typename T> struct S3 { };
+template<typename T> struct S11 { S11(S3<T>); };
+
+struct S2
+{
+ template<typename T> operator S11<T>() { return S11<T>(S5<T>()); }
+ template<typename T> struct S5:public S3<T>
+ {
+ virtual typename S10<T>::S12 S13() {
+ return 0;
+ }
+ };
+};
+
+template<typename T> S11<T> S6(S3<T>) { return S11<T>(S3<T>()); }
+template<typename S12> struct S7 { typedef S12 S15(); };
+
+struct S4
+{
+ template<typename T> operator S11<T>()
+ {
+ struct S14:public S3<T>
+ {
+ S14(S2 x):S11_(x) { }
+ S11<typename S7<typename S10<T>::S12>::S15> S11_;
+ };
+ return S6(S14(S11_));
+ }
+ S2 S11_;
+};
+
+struct S9
+{
+ template<typename F> operator S11<F>() { return S11<F>(S14<F>(S11_)); }
+ template<typename F> struct S14:public S3<F>
+ {
+ S14(S4 x):S11_(x) { }
+ S11<typename S10<F>::S1> S11_;
+ };
+ S4 S11_;
+};
+
+void S15(S11<void()>);
+void S16() { S9 x; S15(x); }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C
new file mode 100644
index 000000000..dc3be3f67
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C
@@ -0,0 +1,17 @@
+// PR C++/38908
+// { dg-options "-Wuninitialized -O" }
+
+struct empty {};
+
+struct dfs_visitor {
+ dfs_visitor() { }
+ empty m_vis;
+};
+
+void bar(const dfs_visitor&);
+void foo(void)
+{
+ dfs_visitor vis;
+ dfs_visitor vis2 = vis;
+ bar (vis2);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C
new file mode 100644
index 000000000..3d2543fb1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C
@@ -0,0 +1,22 @@
+// PR middle-end/39666
+// { dg-do compile }
+// { dg-options "-O2 -Wuninitialized" }
+
+int
+foo (int i)
+{
+ int j;
+ switch (i)
+ {
+ case -__INT_MAX__ - 1 ... -1:
+ j = 6;
+ break;
+ case 0:
+ j = 5;
+ break;
+ case 1 ... __INT_MAX__:
+ j = 4;
+ break;
+ }
+ return j;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C
new file mode 100644
index 000000000..787d3c78f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C
@@ -0,0 +1,22 @@
+// PR middle-end/39666
+// { dg-do compile }
+// { dg-options "-O2 -Wuninitialized" }
+
+int
+foo (int i)
+{
+ int j;
+ switch (i)
+ {
+ case -__INT_MAX__ - 1 ... -1:
+ j = 6;
+ break;
+ case 0:
+ j = 5;
+ break;
+ case 2 ... __INT_MAX__:
+ j = 4;
+ break;
+ }
+ return j; // { dg-warning "may be used uninitialized" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C
new file mode 100644
index 000000000..23fc86dfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C
@@ -0,0 +1,22 @@
+/* PR17544 Incorrect -Wunreachable-code warning
+ Origin: sebor@roguewave.com
+
+ G++ appends a "return 0;" when finishing a function, but it was not
+ given a source location. The gimplifier thinks a return statement
+ needs a locus so it would add one, making the compiler generated code
+ visible to the unreachable code warning. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wunreachable-code" } */
+
+int
+main (int argc, char *argv[])
+{
+ const char* const s = argc < 2 ? "" : argv [1];
+ int i = 0;
+ do {
+ ++i;
+ } while (i < s [0]);
+ return i;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C
new file mode 100644
index 000000000..d50f7fe57
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C
@@ -0,0 +1,23 @@
+// PR c++/21228
+/* { dg-options "-Wunreachable-code" } */
+
+class testStringBase
+{
+public:
+ char *stringPtr;
+};
+
+class testString : public testStringBase
+{
+public:
+ testString();
+};
+
+testString::testString()
+{
+ stringPtr = (char *) 9;
+}
+
+int main(int argc, char **argv) {
+ testString s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-1.C
new file mode 100644
index 000000000..60ceb4f07
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-1.C
@@ -0,0 +1,15 @@
+// Test whether -Wunused handles empty classes the same as non-empty.
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct A {};
+struct B { char c; };
+
+void foo ()
+{
+ struct A a0, a1;
+ struct B b0, b1 = { 25 };
+
+ a0 = a1; // { dg-bogus "value computed is not used" }
+ b0 = b1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-10.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-10.C
new file mode 100644
index 000000000..d2d6a343d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-10.C
@@ -0,0 +1,8 @@
+// PR c++/19190
+// { dg-options "-Wunused" }
+
+struct breakme
+{
+ void setAction( unsigned char a ) { act = a; }
+ unsigned int act:8;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-11.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-11.C
new file mode 100644
index 000000000..4a151d245
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-11.C
@@ -0,0 +1,11 @@
+// PR c++/20212
+// { dg-options "-O2 -Wunused -Wextra" }
+
+template<int> void f(int);
+void g(int i)
+{
+ f<0>(i);
+}
+template<int> void f(int i __attribute__((unused)) )
+{}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-12.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-12.C
new file mode 100644
index 000000000..51d234331
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-12.C
@@ -0,0 +1,8 @@
+// PR c++/24302
+// { dg-options "-Wunused" }
+
+static union
+{
+ unsigned char FLT4ARR[4];
+ float FLT4;
+}; // { dg-warning "used" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-13.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-13.C
new file mode 100644
index 000000000..d0eae113e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-13.C
@@ -0,0 +1,7 @@
+// Test whether -Wunused handles effectless indirect_ref operation ('*').
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+void Foo(int* x) {
+ *x++; // { dg-warning "value computed is not used" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-14.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-14.C
new file mode 100644
index 000000000..b325ccb71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-14.C
@@ -0,0 +1,14 @@
+// Test that -Wunused should not emit a warning on the initialization of
+// non-POD arrays. See PR c++/39803.
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+#include <utility>
+
+using std::pair;
+
+int foo() {
+ pair<int, const char*> components[3]; // { dg-bogus "value computed is not used" }
+ components[0].first = 0;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-15.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-15.C
new file mode 100644
index 000000000..efaebc006
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-15.C
@@ -0,0 +1,11 @@
+// PR c++/39875
+// { dg-do compile }
+// { dg-options "-Wunused-value" }
+
+int *i;
+void
+foo ()
+{
+ *i++; // { dg-warning "value computed is not used" }
+ (void) *i++; // { dg-bogus "value computed is not used" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-16.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-16.C
new file mode 100644
index 000000000..c9e57f79b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-16.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-Wunused-value" }
+
+extern void f1();
+void
+f(bool b)
+{
+ b ? f1(), 0 : 0; // { dg-bogus "has no effect" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-17.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-17.C
new file mode 100644
index 000000000..217bb4b77
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-17.C
@@ -0,0 +1,19 @@
+// PR c++/41109, 41110, 41134
+// { dg-options "-Wunused" }
+
+int memory_consumption(const int &t) { return sizeof(t); }
+
+int s;
+int g() { return memory_consumption(s); }
+
+template <int> struct X { static const int s = 2; };
+
+template <typename T> int f() {
+ const unsigned int dim = 2;
+ return X<dim>::s;
+}
+
+template int f<int>();
+
+static int i;
+template <typename> int h() { return i; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-2.C
new file mode 100644
index 000000000..593bf4872
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-2.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "-Wunused -O3" }
+
+static const int i = 0;
+static void f() { } /* { dg-warning "defined but not used" "" } */
+static inline void g() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-3.C
new file mode 100644
index 000000000..2d00dda3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-3.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-Wunused -O -fno-use-cxa-atexit" }
+
+void do_cleanups();
+
+class Cleanup {
+public:
+ ~Cleanup() { do_cleanups();}
+};
+
+static Cleanup dummy;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-4.C
new file mode 100644
index 000000000..9018e92ef
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-4.C
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-Wunused-parameter" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Sep 2003 <nathan@codesourcery.com>
+// Origin: yotamm@mellanox.co.il
+
+
+// PR c++/9848. Missing warning
+
+struct C1 {
+ // Only use in-charge ctor
+ C1(int bi) {} // { dg-warning "unused parameter" "" }
+};
+struct C2 {
+ // Only use base ctor
+ C2(int bi) {} // { dg-warning "unused parameter" "" }
+};
+
+struct D : C2
+{
+ D (int) : C2 (1) {}
+};
+
+void show_compile_warning ()
+{
+ C1 c1 (1);
+
+ D d (1);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-5.C
new file mode 100644
index 000000000..8a8d9d280
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-5.C
@@ -0,0 +1,19 @@
+/* PR opt/14288 */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall" } */
+
+volatile int sink;
+extern int foo(int);
+
+struct S
+{
+ int x;
+
+ S() { x = foo(0); }
+ ~S() { sink = x; }
+};
+
+int test(bool p)
+{
+ return p ? foo(S().x) : 0; /* { dg-bogus "uninitialized" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-6.C
new file mode 100644
index 000000000..58a3f642b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-6.C
@@ -0,0 +1,11 @@
+/* PR middle-end/14203 */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+void foo()
+{
+ if (false)
+ if (int i=0) // { dg-warning "unused" "" }
+ int j=0; // { dg-warning "unused" "" }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-7.C
new file mode 100644
index 000000000..6f5c23e95
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-7.C
@@ -0,0 +1,12 @@
+// PR c++/14481
+// { dg-options "-Wunused" }
+
+void func()
+{
+ struct mybitfields {
+ unsigned int s_field:8;
+ };
+ struct mybitfields s; // { dg-warning "set but not used" }
+ s.s_field = 255;
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-8.C
new file mode 100644
index 000000000..a1c8a1fb4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-8.C
@@ -0,0 +1,9 @@
+// PR c++/16029
+// { dg-options "-Wunused" }
+
+int main ()
+{
+ // We should not see an "unused" warning about "whatever" on the
+ // next line.
+ return whatever (); // { dg-error "declared" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-9.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-9.C
new file mode 100644
index 000000000..869888955
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-9.C
@@ -0,0 +1,38 @@
+// PR c++/11224
+// { dg-options "-Wunused" }
+
+struct someclass {
+
+ bool isEmpty() const { return true; }
+};
+
+int main()
+{
+ bool bOk = false;
+ someclass foo;
+
+ bOk == foo.isEmpty(); // { dg-warning "not used" }
+
+ return bOk;
+}
+
+int& f();
+
+void g() {
+ f() == 0; // { dg-warning "not used" }
+ f() != 1; // { dg-warning "not used" }
+ f() < 2; // { dg-warning "not used" }
+ f() > 3; // { dg-warning "not used" }
+ f() <= 4; // { dg-warning "not used" }
+ f() >= 5; // { dg-warning "not used" }
+ f() + 6; // { dg-warning "not used" }
+ f() - 7; // { dg-warning "not used" }
+ f() * 8; // { dg-warning "not used" }
+ f() / 9; // { dg-warning "not used" }
+ +f(); // { dg-warning "not used" }
+ -f(); // { dg-warning "not used" }
+ ++f();
+ --f();
+ f() = 10;
+ f() <<= 11;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-1.C
new file mode 100644
index 000000000..96f49b321
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-1.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-options "-Wunused-label" }
+
+extern void f9();
+
+void
+f1()
+{
+ l1: f9(); // { dg-warning "not used" }
+ l3: ; f9(); // { dg-warning "not used" }
+ l4: __attribute__ ((unused)) ; f9();
+}
+
+void
+f2()
+{
+ label: __attribute ((unused)) ;
+}
+
+void
+f3()
+{
+ // The next line would be OK in C but is a syntax error in C++.
+ l2: __attribute__ ((unused)) f9(); // { dg-error "expected" }
+ // We still get an unused label warning--this is
+ // optional and can be removed if it ever changes.
+ // { dg-warning "not used" "expected" { target *-*-* } 24 }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-2.C
new file mode 100644
index 000000000..a53fdedf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+// If __attribute__ ((unused)) follows a label and precedes a
+// declaration, we should get a warning for the label, not the
+// declaration.
+
+void
+f1()
+{
+ int i1; // { dg-warning "unused variable" }
+ l1: __attribute__ ((unused)) int i2; // { dg-warning "label \[^\n\]* not used" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-3.C
new file mode 100644
index 000000000..7479ca20c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-label-3.C
@@ -0,0 +1,51 @@
+// { dg-do compile }
+// { dg-options "-Wunused-label" }
+
+extern void f9();
+
+template<int i>
+void
+f1()
+{
+ if (i)
+ return;
+
+ l1: f9(); // { dg-warning "not used" }
+ l3: ; f9(); // { dg-warning "not used" }
+ l4: __attribute__ ((unused)) ; f9();
+}
+
+template
+void f1<0>();
+
+template<int i>
+void
+f2()
+{
+ if (i)
+ return;
+
+ l1: f9(); // { dg-warning "not used" }
+ l3: ; f9(); // { dg-warning "not used" }
+ l4: __attribute__ ((unused)) ; f9();
+}
+
+template
+void f2<1>();
+
+template<int i>
+void
+f3()
+{
+ void* lab;
+ l1: f9();
+ l2: __attribute__ ((unused)) ; f9();
+ lab = i ? &&l1 : &&l2;
+ goto *lab;
+}
+
+template
+void f3<0>();
+
+template
+void f3<1>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C
new file mode 100644
index 000000000..073e253c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-2.C
@@ -0,0 +1,20 @@
+// Origin PR c++/33255
+// { dg-options "-Wunused" } <-- should trigger -Wunused-local-typedefs
+// { dg-do compile { target c++11 } }
+
+template <typename C>
+struct structure
+{
+ typename C::type val;
+};
+
+int
+main()
+{
+ struct context
+ {
+ using type = int;
+ };
+
+ return structure<context>{42}.val;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-3.C
new file mode 100644
index 000000000..77bacd788
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs-3.C
@@ -0,0 +1,35 @@
+/* Origin PR c++/54372
+ { dg-options "-Wunused-local-typedefs" }
+ { dg-do compile }
+*/
+
+template <typename T>
+void f2()
+{
+ typedef T t __attribute__((unused));
+}
+
+class S
+{
+ template <typename T>
+ void f4()
+ {
+ typedef T t __attribute__((unused));
+ }
+};
+
+template <typename T>
+class tS
+{
+ void f()
+ {
+ typedef T t2 __attribute__((unused));
+ }
+
+ template <typename U>
+ void f2()
+ {
+ typedef T t1 __attribute__((unused));
+ typedef U t2 __attribute__((unused));
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C
new file mode 100644
index 000000000..4fc8640ed
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C
@@ -0,0 +1,146 @@
+// Origin PR c++/33255
+// { dg-options "-Wunused" } <-- should trigger -Wunused-local-typedefs
+// { dg-do compile }
+
+void
+test_warn()
+{
+ typedef int foo; // { dg-warning "locally defined but not used" }
+}
+
+struct S
+{
+ typedef int T;
+ S() {}
+ S(int) {}
+};
+
+template<class T>
+struct ST
+{
+ typedef T type;
+ ST (int) {}
+ ST () {}
+};
+
+template<class T>
+void
+test0_tmpl(void)
+{
+ typedef struct ST<T> foo;
+ foo(2);
+}
+
+int
+test0(void)
+{
+ test0_tmpl<int>();
+}
+
+void
+test1(void)
+{
+ typedef int foo;
+ ST<foo> a;
+}
+
+
+int
+test2(void)
+{
+ typedef S foo;
+ foo::T i = 0;
+ return i;
+}
+
+template<class T>
+void
+test3_tmpl(void)
+{
+ typedef struct ST<int> foo;
+ ST<int> v;
+ const foo __attribute__((unused))&var = v;
+}
+
+void
+test3(void)
+{
+ test3_tmpl<int>();
+}
+
+void
+test4(void)
+{
+ typedef int foo;
+ int __attribute__((unused))vec[1] = {sizeof (foo)};
+}
+
+void
+test5(void)
+{
+ typedef int T0;
+ typedef char T1;
+ typedef int* T2;
+ typedef unsigned T3;
+ struct C0 { virtual void f(void) {}};
+ struct C1 : C0 {};
+ typedef C0 T4;
+
+ int v0 = (T0) 2;
+ char __attribute__((unused)) v1 = static_cast<T1> (0);
+ if (reinterpret_cast<T2> (&v0));
+ unsigned* const c = 0;
+ unsigned* __attribute__((unused))v2 = const_cast<T3* const> (c);
+ C0 *__attribute__((unused))p0 = 0;
+ C1 *p1 = 0;
+ p0 = dynamic_cast<T4*> (p1);
+}
+
+void
+test6(void)
+{
+ struct C0 {};
+ typedef C0 foo;
+ C0 *__attribute__((unused))v = new foo;
+}
+
+template<class T, class U>
+struct S7
+{
+ void
+ f()
+ {
+ typedef int foo;
+ sizeof(foo);
+ }
+};
+
+template<class T>
+void
+test7(void)
+{
+ typedef typename ST<T>::T bar; // { dg-warning "locally defined but not used" }
+ typedef typename ST<T>::T foo; // We shouldn't warn for this one, as
+ // it's used below.
+ S7<int, foo> v;
+}
+
+
+template<class T, class U>
+void
+test8(void)
+{
+ int f(S7<T, U>);
+ void g(int);
+ typedef T foo;
+ g(f(S7<foo, U>()));
+}
+
+int
+test9(void)
+{
+ struct s { typedef int foo;}; // { dg-warning "locally defined but not used" }
+ struct t { typedef int bar;};
+ t::bar b = 0;
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C
new file mode 100644
index 000000000..08bfaa66b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C
@@ -0,0 +1,58 @@
+// { dg-do compile }
+// { dg-options "-Wunused -W" }
+
+long
+f1 (unsigned long long x)
+{
+ unsigned long long a = 1;
+ const union { unsigned long long l; unsigned int p[2]; } b = { x };
+ const union { unsigned long long l; unsigned int p[2]; } c = { a };
+ return b.p[0] + c.p[0];
+}
+
+int
+f2 (int x, int y)
+{
+ int a = 1;
+ int b[] = { 1, 2, x, a, 3, 4 };
+ return b[y];
+}
+
+int
+f3 (int a) // { dg-warning "unused parameter" }
+{
+ return 0;
+}
+
+int
+f4 (int a) // { dg-warning "set but not used" }
+{
+ a = 1;
+ return 0;
+}
+
+int
+f5 (int a)
+{
+ a = 1;
+ return a;
+}
+
+int
+f6 (int &a)
+{
+ return a;
+}
+
+void
+f7 (int &a)
+{
+ a = 1;
+}
+
+struct S
+{
+ S (int i) : j(i) {}
+ S (long i) : j(i + 1) {}
+ int j;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C
new file mode 100644
index 000000000..d4276c0a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C
@@ -0,0 +1,54 @@
+// { dg-do compile }
+// { dg-options "-Wunused -W" }
+
+template <int N>
+long
+f1 (unsigned long long x)
+{
+ unsigned long long a = 1;
+ const union { unsigned long long l; unsigned int p[2]; } b = { x };
+ const union { unsigned long long l; unsigned int p[2]; } c = { a };
+ return b.p[0] + c.p[0];
+}
+
+template <int N>
+int
+f2 (int x, int y)
+{
+ int a = 1;
+ int b[] = { 1, 2, x, a, 3, 4 };
+ return b[y];
+}
+
+template <int N>
+int
+f3 (int a) // { dg-warning "unused parameter" }
+{
+ return 0;
+}
+
+template <int N>
+int
+f4 (int a) // { dg-warning "set but not used" }
+{
+ a = 1;
+ return 0;
+}
+
+template <int N>
+int
+f5 (int a)
+{
+ a = 1;
+ return a;
+}
+
+void
+test ()
+{
+ (void) f1<0> (0);
+ (void) f2<0> (0, 0);
+ (void) f3<0> (0);
+ (void) f4<0> (0);
+ (void) f5<0> (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C
new file mode 100644
index 000000000..3f0a0e7d0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C
@@ -0,0 +1,71 @@
+// { dg-do compile }
+// { dg-options "-Wunused -W" }
+// Suppress a warning that is irrelevant to the purpose of this test.
+// { dg-options "-Wunused -W -Wno-abi" { target arm_eabi } }
+
+#include <stdarg.h>
+
+struct A
+{
+ long a;
+ A () : a (0) { }
+ A (long x) : a (x) { }
+ operator long () const { return a; }
+ long operator- (const A& x) const { return a - x.a; }
+};
+
+long
+fn1 (A a)
+{
+ return a - A (0);
+}
+
+struct B
+{
+ bool operator() (const int x, const int y) const throw() { return x < y; }
+};
+
+template <typename T>
+bool
+fn2 (int x, int y, T z)
+{
+ return z (x, y);
+}
+
+bool
+fn3 (void)
+{
+ return fn2 (1, 2, B ());
+}
+
+int
+fn4 (va_list ap)
+{
+ return va_arg (ap, int);
+}
+
+template <typename T>
+T
+fn5 (va_list ap)
+{
+ return va_arg (ap, T);
+}
+
+int
+fn6 (va_list ap)
+{
+ return fn5 <int> (ap);
+}
+
+template <typename T>
+int
+fn7 (T ap)
+{
+ return va_arg (ap, int);
+}
+
+int
+fn8 (va_list ap)
+{
+ return fn7 (ap);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C
new file mode 100644
index 000000000..fbad380f6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C
@@ -0,0 +1,24 @@
+// PR c++/47783
+// { dg-do compile }
+// { dg-options "-Wunused -W" }
+
+struct R
+{
+ int &i;
+};
+
+void
+foo (R r, int &s)
+{
+ r.i = 7;
+ s = 8;
+}
+
+int
+bar ()
+{
+ int x = 1, y = 1;
+ R r = { x };
+ foo (r, y);
+ return x + y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-5.C
new file mode 100644
index 000000000..e952d0221
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-5.C
@@ -0,0 +1,14 @@
+// PR c++/58362
+// { dg-options "-Wunused-parameter" }
+
+void f1 (long s) { } // { dg-warning "15:unused parameter 's'" }
+
+void f2 (long s, int u) { } // { dg-warning "15:unused parameter 's'" }
+// { dg-warning "22:unused parameter 'u'" "" { target *-*-* } 6 }
+
+void f3 (long s);
+void f3 (long s) { } // { dg-warning "15:unused parameter 's'" }
+
+void f4 (long s, int u);
+void f4 (long s, int u) { } // { dg-warning "15:unused parameter 's'" }
+// { dg-warning "22:unused parameter 'u'" "" { target *-*-* } 13 }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-1.C
new file mode 100644
index 000000000..89c110b0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-1.C
@@ -0,0 +1,8 @@
+// { dg-options "-Wunused" }
+template <int> struct X { static const int s = 2; };
+template <typename T> int f() { const int v = 2; return X<v+1>::s; }
+template <typename T> int g() { const int v = 2; return X<v>::s; }
+template <typename T> int h() { const int v = 2; return X<1 ? v : 0>::s; }
+template int f<int>();
+template int g<int>();
+template int h<int>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-10.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-10.C
new file mode 100644
index 000000000..ffdb89327
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-10.C
@@ -0,0 +1,42 @@
+// PR c++/44412
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct S
+{
+ static const int a = 3;
+ static int b;
+ int c;
+};
+
+const int S::a;
+int S::b = 4;
+
+int
+f1 ()
+{
+ S s;
+ return s.a;
+}
+
+int
+f2 ()
+{
+ S s;
+ return s.b;
+}
+
+void
+f3 ()
+{
+ S s; // { dg-warning "set but not used" }
+ s.c = 6;
+}
+
+int
+f4 ()
+{
+ S s;
+ s.c = 6;
+ return s.c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-11.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-11.C
new file mode 100644
index 000000000..c7c1bf35f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-11.C
@@ -0,0 +1,33 @@
+// PR c++/44412
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct S
+{
+ int foo ();
+ static int bar ();
+};
+
+int S::foo ()
+{
+ return 5;
+}
+
+int S::bar ()
+{
+ return 6;
+}
+
+int
+f1 ()
+{
+ S s;
+ return s.foo ();
+}
+
+int
+f2 ()
+{
+ S s;
+ return s.bar ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-12.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-12.C
new file mode 100644
index 000000000..3300cbe3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-12.C
@@ -0,0 +1,36 @@
+// PR c++/44444
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct S
+{
+ const int &u;
+ const int &v;
+ S (const int &a, const int &b) : u(a), v(b) { }
+};
+
+bool
+f1 ()
+{
+ bool t = false;
+ S z = S (1, 2);
+ t |= z.u == 1;
+ t |= z.v == 2;
+ return t;
+}
+
+void
+f2 ()
+{
+ S z = S (1, 2);
+ z.u; // { dg-warning "no effect" }
+}
+
+int i;
+
+void
+f3 ()
+{
+ S z = S (1, 2);
+ i++, z.u; // { dg-warning "no effect" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-13.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-13.C
new file mode 100644
index 000000000..43df81d88
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-13.C
@@ -0,0 +1,22 @@
+// PR c++/44619
+// { dg-do compile }
+// { dg-options "-Wunused -W" }
+
+struct S { int x, y; };
+
+int
+f1 ()
+{
+ struct S p;
+ int S::*q = &S::x;
+ p.*q = 5;
+ return p.*q;
+}
+
+int
+f2 (struct S *p, int S::*q)
+{
+ struct S *r = p;
+ int S::*s = q;
+ return r->*s;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-14.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-14.C
new file mode 100644
index 000000000..a552b56da
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-14.C
@@ -0,0 +1,17 @@
+// PR c++/44682
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct S { virtual ~S () {} };
+struct T { virtual ~T () {} };
+struct U : S, T {};
+
+void f (U &);
+
+void
+g (void *v)
+{
+ T *t = static_cast <T *> (v);
+ U *u = static_cast <U *> (t);
+ f (*u);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-15.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-15.C
new file mode 100644
index 000000000..9782ccbd9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-15.C
@@ -0,0 +1,29 @@
+// PR c++/45588
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+void bar (unsigned char *);
+
+template <int N>
+struct S
+{
+ static const int k = 6;
+};
+
+template <int N>
+const int S<N>::k;
+
+template <int N>
+void
+foo ()
+{
+ const int i = S<N>::k;
+ unsigned char a[i];
+ bar (a);
+}
+
+void
+baz ()
+{
+ foo<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-16.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-16.C
new file mode 100644
index 000000000..070ce446b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-16.C
@@ -0,0 +1,13 @@
+// PR c++/50158
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+int bar (int);
+
+int
+foo (int a)
+{
+ int b[] = { a, -a };
+ a += b[bar (a) < a];
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-17.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-17.C
new file mode 100644
index 000000000..01650e13a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-17.C
@@ -0,0 +1,4 @@
+// PR c++/10416
+// { dg-options "-Wunused" }
+
+void f () { struct atend { ~atend () { __builtin_printf("leaving f\n"); } } a; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-18.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-18.C
new file mode 100644
index 000000000..033966372
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-18.C
@@ -0,0 +1,14 @@
+// Origin: PR c++/29028
+// { dg-options "-Wunused" }
+// { dg-do compile }
+
+namespace N
+{
+ int i; // { dg-warning "unused variable" }
+}
+
+void
+f ()
+{
+ using N::i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-19.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-19.C
new file mode 100644
index 000000000..75fd1e327
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-19.C
@@ -0,0 +1,26 @@
+// PR c++/55643
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused" }
+
+enum class E { e = 123 };
+
+int
+foo ()
+{
+ E x = E::e;
+ return (double) x;
+}
+
+int
+bar ()
+{
+ E x = E::e;
+ return (long double) x;
+}
+
+int
+baz ()
+{
+ E x = E::e;
+ return (float) x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-2.C
new file mode 100644
index 000000000..0b21ef116
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-2.C
@@ -0,0 +1,104 @@
+// { dg-options "-Wunused -W" }
+
+extern void foo ();
+
+void
+f1 ()
+{
+ try
+ {
+ foo ();
+ }
+ catch (int i)
+ {
+ }
+ catch (double d)
+ {
+ }
+}
+
+void
+f2 (int x)
+{
+ int a = 0;
+ x++;
+ ++a;
+}
+
+struct A
+{
+ bool foo () const { return true; }
+};
+
+int
+f3 ()
+{
+ A a;
+ bool b = a.foo ();
+ return b;
+}
+
+struct B
+{
+ int i;
+ B (int j);
+};
+
+void
+f4 ()
+{
+ B b (6);
+}
+
+struct C
+{
+ int i;
+ C (int j) : i (j) {}
+};
+
+void
+f5 ()
+{
+ C c (6);
+}
+
+struct D
+{
+ int i;
+ D (int j) : i (j) {}
+ ~D ();
+};
+
+void
+f6 ()
+{
+ D d (6);
+}
+
+int *f7 (int s)
+{
+ return new int[s];
+}
+
+template <typename T>
+T *f8 (int s)
+{
+ return new T[s];
+}
+
+template int *f8<int> (int);
+
+void
+f9 (char *p)
+{
+ delete p;
+}
+
+template <typename T>
+void
+f10 (T *p)
+{
+ delete p;
+}
+
+template void f10<char> (char *);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-20.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-20.C
new file mode 100644
index 000000000..792c25369
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-20.C
@@ -0,0 +1,19 @@
+// PR c++/38958
+// { dg-options "-Wunused" }
+
+volatile int g;
+
+struct Lock
+{
+ ~Lock() { g = 0; }
+};
+
+Lock AcquireLock() { return Lock(); }
+
+int main()
+{
+ const Lock& lock = AcquireLock();
+ g = 1;
+ g = 2;
+ g = 3;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-21.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-21.C
new file mode 100644
index 000000000..d279e5980
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-21.C
@@ -0,0 +1,31 @@
+// PR c++/58325
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+void
+f1 ()
+{
+ int *volatile a = new int[1];
+ delete[] a;
+}
+
+void
+f2 ()
+{
+ int *b = new int[1];
+ delete[] b;
+}
+
+void
+f3 ()
+{
+ int *volatile c = new int;
+ delete c;
+}
+
+void
+f4 ()
+{
+ int *d = new int;
+ delete d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-3.C
new file mode 100644
index 000000000..cd8931d71
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-3.C
@@ -0,0 +1,110 @@
+// { dg-options "-Wunused -W" }
+
+#include <typeinfo>
+#include <stdarg.h>
+
+void
+f1 (int a, ...)
+{
+ va_list ap;
+ va_start (ap, a);
+ va_end (ap);
+}
+
+int
+f2 (int a, ...)
+{
+ va_list ap;
+ va_start (ap, a);
+ int i = va_arg (ap, int);
+ va_end (ap);
+ return i;
+}
+
+struct A { int a; A (); virtual ~A (); };
+struct B : virtual A { int b; };
+
+struct B *
+f3 (struct A *a)
+{
+ return dynamic_cast <B *> (a);
+}
+
+struct A *
+f4 (struct B *a)
+{
+ return static_cast <A *> (a);
+}
+
+struct A *
+f5 (struct B *a)
+{
+ return reinterpret_cast <A *> (a);
+}
+
+struct A *
+f6 (const struct A *a)
+{
+ return const_cast <A *> (a);
+}
+
+int
+f7 (long a)
+{
+ return (int) a;
+}
+
+int
+f8 (long a)
+{
+ return int (a);
+}
+
+struct C
+{
+ operator unsigned int() { return 42; }
+};
+
+unsigned int
+f9 ()
+{
+ C u;
+ return u;
+}
+
+struct D
+{
+ operator int & ();
+ operator const int & () const;
+};
+
+void foo (int &);
+void foo (const int &);
+
+void
+f10 ()
+{
+ const D x = D ();
+ foo (x);
+}
+
+int
+f11 (int a)
+{
+ return typeid (a) == typeid (int);
+}
+
+struct E
+{
+ int e () {return 0;}
+};
+
+template <typename T>
+int
+f12 (E a)
+{
+ __decltype (a.e()) i;
+ return i;
+}
+
+template <> int f12<int> (E);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-4.C
new file mode 100644
index 000000000..11ed7afea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-4.C
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+struct S { int e; };
+
+int
+f1 (void)
+{
+ int a;
+ int b;
+ int c;
+ int d;
+ S s;
+ a = 1;
+ b = 2;
+ c = 3;
+ d = 4;
+ s.e = 5;
+ __typeof (c) e; // { dg-warning "set but not used" }
+ __decltype (d) f; // { dg-warning "set but not used" }
+ __decltype (s.e) g; // { dg-warning "set but not used" }
+ e = 1;
+ f = 1;
+ g = 1;
+ return sizeof (a) + __alignof__ (b);
+}
+
+template <int N>
+int f2 (void)
+{
+ int a;
+ int b;
+ int c;
+ int d;
+ a = 1;
+ b = 2;
+ c = 3;
+ d = 4;
+ __typeof (c) e; // { dg-warning "set but not used" }
+ __decltype (d) f; // { dg-warning "set but not used" }
+ e = 1;
+ f = 1;
+ return sizeof (a) + __alignof__ (b);
+}
+
+void
+test (void)
+{
+ (void) f2<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-5.C
new file mode 100644
index 000000000..7fcaa955c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-5.C
@@ -0,0 +1,227 @@
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+template <int N>
+void
+f1 (void)
+{
+ int a; // { dg-warning "set but not used" }
+ int b;
+ int c;
+ c = 1;
+ a = b = c;
+}
+
+template <int N>
+void
+f2 (int x)
+{
+ int a; // { dg-warning "set but not used" }
+ int b;
+ int c; // { dg-warning "set but not used" }
+ c = (a = x, b = x);
+}
+
+template <int N>
+int
+f3 (int x)
+{
+ int a;
+ return a = x;
+}
+
+template <int N>
+int
+f4 (int x)
+{
+ int a;
+ a = x;
+ return a;
+}
+
+template <int N>
+void
+f5 (int x)
+{
+ int a[2]; // { dg-warning "set but not used" }
+ int b;
+ int *c, d[2];
+ c = d;
+ b = x;
+ a[b] = 1;
+ c[b] = 1;
+}
+
+template <int N>
+int
+f6 (int x)
+{
+ int a[2];
+ int b;
+ b = x;
+ a[b] = 1;
+ return a[b];
+}
+
+template <int N>
+void
+f7 (int x, int *p)
+{
+ int *a[2];
+ a[x] = p;
+ a[x][x] = x;
+}
+
+struct S { int i; };
+
+template <int N>
+void
+f8 (void)
+{
+ struct S s; // { dg-warning "set but not used" }
+ s.i = 6;
+}
+
+template <int N>
+int
+f9 (void)
+{
+ struct S s;
+ s.i = 6;
+ return s.i;
+}
+
+template <int N>
+struct S
+f10 (void)
+{
+ struct S s;
+ s.i = 6;
+ return s;
+}
+
+extern int foo11 (int *);
+
+template <int N>
+void
+f11 (void)
+{
+ int a[2];
+ foo11 (a);
+}
+
+template <int N>
+void
+f12 (void)
+{
+ int a;
+ a = 1;
+ a; // { dg-warning "statement has no effect" }
+}
+
+template <int N>
+void
+f13 (void (*x) (void))
+{
+ void (*a) (void);
+ a = x;
+ a ();
+}
+
+template <int N>
+void
+f14 (void (*x) (void))
+{
+ void (*a) (void); // { dg-warning "set but not used" }
+ a = x;
+}
+
+extern void foo15 (int *);
+
+template <int N>
+void
+f15 (void)
+{
+ int a[10];
+ int *b = a + 2;
+ foo15 (b);
+}
+
+extern void foo16 (int **);
+
+template <int N>
+void
+f16 (void)
+{
+ int a[10];
+ int *b[] = { a, a + 2 };
+ foo16 (b);
+}
+
+template <int N>
+void
+f17 (int x)
+{
+ long a; // { dg-warning "set but not used" }
+ int b;
+ a = b = x;
+}
+
+template <int N>
+void
+f18 (int x)
+{
+ int a; // { dg-warning "set but not used" }
+ int b;
+ a = (char) (b = x);
+}
+
+template <int N>
+int
+f19 (int x, int y, int z)
+{
+ int a;
+ int b;
+ a = x;
+ b = y;
+ return z ? a : b;
+}
+
+template <int N>
+int *
+f20 (int x)
+{
+ static int a[] = { 3, 4, 5, 6 };
+ static int b[] = { 4, 5, 6, 7 };
+ static int c[] = { 5, 6, 7, 8 }; // { dg-warning "set but not used" }
+ c[1] = 1;
+ return x ? a : b;
+}
+
+S s;
+
+void
+test ()
+{
+ int i = 0;
+ f1<0> ();
+ f2<0> (0);
+ (void) f3<0> (0);
+ (void) f4<0> (0);
+ f5<0> (0);
+ (void) f6<0> (0);
+ f7<0> (0, &i);
+ f8<0> ();
+ (void) f9<0> ();
+ s = f10<0> ();
+ f11<0> ();
+ f12<0> ();
+ f13<0> (f1<0>);
+ f14<0> (f1<0>);
+ f15<0> ();
+ f16<0> ();
+ f17<0> (0);
+ f18<0> (0);
+ (void) f19<0> (0, 0, 0);
+ (void) f20<0> (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-6.C
new file mode 100644
index 000000000..0fb8e5cac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-6.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+template <int N>
+int
+f1 (void)
+{
+ int c = ({
+ int a;
+ a = 1;
+ a; });
+ return c;
+}
+
+template <int N>
+void
+f2 (void)
+{
+ int f;
+ f = 0;
+ __asm__ __volatile__ ("" : "+r" (f));
+}
+
+void
+test ()
+{
+ (void) f1<0> ();
+ f2<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-7.C
new file mode 100644
index 000000000..cf1b605c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-7.C
@@ -0,0 +1,48 @@
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+template <int N>
+void
+f1 (void)
+{
+ _Complex int a; // { dg-warning "set but not used" }
+ _Complex double b; // { dg-warning "set but not used" }
+ __real__ a = 1;
+ __imag__ a = 2;
+ __real__ b = 3.0;
+ __imag__ b = 4.0;
+}
+
+template <int N>
+int
+f2 (void)
+{
+ _Complex int a;
+ _Complex double b;
+ __real__ a = 1;
+ __imag__ a = 2;
+ __real__ b = 3.0;
+ __imag__ b = 4.0;
+ return __real__ a + __imag__ b;
+}
+
+template <int N>
+_Complex double
+f3 (void)
+{
+ _Complex int a;
+ _Complex double b;
+ __real__ a = 1;
+ __imag__ a = 2;
+ __real__ b = 3.0;
+ __imag__ b = 4.0;
+ return a + b;
+}
+
+void
+test ()
+{
+ f1<0> ();
+ (void) f2<0> ();
+ (void) f3<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-8.C
new file mode 100644
index 000000000..69fc6fb79
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-8.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+template <int N>
+void
+f1 (void)
+{
+ extern int extvari;
+ extvari = 1;
+}
+
+int extvarj;
+
+template <int N>
+void
+f2 (void)
+{
+ extern int extvarj;
+ extvarj = 1;
+}
+
+static int extvark;
+
+template <int N>
+void
+f3 (void)
+{
+ extern int extvark;
+ extvark = 1;
+}
+
+template <int N>
+int
+f4 (void)
+{
+ return extvark;
+}
+
+void
+test ()
+{
+ f1<0> ();
+ f2<0> ();
+ f3<0> ();
+ (void) f4<0> ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-9.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-9.C
new file mode 100644
index 000000000..cb422f45c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-9.C
@@ -0,0 +1,13 @@
+/* PR c++/44062 */
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+void
+f ()
+{
+ int i = 4;
+ static_cast <void> (i);
+ int j;
+ j = 5;
+ static_cast <void> (j);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuseless-cast.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuseless-cast.C
new file mode 100644
index 000000000..6f0e2cfb0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wuseless-cast.C
@@ -0,0 +1,129 @@
+// { dg-options "-Wuseless-cast" }
+
+template<typename T>
+ void tmpl_f1(T& t)
+ {
+ (int)(t);
+ static_cast<int>(t);
+ reinterpret_cast<int>(t);
+
+ (int*)(&t);
+ const_cast<int*>(&t);
+ static_cast<int*>(&t);
+ reinterpret_cast<int*>(&t);
+
+ (int&)(t);
+ const_cast<int&>(t);
+ static_cast<int&>(t);
+ reinterpret_cast<int&>(t);
+ }
+
+template<typename T>
+ void tmpl_f2(T t)
+ {
+ (int&)(t);
+ const_cast<int&>(t);
+ static_cast<int&>(t);
+ reinterpret_cast<int&>(t);
+ }
+
+struct A { };
+
+template<typename T>
+ void tmpl_f3(T& t)
+ {
+ (A)(t);
+ static_cast<A>(t);
+
+ (A*)(&t);
+ const_cast<A*>(&t);
+ static_cast<A*>(&t);
+ reinterpret_cast<A*>(&t);
+ dynamic_cast<A*>(&t);
+
+ (A&)(t);
+ const_cast<A&>(t);
+ static_cast<A&>(t);
+ reinterpret_cast<A&>(t);
+ dynamic_cast<A&>(t);
+ }
+
+template<typename T>
+ void tmpl_f4(T t)
+ {
+ (A&)(t);
+ const_cast<A&>(t);
+ static_cast<A&>(t);
+ reinterpret_cast<A&>(t);
+ dynamic_cast<A&>(t);
+ }
+
+A prvalue();
+
+void f()
+{
+ int n;
+
+ (int)(n); // { dg-warning "useless cast" }
+ static_cast<int>(n); // { dg-warning "useless cast" }
+ reinterpret_cast<int>(n); // { dg-warning "useless cast" }
+
+ (int*)(&n); // { dg-warning "useless cast" }
+ const_cast<int*>(&n); // { dg-warning "useless cast" }
+ static_cast<int*>(&n); // { dg-warning "useless cast" }
+ reinterpret_cast<int*>(&n); // { dg-warning "useless cast" }
+
+ int& m = n;
+
+ (int&)(m); // { dg-warning "useless cast" }
+ const_cast<int&>(m); // { dg-warning "useless cast" }
+ static_cast<int&>(m); // { dg-warning "useless cast" }
+ reinterpret_cast<int&>(m); // { dg-warning "useless cast" }
+
+ tmpl_f1(m);
+
+ (int&)(n); // { dg-warning "useless cast" }
+ const_cast<int&>(n); // { dg-warning "useless cast" }
+ static_cast<int&>(n); // { dg-warning "useless cast" }
+ reinterpret_cast<int&>(n); // { dg-warning "useless cast" }
+
+ tmpl_f2(n);
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ (int&&)(42);
+ static_cast<int&&>(42);
+
+ (A&&)(prvalue());
+ const_cast<A&&>(prvalue());
+ static_cast<A&&>(prvalue());
+#endif
+
+ A a;
+
+ (A)(a); // { dg-warning "useless cast" }
+ static_cast<A>(a); // { dg-warning "useless cast" }
+
+ (A*)(&a); // { dg-warning "useless cast" }
+ const_cast<A*>(&a); // { dg-warning "useless cast" }
+ static_cast<A*>(&a); // { dg-warning "useless cast" }
+ reinterpret_cast<A*>(&a); // { dg-warning "useless cast" }
+ dynamic_cast<A*>(&a); // { dg-warning "useless cast" }
+
+ A& b = a;
+
+ (A&)(b); // { dg-warning "useless cast" }
+ const_cast<A&>(b); // { dg-warning "useless cast" }
+ static_cast<A&>(b); // { dg-warning "useless cast" }
+ static_cast<A&>(b); // { dg-warning "useless cast" }
+ dynamic_cast<A&>(b); // { dg-warning "useless cast" }
+
+ tmpl_f3(b);
+
+ (A&)(a); // { dg-warning "useless cast" }
+ const_cast<A&>(a); // { dg-warning "useless cast" }
+ static_cast<A&>(a); // { dg-warning "useless cast" }
+ reinterpret_cast<A&>(a); // { dg-warning "useless cast" }
+ dynamic_cast<A&>(a); // { dg-warning "useless cast" }
+
+ tmpl_f4(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-1.C
new file mode 100644
index 000000000..ca3669aec
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-1.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wvla" } */
+
+void func (int i)
+{
+ int array[i]; /* { dg-warning "variable length array 'array' is used" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-2.C
new file mode 100644
index 000000000..df479d0b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile { target { ! c++1y } } } */
+/* { dg-options "-pedantic-errors -Wvla" } */
+
+void func (int i)
+{
+ int array[i]; /* { dg-error "ISO C.* forbids variable.* array 'array'" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-3.C
new file mode 100644
index 000000000..259c576b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wvla-3.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -Wno-vla" } */
+
+void func (int i)
+{
+ int array[i];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C
new file mode 100644
index 000000000..d0f62b212
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C
@@ -0,0 +1,100 @@
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+struct A;
+
+typedef int (A::*pointmemfun) (int);
+typedef int (A::*pointdmem);
+typedef int (*pointfun) (int);
+
+pointmemfun pmfs;
+pointdmem pdms;
+pointfun pfs;
+int* ps;
+
+void f()
+{
+ pointmemfun pmf(0); // { dg-warning "zero as null pointer" }
+ pointdmem pdm(0); // { dg-warning "zero as null pointer" }
+ pointfun pf(0); // { dg-warning "zero as null pointer" }
+ int* p(0); // { dg-warning "zero as null pointer" }
+
+ pmf = 0; // { dg-warning "zero as null pointer" }
+
+ pdm = 0; // { dg-warning "zero as null pointer" }
+
+ pf = 0; // { dg-warning "zero as null pointer" }
+
+ p = 0; // { dg-warning "zero as null pointer" }
+
+ if (pmf)
+ ;
+
+ if (pdm)
+ ;
+
+ if (pf)
+ ;
+
+ if (p)
+ ;
+
+ if (!pmf)
+ ;
+
+ if (!pdm)
+ ;
+
+ if (!pf)
+ ;
+
+ if (!p)
+ ;
+
+ if (pmf == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pdm == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pf == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (p == 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pmf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pdm) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == pf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 == p) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pmf != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pdm != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (pf != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (p != 0) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pmf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pdm) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != pf) // { dg-warning "zero as null pointer" }
+ ;
+
+ if (0 != p) // { dg-warning "zero as null pointer" }
+ ;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-2.C
new file mode 100644
index 000000000..317d852c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-2.C
@@ -0,0 +1,49 @@
+// PR c++/51045
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+template <typename T>
+struct A
+{
+ A() { t = new T; }
+
+ ~A()
+ {
+ delete t;
+ }
+ T* t;
+};
+
+template <typename T>
+struct B
+{
+ B() { t = new T[1]; }
+
+ ~B()
+ {
+ delete [] t;
+ }
+ T* t;
+};
+
+template <typename Type>
+class Variant
+{
+ Type t;
+};
+
+class Op;
+
+typedef Variant<A<Op> > vara;
+typedef Variant<B<Op> > varb;
+
+class Op
+{
+ vara x;
+ varb y;
+};
+
+int main()
+{
+ vara a;
+ varb b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-3.C
new file mode 100644
index 000000000..ed54143a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-3.C
@@ -0,0 +1,22 @@
+// PR c++/51290
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+class A { int a; };
+
+class B { int b; };
+
+class C : public A, public B
+{
+ private:
+ static void foo (A *x)
+ {
+ C *y = static_cast<C *>(x);
+ (void) y;
+ }
+
+ static void bar (B *x)
+ {
+ C *y = static_cast<C *>(x);
+ (void) y;
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-4.C
new file mode 100644
index 000000000..548caac36
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-4.C
@@ -0,0 +1,22 @@
+// PR c++/51299
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+class Base
+{
+ public:
+ virtual ~Base();
+};
+
+class Derived : public Base
+{
+};
+
+void foo(Base* b)
+{
+ Derived* d = dynamic_cast<Derived*>(b);
+}
+
+void bar(Base& b)
+{
+ Derived& d = dynamic_cast<Derived&>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C
new file mode 100644
index 000000000..185d2b5c4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C
@@ -0,0 +1,20 @@
+// PR c++/52718
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+struct foo
+{
+ foo(void* a = 0) {}; // { dg-warning "zero as null pointer" }
+};
+
+void* fun(void* a = 0) {}; // { dg-warning "zero as null pointer" }
+
+struct bar: foo
+{
+ bar() {};
+};
+
+struct baz
+{
+ baz(const foo& f1 = foo(),
+ void* f2 = fun()) {};
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-6.C
new file mode 100644
index 000000000..4a76b5cf1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-6.C
@@ -0,0 +1,6 @@
+// PR c++/53301
+// { dg-options "-Wzero-as-null-pointer-constant" }
+
+class x { public: x(int v) {} };
+
+void foo(const x& = 0);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C
new file mode 100644
index 000000000..cf193e0cb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C
@@ -0,0 +1,18 @@
+// Test for the warning of exposing types from an anonymous namespace
+// { dg-do compile }
+
+#include "anonymous-namespace-1.h"
+
+namespace {
+ class good { };
+}
+
+class foo::bar : public good { };
+class foobar1
+{
+ good g;
+};
+
+#line 17 "foo.C"
+class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" }
+class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h
new file mode 100644
index 000000000..0d3e239e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h
@@ -0,0 +1,7 @@
+class foo {
+ class bar;
+};
+
+namespace {
+ class bad { };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C
new file mode 100644
index 000000000..4048f3959
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C
@@ -0,0 +1,29 @@
+// Test for the warning of exposing types from an anonymous namespace
+// { dg-do compile }
+//
+#include "anonymous-namespace-2.h"
+
+namespace {
+ struct good { };
+}
+
+struct g1 {
+ good * A;
+};
+struct g2 {
+ good * A[1];
+};
+struct g3 {
+ good (*A)[1];
+};
+
+#line 21 "foo.C"
+struct b1 { // { dg-warning "uses the anonymous namespace" }
+ bad * B;
+};
+struct b2 { // { dg-warning "uses the anonymous namespace" }
+ bad * B[1];
+};
+struct b3 { // { dg-warning "uses the anonymous namespace" }
+ bad (*B)[1];
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h
new file mode 100644
index 000000000..ce5d05c2a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h
@@ -0,0 +1,3 @@
+namespace {
+ struct bad { };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C
new file mode 100644
index 000000000..8b72abdf5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C
@@ -0,0 +1,15 @@
+// Test for the warning of exposing types from an anonymous namespace
+// { dg-do compile }
+//
+#include <memory>
+#include "anonymous-namespace-3.h"
+
+struct B { std::auto_ptr<A> p; };
+
+#line 10 "foo.C"
+struct C // { dg-warning "uses the anonymous namespace" }
+{
+ std::auto_ptr<A> p;
+};
+
+// { dg-prune-output "auto_ptr. is deprecated" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h
new file mode 100644
index 000000000..0c7c1f8e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h
@@ -0,0 +1 @@
+namespace { struct A; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C
new file mode 100644
index 000000000..7d1e89edf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C
@@ -0,0 +1,12 @@
+// PR c++/57137
+
+#include "anonymous-namespace-4.h"
+
+namespace
+{
+ class NonCloneable;
+ void fn1 ()
+ {
+ is_function_impl < NonCloneable > i;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h
new file mode 100644
index 000000000..e0b7d68c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h
@@ -0,0 +1,14 @@
+template < typename T > struct integral_c {
+ static const T value = 0;
+};
+struct is_reference:integral_c < bool > { };
+template < class > struct is_function_ptr_helper { };
+template < bool > struct is_function_chooser;
+
+template <> struct is_function_chooser <0 >
+{
+ template < typename T > struct result_:is_function_ptr_helper < T * > { };
+};
+
+template < typename T > struct is_function_impl:is_function_chooser <
+ is_reference::value >::result_ < T > { };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-5.C
new file mode 100644
index 000000000..6f5a081d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-5.C
@@ -0,0 +1,8 @@
+namespace {
+ void f(); // { dg-message "never defined" }
+}
+
+int main()
+{
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-6.C
new file mode 100644
index 000000000..d238df392
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/anonymous-namespace-6.C
@@ -0,0 +1,8 @@
+// PR c++/53711
+// { dg-options -Wall }
+
+namespace {
+ void f () // { dg-warning "not used" }
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/changes-meaning.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/changes-meaning.C
new file mode 100644
index 000000000..fdbddf820
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/changes-meaning.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } */
+
+template <class _Tp> class auto_ptr {}; /* { dg-warning "changes meaning" } */
+template <class _Tp>
+class counted_ptr
+{
+public:
+ auto_ptr<_Tp> auto_ptr(); /* { dg-warning "" } */
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/compare1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/compare1.C
new file mode 100644
index 000000000..e00592262
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/compare1.C
@@ -0,0 +1,10 @@
+/* -Wall is supposed to trigger -Wsign-compare for C++. PR 10604.
+ See also gcc.dg/compare7.c. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int f(unsigned a, int b)
+{
+ return a < b; /* { dg-warning "signed and unsigned" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv1.C
new file mode 100644
index 000000000..d06cbd586
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv1.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Apr 2003 <nathan@codesourcery.com>
+
+// PR 10337, unneeded warning
+
+class A {
+ public:
+ A() {}
+};
+
+class B : public A {
+ public:
+ B() {}
+ void operator=(const A& b) {}
+ void operator=(const B& b) {}
+};
+
+class C {
+ public:
+ C() {}
+ operator B &() { return _b; }
+ operator const B &() const { return _b; }
+
+ B _b;
+};
+
+int main() {
+ B b;
+ C c;
+ b = c;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv2.C
new file mode 100644
index 000000000..45f518346
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv2.C
@@ -0,0 +1,5 @@
+// PR c++/13932
+// { dg-options "-Wconversion" }
+
+int i = 1.;
+int j = 1.1; // { dg-warning "conversion" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv3.C
new file mode 100644
index 000000000..5900c3aac
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv3.C
@@ -0,0 +1,4 @@
+// PR c++/19457
+
+int i=-1;
+unsigned int j= ~0; // { dg-bogus "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conv4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv4.C
new file mode 100644
index 000000000..a15ef8bf1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conv4.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// This file should compile cleanly by default and not warn on the conversions.
+int func1(int i)
+{
+ return i;
+}
+
+int main()
+{
+ float f;
+ long l;
+ unsigned long ul;
+
+ f = 1.5f;
+
+ l = f;
+ ul = -1;
+ func1(f);
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-function-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-function-1.C
new file mode 100644
index 000000000..878011cf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-function-1.C
@@ -0,0 +1,8 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// { dg-options "-Wno-conversion" }
+
+struct A {
+ operator A&();
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-real-integer-3.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-real-integer-3.h
new file mode 100644
index 000000000..6ed5b2c42
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/conversion-real-integer-3.h
@@ -0,0 +1,3 @@
+#pragma GCC system_header
+
+#define INT_MAX __INT_MAX__
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C
new file mode 100644
index 000000000..3e84c0921
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C
@@ -0,0 +1,9 @@
+// { dg-options "-Wctor-dtor-privacy" }
+
+struct C { // { dg-warning "" }
+ static bool result;
+private:
+ static bool check();
+};
+
+bool C::result = check();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C
new file mode 100644
index 000000000..16873ab78
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C
@@ -0,0 +1,7 @@
+struct C {
+ static bool result;
+private:
+ static bool check();
+};
+
+bool C::result = check();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-init-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-init-1.C
new file mode 100644
index 000000000..0796972fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor-init-1.C
@@ -0,0 +1,9 @@
+// PR c++/11554
+// { dg-options "-Wall" }
+
+struct Y {
+ Y ();
+ int i1, i2; // { dg-warning "" }
+};
+
+Y::Y () : i2(0), i1(0) {} // { dg-warning "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor1.C
new file mode 100644
index 000000000..00a6c952b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ctor1.C
@@ -0,0 +1,13 @@
+// PR c++/35734
+// { dg-options "-W" }
+
+struct A
+{
+ A();
+ template<typename T> A(const T&);
+};
+
+struct B : A
+{
+ B(const B&) {} // { dg-warning "base class" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-array-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-array-1.C
new file mode 100644
index 000000000..c3af71323
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-array-1.C
@@ -0,0 +1,11 @@
+// PR c++/29185
+
+int a [1];
+struct S { int a [1]; } s;
+
+void foo (S *p)
+{
+ delete a; // { dg-warning "deleting array" }
+ delete s.a; // { dg-warning "deleting array" }
+ delete p->a; // { dg-warning "deleting array" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-non-virtual-dtor.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-non-virtual-dtor.C
new file mode 100644
index 000000000..f5727ea90
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/delete-non-virtual-dtor.C
@@ -0,0 +1,66 @@
+// { dg-options "-Wdelete-non-virtual-dtor" }
+// { dg-do compile { target c++11 } }
+
+struct polyBase { virtual void f(); };
+
+void f(polyBase* p, polyBase* arr)
+{
+ polyBase pb;
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
+struct polyDerived : polyBase { };
+
+void f(polyDerived* p, polyDerived* arr)
+{
+ polyDerived pd;
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
+struct absDerived : polyBase { virtual void g() = 0; };
+
+void f(absDerived* p, absDerived* arr)
+{
+ delete p; // { dg-warning "non-virtual destructor will" }
+ delete [] arr;
+}
+
+struct finalDerived final : polyBase { };
+
+void f(finalDerived* p, finalDerived* arr)
+{
+ finalDerived fd;
+ delete p; // no error for final classes
+ delete [] arr;
+}
+
+struct safeBase { virtual ~safeBase(); };
+struct safeDerived : safeBase { virtual void f(); };
+
+void f(safeDerived* p, safeDerived* arr)
+{
+ safeDerived sd;
+ delete p; // no error because base has virtual dtor
+ delete [] arr;
+}
+
+struct polyBaseNonTrivial { ~polyBaseNonTrivial(); virtual void f(); };
+
+void f(polyBaseNonTrivial* p, polyBaseNonTrivial* arr)
+{
+ polyBaseNonTrivial pbnt;
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
+struct polyDerivedNT : polyBaseNonTrivial { ~polyDerivedNT(); };
+
+void f(polyDerivedNT* p, polyDerivedNT* arr)
+{
+ polyDerivedNT pdnt;
+ delete p; // { dg-warning "non-virtual destructor might" }
+ delete [] arr;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-2.C
new file mode 100644
index 000000000..d79a7f9e6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-2.C
@@ -0,0 +1,11 @@
+/* Test __attribute__((deprecated)). Test merging with multiple
+ declarations. Bug 7425 (C++ version). */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void func(void);
+void func(void) __attribute__((deprecated));
+
+void f(void) {
+ func(); /* { dg-warning "'void func\\(\\)' is deprecated" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-3.C
new file mode 100644
index 000000000..8b4378c41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-3.C
@@ -0,0 +1,14 @@
+/* PR 17947 bad warning with implicit conversion and __attribute__((deprecated)) */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct Foo
+{
+ operator int() __attribute__((deprecated));
+};
+
+void g(void)
+{
+ Foo f;
+ (int)f; // { dg-warning "'Foo::operator int\\(\\)' is deprecated \\(declared at" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-4.C
new file mode 100644
index 000000000..e2f1a2c33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-4.C
@@ -0,0 +1,9 @@
+// PR c++/15269
+
+struct B {
+ virtual int foo() __attribute__((deprecated));
+};
+
+int main(void) {
+ ((B*)0)->foo(); // { dg-warning "deprecated" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-5.C
new file mode 100644
index 000000000..a015bd50b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-5.C
@@ -0,0 +1,4 @@
+// PR c++/16370
+
+struct Foo { int i; } __attribute__ ((deprecated));
+void foo() { Foo f; } // { dg-warning "deprecated" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-6.C
new file mode 100644
index 000000000..8ce6ac02d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-6.C
@@ -0,0 +1,110 @@
+/* Test __attribute__ ((deprecated("message"))) */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations -fmessage-length=0" } */
+
+typedef int INT1 __attribute__((deprecated("Please avoid INT1")));
+typedef INT1 INT2 __attribute__ ((__deprecated__("Please avoid INT2")));
+
+typedef INT1 INT1a; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+
+INT1 should_be_unavailable; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+INT1a should_not_be_deprecated;
+
+INT1 f1(void) __attribute__ ((deprecated("Please avoid f1")));
+INT1 f2(void) { return 0; } /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+
+INT2 f3(void) __attribute__ ((__deprecated__("Please avoid f3")));
+INT2 f4(void) { return 0; } /* { dg-warning "'INT2' is deprecated .declared at \[^\n\]*: Please avoid INT2" "" } */
+int f5(INT2 x); /* { dg-warning "'INT2' is deprecated" "" } */
+int f6(INT2 x) __attribute__ ((__deprecated__("Please avoid f6")));
+
+typedef enum Color {red, green, blue} Color __attribute__((deprecated("Please avoid Color")));
+
+int g1;
+int g2 __attribute__ ((deprecated("Please avoid g2")));
+int g3 __attribute__ ((__deprecated__("Please avoid g3")));
+Color k; /* { dg-warning "'Color' is deprecated .declared at \[^\n\]*: Please avoid Color" "" } */
+
+typedef struct {
+ int field1;
+ int field2 __attribute__ ((deprecated("Please avoid field2")));
+ int field3;
+ int field4 __attribute__ ((__deprecated__("Please avoid field4")));
+ union {
+ int field5;
+ int field6 __attribute__ ((deprecated("Please avoid field6")));
+ } u1;
+ int field7:1;
+ int field8:1 __attribute__ ((deprecated("Please avoid field8")));
+ union {
+ int field9;
+ int field10;
+ } u2 __attribute__ ((deprecated("Please avoid u2")));
+} S1;
+
+int func1()
+{
+ INT1 w; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+ int x __attribute__ ((deprecated("Please avoid x")));
+ int y __attribute__ ((__deprecated__("Please avoid y")));
+ int z;
+ int (*pf)() = f1; /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "" } */
+
+ z = w + x + y + g1 + g2 + g3; /* { dg-warning "'x' is deprecated .declared at \[^\n\]*: Please avoid x" "" } */
+ /* { dg-warning "'y' is deprecated .declared at \[^\n\]*: Please avoid y" "y" { target *-*-* } 53 } */
+ /* { dg-warning "'g2' is deprecated .declared at \[^\n\]*: Please avoid g2" "g2" { target *-*-* } 53 } */
+ /* { dg-warning "'g3' is deprecated .declared at \[^\n\]*: Please avoid g3" "g3" { target *-*-* } 53 } */
+ return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "f1" } */
+}
+
+int func2(S1 *p)
+{
+ S1 lp;
+
+ if (p->field1)
+ return p->field2; /* { dg-warning "'S1::field2' is deprecated .declared at \[^\n\]*: Please avoid field2" "" } */
+ else if (lp.field4) /* { dg-warning "'S1::field4' is deprecated .declared at \[^\n\]*: Please avoid field4" "" } */
+ return p->field3;
+
+ p->u1.field5 = g1 + p->field7;
+ p->u2.field9; /* { dg-warning "'S1::u2' is deprecated .declared at \[^\n\]*: Please avoid u2" "" } */
+ return p->u1.field6 + p->field8; /* { dg-warning "'S1::<anonymous union>::field6' is deprecated .declared at \[^\n\]*: Please avoid field6" "" } */
+ /* { dg-warning "'S1::field8' is deprecated .declared at \[^\n\]*: Please avoid field8" "field8" { target *-*-* } 71 } */
+}
+
+struct SS1 {
+ int x;
+ INT1 y; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+} __attribute__ ((deprecated("Please avoid SS1")));
+
+struct SS1 *p1; /* { dg-warning "'SS1' is deprecated .declared at \[^\n\]*: Please avoid SS1" "" } */
+
+struct __attribute__ ((__deprecated__("Please avoid SS2"))) SS2 {
+ int x;
+ INT1 y; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */
+};
+
+struct SS2 *p2; /* { dg-warning "'SS2' is deprecated .declared at \[^\n\]*: Please avoid SS2" "" } */
+
+class T {
+ public:
+ void member1(int) __attribute__ ((deprecated("Please avoid member1")));
+ void member2(INT1) __attribute__ ((__deprecated__("Please avoid member2"))); /* { dg-warning "'INT1' is deprecated" "" } */
+ int member3(T *);
+ int x;
+} __attribute__ ((deprecated("Please avoid T")));
+
+T *p3; // { dg-warning "'T' is deprecated .declared at \[^\n\]*: Please avoid T" }
+
+inline void T::member1(int) {}
+
+int T::member3(T *p) // { dg-warning "'T' is deprecated .declared at \[^\n\]*: Please avoid T" }
+{
+ p->member1(1); /* { dg-warning "'void T::member1\\(int\\)' is deprecated .declared at \[^\n\]*: Please avoid member1" "" } */
+ (*p).member1(2); /* { dg-warning "'void T::member1\\(int\\)' is deprecated .declared at \[^\n\]*: Please avoid member1" "" } */
+ p->member2(1); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated .declared at \[^\n\]*: Please avoid member2" "" } */
+ (*p).member2(2); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated .declared at \[^\n\]*: Please avoid member2" "" } */
+ p->member3(p);
+ (*p).member3(p);
+ return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-7.C
new file mode 100644
index 000000000..f564a1bb0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-7.C
@@ -0,0 +1,17 @@
+// PR c++/56130
+
+int g_nn;
+int& g_n __attribute__((deprecated)) = g_nn;
+
+void f()
+{
+ int f_nn;
+ int& f_n __attribute__((deprecated)) = f_nn;
+ f_n = 1; // { dg-warning "'f_n' is deprecated" }
+}
+
+int main()
+{
+ g_n = 1; // { dg-warning "'g_n' is deprecated" }
+ f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-8.C
new file mode 100644
index 000000000..801811029
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated-8.C
@@ -0,0 +1,15 @@
+// PR c++/58305
+
+class ToBeDeprecated {
+} __attribute__ ((deprecated ("deprecated!")));
+
+typedef ToBeDeprecated NotToBeDeprecated; // { dg-warning "'ToBeDeprecated' is deprecated" }
+
+int main() {
+
+ ToBeDeprecated(); // { dg-warning "'ToBeDeprecated' is deprecated" }
+ ToBeDeprecated x; // { dg-warning "'ToBeDeprecated' is deprecated" }
+
+ NotToBeDeprecated();
+ NotToBeDeprecated y;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated.C
new file mode 100644
index 000000000..210740814
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/deprecated.C
@@ -0,0 +1,117 @@
+/* Test __attribute__ ((deprecated)) */
+/* { dg-do compile } */
+/* { dg-options "-Wdeprecated-declarations -fmessage-length=0" } */
+
+#if 1
+typedef int INT1 __attribute__((deprecated));
+typedef INT1 INT2 __attribute__ ((__deprecated__));
+
+typedef INT1 INT1a; /* { dg-warning "'INT1' is deprecated" "" } */
+typedef INT1 INT1b __attribute__ ((deprecated));
+
+INT1 should_be_unavailable; /* { dg-warning "'INT1' is deprecated" "" } */
+INT1a should_not_be_deprecated;
+
+INT1 f1(void) __attribute__ ((deprecated));
+INT1 f2(void) { return 0; } /* { dg-warning "'INT1' is deprecated" "" } */
+
+INT2 f3(void) __attribute__ ((__deprecated__));
+INT2 f4(void) { return 0; } /* { dg-warning "'INT2' is deprecated" "" } */
+int f5(INT2 x); /* { dg-warning "'INT2' is deprecated" "" } */
+int f6(INT2 x) __attribute__ ((__deprecated__));
+
+typedef enum Color {red, green, blue} Color __attribute__((deprecated));
+
+int g1;
+int g2 __attribute__ ((deprecated));
+int g3 __attribute__ ((__deprecated__));
+Color k; /* { dg-warning "'Color' is deprecated" "" } */
+
+typedef struct {
+ int field1;
+ int field2 __attribute__ ((deprecated));
+ int field3;
+ int field4 __attribute__ ((__deprecated__));
+ union {
+ int field5;
+ int field6 __attribute__ ((deprecated));
+ } u1;
+ int field7:1;
+ int field8:1 __attribute__ ((deprecated));
+ union {
+ int field9;
+ int field10;
+ } u2 __attribute__ ((deprecated));
+} S1;
+
+int func1()
+{
+ INT1 w; /* { dg-warning "'INT1' is deprecated" "" } */
+ int x __attribute__ ((deprecated));
+ int y __attribute__ ((__deprecated__));
+ int z;
+ int (*pf)() = f1; /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "" } */
+
+ z = w + x + y + g1 + g2 + g3; /* { dg-warning "'x' is deprecated" "" } */
+ /* { dg-warning "'y' is deprecated" "y" { target *-*-* } 55 } */
+ /* { dg-warning "'g2' is deprecated" "g2" { target *-*-* } 55 } */
+ /* { dg-warning "'g3' is deprecated" "g3" { target *-*-* } 55 } */
+ return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "f1" } */
+}
+
+int func2(S1 *p)
+{
+ S1 lp;
+
+ if (p->field1)
+ return p->field2; /* { dg-warning "'S1::field2' is deprecated" "" } */
+ else if (lp.field4) /* { dg-warning "'S1::field4' is deprecated" "" } */
+ return p->field3;
+
+ p->u1.field5 = g1 + p->field7;
+ p->u2.field9; /* { dg-warning "'S1::u2' is deprecated" "" } */
+ return p->u1.field6 + p->field8; /* { dg-warning "'S1::<anonymous union>::field6' is deprecated" "" } */
+ /* { dg-warning "'S1::field8' is deprecated" "field8" { target *-*-* } 73 } */
+}
+
+struct SS1 {
+ int x;
+ INT1 y; /* { dg-warning "'INT1' is deprecated" "" } */
+} __attribute__ ((deprecated));
+
+struct SS1 *p1; /* { dg-warning "'SS1' is deprecated" "" } */
+
+struct __attribute__ ((__deprecated__)) SS2 {
+ int x;
+ INT1 y; /* { dg-warning "'INT1' is deprecated" "" } */
+};
+
+struct SS2 *p2; /* { dg-warning "'SS2' is deprecated" "" } */
+#endif
+
+#ifdef __cplusplus
+class T {
+ public:
+ void member1(int) __attribute__ ((deprecated));
+ void member2(INT1) __attribute__ ((__deprecated__)); /* { dg-warning "'INT1' is deprecated" "" } */
+ int member3(T *);
+ int x;
+} __attribute__ ((deprecated));
+
+T *p3; // { dg-warning "'T' is deprecated" }
+
+inline void T::member1(int) {}
+
+int T::member3(T *p) // { dg-warning "'T' is deprecated" }
+{
+ p->member1(1); /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */
+ (*p).member1(2); /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */
+ p->member2(1); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated" "" } */
+ (*p).member2(2); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated" "" } */
+ p->member3(p);
+ (*p).member3(p);
+ return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "" } */
+}
+#endif
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/do-empty.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/do-empty.C
new file mode 100644
index 000000000..350261d48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/do-empty.C
@@ -0,0 +1,15 @@
+/* Test diagnostics for empty bodies in do / while. */
+/* { dg-do compile } */
+/* { dg-options "-Wempty-body" } */
+
+void
+f (int x)
+{
+ do
+ ; /* { dg-warning "empty body in" } */
+ while (x--);
+
+ do
+ {} /* { dg-bogus "empty body in" } */
+ while (++x < 10);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/effc1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc1.C
new file mode 100644
index 000000000..345f8d1b6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc1.C
@@ -0,0 +1,16 @@
+// { dg-options -Weffc++ }
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Apr 2002 <nathan@codesourcery.com>
+
+// Bug 5719
+
+class A
+{
+ public:
+ A & operator+=( int );
+ A & operator+( int ); // { dg-warning ".* should return by value" "" }
+ A operator+=( float );
+ A operator+( float );
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/effc2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc2.C
new file mode 100644
index 000000000..fb765f0d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc2.C
@@ -0,0 +1,39 @@
+// { dg-do compile }
+// { dg-options "-Weffc++" }
+// Contributed by Benjamin Kosnik <bkoz at redhat dot com>
+// PR c++/16169 : Improve -Weffc++ rule 15
+
+struct A {
+ const A& foo();
+ const A& operator=(int)
+ { return foo(); }
+};
+
+struct B {
+ B& foo();
+ B& operator=(int)
+ { return foo(); }
+};
+
+struct C {
+ C& operator=(int)
+ { return *this; }
+};
+
+struct D {
+ D operator=(int)
+ { return *this; } // { dg-warning "should return a reference" }
+};
+
+struct E {
+ E& foo();
+ E operator=(int)
+ { return foo(); } // { dg-warning "should return a reference" }
+};
+
+struct F
+{
+ operator float();
+ float operator=(int)
+ { return *this; } // { dg-warning "should return a reference" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/effc3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc3.C
new file mode 100644
index 000000000..ba2cc0399
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/effc3.C
@@ -0,0 +1,58 @@
+// { dg-do compile }
+// { dg-options "-Weffc++" }
+// Contributed by Benjamin Kosnik <bkoz at redhat dot com>
+// PR c++/16165 and PR c++/8211: Improve item 11 of -Weffc++
+
+
+// We should not warn for this class since this kind of pointers can
+// never hold dynamic memory.
+struct A {
+ void (*func1)(void);
+ void (A::*func2)(void);
+ int A::*func3;
+
+ int a;
+ void b(void);
+
+ A();
+ ~A();
+};
+
+// We do not warn for this class because there is no destructor, so we
+// assume there is no dynamic memory allocated (it could point to a
+// global variable).
+struct B {
+ int *ptr;
+ B();
+};
+
+
+// We should emit a warning for these
+struct C1 { // { dg-warning "" "" }
+ int *ptr;
+ C1();
+ ~C1();
+};
+
+struct C2 { // { dg-warning "" "" }
+ int *ptr;
+ C2();
+ C2(const C2&);
+ ~C2();
+};
+
+struct C3 { // { dg-warning "" "" }
+ int *ptr;
+ C3();
+ ~C3();
+ C3& operator=(const C3&);
+};
+
+// But not for this
+struct C4 {
+ int *ptr;
+ C4();
+ C4(const C4&);
+ ~C4();
+ C4& operator=(const C4&);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/empty-body.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/empty-body.C
new file mode 100644
index 000000000..064a09dde
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/empty-body.C
@@ -0,0 +1,12 @@
+// PR c++/5520
+// { dg-options "-O2 -Wempty-body" }
+
+void breakme()
+{
+ if(1) ; // { dg-warning "empty body" }
+ if(1) {} // { dg-bogus "empty body" }
+ if(1) (void)0; // { dg-bogus "empty body" }
+ if(1) {} else; // { dg-warning "empty body" }
+ if(1) {} else (void)0; // // { dg-bogus "empty body" }
+ if(1) ; else (void)0; // // { dg-bogus "empty body" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format1.C
new file mode 100644
index 000000000..27bc414b0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format1.C
@@ -0,0 +1,15 @@
+// Test that formats get checked according to C94.
+// Origin: Joseph Myers <jsm28@cam.ac.uk>.
+// { dg-do compile }
+// { dg-options "-ansi -pedantic -Wformat" }
+
+#include <cstdio>
+
+void
+foo (int i, int *ip, __WINT_TYPE__ lc, wchar_t *ls)
+{
+ std::printf ("%d%ls%lc\n", i, ls, lc);
+ std::printf ("%d", ls); // { dg-warning "format" "printf warning" }
+ std::scanf ("%d%lc%ls%l[abc]", ip, ls, ls, ls);
+ std::scanf ("%hd", ip); // { dg-warning "format" "scanf warning" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format2.C
new file mode 100644
index 000000000..639bc668b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format2.C
@@ -0,0 +1,32 @@
+// Test for format attributes: test applying them to types in C++.
+// Origin: Joseph Myers <jsm28@cam.ac.uk>
+// { dg-do compile }
+// { dg-options "-Wformat" }
+
+__attribute__((format(printf, 1, 2))) void (*tformatprintf0) (const char *, ...);
+void (*tformatprintf1) (const char *, ...) __attribute__((format(printf, 1, 2)));
+void (__attribute__((format(printf, 1, 2))) *tformatprintf2) (const char *, ...);
+void (__attribute__((format(printf, 1, 2))) ****tformatprintf3) (const char *, ...);
+
+char * (__attribute__((format_arg(1))) *tformat_arg) (const char *);
+
+void
+baz (int i)
+{
+ (*tformatprintf0) ("%d", i);
+ (*tformatprintf0) ((*tformat_arg) ("%d"), i);
+ (*tformatprintf0) ("%"); // { dg-warning "format" "prefix" }
+ (*tformatprintf0) ((*tformat_arg) ("%")); // { dg-warning "format" "prefix" }
+ (*tformatprintf1) ("%d", i);
+ (*tformatprintf1) ((*tformat_arg) ("%d"), i);
+ (*tformatprintf1) ("%"); // { dg-warning "format" "postfix" }
+ (*tformatprintf1) ((*tformat_arg) ("%")); // { dg-warning "format" "postfix" }
+ (*tformatprintf2) ("%d", i);
+ (*tformatprintf2) ((*tformat_arg) ("%d"), i);
+ (*tformatprintf2) ("%"); // { dg-warning "format" "nested" }
+ (*tformatprintf2) ((*tformat_arg) ("%")); // { dg-warning "format" "nested" }
+ (****tformatprintf3) ("%d", i);
+ (****tformatprintf3) ((*tformat_arg) ("%d"), i);
+ (****tformatprintf3) ("%"); // { dg-warning "format" "nested 2" }
+ (****tformatprintf3) ((*tformat_arg) ("%")); // { dg-warning "format" "nested 2" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format3.C
new file mode 100644
index 000000000..0bdaaee17
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format3.C
@@ -0,0 +1,12 @@
+// PR c++/13070
+// { dg-do compile }
+// { dg-options "-Wformat" }
+
+extern "C" int printf (const char*, ...);
+
+int main()
+{
+ printf("%d\n", 1, 1); // { dg-warning "too many" "printf warning" }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format4.C
new file mode 100644
index 000000000..fa622fceb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Wformat=2" }
+
+extern "C" int printf (const char*, ...);
+
+void foo(int i)
+{
+ printf("Hello World %d!\n", i);
+ printf(&"Hello World %d!\n"[0], i);
+ printf(&"Hello World %d!\n"[6], i);
+ printf(&"Hello World %d!\n"[8]-2, i);
+ printf(&"Hello World %d!\n"[4]+2, i);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format5.C
new file mode 100644
index 000000000..e219f8810
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format5.C
@@ -0,0 +1,12 @@
+// PR c++/38980
+// { dg-options "-Wformat" }
+
+extern "C"
+int printf(const char *format, ...) __attribute__((format(printf, 1, 2) ));
+
+const char fmt1[] = "Hello, %s";
+
+void f()
+{
+ printf(fmt1, 3); // { dg-warning "expects argument" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format6.C
new file mode 100644
index 000000000..a74f8025d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format6.C
@@ -0,0 +1,7 @@
+// PR c++/17212
+// { dg-options "-Wformat -Wno-format-zero-length" }
+
+void f()
+{
+ __builtin_printf("");
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format7.C
new file mode 100644
index 000000000..6e84069ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format7.C
@@ -0,0 +1,10 @@
+// PR c++/50757
+// { dg-options "-Wformat -Wno-nonnull" }
+
+extern void *f (void *__s) __attribute__ ((__nonnull__ (1)));
+
+int main()
+{
+ void* const s = 0;
+ f(s);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/format8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/format8.C
new file mode 100644
index 000000000..16b223ef8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/format8.C
@@ -0,0 +1,7 @@
+// PR c++/52818
+// { dg-options "-pedantic-errors -Wformat" }
+
+extern "C" int printf (const char *, ...);
+void f() {
+ printf("%lf", 0.0); // { dg-warning "%lf" "" { target { ! c++11 } } }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/forward-inner.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/forward-inner.C
new file mode 100644
index 000000000..dae99486a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/forward-inner.C
@@ -0,0 +1,81 @@
+// Check that the compiler warns about inner-style forward declarations in
+// contexts where they're not actually illegal, but merely useless.
+
+// Verify warnings for and within classes, and by extension, struct and union.
+class C1;
+class C1::C2; // { dg-error "does not name a type" }
+class C1::C2::C3; // { dg-error "has not been declared" }
+
+class C1 {
+ public:
+ class C2;
+ class C2::C3; // { dg-error "does not name a type" }
+ class C2 {
+ public:
+ class C3;
+ class C3 { };
+ class C3;
+ };
+ class C2;
+ class C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" }
+};
+
+class C1;
+class C1::C2; // { dg-warning "declaration 'class C1::C2' does not declare anything" }
+class C1::C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" }
+
+
+// Verify warnings for namespace scopes.
+class N1::C4; // { dg-error "has not been declared" }
+class N1::N2::C5; // { dg-error "has not been declared" }
+
+namespace N1 {
+ class C4;
+ class C4 { };
+ class C4;
+
+ class N2::C5; // { dg-error "has not been declared" }
+ namespace N2 {
+ class C5;
+ class C5 { };
+ class C5;
+ }
+ class N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" }
+}
+
+class N1::C4; // { dg-warning "declaration 'class N1::C4' does not declare anything" }
+class N1::N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" }
+
+
+// Verify that using declarations related to namespaces don't generate a
+// warning.
+using namespace N1;
+using namespace N1::N2;
+
+namespace N3 {
+ using N1::C4; // Valid using declaration, no warning
+ using N1::N2::C5; // Valid using declaration, no warning
+}
+
+
+// Verify that explicit template instantiations, easy to confuse with
+// forward declarations, don't generate a warning.
+template<class C>
+class TC6 {
+ public:
+ class TC7 { };
+};
+
+template class TC6<int>::TC7; // Valid explicit instantiation, no warning
+
+
+// Verify that friend declarations, also easy to confuse with forward
+// declrations, are similarly not warned about.
+class C8 {
+ public:
+ class C9 { };
+};
+class C10 {
+ public:
+ friend class C8::C9; // Valid friend declaration, no warning
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/friend.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/friend.C
new file mode 100644
index 000000000..e7982896a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/friend.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options -Wredundant-decls } */
+
+/* Test to see if spurious warnings about redundant
+ declarations are emiited because of the friend
+ declaration. */
+
+class Foo
+{
+ friend void bar (Foo);
+public:
+};
+
+extern void bar (Foo);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/huge-val1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/huge-val1.C
new file mode 100644
index 000000000..2ddfae0c9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/huge-val1.C
@@ -0,0 +1,33 @@
+// PR c++/23139: HUGE_VAL definition should be accepted with -pedantic.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do link }
+// { dg-options "-pedantic-errors" }
+
+#include <math.h>
+
+double d = HUGE_VAL;
+#ifdef HUGE_VALF
+float f = HUGE_VALF;
+#endif
+#ifdef HUGE_VALL
+long double l = HUGE_VALL;
+#endif
+
+extern void link_failure ();
+
+int
+main ()
+{
+#ifdef __GLIBC__
+ if (HUGE_VAL != __builtin_huge_val ())
+ link_failure ();
+#ifdef HUGE_VALF
+ if (HUGE_VALF != __builtin_huge_valf ())
+ link_failure ();
+#endif
+#ifdef HUGE_VALL
+ if (HUGE_VALL != __builtin_huge_vall ())
+ link_failure ();
+#endif
+#endif
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/if-empty-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/if-empty-1.C
new file mode 100644
index 000000000..b29a6cb92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/if-empty-1.C
@@ -0,0 +1,23 @@
+/* Test diagnostics for empty bodies in if / else. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wempty-body" } */
+
+void
+f (int x)
+{
+ if (x)
+ ; /* { dg-warning "suggest braces around empty body in an" } */
+ if (x)
+ ; /* By design we don't warn in this case. */
+ else
+ (void)0;
+ if (x)
+ (void)0;
+ else
+ ; /* { dg-warning "suggest braces around empty body in an" } */
+ if (x)
+ (void)0;
+ else
+ (void)0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ignored_typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ignored_typedef.C
new file mode 100644
index 000000000..74586a81f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ignored_typedef.C
@@ -0,0 +1,22 @@
+// PR c++/23689
+// Test that malformed typedef's produce a compiler warning.
+
+typedef char valid_0;
+typedef int valid_1;
+typedef long valid_2;
+typedef float valid_3;
+typedef double valid_4;
+typedef unsigned valid_5;
+typedef int *valid_6;
+typedef struct valid_7 {} valid_8;
+typedef struct {} valid_9;
+typedef int temp_0; typedef temp_0 valid_10;
+struct temp_1 {}; typedef temp_1 valid_11;
+union temp_2 {}; typedef temp_2 valid_12;
+typedef void (*valid_13) (int);
+
+typedef struct invalid_0 {}; // { dg-warning "'typedef' was ignored" }
+typedef class invalid_1 {}; // { dg-warning "'typedef' was ignored" }
+typedef enum invalid_2 { INVALID_2 }; // { dg-warning "'typedef' was ignored" }
+typedef enum { INVALID_3 }; // { dg-warning "'typedef' was ignored" }
+typedef union invalid_4 {}; // { dg-warning "'typedef' was ignored" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename1.C
new file mode 100644
index 000000000..2952e6fd0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename1.C
@@ -0,0 +1,17 @@
+// The -pedantic option must be omitted to trigger the crash.
+// { dg-do compile }
+// { dg-options "" }
+
+// PR c++/7982: Crash warning about implicit typename.
+// The base class refers to another typename, while the
+// name lookup finds a template.
+
+template <typename T> struct X {};
+
+template <typename T> struct C {
+ typedef typename T::X X;
+};
+
+template <typename T> struct A : public C<T> {
+ typedef ::X<int> X;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename2.C
new file mode 100644
index 000000000..2bd83cffa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename2.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/11039: Implicit typename warning in friend class declaration.
+
+template <typename T> struct X {
+ struct Y {
+ struct Z {};
+ };
+ friend struct Y::Z;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename3.C
new file mode 100644
index 000000000..9b1ea8cfc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/implicit-typename3.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/11039: Implicit typename warning in friend class declaration.
+
+template <typename T> struct X {
+ struct Y {
+ struct Z {};
+ };
+ template <typename U> friend struct Y::Z f(U);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete1.C
new file mode 100644
index 000000000..9dc645d82
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Contributed by Brian Gaeke; public domain.
+
+// 5 If the object being deleted has incomplete class type at the
+// point of deletion and the complete class has a non-trivial
+// destructor or a deallocation function, the behavior is undefined.
+
+// (But the deletion does not constitute an ill-formed program. So the
+// program should nevertheless compile, but it should give a warning.)
+
+class A; // { dg-warning "forward declaration of 'class A'" "" }
+
+A *a; // { dg-warning "'a' has incomplete type" "" }
+
+int
+main (int argc, char **argv)
+{
+ delete a; // { dg-warning "delete" "warn" }
+ // { dg-message "note" "note" { target *-*-* } 19 }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete2.C
new file mode 100644
index 000000000..30be26749
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/incomplete2.C
@@ -0,0 +1,13 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A; // { dg-error "forward declaration" }
+
+int f (A); // { dg-error "initializing" }
+const A &make ();
+
+int
+main ()
+{
+ return f (make ()); // { dg-error "invalid use of incomplete type" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/inline1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/inline1.C
new file mode 100644
index 000000000..24836e744
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/inline1.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com>
+
+// PR 4803. Used inline functions must have a definition.
+
+inline void Foo1 (); // { dg-warning "inline function" "" }
+inline void Bar1 ();
+template <typename T> inline void Foo2(T); // { dg-warning "inline function" "" }
+template <typename T> inline void Bar2(T);
+
+void Baz ()
+{
+ Foo1 ();
+ Foo2 (1);
+
+ Bar1 ();
+ Bar2 (1);
+}
+
+inline void Bar1 () {}
+template <typename T> inline void Bar2(T) {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/inline2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/inline2.C
new file mode 100644
index 000000000..0f5f78af1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/inline2.C
@@ -0,0 +1,20 @@
+// PR c++/21627
+
+template<typename T>
+struct TPL
+{
+ TPL (){}
+ ~TPL (){}
+ void method () {}
+};
+
+template <> TPL<int>::TPL ();
+template <> TPL<int>::~TPL ();
+template <> void TPL<int>::method ();
+
+void Foo ()
+{
+ TPL<int> i;
+ i.method ();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/main-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-2.C
new file mode 100644
index 000000000..d38ef8e09
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// Make sure that the type of f1 does not change
+// after the error of main about not returning
+// int.
+// From Pekka Vuorela <pvuorela@iki.fi>
+// PR c++/23229
+
+void f1();
+
+void
+main() /* { dg-error "must return" } */
+{
+ f1();
+}
+
+void f1()
+{
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/main-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-3.C
new file mode 100644
index 000000000..eb462f4ba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-3.C
@@ -0,0 +1,7 @@
+// PR c++/29735
+// { dg-do compile }
+
+int __attribute__ ((vector_size (8))) main () // { dg-error "must return" }
+{
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/main-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-4.C
new file mode 100644
index 000000000..ad2dd7098
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/main-4.C
@@ -0,0 +1,5 @@
+// This pattern is used by a lot of autoconf scripts, so don't
+// complain about it unless -pedantic.
+// { dg-options "" }
+
+int main () { main (); return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/main.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/main.C
new file mode 100644
index 000000000..ebf92177b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/main.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Donald W. Gillies <dgillies@graviton.com>
+
+// PR c++/4494: Incorrect diagnostics about return type of main.
+
+typedef int int_t;
+
+int_t main() {
+
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-1.C
new file mode 100644
index 000000000..0b3f6e952
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-1.C
@@ -0,0 +1,43 @@
+/* Test for warnings for missing format attributes. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
+/* VxWorks does not provide vscanf, either in kernel or RTP mode. */
+/* { dg-error "not declared" "" { target *-*-vxworks* } 26 } */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+void
+foo (const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ vprintf (fmt, ap); /* { dg-warning "candidate" "printf attribute warning" } */
+ va_end (ap);
+}
+
+void
+bar (const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ vscanf (fmt, ap); /* { dg-warning "candidate" "scanf attribute warning" { xfail *-*-vxworks* } } */
+ va_end (ap);
+}
+
+__attribute__((__format__(__printf__, 1, 2))) void
+foo2 (const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ vprintf (fmt, ap);
+ va_end (ap);
+}
+
+void
+vfoo (const char *fmt, va_list arg)
+{
+ vprintf (fmt, arg); /* { dg-warning "candidate" "printf attribute warning 2" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-2.C
new file mode 100644
index 000000000..bd7f11ba8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-2.C
@@ -0,0 +1,17 @@
+/* Test for warnings for missing format attributes. Don't warn if no
+ relevant parameters for a format attribute; see c/1017. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+void
+foo (int i, ...)
+{
+ va_list ap;
+ va_start (ap, i);
+ vprintf ("Foo %s bar %s", ap); /* { dg-bogus "candidate" "bogus printf attribute warning" } */
+ va_end (ap);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-3.C
new file mode 100644
index 000000000..d131d1511
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-3.C
@@ -0,0 +1,27 @@
+/* Test warnings for missing format attributes on function pointers. */
+/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
+
+#include <stdarg.h>
+
+typedef void (*noattr_t) (const char *, ...);
+typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t;
+
+typedef void (*vnoattr_t) (const char *, va_list);
+typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t;
+
+void
+foo1 (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va)
+{
+ noattr_t na1 = na;
+ noattr_t na2 = a; /* { dg-warning "candidate" "initialization warning" } */
+ attr_t a1 = na;
+ attr_t a2 = a;
+
+ vnoattr_t vna1 = vna;
+ vnoattr_t vna2 = va; /* { dg-warning "candidate" "initialization warning" } */
+ vattr_t va1 = vna;
+ vattr_t va2 = va;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-4.C
new file mode 100644
index 000000000..73db0d50b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-4.C
@@ -0,0 +1,33 @@
+/* Test warnings for missing format attributes on function pointers. */
+/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
+
+#include <stdarg.h>
+
+typedef void (*noattr_t) (const char *, ...);
+typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t;
+
+typedef void (*vnoattr_t) (const char *, va_list);
+typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t;
+
+void
+foo1 (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va)
+{
+ noattr_t na1, na2;
+ attr_t a1, a2;
+
+ vnoattr_t vna1, vna2;
+ vattr_t va1, va2;
+
+ na1 = na;
+ na2 = a; /* { dg-warning "candidate" "assignment warning" } */
+ a1 = na;
+ a2 = a;
+
+ vna1 = vna;
+ vna2 = va; /* { dg-warning "candidate" "assignment warning" } */
+ va1 = vna;
+ va1 = va;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-5.C
new file mode 100644
index 000000000..cbc27b5e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-5.C
@@ -0,0 +1,49 @@
+/* Test warnings for missing format attributes on function pointers. */
+/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
+
+#include <stdarg.h>
+
+typedef void (*noattr_t) (const char *, ...);
+typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t;
+
+typedef void (*vnoattr_t) (const char *, va_list);
+typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t;
+
+noattr_t
+foo1 (noattr_t na, attr_t a, int i)
+{
+ if (i)
+ return na;
+ else
+ return a; /* { dg-warning "candidate" "return type warning" } */
+}
+
+attr_t
+foo2 (noattr_t na, attr_t a, int i)
+{
+ if (i)
+ return na;
+ else
+ return a;
+}
+
+vnoattr_t
+foo3 (vnoattr_t vna, vattr_t va, int i)
+{
+ if (i)
+ return vna;
+ else
+ return va; /* { dg-warning "candidate" "return type warning" } */
+}
+
+vattr_t
+foo4 (vnoattr_t vna, vattr_t va, int i)
+{
+ if (i)
+ return vna;
+ else
+ return va;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-6.C
new file mode 100644
index 000000000..f78dbdfa1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/miss-format-6.C
@@ -0,0 +1,32 @@
+/* Test warnings for missing format attributes on function pointers. */
+/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-format-attribute" } */
+/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */
+
+#include <stdarg.h>
+
+typedef void (*noattr_t) (const char *, ...);
+typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t;
+
+typedef void (*vnoattr_t) (const char *, va_list);
+typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t;
+
+extern void foo1 (noattr_t);
+extern void foo2 (attr_t);
+extern void foo3 (vnoattr_t);
+extern void foo4 (vattr_t);
+
+void
+foo (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va)
+{
+ foo1 (na);
+ foo1 (a); /* { dg-warning "candidate" "parameter passing warning" } */
+ foo2 (na);
+ foo2 (a);
+
+ foo3 (vna);
+ foo3 (va); /* { dg-warning "candidate" "parameter passing warning" } */
+ foo4 (vna);
+ foo4 (va);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-1.C
new file mode 100644
index 000000000..f28418f0c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-1.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wextra -Wno-missing-field-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { 1, 2, 3 };
+struct s s2 = { 1, 2 }; /* { dg-bogus "missing initializer" } */
+struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-bogus "missing initializer" } */
+struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-bogus "missing initializer" } */
+struct s s5[] = { 1, 2, 3, 4, 5, 6 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-2.C
new file mode 100644
index 000000000..7f6ec060f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/missing-field-init-2.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-field-initializers" } */
+
+struct s { int a, b, c; };
+struct s s1 = { 1, 2, 3 };
+struct s s2 = { 1, 2 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
+struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-warning "(missing initializer)|(near initialization)" } */
+struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-warning "(missing initializer)|(near initialization)" } */
+struct s s5[] = { 1, 2, 3, 4, 5, 6 };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C
new file mode 100644
index 000000000..c941c1333
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C
@@ -0,0 +1,13 @@
+/* PR c/19978 : Test for duplicated warnings (unary operators). */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow -ftrack-macro-expansion=0" } */
+
+#include <limits.h>
+
+int
+g (void)
+{
+ return - - - - -INT_MIN; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */
+ /* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C
new file mode 100644
index 000000000..863016bfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C
@@ -0,0 +1,12 @@
+/* PR c/19978 : Test for duplicated warnings (binary operators). */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow" } */
+
+#include <limits.h>
+
+int
+g1 (void)
+{
+ return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */
+ /* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C
new file mode 100644
index 000000000..afb4e517f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C
@@ -0,0 +1,12 @@
+/* PR 30465 : Test for duplicated warnings in a conversion. */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow" } */
+
+short int
+g (void)
+{
+ short int wc = ((short int)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */
+ /* { dg-warning "overflow" "" { target *-*-* } 8 } */
+ return wc;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/new1.C
new file mode 100644
index 000000000..b50b2c354
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/new1.C
@@ -0,0 +1,3 @@
+void f() {
+ new int[0]; // { dg-bogus "zero" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/no-write-strings.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/no-write-strings.C
new file mode 100644
index 000000000..c5d48de37
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/no-write-strings.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options -Wno-write-strings }
+
+int main()
+{
+ char* p = "Asgaard";
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect2.C
new file mode 100644
index 000000000..8b012c8ca
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect2.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Aug 2003 <nathan@codesourcery.com>
+// Origin PR 11945 gerald@pfeifer.com
+
+// PR 11945 inconsistent warnings
+
+extern "C" void FormatDisk();
+ template <class T>
+ struct C {
+ C(){ FormatDisk(), 0; } // { dg-warning "right operand of comma" "" }
+ };
+ template struct C<int>; // { dg-message "required" }
+ template <class T>
+ void f() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" }
+ template void f<int> (); // { dg-message "required" }
+void g() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect4.C
new file mode 100644
index 000000000..612db48ee
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect4.C
@@ -0,0 +1,88 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Sep 2003 <nathan@codesourcery.com>
+
+// PR 12037.
+
+struct X
+{
+ int operator+(int);
+ int operator-(int);
+ int operator*(int);
+ int operator/(int);
+ int operator%(int);
+ int operator>>(int);
+ int operator<<(int);
+ int operator&(int);
+ int operator|(int);
+ int operator^(int);
+ int operator&&(int);
+ int operator||(int);
+ int operator==(int);
+ int operator!=(int);
+ int operator<(int);
+ int operator<=(int);
+ int operator>(int);
+ int operator>=(int);
+ int operator*();
+ int operator!();
+ int operator~();
+ int operator++();
+ int operator--();
+ int operator++(int);
+ int operator--(int);
+ int operator()();
+ int operator,(int);
+ X *operator->();
+ operator int () const;
+ int m;
+ virtual ~X ();
+ X &Foo ();
+};
+struct Y : X
+{
+};
+
+template<int I> void Foo (X &x)
+{
+ x + I;
+ x - I;
+ x * I;
+ x / I;
+ x % I;
+ x >> I;
+ x << I;
+ x & I;
+ x | I;
+ x && I;
+ x || I;
+ x == I;
+ x != I;
+ x < I;
+ x <= I;
+ x > I;
+ x >= I;
+ *x;
+ !x;
+ ~x;
+ x++;
+ x--;
+ ++x;
+ --x;
+ x ();
+ x, I;
+ x->m;
+ static_cast<int> (x);
+ dynamic_cast<Y &> (x);
+ reinterpret_cast<int> (x.Foo ()); // { dg-error "invalid cast" }
+ const_cast<X &> (x.Foo ()); // { dg-warning "not used" }
+
+ reinterpret_cast<int *> (&x);// { dg-warning "no effect" "" }
+ const_cast<X &> (x); // { dg-warning "no effect" "" }
+ sizeof (x++); // { dg-warning "no effect" "" }
+ __alignof__ (x++); // { dg-warning "no effect" "" }
+}
+
+template void Foo<4> (X&); // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect5.C
new file mode 100644
index 000000000..f0f4e7410
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect5.C
@@ -0,0 +1,8 @@
+/* PR middle-end/13325 */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n);
+void f (void *dest, const void *src) {
+ memcpy (dest, src, 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect6.C
new file mode 100644
index 000000000..ca6baba81
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect6.C
@@ -0,0 +1,14 @@
+// { dg-options "-Wall" }
+// PR c++/15083
+
+extern "C" int printf(const char*,...);
+struct Counter {
+ Counter(){printf("Hello World.\n");}
+};
+template< typename T >
+void resetData() {
+ new Counter();
+}
+int main() {
+ resetData<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect7.C
new file mode 100644
index 000000000..4aca2496c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect7.C
@@ -0,0 +1,8 @@
+// PR c++/8057
+// Don't give a "statement has no effect" warning when declaring a
+// template, only when instantiating it.
+// { dg-do compile }
+// { dg-options "-Wunused" }
+struct Y { static int i; };
+template <typename T> class X { X() { Y::i; }; };
+class Z { Z() { Y::i; }; }; // { dg-warning "no effect" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect8.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect8.C
new file mode 100644
index 000000000..48edfdea6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noeffect8.C
@@ -0,0 +1,15 @@
+// PR c++/26696, 28996
+// { dg-do compile }
+// { dg-options "-Waddress" }
+
+struct A
+{
+ static void f() {}
+};
+
+int main()
+{
+ A a;
+ a.f; // { dg-warning "not call" }
+ A().f; // { dg-warning "not call" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/nonnull1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/nonnull1.C
new file mode 100644
index 000000000..46de7e931
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/nonnull1.C
@@ -0,0 +1,16 @@
+// Test that "nonnull" attribute works for C++.
+// Origin: Joseph Myers <jsm@polyomino.org.uk>
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// The "nonnull" attribute is thoroughly tested for C, so here we
+// simply test that it works at all, as at one point the relevant
+// checking code was only called for C.
+
+extern void f (char *) __attribute__((nonnull));
+
+void
+g ()
+{
+ f (0); // { dg-warning "null" "null argument" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-1.C
new file mode 100644
index 000000000..17375d42e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-1.C
@@ -0,0 +1,71 @@
+// Test that noreturn attributes are properly set.
+// Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> 2002-06-18.
+// { dg-do compile }
+// { dg-options "-Wall -O2" }
+
+#include <cstdlib>
+
+int foo1 (int i)
+{
+ switch (i)
+ {
+ case 1:
+ case 2:
+ return i;
+ }
+ abort();
+}
+
+int foo2 (int i)
+{
+ switch (i)
+ {
+ case 1:
+ case 2:
+ return i;
+ }
+ std::abort();
+}
+
+int foo3 (int i)
+{
+ switch (i)
+ {
+ case 1:
+ case 2:
+ return i;
+ }
+ exit(1);
+}
+
+int foo4 (int i)
+{
+ switch (i)
+ {
+ case 1:
+ case 2:
+ return i;
+ }
+ std::exit(1);
+}
+
+void __attribute__ ((__noreturn__)) foo5 ()
+{
+ abort();
+}
+
+void __attribute__ ((__noreturn__)) foo6 ()
+{
+ std::abort();
+}
+
+void __attribute__ ((__noreturn__)) foo7 ()
+{
+ exit(1);
+}
+
+void __attribute__ ((__noreturn__)) foo8 ()
+{
+ std::exit(1);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-2.C
new file mode 100644
index 000000000..3b18e1dbc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-2.C
@@ -0,0 +1,4 @@
+// { dg-options "-Wall" }
+
+template <class T>
+int f (T t) { } // { dg-warning "no return" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-3.C
new file mode 100644
index 000000000..828935c12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-3.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Origin: stip@mathematik.uni-ulm.de
+// Andrew Pinski <pinskia@gcc.gnu.org>
+
+// PR c++/13106: No return warning when return type is a dependent type.
+
+template <typename T> T dummy() { }
+
+int main() {
+ dummy<void>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-4.C
new file mode 100644
index 000000000..7ef76cc5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-4.C
@@ -0,0 +1,13 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+ int g ()
+ {
+ f (__FUNCTION__);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-5.C
new file mode 100644
index 000000000..77d4890df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-5.C
@@ -0,0 +1,15 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+void f (int) __attribute__ ((noreturn));
+void f (double) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+ int g ()
+ {
+ f ((T) 0);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-6.C
new file mode 100644
index 000000000..fdbc42516
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-6.C
@@ -0,0 +1,13 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *);
+
+template <typename T> struct A
+{
+ int g ()
+ {
+ f (__FUNCTION__);
+ } // { dg-warning "no return statement in function returning non-void" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-7.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-7.C
new file mode 100644
index 000000000..a869b7016
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/noreturn-7.C
@@ -0,0 +1,15 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+void f (int);
+void f (double) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+ int g ()
+ {
+ f ((T) 0);
+ } // { dg-warning "no return statement in function returning non-void" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/null4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/null4.C
new file mode 100644
index 000000000..6aa4a097f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/null4.C
@@ -0,0 +1,55 @@
+// PR c++/24745 : warnings for NULL constant.
+// { dg-do compile }
+// { dg-options "-Wpointer-arith -Wconversion " }
+
+#include <cstddef>
+
+int foo (void)
+{
+ if (NULL == 1) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL > NULL) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL < NULL) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL >= 0) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL <= 0) return -1; // { dg-warning "NULL used in arithmetic" }
+ // Adding to the NULL pointer, which has no specific type, should
+ // result in a warning; the type of the resulting expression is
+ // actually "int", not a pointer type.
+ if (NULL + 1) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (1 + NULL) return -1; // { dg-warning "NULL used in arithmetic" }
+ return 0;
+}
+
+int *ip;
+
+struct S {};
+typedef int S::*SPD;
+typedef void (S::*SPF)(void);
+SPD spd;
+SPF spf;
+
+int bar (void)
+{
+ if (NULL) return -1;
+ if (!NULL) return -1;
+ if (!NULL == 1) return -1;
+ if (NULL || NULL) return -1;
+ if (!NULL && NULL) return -1;
+ if (NULL == NULL) return -1;
+ if (NULL != NULL) return -1;
+ if (NULL == 0) return -1;
+ if (NULL != 0) return -1;
+ // Subtraction of pointers is vaild, so using NULL is OK.
+ if (ip - NULL) return -1;
+ if (NULL - NULL) return -1;
+ // Comparing NULL with a pointer-to-member is OK.
+ if (NULL == spd) return -1;
+ if (spd == NULL) return -1;
+ if (NULL != spd) return -1;
+ if (spd != NULL) return -1;
+ if (NULL == spf) return -1;
+ if (spf == NULL) return -1;
+ if (NULL != spf) return -1;
+ if (spf != NULL) return -1;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/oldcast1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/oldcast1.C
new file mode 100644
index 000000000..26c0a5c4d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/oldcast1.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-ansi -pedantic-errors -Wold-style-cast" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5089. old style cast to void should be permitted (think assert)
+
+void foo ()
+{
+ int i;
+ float f = (float)i; // { dg-warning "use of old-style cast" "" }
+
+ (void)i;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-1.C
new file mode 100644
index 000000000..7cd76e74c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-1.C
@@ -0,0 +1,128 @@
+/* Test for diagnostics for constant overflow. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } */
+
+#include <limits.h>
+
+enum e {
+ E0 = INT_MAX,
+ /* Unsigned overflow wraps around. */
+ E1 = UINT_MAX + 1,
+ /* Overflow in an unevaluated part of an expression is OK (example
+ in the standard). */
+ E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } 14 } */
+ E3 = 1 / 0, /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant.expression" "enum error" { target *-*-* } 15 } */
+ /* But as in DR#031, the 1/0 in an evaluated subexpression means the
+ whole expression violates the constraints. */
+ E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */
+ E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 21 } */
+ /* Again, overflow in evaluated subexpression. */
+ E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 24 } */
+ /* A cast does not constitute overflow in conversion. */
+ E7 = (char) INT_MAX
+};
+
+struct s {
+ int a;
+ int : 0 * (1 / 0); /* { dg-warning "division by zero" } */
+ int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 33 } */
+};
+
+void
+f (void)
+{
+ /* This expression is not required to be a constant expression, so
+ it should just involve undefined behavior at runtime. */
+ int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+}
+
+/* This expression is neither required to be constant. */
+static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+
+
+// Test for overflow in null pointer constant.
+void *n = 0;
+/* The first two of these involve overflow, so are not null pointer
+ constants. The third has the overflow in an unevaluated
+ subexpression, so is a null pointer constant. */
+void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+/* { dg-warning "invalid conversion from 'int' to 'void" "null" { target *-*-* } 54 } */
+void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */
+/* { dg-error "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 56 } */
+void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */
+
+void
+g (int i)
+{
+ switch (i)
+ {
+ case 0 * (1/0): /* { dg-warning "division by zero" } */
+ ;
+ case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 67 } */
+ ;
+ }
+}
+
+int
+h (void)
+{
+ return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+}
+
+int
+h1 (void)
+{
+ return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */
+}
+
+void fuc (unsigned char);
+void fsc (signed char);
+
+void
+h2 (void)
+{
+ fsc (SCHAR_MAX + 1);
+ fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (UCHAR_MAX);
+ fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fuc (-1);
+ fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (SCHAR_MIN);
+ fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+}
+
+void fui (unsigned int);
+void fsi (signed int);
+
+int si;
+unsigned ui;
+
+void
+h2i (int x)
+{
+ /* For some reason, we only give certain warnings for implicit
+ conversions among values of the same precision with -Wconversion,
+ while we don't give others at all. */
+ fsi ((unsigned)INT_MAX + 1);
+ si = (unsigned)INT_MAX + 1;
+ si = x ? (unsigned)INT_MAX + 1 : 1;
+ fsi ((unsigned)INT_MAX + 2);
+ si = (unsigned)INT_MAX + 2;
+ si = x ? (unsigned)INT_MAX + 2 : 1;
+ fsi (UINT_MAX);
+ si = UINT_MAX;
+ fui (-1);
+ ui = -1;
+ ui = x ? -1 : 1U;
+ fui (INT_MIN);
+ ui = INT_MIN;
+ ui = x ? INT_MIN : 1U;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-3.C
new file mode 100644
index 000000000..73c0e006f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-3.C
@@ -0,0 +1,130 @@
+/* Test for diagnostics for constant overflow. Test with -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-fpermissive -pedantic" } */
+
+#include <limits.h>
+
+enum e {
+ E0 = INT_MAX,
+ /* Unsigned overflow wraps around. */
+ E1 = UINT_MAX + 1,
+ /* Overflow in an unevaluated part of an expression is OK (example
+ in the standard). */
+ E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } 14 } */
+ E3 = 1 / 0, /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant.expression" "enum error" { target *-*-* } 15 } */
+ /* But as in DR#031, the 1/0 in an evaluated subexpression means the
+ whole expression violates the constraints. */
+ E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */
+ E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 21 } */
+ /* Again, overflow in evaluated subexpression. */
+ E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 24 } */
+ /* A cast does not constitute overflow in conversion. */
+ E7 = (char) INT_MAX
+};
+
+struct s {
+ int a;
+ int : 0 * (1 / 0); /* { dg-warning "division by zero" } */
+ int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 33 } */
+};
+
+void
+f (void)
+{
+ /* This expression is not required to be a constant expression, so
+ it should just involve undefined behavior at runtime. */
+ int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+
+}
+
+/* This expression is neither required to be constant. */
+static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+
+
+// Test for overflow in null pointer constant.
+void *n = 0;
+/* The first two of these involve overflow, so are not null pointer
+ constants. The third has the overflow in an unevaluated
+ subexpression, so is a null pointer constant. */
+void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+/* { dg-warning "invalid conversion from 'int' to 'void" "null" { target *-*-* } 55 } */
+
+void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */
+/* { dg-warning "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 58 } */
+void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */
+
+void
+g (int i)
+{
+ switch (i)
+ {
+ case 0 * (1/0): /* { dg-warning "division by zero" } */
+ ;
+ case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */
+ /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 69 } */
+ ;
+ }
+}
+
+int
+h (void)
+{
+ return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+}
+
+int
+h1 (void)
+{
+ return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */
+}
+
+void fuc (unsigned char);
+void fsc (signed char);
+
+void
+h2 (void)
+{
+ fsc (SCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (UCHAR_MAX); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fuc (-1);
+ fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (SCHAR_MIN);
+ fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+}
+
+void fui (unsigned int);
+void fsi (signed int);
+
+int si;
+unsigned ui;
+
+void
+h2i (int x)
+{
+ /* For some reason, we only give certain warnings for implicit
+ conversions among values of the same precision with -Wconversion,
+ while we don't give others at all. */
+ fsi ((unsigned)INT_MAX + 1);
+ si = (unsigned)INT_MAX + 1;
+ si = x ? (unsigned)INT_MAX + 1 : 1;
+ fsi ((unsigned)INT_MAX + 2);
+ si = (unsigned)INT_MAX + 2;
+ si = x ? (unsigned)INT_MAX + 2 : 1;
+ fsi (UINT_MAX);
+ si = UINT_MAX;
+ fui (-1);
+ ui = -1;
+ ui = x ? -1 : 1U;
+ fui (INT_MIN);
+ ui = INT_MIN;
+ ui = x ? INT_MIN : 1U;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-4.C
new file mode 100644
index 000000000..24b3959a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-4.C
@@ -0,0 +1,133 @@
+/* Test for diagnostics for constant overflow. Test with -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+#include <limits.h>
+
+enum e {
+ E0 = INT_MAX,
+ /* Unsigned overflow wraps around. */
+ E1 = UINT_MAX + 1,
+ /* Overflow in an unevaluated part of an expression is OK (example
+ in the standard). */
+ E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } } */
+ E3 = 1 / 0, /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant.expression" "enum error" { target *-*-* } 15 } */
+ /* But as in DR#031, the 1/0 in an evaluated subexpression means the
+ whole expression violates the constraints. */
+ E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */
+ /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */
+ E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */
+ /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 21 } */
+ /* { dg-error "enumerator value for 'E5' is not an integer constant" "enum error" { target *-*-* } 21 } */
+ /* Again, overflow in evaluated subexpression. */
+ E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */
+ /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 25 } */
+ /* { dg-error "enumerator value for 'E6' is not an integer constant" "enum error" { target *-*-* } 25 } */
+ /* A cast does not constitute overflow in conversion. */
+ E7 = (char) INT_MAX
+};
+
+struct s {
+ int a;
+ int : 0 * (1 / 0); /* { dg-warning "division by zero" } */
+ int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+ /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 35 } */
+ /* { dg-error "bit-field .* width not an integer constant" "" { target *-*-* } 35 } */
+};
+
+void
+f (void)
+{
+ /* This expression is not required to be a constant expression, so
+ it should just involve undefined behavior at runtime. */
+ int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+
+}
+
+/* This expression is neither required to be constant. */
+static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+
+
+// Test for overflow in null pointer constant.
+void *n = 0;
+/* The first two of these involve overflow, so are not null pointer
+ constants. The third has the overflow in an unevaluated
+ subexpression, so is a null pointer constant. */
+void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */
+/* { dg-error "invalid conversion from 'int' to 'void" "null" { target *-*-* } 58 } */
+
+void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */
+/* { dg-error "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 61 } */
+void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */
+
+void
+g (int i)
+{
+ switch (i)
+ {
+ case 0 * (1/0): /* { dg-warning "division by zero" } */
+ ;
+ case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */
+ /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 72 } */
+ ;
+ }
+}
+
+int
+h (void)
+{
+ return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
+}
+
+int
+h1 (void)
+{
+ return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */
+}
+
+void fuc (unsigned char);
+void fsc (signed char);
+
+void
+h2 (void)
+{
+ fsc (SCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (UCHAR_MAX); /* { dg-warning "overflow in implicit constant conversion" } */
+ fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */
+ fuc (-1);
+ fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (SCHAR_MIN);
+ fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+ fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */
+}
+
+void fui (unsigned int);
+void fsi (signed int);
+
+int si;
+unsigned ui;
+
+void
+h2i (int x)
+{
+ /* For some reason, we only give certain warnings for implicit
+ conversions among values of the same precision with -Wconversion,
+ while we don't give others at all. */
+ fsi ((unsigned)INT_MAX + 1);
+ si = (unsigned)INT_MAX + 1;
+ si = x ? (unsigned)INT_MAX + 1 : 1;
+ fsi ((unsigned)INT_MAX + 2);
+ si = (unsigned)INT_MAX + 2;
+ si = x ? (unsigned)INT_MAX + 2 : 1;
+ fsi (UINT_MAX);
+ si = UINT_MAX;
+ fui (-1);
+ ui = -1;
+ ui = x ? -1 : 1U;
+ fui (INT_MIN);
+ ui = INT_MIN;
+ ui = x ? INT_MIN : 1U;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-5.C
new file mode 100644
index 000000000..bdfec4a6b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-5.C
@@ -0,0 +1,11 @@
+/* PR c/27273 */
+/* { dg-do compile } */
+
+// This used to warn about "overflow in implicit constant conversion",
+// which was wrong; 512 is never converted to unsigned char. Rather, an
+// appropriate warning would be that the & expression always evaluates to 0
+// because of the limited range of unsigned char.
+
+unsigned char rx_async(unsigned char p) {
+ return p & 512; /* { dg-warning "" "" { xfail *-*-* } } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-6.C
new file mode 100644
index 000000000..6c7a28b3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/overflow-warn-6.C
@@ -0,0 +1,18 @@
+/* Test non-constant operands in overflowed expressions. */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow" } */
+
+#include <limits.h>
+
+int
+h1 (int x)
+{
+ return x * (0 * (INT_MAX + 1)); /* { dg-warning "integer overflow in expression" } */
+}
+
+int
+h2 (int x)
+{
+ return ((INT_MAX + 1) * 0) * x; /* { dg-warning "integer overflow in expression" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic1.C
new file mode 100644
index 000000000..2a4d05536
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic1.C
@@ -0,0 +1,11 @@
+// PR10032
+// { dg-options "-pedantic" }
+
+int main() {
+ goto label; // { dg-error "" }
+
+ int temp = 1; // { dg-error "" }
+
+ label: // { dg-error "" }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic2.C
new file mode 100644
index 000000000..6c834162c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pedantic2.C
@@ -0,0 +1,10 @@
+// { dg-options "-pedantic" }
+
+class foo
+{
+ foo() {};
+ void bar() {};
+
+ foo(int) {};; // { dg-warning "extra" }
+ void bar(int) {};; // { dg-warning "extra" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf1.C
new file mode 100644
index 000000000..013c21b6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: benko@sztaki.hu
+
+// PR c++/10496: Incorrect pointer to member function diagnostics
+// for constant member functions.
+
+struct a
+{
+ int f() const;
+};
+
+
+int
+a::f() const
+{
+ int (a::* b)() const = &f; // { dg-error "&a::f" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf2.C
new file mode 100644
index 000000000..cce52b0aa
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pmf2.C
@@ -0,0 +1,22 @@
+// PR c++/56104
+// { dg-options "-Wall -O2" }
+
+struct Foo
+{
+ void call()
+ {}
+};
+
+template<class MEMSIG, MEMSIG MEMFUNC>
+struct Wrap
+{
+ inline static void call( Foo cc )
+ {
+ (cc.*MEMFUNC)(); // <- warning here
+ }
+};
+
+void bar()
+{
+ Wrap<void (Foo::*)(), &Foo::call>::call( Foo() );
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C
new file mode 100644
index 000000000..c6b75a7fc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-fsyntax-only -fpermissive" }
+
+int foo (int i, void *p)
+{
+ if (i == p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 0;
+ else if (i != p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 1;
+}
+
+int bar (int i, void *p)
+{
+ if (i < p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 0;
+ else if (i >= p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 1;
+}
+
+int baz (int i, void *p)
+{
+ if (i <= p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 0;
+ else if (i > p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" }
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11159.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11159.C
new file mode 100644
index 000000000..ed4107a23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11159.C
@@ -0,0 +1,37 @@
+// PR c++/11159 : erroneous warning in copy ctor with virtual inheritance
+// { dg-do compile }
+// { dg-options "-Wall -Wextra" }
+struct A
+{
+ A ();
+};
+
+struct B : virtual A
+{
+ B ();
+};
+
+struct C : virtual A
+{
+ C ();
+};
+
+struct D : B, C
+{
+ D (D const&){}
+};
+
+template <typename Base>
+struct E : Base
+{
+ E ();
+
+ E (E const &)
+ : Base ()
+ {
+ };
+};
+
+E<C> foo;
+E<C> bar (foo);
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11492.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11492.C
new file mode 100644
index 000000000..d23595f2d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr11492.C
@@ -0,0 +1,12 @@
+// PR11492
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+int main( void )
+{
+ unsigned int a;
+ unsigned char b;
+ for ( a = 0, b = 2; a > b * 1000; a++ ) /* { dg-bogus "comparison between signed and unsigned integer" } */
+ { ; }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr12242.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr12242.C
new file mode 100644
index 000000000..a2f81f87a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr12242.C
@@ -0,0 +1,57 @@
+// PR 12242: should warn about out-of-range int->enum conversions
+// { dg-do compile }
+// { dg-options "-Wconversion -fpermissive" }
+enum X { A };
+enum Y { B, C, D };
+
+void example ()
+{
+ int i = 5;
+ X x;
+ Y y;
+
+ x = 10; // { dg-warning "invalid conversion from .int. to .X." "invalid" }
+ // { dg-warning "unspecified" "unspecified" { target *-*-* } 13 }
+ x = 1; // { dg-warning "invalid conversion from .int. to .X." }
+ x = C; // { dg-error "cannot convert .Y. to .X. in assignment" }
+ x = D; // { dg-error "cannot convert .Y. to .X. in assignment" }
+ y = A; // { dg-error "cannot convert .X. to .Y. in assignment" }
+ x = y; // { dg-error "cannot convert .Y. to .X. in assignment" }
+ x = i; // { dg-warning "invalid conversion from .int. to .X." }
+}
+
+void foo ()
+{
+ X a = static_cast<X> (10); // { dg-warning "unspecified" }
+ X b = static_cast<X> (0);
+ X c = static_cast<X> (1);
+ X d = static_cast<X> (2); // { dg-warning "unspecified" }
+ X f = static_cast<X> ((int)A);
+ X g = static_cast<X> (B);
+ X h = static_cast<X> (C);
+ X e = static_cast<X> (D); // { dg-warning "unspecified" }
+}
+
+enum QEvent { x = 42 };
+
+int bar()
+{
+ QEvent x = ( QEvent ) 42000; // { dg-warning "unspecified" }
+ return ( int ) x;
+}
+
+enum W {a,b,c};
+enum Z {d,e,f,g};
+void bazz (int, int, int, int);
+
+void baz() {
+ int three = 3;
+ int four = 4;
+ bazz (
+ W(three),
+ W(3),
+ Z(four),
+ Z(4) // { dg-warning "unspecified" }
+ );
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-2.C
new file mode 100644
index 000000000..9ab8bbc41
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-2.C
@@ -0,0 +1,24 @@
+// PR c++/13358: g++ should accept a long long constant sans LL suffix
+// if -Wno-long-long is in use.
+// { dg-do compile }
+// { dg-require-effective-target int32plus }
+// { dg-options "-std=c++98 -pedantic-errors" }
+
+
+void use_longlong ()
+{
+ unsigned long long x1, x2, x3; // { dg-error "ISO C\\+\\+ 1998 does not support 'long long'" }
+ // make sure we error with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+ x2 = 1956772631100509574; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+ x3 = 0154476645345674746606; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+}
+
+void use_longlong2 ()
+{
+ unsigned long long x1, x2, x3; // { dg-error "ISO C\\+\\+ 1998 does not support 'long long'" }
+ // make sure we error with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86LL; // { dg-error "long long" }
+ x2 = 1956772631100509574LL; // { dg-error "long long" }
+ x3 = 0154476645345674746606LL; // { dg-error "long long" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-3.C
new file mode 100644
index 000000000..7ae0e2361
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-3.C
@@ -0,0 +1,24 @@
+// PR c++/13358: g++ should accept a long long constant sans LL suffix
+// if -Wno-long-long is in use
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target int32plus }
+// { dg-options "-pedantic-errors" }
+
+
+void use_longlong ()
+{
+ unsigned long long x1, x2, x3;
+ // make sure it's ok with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86;
+ x2 = 1956772631100509574;
+ x3 = 0154476645345674746606;
+}
+
+void use_longlong2 ()
+{
+ unsigned long long x1, x2, x3;
+ // make sure it's ok with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86LL;
+ x2 = 1956772631100509574LL;
+ x3 = 0154476645345674746606LL;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-4.C
new file mode 100644
index 000000000..3aaeb8573
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358-4.C
@@ -0,0 +1,24 @@
+// PR c++/13358: g++ should accept a long long constant sans LL suffix
+// if -Wno-long-long is in use.
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target int32plus }
+// { dg-options "-pedantic-errors -Wlong-long" }
+
+
+void use_longlong ()
+{
+ unsigned long long x1, x2, x3; // { dg-warning "ISO C\\+\\+ 1998 does not support 'long long'" }
+ // make sure we warn with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+ x2 = 1956772631100509574; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+ x3 = 0154476645345674746606; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } }
+}
+
+void use_longlong2 ()
+{
+ unsigned long long x1, x2, x3; // { dg-warning "ISO C\\+\\+ 1998 does not support 'long long'" }
+ // make sure we warn with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86LL; // { dg-warning "long long" }
+ x2 = 1956772631100509574LL; // { dg-warning "long long" }
+ x3 = 0154476645345674746606LL; // { dg-warning "long long" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358.C
new file mode 100644
index 000000000..257616d2f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr13358.C
@@ -0,0 +1,24 @@
+// PR c++/13358: g++ should accept a long long constant sans LL suffix
+// if -Wno-long-long is in use.
+// { dg-do compile }
+// { dg-require-effective-target int32plus }
+// { dg-options "-std=c++98 -Wno-long-long -pedantic-errors" }
+
+
+void use_longlong ()
+{
+ unsigned long long x1, x2, x3;
+ // make sure it's ok with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86;
+ x2 = 1956772631100509574;
+ x3 = 0154476645345674746606;
+}
+
+void use_longlong2 ()
+{
+ unsigned long long x1, x2, x3;
+ // make sure it's ok with hex, decimal and octal
+ x1 = 0x1b27da572ef3cd86LL;
+ x2 = 1956772631100509574LL;
+ x3 = 0154476645345674746606LL;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-1.C
new file mode 100644
index 000000000..6148ffecb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// Test that an new declartion with different attributes then old one fail.
+extern void foo (int); // { dg-message "old declaration" }
+
+void
+bar (void)
+{
+ foo (1);
+}
+
+void __attribute__((stdcall)) foo (int i) // { dg-error "new declaration" }
+{
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-2.C
new file mode 100644
index 000000000..5002d5465
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr15774-2.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// Test that old declaration is used, if new one has no attributes.
+extern void __attribute__((stdcall)) foo (int);
+
+void
+bar (void)
+{
+ foo (1);
+}
+
+void foo (int i)
+{
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr16302.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr16302.C
new file mode 100644
index 000000000..a6f1a4574
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr16302.C
@@ -0,0 +1,76 @@
+// PR 16302
+/* { dg-do compile } */
+/* { dg-options "-Wlogical-op" } */
+void bar (int);
+int
+foo (int argc, char *argv[])
+{
+ if (argc != 1 || argc != 2) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ if (argc || !argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ if (argc && !argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc != 1 || argc != 2); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc || !argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ bar (argc && !argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc != 1 || argc != 2) ? 1 : 0 ; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc || !argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ return (argc && !argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+
+ if (argc == 2 && argc == 1) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ if (argc || !argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ if (argc && !argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc == 2 && argc == 1); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc || !argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ bar (argc && !argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc == 2 && argc == 1) ? 1 : 0 ; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc || !argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ return (argc && !argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+
+ if (argc == 2 && argc == 1) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ if (!argc || argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ if (!argc && argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc == 2 && argc == 1); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ bar (!argc || argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ bar (!argc && argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc == 2 && argc == 1) ? 1 : 0 ; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+ return (!argc || argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */
+ return (!argc && argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */
+
+ return 0;
+}
+
+int
+foo2 (int argc)
+{
+ if (5 != 1 || 5 != 2) return 1;
+ if (5 < 0 && 5 > 10) return 1;
+ if (1 || 0) return 1;
+ if (0 && 1) return 1;
+ if (2 || !2) return 1;
+ if (2 && !2) return 1;
+ if (!(!2) || !(2)) return 1;
+ if (!(!2) && !(2)) return 1;
+ bar (5 != 1 || 5 != 2);
+ bar (5 < 0 && 5 > 10);
+ bar (1 || 0);
+ bar (0 && 1);
+ bar (2 || !2);
+ bar (2 && !2);
+ return (5 != 1 || 5 != 2) ? 1 : 0 ;
+ return (5 < 0 && 5 > 10) ? 1 : 0;
+ return (1 || 0) ? 1 : 0 ;
+ return (0 && 1) ? 1 : 0;
+ return (2 || !2) ? 1 : 0;
+ return (2 && !2) ? 1 : 0;
+
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr18016.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr18016.C
new file mode 100644
index 000000000..9cf1ea3b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr18016.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wuninitialized -Winit-self" } */
+
+class X {
+ int i;
+ X() : i(i) { } // { dg-warning "initialized with itself" }
+ X(int i) : i(i) { }
+ X(const X& x) : i(x.i) { }
+};
+
+// { dg-prune-output "In constructor" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr21983.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr21983.C
new file mode 100644
index 000000000..0108169ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr21983.C
@@ -0,0 +1,7 @@
+// PR c++/21983
+// { dg-do compile }
+
+struct B { virtual void foo () = 0; };
+struct D1 : public virtual B { virtual void foo () {} };
+struct D2 : public virtual B { virtual void foo () {} };
+struct D : public D1, public D2 { }; // { dg-error "no unique final overrider" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr23075.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr23075.C
new file mode 100644
index 000000000..59e93be48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr23075.C
@@ -0,0 +1,9 @@
+// PR c/23075
+// { dg-do compile }
+// { dg-options "-O2 -Wreturn-type" }
+
+int
+foo (void)
+{
+ return; // { dg-error "with no value" }
+} // { dg-bogus "no return statement" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr26785.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr26785.C
new file mode 100644
index 000000000..f3984d58e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr26785.C
@@ -0,0 +1,10 @@
+// PR 26785
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+
+class foo {
+ foo::foo // { dg-error "3:extra qualification" }
+ (int a,
+ int b,
+ int c);
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr28943.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr28943.C
new file mode 100644
index 000000000..046312c0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr28943.C
@@ -0,0 +1,15 @@
+// PR c++/28943 void and non-void in conditional expression
+// { dg-do compile }
+// { dg-options "" }
+
+void debug (const char * string)
+{
+ return;
+}
+
+int f()
+{
+ ( true == false ? 0 : debug ("Some string")); // { dg-error "third operand .* type 'void'.* second operand is neither a throw-expression nor of type 'void'" }
+ ( true == false ? debug ("Some string") : 0 ); // { dg-error "second operand .* type 'void'.* third operand is neither a throw-expression nor of type 'void'" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551-2.C
new file mode 100644
index 000000000..fe85c4ff4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551-2.C
@@ -0,0 +1,6 @@
+// PR 30551 -Wmain is enabled by -pedantic/-pedantic-errors.
+// { dg-do compile }
+// { dg-options "-pedantic-errors" }
+// { dg-skip-if "-Wmain not enabled with -pedantic on SPU" { spu-*-* } }
+int main(char a) {} /* { dg-error "first argument of .*main.* should be .int." "int" } */
+/* { dg-error "main.* takes only zero or two arguments" "zero or two" { target *-*-* } 5 } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551.C
new file mode 100644
index 000000000..23367139c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30551.C
@@ -0,0 +1,6 @@
+// PR 30551 -Wmain is enabled by default.
+// { dg-do compile }
+// { dg-options "" }
+// { dg-skip-if "-Wmain not enabled on SPU" { spu-*-* } }
+int main(char a) {} /* { dg-warning "first argument of .*main.* should be .int." "int" } */
+/* { dg-warning "main.* takes only zero or two arguments" "zero or two" { target *-*-* } 5 } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30636.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30636.C
new file mode 100644
index 000000000..32ce6edbd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr30636.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Warray-bounds" } */
+
+typedef char one_buffer[512];
+static one_buffer emergency_buffer[4];
+
+void free_exception (void *vptr)
+{
+ char *base = (char *) &emergency_buffer[0][0];
+ char *ptr = (char *) vptr;
+ if (ptr >= base && ptr < base + sizeof (emergency_buffer)) /* { dg-bogus "subscript" } */
+ {
+ /* Do something. */
+ __builtin_exit (0);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246-2.C
new file mode 100644
index 000000000..c9a4cae7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246-2.C
@@ -0,0 +1,9 @@
+// PR 31246
+// { dg-do compile }
+// { dg-options "-Wunreachable-code" }
+#include <new>
+
+int* get_ptr(void* ptr)
+{
+ return new(ptr) int();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246.C
new file mode 100644
index 000000000..f3603af47
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr31246.C
@@ -0,0 +1,9 @@
+// PR 31246
+// { dg-do compile }
+// { dg-options "-Wunreachable-code -D_GLIBCXX_DEBUG" }
+#include <vector>
+
+int main()
+{
+ std::vector<int>::iterator a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33160.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33160.C
new file mode 100644
index 000000000..e463e2dfd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33160.C
@@ -0,0 +1,12 @@
+// PR 33160
+// { dg-do compile }
+// { dg-options "-Wall -Wextra -Wpointer-arith -pedantic -Wconversion" }
+
+typedef int __attribute__((mode(pointer))) intptr_t;
+int foo(void)
+{
+ intptr_t t = 0;
+ if (t != ((intptr_t)__null)) t = 1;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33738.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33738.C
new file mode 100644
index 000000000..60ee0b484
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr33738.C
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-O2 -Wtype-limits -fstrict-enums" }
+extern void link_error (void);
+
+enum Alpha {
+ ZERO = 0, ONE, TWO, THREE
+};
+
+Alpha a2;
+
+int m1 = -1;
+int GetM1() {
+ return m1;
+}
+
+int main() {
+ a2 = static_cast<Alpha>(GetM1());
+ if (a2 == -1) { // { dg-warning "always false due" }
+ link_error ();
+ }
+ a2 = static_cast<Alpha>(GetM1());
+ if (-1 == a2) { // { dg-warning "always false due" }
+ link_error ();
+ }
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr34985.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr34985.C
new file mode 100644
index 000000000..56437509d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr34985.C
@@ -0,0 +1,9 @@
+/* PR34985: Warning "defined but not used" despite __attribute__((__used__)) */
+/* { dg-do compile } */
+/* { dg-options "-Wall -Wextra -O2" } */
+static void xxyyzz (void);
+static void __attribute__((__used__)) xxyyzz(void)
+{
+}
+
+/* { dg-final { scan-assembler "xxyyzz" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35602.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35602.C
new file mode 100644
index 000000000..66a569b3d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35602.C
@@ -0,0 +1,28 @@
+// PR 35602 Bogus warning with -Wsign-conversion
+// { dg-do compile }
+// { dg-options "-Wconversion -Wsign-conversion" }
+struct c
+{
+ ~c();
+ c();
+};
+
+int
+
+main(const int,
+ const char * const * const)
+{
+ c x[0UL][0UL] = // { dg-bogus "warning: conversion to .long unsigned int. from .long int. may change the sign of the result" }
+ {
+ };
+
+ c y[0UL] =
+ {
+ };
+
+ int z[0ul][0UL] =
+ {
+ };
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35635.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35635.C
new file mode 100644
index 000000000..de68ceb48
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35635.C
@@ -0,0 +1,89 @@
+/* PR 35635 */
+/* { dg-do compile } */
+/* { dg-options "-Wconversion -Wsign-conversion" } */
+
+struct unsigned_bit {
+ unsigned int x:1;
+} unsigned_bit;
+struct signed_bit {
+ int x:1;
+} signed_bit;
+int bar;
+int bar2;
+
+void func1()
+{
+ /* The result of boolean operators fits in unsiged int:1, thus do
+ not warn. */
+ unsigned_bit.x = (bar != 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar == 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar <= 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar >= 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar < 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar > 0); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = !bar; /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar || bar2); /* { dg-bogus "conversion" } */
+ unsigned_bit.x = (bar && bar2); /* { dg-bogus "conversion" } */
+
+ /* Both branches of ? fit in the destination, thus do not warn. */
+ unsigned_bit.x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */
+ unsigned_bit.x = bar != 0 ? 1.0 : 0.0; /* { dg-bogus "conversion" } */
+
+ /* At least one branch of ? does not fit in the destination, thus
+ warn. */
+ unsigned_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */
+ unsigned_bit.x = bar != 0 ? 0 : -1; /* { dg-warning "conver" } */
+}
+
+void func2()
+{
+ signed char schar_x;
+
+ /* Both branches of ? fit in the destination, thus do not warn. */
+ schar_x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */
+ schar_x = bar != 0 ? 2.0 : 10; /* { dg-bogus "conversion" } */
+
+ /* At least one branch of ? does not fit in the destination, thus
+ warn. */
+ schar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */
+ schar_x = bar != 0 ? (signed char) 1024: -1024; /* { dg-warning "conversion" } */
+}
+
+
+
+void func3()
+{
+ unsigned char uchar_x;
+
+ /* Both branches of ? fit in the destination, thus do not warn. */
+ uchar_x = bar != 0 ? 1 : 0;
+ uchar_x = bar != 0 ? 2.0 : 10;
+
+ /* At least one branch of ? does not fit in the destination, thus
+ warn. */
+ uchar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */
+ uchar_x = bar != 0 /* { dg-warning "negative integer implicitly converted to unsigned type" } */
+ ? (unsigned char) 1024
+ : -1;
+}
+
+void func4()
+{
+ signed_bit.x = -1; /* { dg-bogus "conversion" } */
+ signed_bit.x = bar != 0 ? -1.0 : 0.0; /* { dg-bogus "conversion" } */
+ signed_bit.x = bar != 0 ? -1 : 0; /* { dg-bogus "conversion" } */
+
+ signed_bit.x = 1; /* { dg-warning "conversion" } */
+ signed_bit.x = (bar != 0); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar == 0); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar <= 0); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar >= 0); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar < 0); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar > 0); /* { dg-warning "conversion" } */
+ signed_bit.x = !bar; /* { dg-warning "conversion" } */
+ signed_bit.x = (bar || bar2); /* { dg-warning "conversion" } */
+ signed_bit.x = (bar && bar2); /* { dg-warning "conversion" } */
+ signed_bit.x = bar != 0 ? 1 : 0; /* { dg-warning "conversion" } */
+ signed_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35711.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35711.C
new file mode 100644
index 000000000..653269c0e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr35711.C
@@ -0,0 +1,8 @@
+// PR 35711
+// { dg-do compile }
+// { dg-options "-Wcast-qual" }
+
+int* foo (volatile int *p)
+{
+ return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36069.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36069.C
new file mode 100644
index 000000000..efb35c257
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36069.C
@@ -0,0 +1,16 @@
+// PR c++/36069 Strange "warning: suggest parentheses around
+// assignment used as truth value" with volatile/non volatile bools
+// { dg-do compile }
+// { dg-options "-Wparentheses" }
+struct foo {
+ bool a;
+ volatile bool b,c;
+ foo() { a = b = c = false; } // { dg-bogus "parentheses" }
+};
+
+int main() {
+ bool a;
+ volatile bool b,c;
+ a = b = c = false; // { dg-bogus "parentheses" }
+ foo A;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36921.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36921.C
new file mode 100644
index 000000000..739366910
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36921.C
@@ -0,0 +1,27 @@
+/* PR 36921: comparison operator can be overloaded. Do not emit
+ warnings in such case.
+ { dg-do compile }
+ { dg-options "-Wparentheses" }
+*/
+struct A {};
+A operator<(A, A) { return A(); }
+A operator>(A, A) { return A(); }
+A operator<=(A, A) { return A(); }
+A operator>=(A, A) { return A(); }
+A operator==(A, A) { return A(); }
+A operator!=(A, A) { return A(); }
+
+int main() {
+ A() < A() < A(); // should not emit warning
+ 1 < 2 < 3; // { dg-warning "mathematical meaning" "parentheses" }
+ A() > A() > A(); // should not emit warning
+ 1 > 2 > 3; // { dg-warning "mathematical meaning" "parentheses" }
+ A() <= A() <= A(); // should not emit warning
+ 1 <= 2 <= 3; // { dg-warning "mathematical meaning" "parentheses" }
+ A() >= A() >= A(); // should not emit warning
+ 1 >= 2 >= 3; // { dg-warning "mathematical meaning" "parentheses" }
+
+ A() == A() < A (); // { dg-warning "suggest parentheses" "parentheses" }
+ A() < A() != A (); // { dg-warning "suggest parentheses" "parentheses" }
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36954.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36954.C
new file mode 100644
index 000000000..92cea2f38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36954.C
@@ -0,0 +1,23 @@
+// PR c++/36954
+// { dg-do compile }
+// { dg-options "-Wlogical-op -Wextra -Wall" }
+
+template<class C> void Test()
+{
+ if ((1 == 2) || (true)) {
+ }
+
+ if ((1 == 2) || (!false)) {
+ }
+
+ if (false || true) {
+ }
+}
+
+
+
+int main() {
+ if ((1 == 2) || (true)) {
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36999.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36999.C
new file mode 100644
index 000000000..ce2286efc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr36999.C
@@ -0,0 +1,40 @@
+/* PR36999: Erroneous "does not declare anything" warnings. */
+/* { dg-do compile } */
+
+class C1 {
+ public: class C2 { };
+};
+
+void cf1 (class C1::C2, void*); // { dg-bogus "does not declare anything" }
+void cf2 (void*, class C1::C2);
+void cf3 (C1::C2, void*);
+
+namespace N {
+
+enum E1 { foo };
+enum E2 { bar };
+
+template <class X>
+class TC1 { };
+
+template <class T, class U>
+class TC2 : public TC1<T> { };
+
+}
+
+void
+tcf1 (N::TC2<enum N::E1, void*> *arg1, // { dg-bogus "does not declare anything" }
+ N::TC2<void*, enum N::E1> *arg2,
+ N::TC2<N::E1, void*> *arg3)
+{
+}
+
+void *
+tcf2 (void *x)
+{
+ return (void *)
+ (N::TC2<enum N::E1, void*> *) // { dg-bogus "does not declare anything" }
+ (N::TC2<void*, enum N::E1> *)
+ (N::TC2<N::E1, void*> *)
+ x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5310.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5310.C
new file mode 100644
index 000000000..48a60062f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5310.C
@@ -0,0 +1,11 @@
+// PR 5310
+// { dg-do compile }
+// { dg-options "-pedantic -Wall -Wextra -Wpointer-arith -Wconversion" }
+void foo (int);
+void foo (long);
+
+void bar()
+{
+ foo ((int)__null);
+ foo ((long)__null);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5645.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5645.C
new file mode 100644
index 000000000..5ca61bdba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr5645.C
@@ -0,0 +1,32 @@
+// PR5645: gcc warns that pure virtual class not explicitly initialized.
+// { dg-do compile }
+// { dg-options "-Wall -Wextra" }
+
+class a {
+public:
+ virtual int f() = 0;
+ virtual int g() = 0;
+};
+
+class b : public a {
+public:
+ b();
+ b(const b& c);
+
+protected:
+ int i;
+};
+
+b::b() {}
+
+b::b(const b& c) { // { dg-bogus "base class .class a. should be explicitly initialized in the copy constructor" }
+ i = c.i;
+}
+
+struct X {};
+
+struct Y : X
+{
+ Y (Y const&) {}
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8570.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8570.C
new file mode 100644
index 000000000..4c34c6c33
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8570.C
@@ -0,0 +1,13 @@
+// PR c++/8570
+// { dg-do compile }
+// { dg-options "" }
+template <typename T, typename P>
+class X { // { dg-message "note: previous declaration .* used 2" }
+public:
+ X() { }
+
+private:
+ template <typename U> friend class X; // { dg-error "redeclared with 1 template parameter" }
+};
+
+X<int, int> i; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8715.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8715.C
new file mode 100644
index 000000000..330c148bb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pr8715.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int foo()
+{
+ unsigned char b = '1';
+
+ bool x = ~b; /* { dg-warning "promoted ~unsigned is always non-zero" } */
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.C
new file mode 100644
index 000000000..489761b5b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.C
@@ -0,0 +1,10 @@
+// PR c++/30500
+// { dg-options "-Wconversion" }
+
+#include "pragma-system_header1.h"
+
+void f()
+{
+ g<int>();
+ h<int>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.h
new file mode 100644
index 000000000..684c6bf12
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header1.h
@@ -0,0 +1,7 @@
+#pragma GCC system_header
+
+template <typename T>
+ int g() { double d = 0.1; return d; }
+
+template <typename T>
+ T h() { double d = 0.1; return d; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.C
new file mode 100644
index 000000000..a39bea721
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.C
@@ -0,0 +1,17 @@
+// PR c++/30500
+// { dg-options "-Wconversion" }
+
+#include "pragma-system_header2.h"
+
+
+void f()
+{
+ g<int>();
+ h<int>();
+}
+
+// { dg-warning "conversion" "" { target *-*-* } 2 }
+// { dg-warning "conversion" "" { target *-*-* } 5 }
+
+// I couldn't find another way to make this work.
+// { dg-prune-output "In file included from" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.h
new file mode 100644
index 000000000..aa4f0e94d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header2.h
@@ -0,0 +1,5 @@
+template <typename T>
+ int g() { double d = 0.1; return d; }
+
+template <typename T>
+ T h() { double d = 0.1; return d; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.C
new file mode 100644
index 000000000..a9255c9c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.C
@@ -0,0 +1,9 @@
+// PR c++/32368
+// { dg-options "-Wall -O" }
+
+#include "pragma-system_header3.h"
+
+int main()
+{
+ return f();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.h
new file mode 100644
index 000000000..e16f38f8a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header3.h
@@ -0,0 +1,7 @@
+#pragma GCC system_header
+
+static inline int f()
+{
+ int i;
+ return i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.C
new file mode 100644
index 000000000..898e10801
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.C
@@ -0,0 +1,6 @@
+// PR c++/32256
+// { dg-options "-Wall" }
+
+#include "pragma-system_header4.h"
+
+void ok() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.h
new file mode 100644
index 000000000..c3abae0af
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header4.h
@@ -0,0 +1,2 @@
+#pragma GCC system_header
+int noreturn() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.C
new file mode 100644
index 000000000..771db3d7c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.C
@@ -0,0 +1,10 @@
+// PR c++/36760
+// { dg-options "-Wextra" }
+
+#include "pragma-system_header5.h"
+
+void f()
+{
+ g<const double>();
+ g<volatile void>();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.h b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.h
new file mode 100644
index 000000000..5732e4afd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/pragma-system_header5.h
@@ -0,0 +1,3 @@
+#pragma GCC system_header
+
+template <typename T> T g();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/private1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/private1.C
new file mode 100644
index 000000000..c42d6b7e3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/private1.C
@@ -0,0 +1,16 @@
+// g++ should not complain about A having private [cd]tors.
+
+class A
+{
+ A();
+ ~A();
+public:
+ int dummy(); // needed to get bogus warning
+ static A* get_A ();
+};
+
+A* A::get_A()
+{
+ static A a;
+ return &a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/ref-temp1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/ref-temp1.C
new file mode 100644
index 000000000..26f1ca5de
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/ref-temp1.C
@@ -0,0 +1,11 @@
+// PR c++/986
+// { dg-options "-Wall -Wextra" }
+
+struct X { X (int); };
+
+struct Y {
+ Y ();
+ const X &x; // note the ampersand
+};
+
+Y::Y () : x(1) {} // { dg-warning "temporary" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-1.C
new file mode 100644
index 000000000..6cbd23e2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-1.C
@@ -0,0 +1,14 @@
+/* PR/18160 */
+
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-ansi" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x __asm ("eax");
+ g(&x); /* { dg-error "address of explicit register variable" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-2.C
new file mode 100644
index 000000000..28f5df0cf
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-var-2.C
@@ -0,0 +1,14 @@
+/* PR/18160 */
+
+/* { dg-do compile } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-Wall -W" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x;
+ g(&x); /* { dg-warning "address requested for 'x', which is declared 'register'" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference.C
new file mode 100644
index 000000000..83021900d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+const int* bar();
+
+const int&
+foo1()
+{
+ static int empty;
+ const int* x = bar();
+ return (x ? *x : empty); // { dg-bogus ".*" "" { xfail *-*-* } }
+}
+
+const int&
+foo2()
+{
+ static int empty;
+ const int* x = bar();
+ const int& r = (x ? *x : empty);
+ return (r);
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference2.C
new file mode 100644
index 000000000..190266215
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/return-reference2.C
@@ -0,0 +1,21 @@
+// PR c++/26671
+
+class A
+{
+public:
+ int first;
+ int second;
+
+};
+
+int &f()
+{
+ A a; // { dg-warning "local" }
+ return a.second;
+}
+
+int &g()
+{
+ int ar[42]; // { dg-warning "local" }
+ return ar[20];
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/sentinel.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/sentinel.C
new file mode 100644
index 000000000..5f718f830
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/sentinel.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+extern void ex (int i, ...) __attribute__ ((__sentinel__(0)));
+
+void f()
+{
+ ex (1, 0); /* { dg-warning "missing sentinel in function call" "" } */
+ ex (1, 0L); /* { dg-warning "missing sentinel in function call" "" } */
+ ex (1, (void *)0);
+ ex (1, __null); /* { dg-bogus "sentinel" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-1.C
new file mode 100644
index 000000000..6a98fd703
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-1.C
@@ -0,0 +1,109 @@
+/* Test for sequence point warnings. */
+/* Origin: Michael Meeks in
+ <URL:http://gcc.gnu.org/ml/gcc-patches/1998-06/msg00316.html>,
+ adapted to a testcase by Joseph Myers <jsm28@cam.ac.uk>. */
+/* { dg-do compile } */
+/* { dg-options "-Wsequence-point" } */
+
+struct s
+{
+ int a;
+};
+
+extern int fn (int);
+extern int fnb (int, int);
+extern int fnc (int *);
+extern int sprintf (char *, const char *, ...);
+
+typedef __SIZE_TYPE__ size_t;
+
+void
+foo (int a, int b, int n, int p, int *ptr, struct s *sptr,
+ int *ap, int *bp, int **cp, char *ans, int (*fnp[8])(int))
+{
+ int len;
+
+ a = a++; /* { dg-warning "undefined" "sequence point warning" } */
+ a = --a; /* { dg-warning "undefined" "sequence point warning" } */
+ a = ++a + b; /* { dg-warning "undefined" "sequence point warning" } */
+ a = a-- + b; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[n] = bp[n++]; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[--n] = bp[n]; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[++n] = bp[--n]; /* { dg-warning "undefined" "sequence point warning" } */
+ cp[n][n] = cp[n][n]++; /* { dg-warning "undefined" "sequence point warning" } */
+ cp[n][p] = cp[n][n++]; /* { dg-warning "undefined" "sequence point warning" } */
+ *ptr++ = (size_t)ptr++; /* { dg-warning "undefined" "sequence point warning" } */
+ sptr->a = sptr->a++; /* { dg-warning "undefined" "sequence point warning" } */
+ sptr->a = (size_t)(sptr++); /* { dg-warning "undefined" "sequence point warning" } */
+ *ptr++ = fn (*ptr); /* { dg-warning "undefined" "sequence point warning" } */
+ a = b = a++; /* { dg-warning "undefined" "sequence point warning" } */
+ b = a = --b; /* { dg-warning "undefined" "sequence point warning" } */
+ a = 1 + (a = 1); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (a = b); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (a = b) + 1; /* { dg-warning "undefined" "sequence point warning" } */
+ a = (bp[a++] = b) + 1; /* { dg-warning "undefined" "sequence point warning" } */
+ a = b++ * b++; /* { dg-warning "undefined" "sequence point warning" } */
+ a = fnb (b++, b++); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (*fnp[b++]) (b++); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (*fnp[b]) (b++); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (*fnp[b++]) (b); /* { dg-warning "undefined" "sequence point warning" } */
+ *ap = fnc (ap++); /* { dg-warning "undefined" "sequence point warning" } */
+ (a += b) + (a += n); /* { dg-warning "undefined" "sequence point warning" } */
+ a = (b, b++) + (b++, b); /* { dg-warning "undefined" "sequence point warning" } */
+ ap[a++] += a; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[a+=1] += a; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[a++] += a++; /* { dg-warning "undefined" "sequence point warning" } */
+ ap[a+=1] += a++; /* { dg-warning "undefined" "sequence point warning" } */
+ a = a++, b = a; /* { dg-warning "undefined" "sequence point warning" } */
+ b = a, a = a++; /* { dg-warning "undefined" "sequence point warning" } */
+ a = (b++ ? n : a) + b; /* { dg-warning "undefined" "sequence point warning" } */
+ b ? a = a++ : a; /* { dg-warning "undefined" "sequence point warning" } */
+ b && (a = a++); /* { dg-warning "undefined" "sequence point warning" } */
+ (a = a++) && b; /* { dg-warning "undefined" "sequence point warning" } */
+ b, (a = a++); /* { dg-warning "undefined" "sequence point warning" } */
+ (a = a++), b; /* { dg-warning "undefined" "sequence point warning" } */
+ a ^= b ^= a ^= b; /* { dg-bogus "undefined" "sequence point warning" } */
+
+ a = a; /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = ! (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = - (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = (double) (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ len = sprintf (ans, "%d", len++); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = fn (a++); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ b++, (b + b); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ (a = b++), (a = b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = (b++, b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = b++ && b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = b++ || b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = (b++ ? b++ : a); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ a = (b++ ? a : b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ ap[a++] += bp[b]; /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ ap[a += 1] += 1; /* { dg-bogus "undefined" "bogus sequence point warning" } */
+ *ptr < 128 ? *ptr++ : *(ptr += 2); /* { dg-bogus "undefined" "bogus sequence point warning" } */
+
+ /* The following will be represented internally with a tree consisting of
+ many duplicated SAVE_EXPRs. This caused the previous version of the
+ sequence point warning code to fail by running out of virtual memory. */
+ a = ((b & 1 ? 21 : 0)
+ | (b & 2 ? 22 : 0)
+ | (b & 3 ? 23 : 0)
+ | (b & 4 ? 24 : 0)
+ | (b & 5 ? 25 : 0)
+ | (b & 6 ? 26 : 0)
+ | (b & 7 ? 27 : 0)
+ | (b & 8 ? 28 : 0)
+ | (b & 9 ? 29 : 0)
+ | (b & 10 ? 30 : 0)
+ | (b & 11 ? 31 : 0)
+ | (b & 12 ? 32 : 0)
+ | (b & 13 ? 1 : 0)
+ | (b & 14 ? 2 : 0)
+ | (b & 15 ? 3 : 0)
+ | (b & 16 ? 4 : 0)
+ | (b & 17 ? 5 : 0)
+ | (b & 18 ? 6 : 0)
+ | (b & 19 ? 7 : 0)
+ | (b & 20 ? 8 : 0)
+ | (b & 21 ? 9 : 0));
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-2.C
new file mode 100644
index 000000000..9a4b618ea
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-2.C
@@ -0,0 +1,46 @@
+/* More sequence point warning tests */
+/* { dg-do compile } */
+/* { dg-options "-Wsequence-point" } */
+
+struct s { struct s *nxt; int v; } q;
+
+int x[10];
+
+int foo(int *p)
+{
+ int i = 0;
+
+ /* Test general-lvalue sequence point warnings */
+ (*p) = (*p)++; /* { dg-warning "undefined" "sequence point warning" } */
+ p[3] = p[3]++; /* { dg-warning "undefined" "sequence point warning" } */
+ p[i] = p[i]++; /* { dg-warning "undefined" "sequence point warning" } */
+ x[3] = x[3]++; /* { dg-warning "undefined" "sequence point warning" } */
+ q.nxt->nxt->v = q.nxt->nxt->v++; /* { dg-warning "undefined" "sequence point warning" } */
+
+ /* test expressions that appear elsewhere in the C grammar */
+
+ { int a = i-i++; (void)a;} /* { dg-warning "undefined" "sequence point warning" } */
+
+ if ((i-i++) != 0) /* { dg-warning "undefined" "sequence point warning" } */
+ return i-i++; /* { dg-warning "undefined" "sequence point warning" } */
+
+ for (i-i++;;) /* { dg-warning "undefined" "sequence point warning" } */
+ ;
+
+ for (; (i-i++) != 0; ) /* { dg-warning "undefined" "sequence point warning" } */
+ ;
+
+ for (;;i-i++) /* { dg-warning "undefined" "sequence point warning" } */
+ ;
+
+ while ((i-i++) != 0) /* { dg-warning "undefined" "sequence point warning" } */
+ ;
+
+ do {} while ((i-i++) != 0); /* { dg-warning "undefined" "sequence point warning" } */
+
+ switch (i-i++) { /* { dg-warning "undefined" "sequence point warning" } */
+ case 0: return 1;
+ }
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-3.C
new file mode 100644
index 000000000..58971ca18
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-3.C
@@ -0,0 +1,15 @@
+/* More sequence point warning tests */
+/* { dg-do compile } */
+/* { dg-options "-Wsequence-point" } */
+
+void bar(int i, int j)
+{
+ return;
+}
+
+void foo (int i)
+{
+ int a = i-i++; (void)a; /* { dg-warning "undefined" "sequence point warning" } */
+
+ bar (i--, i++); /* { dg-warning "undefined" "sequence point warning" } */
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C
new file mode 100644
index 000000000..01d87be8b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C
@@ -0,0 +1,54 @@
+// PR 17880
+// { dg-do compile }
+// { dg-options "-Wsequence-point" }
+
+int
+foo (int x)
+{
+ unsigned int a;
+ int b;
+
+ b = (a += 5) > a; // { dg-warning "undefined" "sequence point warning" }
+ b = (a += 5) + a == 10; // { dg-warning "undefined" "sequence point warning" }
+ b = (a -= 5) > a; // { dg-warning "undefined" "sequence point warning" }
+ b = (a -= 5) + a == 10; // { dg-warning "undefined" "sequence point warning" }
+ b = a-- > a; // { dg-warning "undefined" "sequence point warning" }
+ b = a-- + a == 10; // { dg-warning "undefined" "sequence point warning" }
+ b = ++a > a; // { dg-warning "undefined" "sequence point warning" }
+ b = ++a + a == 10; // { dg-warning "undefined" "sequence point warning" }
+
+ if ((a += 5) > a) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if ((a += 5) + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if ((a -= 5) > a) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if ((a -= 5) + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if (a-- > a) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if (a-- + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if (++a > a) return -1; // { dg-warning "undefined" "sequence point warning" }
+ if (++a + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" }
+ do {} while ((a += 5) > a); // { dg-warning "undefined" "sequence point warning" }
+ while ((a += 5) > a); // { dg-warning "undefined" "sequence point warning" }
+ for ((a += 5) > a;;); // { dg-warning "undefined" "sequence point warning" }
+ for (b = (a += 5) > a;;); // { dg-warning "undefined" "sequence point warning" }
+ for (; (a += 5) > a;); // { dg-warning "undefined" "sequence point warning" }
+ for (;; b = (a += 5) > a); // { dg-warning "undefined" "sequence point warning" }
+ for (;; a++ + a++); // { dg-warning "undefined" "sequence point warning" }
+ if (a) a++ - a--; // { dg-warning "undefined" "sequence point warning" }
+ ((a +=5) > a) ? a : b; // { dg-warning "undefined" "sequence point warning" }
+ return (a++ - a--); // { dg-warning "undefined" "sequence point warning" }
+}
+
+void bar (int i)
+{
+ int a = i++ - i++; // { dg-warning "undefined" "sequence point warning" }
+}
+
+void baz (int i)
+{
+ switch (i++ + i++) // { dg-warning "undefined" "sequence point warning" }
+ {
+ case 1:
+ i++ - i++; // { dg-warning "undefined" "sequence point warning" }
+ case 2:
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-1.C
new file mode 100644
index 000000000..027c405d4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-1.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Check that we don't warn about code that will not be executed.
+extern int f2(int);
+void
+f1(int i)
+{
+ f2(1 == 1 ? 0 : f2(i >> -10));
+ f2(1 == 1 ? 0 : f2(i >> 128));
+ f2(1 == 1 ? 0 : f2(i << -10));
+ f2(1 == 1 ? 0 : f2(1 << 128));
+ f2(1 != 1 ? f2(i >> -10) : 0);
+ f2(1 != 1 ? f2(i >> 128) : 0);
+ f2(1 != 1 ? f2(i << -10) : 0);
+ f2(1 != 1 ? f2(1 << 128) : 0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-2.C
new file mode 100644
index 000000000..28f9049a9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/skip-2.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+extern int f2(int);
+extern void f3();
+void
+f1(int i)
+{
+ if (1 == 1 || f2(i >> -10))
+ f3();
+ if (1 == 1 || f2(i >> 128))
+ f3();
+ if (1 == 1 || f2(i << -10))
+ f3();
+ if (1 == 1 || f2(i << 128))
+ f3();
+ if (1 == 1 || i < 0xffffffff)
+ f3();
+ if (1 == 1 || i >= -0x80000000)
+ f3();
+ if (1 == 0 && f2(i >> -10))
+ f3();
+ if (1 == 0 && f2(i >> 128))
+ f3();
+ if (1 == 0 && f2(i << -10))
+ f3();
+ if (1 == 0 && f2(i << 128))
+ f3();
+ if (1 == 0 && i < 0xffffffff)
+ f3();
+ if (1 == 0 && i >= -0x80000000)
+ f3();
+ if (1 == 1 && f2(i >> -10)) /* { dg-warning "shift count is negative" } */
+ f3();
+ if (1 == 0 || f2(i << -10)) /* { dg-warning "shift count is negative" } */
+ f3();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/string1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/string1.C
new file mode 100644
index 000000000..2670f63d9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/string1.C
@@ -0,0 +1,18 @@
+// PR c++/35652
+// { dg-options "-O" }
+
+#include <string>
+int test() {
+ // blank line padding, could also be code...
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ std::string s = "";
+ s += 'x' + "y"; // { dg-warning "bounds of constant string" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/switch1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/switch1.C
new file mode 100644
index 000000000..49c17e912
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/switch1.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target { int32plus } } }
+
+signed char sc;
+
+void
+foo (void)
+{
+ switch (sc)
+ {
+ case 1:
+ case 2 * __SCHAR_MAX__ + 3: // { dg-warning "case label value exceeds maximum" }
+ case - 2 * __SCHAR_MAX__ - 1: // { dg-warning "case label value is less than minimum" }
+ break;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/template-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/template-1.C
new file mode 100644
index 000000000..04ea5ae32
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/template-1.C
@@ -0,0 +1,15 @@
+//Origin: bangerth@dealii.org
+//PR c++/11490
+//Since N is know at instantiation time, there
+// should be no warning about comparision between
+// unsinged and signed interegers.
+
+// { dg-do compile }
+// { dg-options "-W" }
+
+template <int N> bool f() {
+ unsigned int i=0;
+ return i!=N; // { dg-bogus "signed and unsigned" }
+}
+
+template bool f<2> ();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/translate-ice-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/translate-ice-1.C
new file mode 100644
index 000000000..22e103c29
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/translate-ice-1.C
@@ -0,0 +1,45 @@
+// Test ICE in caching printable names for a function.
+// { dg-options "-std=c++98 -pedantic -O2" }
+
+void g (int a) __attribute__((warning("g")));
+void g2 (int a, int *p);
+static inline __attribute__((__always_inline__)) void
+gg (int a)
+{
+ if (a == 0)
+ return g(a); // { dg-warning "attribute" }
+ __extension__ int v[a];
+ return g2(a, v);
+}
+
+void h (int a) __attribute__((warning("h")));
+void h2 (int a, int *p);
+static inline __attribute__((__always_inline__)) void
+hh (int a)
+{
+ if (a == 0)
+ return h(a); // { dg-warning "attribute" }
+ __extension__ int v[a];
+ return h2(a, v);
+}
+
+void i (int a) __attribute__((warning("i")));
+void i2 (int a, int *p);
+static inline __attribute__((__always_inline__)) void
+ii (int a)
+{
+ if (a == 0)
+ return i(a); // { dg-warning "attribute" }
+ __extension__ int v[a];
+ return i2(a, v);
+}
+
+void
+f (void)
+{
+ long long l; // { dg-warning "long long" }
+ const char *p = __PRETTY_FUNCTION__;
+ gg(0);
+ hh(0);
+ ii(0);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/undefined1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/undefined1.C
new file mode 100644
index 000000000..87fa3ec5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/undefined1.C
@@ -0,0 +1,7 @@
+// PR 17256
+
+inline static void f1(void); // { dg-warning "used but never" }
+void g1(void) { if (0) { f1(); } }
+
+inline void f2(void); // { dg-warning "used but never" }
+void g2(void) { if (0) { f2(); } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/unit-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/unit-1.C
new file mode 100644
index 000000000..18f5f6b6a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/unit-1.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+struct a { int mode; };
+int sys_msgctl (void)
+{
+ struct a setbuf;
+ return setbuf.mode; /* { dg-warning "'setbuf.a::mode' is used" "" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c b/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c
new file mode 100644
index 000000000..fc14469c3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c
@@ -0,0 +1,11 @@
+// PR 40614
+// { dg-options "-Werror=unused-result" }
+/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
+class QByteArray {
+public:
+ QByteArray(const QByteArray &);
+};
+class QString {
+ QByteArray toLocal8Bit() const __attribute__ ((warn_unused_result));
+ void fooWarnHere() const { toLocal8Bit(); } // { dg-error "ignoring" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1.C
new file mode 100644
index 000000000..466c99e7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/unused-result1.C
@@ -0,0 +1,10 @@
+// PR c++/27371
+
+class QByteArray {
+public:
+ QByteArray(const QByteArray &);
+};
+class QString {
+ QByteArray toLocal8Bit() const __attribute__ ((warn_unused_result));
+ void fooWarnHere() const { toLocal8Bit(); } // { dg-warning "ignoring" "" { xfail *-*-* } }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/var-args1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/var-args1.C
new file mode 100644
index 000000000..9bd84a7dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/var-args1.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+#include <stdarg.h>
+
+void foo(int, ...)
+{
+ va_list va;
+ int i;
+ i = va_arg(va, int&); /* { dg-error "cannot receive objects" } */
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/volatile1.C
new file mode 100644
index 000000000..ac9dd4df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/volatile1.C
@@ -0,0 +1,12 @@
+// PR c++/26577
+
+struct A
+{
+ A(const A&);
+ A& operator=(const A&);
+ void baz() volatile;
+};
+void A::baz() volatile
+{
+ *this; // { dg-warning "indirection will not access" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/warn_unused.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/warn_unused.C
new file mode 100644
index 000000000..af687fc16
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/warn_unused.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options -Wunused }
+
+struct __attribute__((warn_unused)) Test
+{
+ Test();
+ ~Test();
+ void use();
+};
+
+struct TestNormal
+{
+ TestNormal();
+};
+
+int main()
+{
+ Test unused; // { dg-warning "unused variable" }
+ Test used; // { dg-bogus "unused variable" }
+ TestNormal normal; // { dg-bogus "unused variable" }
+ used.use();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/wdate-time.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/wdate-time.C
new file mode 100644
index 000000000..0ff27b4cd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/wdate-time.C
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-Wdate-time" } */
+
+const char time[] = __TIME__; /* { dg-warning "might prevent reproducible builds" } */
+const char date[] = __DATE__; /* { dg-warning "might prevent reproducible builds" } */
+const char timestamp[] = __TIMESTAMP__; /* { dg-warning "might prevent reproducible builds" } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/weak1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/weak1.C
new file mode 100644
index 000000000..456e6f34c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/weak1.C
@@ -0,0 +1,22 @@
+// { dg-do run }
+// { dg-require-weak "" }
+// The PA HP-UX dynamic loader doesn't support unsatisfied weak symbols.
+// { dg-skip-if "No unsat" { hppa*-*-hpux* } { "*" } { "" } }
+// { dg-skip-if "No weak unsat" { *-*-aix* } { "*" } { "" } }
+// The darwin loader does, but they do need to exist at link time.
+// { dg-skip-if "No link unsat" { *-*-darwin* } { "*" } { "" } }
+// For kernel modules and static RTPs, the loader treats undefined weak
+// symbols in the same way as undefined strong symbols. The test
+// therefore fails to load, so skip it.
+// { dg-skip-if "" { "*-*-vxworks*" && nonpic } "*" { "-non-static" } }
+
+extern void foo (void) __attribute__ ((weak));
+
+int
+main ()
+{
+ if (&foo)
+ foo ();
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings-default.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings-default.C
new file mode 100644
index 000000000..ee6b21718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings-default.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// Test the default for -Wwrite-strings
+
+int main()
+{
+ char* p = "Asgaard"; // { dg-warning "deprecated" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings.C
new file mode 100644
index 000000000..73c814909
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/write-strings.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options -Wwrite-strings }
+
+int main()
+{
+ char* p = "Asgaard"; // { dg-warning "deprecated" }
+}