aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r--gcc/testsuite/g++.dg/README9
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield5.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield6.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield7.C7
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield8.C20
-rw-r--r--gcc/testsuite/g++.dg/abi/dtor1.C22
-rw-r--r--gcc/testsuite/g++.dg/abi/dtor2.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/empty10.C27
-rw-r--r--gcc/testsuite/g++.dg/abi/empty11.C19
-rw-r--r--gcc/testsuite/g++.dg/abi/empty5.C17
-rw-r--r--gcc/testsuite/g++.dg/abi/empty6.C8
-rw-r--r--gcc/testsuite/g++.dg/abi/empty7.C18
-rw-r--r--gcc/testsuite/g++.dg/abi/empty8.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/empty9.C16
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle10.C13
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle11.C10
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle12.C11
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle13.C28
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle14.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle15.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle16.C18
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle17.C11
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle9.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/rtti2.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/thunk1.C22
-rw-r--r--gcc/testsuite/g++.dg/abi/thunk2.C26
-rw-r--r--gcc/testsuite/g++.dg/abi/vague1.C2
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase10.C7
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase11.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase12.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase13.C17
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase14.C6
-rw-r--r--gcc/testsuite/g++.dg/abi/vcall1.C36
-rw-r--r--gcc/testsuite/g++.dg/abi/vthunk2.C16
-rw-r--r--gcc/testsuite/g++.dg/abi/vthunk3.C26
-rw-r--r--gcc/testsuite/g++.dg/abi/vtt1.C11
-rw-r--r--gcc/testsuite/g++.dg/bprob/bprob.exp3
-rw-r--r--gcc/testsuite/g++.dg/bprob/g++-bprob-1.C (renamed from gcc/testsuite/g++.dg/bprob/bprob-1.C)0
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10.h54
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21.h54
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22.h59
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4.h57
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/break/README11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5.h11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7.h3
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_y.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6.h7
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_x.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_y.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10.h12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_y.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11.h12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_y.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/compat.exp137
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_x.C22
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2.h22
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_x.C19
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_y.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1.h7
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_main.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_y.C17
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_x.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_y.C39
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_x.C28
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3.h8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_x.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1.h15
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C26
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_x.C33
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_y.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1.h6
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_x.C15
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_y.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1.h30
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_main.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_x.C7
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_main.C25
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_x.C15
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_y.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_main.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_x.C22
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_y.C24
-rw-r--r--gcc/testsuite/g++.dg/cpp/c++98-pedantic.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp/c++98.C10
-rw-r--r--gcc/testsuite/g++.dg/dg.exp1
-rw-r--r--gcc/testsuite/g++.dg/eh/spec5.C22
-rw-r--r--gcc/testsuite/g++.dg/eh/spec6.C19
-rw-r--r--gcc/testsuite/g++.dg/eh/stabilize.C26
-rw-r--r--gcc/testsuite/g++.dg/expr/cond1.C28
-rw-r--r--gcc/testsuite/g++.dg/ext/asm3.C13
-rw-r--r--gcc/testsuite/g++.dg/ext/lvaddr.C10
-rw-r--r--gcc/testsuite/g++.dg/ext/lvcast.C11
-rw-r--r--gcc/testsuite/g++.dg/ext/typedef-init.C33
-rw-r--r--gcc/testsuite/g++.dg/ext/vla1.C26
-rw-r--r--gcc/testsuite/g++.dg/ext/vlm1.C13
-rw-r--r--gcc/testsuite/g++.dg/ext/vlm2.C13
-rw-r--r--gcc/testsuite/g++.dg/inherit/cond1.C10
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant1.C10
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant2.C70
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant3.C70
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant4.C76
-rw-r--r--gcc/testsuite/g++.dg/inherit/override1.C20
-rw-r--r--gcc/testsuite/g++.dg/inherit/thunk1.C41
-rw-r--r--gcc/testsuite/g++.dg/inherit/typedef1.C8
-rw-r--r--gcc/testsuite/g++.dg/inherit/typeinfo1.C18
-rw-r--r--gcc/testsuite/g++.dg/inherit/using2.C25
-rw-r--r--gcc/testsuite/g++.dg/inherit/using3.C19
-rw-r--r--gcc/testsuite/g++.dg/init/aggr1.C19
-rw-r--r--gcc/testsuite/g++.dg/init/array1.C6
-rw-r--r--gcc/testsuite/g++.dg/init/array6.C7
-rw-r--r--gcc/testsuite/g++.dg/init/array7.C15
-rw-r--r--gcc/testsuite/g++.dg/init/array8.C12
-rw-r--r--gcc/testsuite/g++.dg/init/brace1.C4
-rw-r--r--gcc/testsuite/g++.dg/init/brace2.C8
-rw-r--r--gcc/testsuite/g++.dg/init/copy2.C5
-rw-r--r--gcc/testsuite/g++.dg/init/copy3.C16
-rw-r--r--gcc/testsuite/g++.dg/init/ctor1.C57
-rw-r--r--gcc/testsuite/g++.dg/init/dtor2.C28
-rw-r--r--gcc/testsuite/g++.dg/init/pm2.C7
-rw-r--r--gcc/testsuite/g++.dg/init/string1.C8
-rw-r--r--gcc/testsuite/g++.dg/lookup/anon2.C6
-rw-r--r--gcc/testsuite/g++.dg/lookup/pretty1.C1
-rw-r--r--gcc/testsuite/g++.dg/lookup/ptrmem1.C15
-rw-r--r--gcc/testsuite/g++.dg/lookup/scoped2.C19
-rw-r--r--gcc/testsuite/g++.dg/opt/const2.C40
-rw-r--r--gcc/testsuite/g++.dg/opt/local1.C20
-rw-r--r--gcc/testsuite/g++.dg/opt/reload1.C43
-rw-r--r--gcc/testsuite/g++.dg/other/constref1.C16
-rw-r--r--gcc/testsuite/g++.dg/other/constref2.C16
-rw-r--r--gcc/testsuite/g++.dg/other/cxa-atexit1.C26
-rw-r--r--gcc/testsuite/g++.dg/other/do1.C13
-rw-r--r--gcc/testsuite/g++.dg/other/offsetof1.C2
-rw-r--r--gcc/testsuite/g++.dg/other/warning1.C18
-rw-r--r--gcc/testsuite/g++.dg/overload/member1.C22
-rw-r--r--gcc/testsuite/g++.dg/overload/member2.C41
-rw-r--r--gcc/testsuite/g++.dg/parse/decl-specifier-1.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/friend1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/inline1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/stmtexpr3.C8
-rw-r--r--gcc/testsuite/g++.dg/rtti/crash1.C10
-rw-r--r--gcc/testsuite/g++.dg/rtti/cv1.C17
-rw-r--r--gcc/testsuite/g++.dg/template/access6.C17
-rw-r--r--gcc/testsuite/g++.dg/template/complit1.C11
-rw-r--r--gcc/testsuite/g++.dg/template/cond.C23
-rw-r--r--gcc/testsuite/g++.dg/template/crash2.C31
-rw-r--r--gcc/testsuite/g++.dg/template/ctor2.C18
-rw-r--r--gcc/testsuite/g++.dg/template/deduce1.C25
-rw-r--r--gcc/testsuite/g++.dg/template/friend4.C2
-rw-r--r--gcc/testsuite/g++.dg/template/friend8.C18
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate1.C8
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate3.C17
-rw-r--r--gcc/testsuite/g++.dg/template/meminit1.C7
-rw-r--r--gcc/testsuite/g++.dg/template/pretty1.C43
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem3.C22
-rw-r--r--gcc/testsuite/g++.dg/template/qualttp20.C20
-rw-r--r--gcc/testsuite/g++.dg/template/ref1.C3
-rw-r--r--gcc/testsuite/g++.dg/template/strlen1.C9
-rw-r--r--gcc/testsuite/g++.dg/template/subst1.C27
-rw-r--r--gcc/testsuite/g++.dg/template/typename3.C7
-rw-r--r--gcc/testsuite/g++.dg/template/typename4.C3
-rw-r--r--gcc/testsuite/g++.dg/template/union1.C29
-rw-r--r--gcc/testsuite/g++.dg/template/varmod1.C10
-rw-r--r--gcc/testsuite/g++.dg/tls/init-2.C6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreorder-1.C14
221 files changed, 4133 insertions, 32 deletions
diff --git a/gcc/testsuite/g++.dg/README b/gcc/testsuite/g++.dg/README
index 073913f2056..478568bf882 100644
--- a/gcc/testsuite/g++.dg/README
+++ b/gcc/testsuite/g++.dg/README
@@ -1,16 +1,25 @@
Subdirectories:
abi Tests for ABI compatibility -- mangling, object layout, etc.
+bprob Tests for functionality of profile-directed block ordering.
+compat Tests for binary compatibility (consistency, not ABI conformance).
+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.
+opt Tests for fixes of bugs with particular optimizations.
+other Tests that don't quite fit anywhere else.
overload Tests for overload resolution and conversions.
parse Tests for parsing.
rtti Tests for run-time type identification (typeid, dynamic_cast, etc.)
+special Tests requiring individual processing.
template Tests for templates.
+tls Tests for support of thread-local data.
warn Tests for compiler warnings.
other Tests that don't fit into one of the other categories.
diff --git a/gcc/testsuite/g++.dg/abi/bitfield5.C b/gcc/testsuite/g++.dg/abi/bitfield5.C
new file mode 100644
index 00000000000..eed76e649e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield5.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+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/testsuite/g++.dg/abi/bitfield6.C b/gcc/testsuite/g++.dg/abi/bitfield6.C
new file mode 100644
index 00000000000..50f76ab824b
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/bitfield7.C b/gcc/testsuite/g++.dg/abi/bitfield7.C
new file mode 100644
index 00000000000..9868cfce198
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield7.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+union U { // { dg-warning "ABI" }
+ int i: 4096; // { dg-warning "exceeds" }
+};
+
diff --git a/gcc/testsuite/g++.dg/abi/bitfield8.C b/gcc/testsuite/g++.dg/abi/bitfield8.C
new file mode 100644
index 00000000000..8195fda631d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield8.C
@@ -0,0 +1,20 @@
+// { dg-do run { target i?86-*-* } }
+// { dg-options "-fabi-version=0" }
+
+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/testsuite/g++.dg/abi/dtor1.C b/gcc/testsuite/g++.dg/abi/dtor1.C
new file mode 100644
index 00000000000..48b0a557127
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/dtor1.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/dtor2.C b/gcc/testsuite/g++.dg/abi/dtor2.C
new file mode 100644
index 00000000000..f4a1336fefa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/dtor2.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+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/testsuite/g++.dg/abi/empty10.C b/gcc/testsuite/g++.dg/abi/empty10.C
new file mode 100644
index 00000000000..970afbaf512
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty10.C
@@ -0,0 +1,27 @@
+// { dg-do run { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/empty11.C b/gcc/testsuite/g++.dg/abi/empty11.C
new file mode 100644
index 00000000000..b35363f5bf6
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/empty5.C b/gcc/testsuite/g++.dg/abi/empty5.C
new file mode 100644
index 00000000000..c3717727e21
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/empty6.C b/gcc/testsuite/g++.dg/abi/empty6.C
new file mode 100644
index 00000000000..aa272733987
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty6.C
@@ -0,0 +1,8 @@
+// { dg-options "-Wabi" }
+
+struct A {};
+
+struct B {
+ A a; // { dg-warning "empty" }
+ virtual void f () {}
+};
diff --git a/gcc/testsuite/g++.dg/abi/empty7.C b/gcc/testsuite/g++.dg/abi/empty7.C
new file mode 100644
index 00000000000..4b1ac3b2c2c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty7.C
@@ -0,0 +1,18 @@
+// { dg-do run { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/empty8.C b/gcc/testsuite/g++.dg/abi/empty8.C
new file mode 100644
index 00000000000..a5287b15fa0
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/empty9.C b/gcc/testsuite/g++.dg/abi/empty9.C
new file mode 100644
index 00000000000..757bf6c8690
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty9.C
@@ -0,0 +1,16 @@
+// { dg-do run { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/mangle10.C b/gcc/testsuite/g++.dg/abi/mangle10.C
new file mode 100644
index 00000000000..d5782ba6dfc
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/mangle11.C b/gcc/testsuite/g++.dg/abi/mangle11.C
new file mode 100644
index 00000000000..f7151171d30
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle11.C
@@ -0,0 +1,10 @@
+// { dg-options "-Wabi" }
+
+template <typename Q>
+void f (typename Q::X) {}
+
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int); // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle12.C b/gcc/testsuite/g++.dg/abi/mangle12.C
new file mode 100644
index 00000000000..772b58b7a39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle12.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi" }
+
+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-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle13.C b/gcc/testsuite/g++.dg/abi/mangle13.C
new file mode 100644
index 00000000000..716c4c36f41
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/mangle14.C b/gcc/testsuite/g++.dg/abi/mangle14.C
new file mode 100644
index 00000000000..8e2bfddde76
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle14.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+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/testsuite/g++.dg/abi/mangle15.C b/gcc/testsuite/g++.dg/abi/mangle15.C
new file mode 100644
index 00000000000..3c112e263f0
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/mangle16.C b/gcc/testsuite/g++.dg/abi/mangle16.C
new file mode 100644
index 00000000000..1f3039f8682
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/mangle17.C b/gcc/testsuite/g++.dg/abi/mangle17.C
new file mode 100644
index 00000000000..1da6dea632b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle17.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi" }
+
+enum E { e = 3 };
+
+template <int I> struct S {};
+
+template <int I> void f (S<e + int (3.7)>) {}
+template void f<7>(S<e + int (3.7)>); // { dg-warning "mangle" }
+
+template <int I> void g (S<e + int (3.7)>) {}
+template void g<7>(S<e + int (3.7)>); // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle9.C b/gcc/testsuite/g++.dg/abi/mangle9.C
new file mode 100644
index 00000000000..f3ededfb4d0
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/rtti2.C b/gcc/testsuite/g++.dg/abi/rtti2.C
new file mode 100644
index 00000000000..eece8724a2a
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/thunk1.C b/gcc/testsuite/g++.dg/abi/thunk1.C
new file mode 100644
index 00000000000..c9ad5b478f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/thunk1.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target i?86-*-* } }
+
+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/testsuite/g++.dg/abi/thunk2.C b/gcc/testsuite/g++.dg/abi/thunk2.C
new file mode 100644
index 00000000000..b1c9788e6d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/thunk2.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/vague1.C b/gcc/testsuite/g++.dg/abi/vague1.C
index 928d652b836..3d10edd8abe 100644
--- a/gcc/testsuite/g++.dg/abi/vague1.C
+++ b/gcc/testsuite/g++.dg/abi/vague1.C
@@ -2,7 +2,9 @@
// instantiations.
// Disable debug info so we don't get confused by the symbol name there.
+// The test fails on hppa*-*-hpux* because the symbol _ZN1AIiE1tE is imported.
// { dg-options "-g0" }
+// { dg-final { if { [istarget hppa*-*-hpux*] } { return } } }
// { dg-final { scan-assembler-not "_ZN1AIiE1tE" } }
template <class T> struct A {
diff --git a/gcc/testsuite/g++.dg/abi/vbase10.C b/gcc/testsuite/g++.dg/abi/vbase10.C
new file mode 100644
index 00000000000..3c110be7188
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase10.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+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/testsuite/g++.dg/abi/vbase11.C b/gcc/testsuite/g++.dg/abi/vbase11.C
new file mode 100644
index 00000000000..375577365a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase11.C
@@ -0,0 +1,12 @@
+// { dg-do run { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/vbase12.C b/gcc/testsuite/g++.dg/abi/vbase12.C
new file mode 100644
index 00000000000..98b9054f05e
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/vbase13.C b/gcc/testsuite/g++.dg/abi/vbase13.C
new file mode 100644
index 00000000000..6a0bff484d7
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/vbase14.C b/gcc/testsuite/g++.dg/abi/vbase14.C
new file mode 100644
index 00000000000..99290b85720
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase14.C
@@ -0,0 +1,6 @@
+// { dg-options "-Wabi" }
+
+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/testsuite/g++.dg/abi/vcall1.C b/gcc/testsuite/g++.dg/abi/vcall1.C
new file mode 100644
index 00000000000..00830cd23d6
--- /dev/null
+++ b/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/testsuite/g++.dg/abi/vthunk2.C b/gcc/testsuite/g++.dg/abi/vthunk2.C
new file mode 100644
index 00000000000..2499749d64c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vthunk2.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target i?86-*-* } }
+
+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/testsuite/g++.dg/abi/vthunk3.C b/gcc/testsuite/g++.dg/abi/vthunk3.C
new file mode 100644
index 00000000000..3bd2fd40a18
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vthunk3.C
@@ -0,0 +1,26 @@
+// { dg-do compile { target i?86-*-* } }
+// { 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/testsuite/g++.dg/abi/vtt1.C b/gcc/testsuite/g++.dg/abi/vtt1.C
new file mode 100644
index 00000000000..8235c460b97
--- /dev/null
+++ b/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/testsuite/g++.dg/bprob/bprob.exp b/gcc/testsuite/g++.dg/bprob/bprob.exp
index 724954039aa..d19e341b1ea 100644
--- a/gcc/testsuite/g++.dg/bprob/bprob.exp
+++ b/gcc/testsuite/g++.dg/bprob/bprob.exp
@@ -51,9 +51,6 @@ if $tracelevel then {
# Load support procs.
load_lib profopt.exp
-# Clean up existing .da files.
-profopt-cleanup da
-
# Main loop.
foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
# If we're only testing specific files and this isn't one of them, skip it.
diff --git a/gcc/testsuite/g++.dg/bprob/bprob-1.C b/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C
index b1a1de77e98..b1a1de77e98 100644
--- a/gcc/testsuite/g++.dg/bprob/bprob-1.C
+++ b/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1.h b/gcc/testsuite/g++.dg/compat/abi/bitfield1.h
new file mode 100644
index 00000000000..09d64162ff3
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/bitfield1_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
new file mode 100644
index 00000000000..cdb7a45a744
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-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/testsuite/g++.dg/compat/abi/bitfield1_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
new file mode 100644
index 00000000000..1447655a33e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
@@ -0,0 +1,14 @@
+#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/testsuite/g++.dg/compat/abi/bitfield1_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
new file mode 100644
index 00000000000..7ca5d4b3f51
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
@@ -0,0 +1,13 @@
+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/testsuite/g++.dg/compat/abi/bitfield2.h b/gcc/testsuite/g++.dg/compat/abi/bitfield2.h
new file mode 100644
index 00000000000..09d64162ff3
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/bitfield2_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
new file mode 100644
index 00000000000..df74037b66b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-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/testsuite/g++.dg/compat/abi/bitfield2_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
new file mode 100644
index 00000000000..1447655a33e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
@@ -0,0 +1,14 @@
+#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/testsuite/g++.dg/compat/abi/bitfield2_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
new file mode 100644
index 00000000000..6119544db16
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
@@ -0,0 +1,13 @@
+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/testsuite/g++.dg/compat/abi/vbase8-10.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h
new file mode 100644
index 00000000000..aee0b6b49a5
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-10_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C
new file mode 100644
index 00000000000..606c0fe2f93
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-10_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
new file mode 100644
index 00000000000..18e78fcc59c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
@@ -0,0 +1,49 @@
+#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/testsuite/g++.dg/compat/abi/vbase8-10_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
new file mode 100644
index 00000000000..1d6c8261668
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
@@ -0,0 +1,63 @@
+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/testsuite/g++.dg/compat/abi/vbase8-21.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h
new file mode 100644
index 00000000000..cd510e2ce85
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-21_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C
new file mode 100644
index 00000000000..16a0a3cd3c7
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-21_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
new file mode 100644
index 00000000000..986fcfbe5e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
@@ -0,0 +1,49 @@
+#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/testsuite/g++.dg/compat/abi/vbase8-21_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
new file mode 100644
index 00000000000..0bd76246d4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
@@ -0,0 +1,63 @@
+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/testsuite/g++.dg/compat/abi/vbase8-22.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h
new file mode 100644
index 00000000000..e19e93eaead
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-22_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C
new file mode 100644
index 00000000000..6455a2efcb9
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-22_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
new file mode 100644
index 00000000000..5d3eacf7c90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
@@ -0,0 +1,49 @@
+#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/testsuite/g++.dg/compat/abi/vbase8-22_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
new file mode 100644
index 00000000000..293ed100be4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
@@ -0,0 +1,63 @@
+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/testsuite/g++.dg/compat/abi/vbase8-4.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h
new file mode 100644
index 00000000000..b183fbe4f9b
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-4_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C
new file mode 100644
index 00000000000..f5e5e38247e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/abi/vbase8-4_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
new file mode 100644
index 00000000000..66b514c1b09
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
@@ -0,0 +1,49 @@
+#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/testsuite/g++.dg/compat/abi/vbase8-4_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
new file mode 100644
index 00000000000..86dd40433d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
@@ -0,0 +1,63 @@
+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/testsuite/g++.dg/compat/break/README b/gcc/testsuite/g++.dg/compat/break/README
new file mode 100644
index 00000000000..98886310caa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/README
@@ -0,0 +1,11 @@
+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.
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5.h b/gcc/testsuite/g++.dg/compat/break/bitfield5.h
new file mode 100644
index 00000000000..6f7f012cc6b
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/bitfield5_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C
new file mode 100644
index 00000000000..415a8846c26
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/bitfield5_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C
new file mode 100644
index 00000000000..9be9372347a
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/bitfield5_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C
new file mode 100644
index 00000000000..6ee4dd0089d
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/bitfield7.h b/gcc/testsuite/g++.dg/compat/break/bitfield7.h
new file mode 100644
index 00000000000..2060bf7473b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7.h
@@ -0,0 +1,3 @@
+union U {
+ int i: 4096;
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C
new file mode 100644
index 00000000000..57bb96101f1
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/bitfield7_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
new file mode 100644
index 00000000000..b42ea2e9ae3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
@@ -0,0 +1,13 @@
+#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/testsuite/g++.dg/compat/break/bitfield7_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
new file mode 100644
index 00000000000..916d150d537
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
@@ -0,0 +1,11 @@
+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/testsuite/g++.dg/compat/break/empty6.h b/gcc/testsuite/g++.dg/compat/break/empty6.h
new file mode 100644
index 00000000000..47a0da8b52e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/empty6_main.C b/gcc/testsuite/g++.dg/compat/break/empty6_main.C
new file mode 100644
index 00000000000..bf6d982413b
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/empty6_x.C b/gcc/testsuite/g++.dg/compat/break/empty6_x.C
new file mode 100644
index 00000000000..f7e25e9abf9
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/empty6_y.C b/gcc/testsuite/g++.dg/compat/break/empty6_y.C
new file mode 100644
index 00000000000..cb3d45c9e15
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase10.h b/gcc/testsuite/g++.dg/compat/break/vbase10.h
new file mode 100644
index 00000000000..f418d1e56a4
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase10_main.C b/gcc/testsuite/g++.dg/compat/break/vbase10_main.C
new file mode 100644
index 00000000000..a082b5dbf3e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase10_x.C b/gcc/testsuite/g++.dg/compat/break/vbase10_x.C
new file mode 100644
index 00000000000..6d51d3c7269
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase10_y.C b/gcc/testsuite/g++.dg/compat/break/vbase10_y.C
new file mode 100644
index 00000000000..70ce0075e66
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase11.h b/gcc/testsuite/g++.dg/compat/break/vbase11.h
new file mode 100644
index 00000000000..a298f764415
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase11_main.C b/gcc/testsuite/g++.dg/compat/break/vbase11_main.C
new file mode 100644
index 00000000000..2ac59944992
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase11_x.C b/gcc/testsuite/g++.dg/compat/break/vbase11_x.C
new file mode 100644
index 00000000000..4b2398ae10d
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/break/vbase11_y.C b/gcc/testsuite/g++.dg/compat/break/vbase11_y.C
new file mode 100644
index 00000000000..01ca62b87b8
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/compat.exp b/gcc/testsuite/g++.dg/compat/compat.exp
new file mode 100644
index 00000000000..1e13c102a50
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/compat.exp
@@ -0,0 +1,137 @@
+# Copyright (C) 2002 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 2 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 this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# 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
+
+#
+# compat-fix-library-path -- switch LD_LIBRARY_PATH
+#
+proc compat-fix-library-path { } {
+ global ld_library_path
+
+ # See comments in lib/g++.exp for why this is needed.
+ setenv LD_LIBRARY_PATH $ld_library_path
+ setenv SHLIB_PATH $ld_library_path
+ setenv LD_LIBRARYN32_PATH $ld_library_path
+ setenv LD_LIBRARY64_PATH $ld_library_path
+}
+
+#
+# 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
+ compat-fix-library-path
+ }
+}
+
+#
+# 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
+ compat-fix-library-path
+ }
+}
+
+# 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
+
+# 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 $use_alt
+}
+
+# Restore the original compiler under test.
+compat-use-tst-compiler
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1.h b/gcc/testsuite/g++.dg/compat/eh/ctor1.h
new file mode 100644
index 00000000000..e83476f2d60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor1.h
@@ -0,0 +1,10 @@
+struct Foo
+{
+ ~Foo ();
+};
+
+struct Bar
+{
+ ~Bar ();
+ Foo f;
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C
new file mode 100644
index 00000000000..a188b46da86
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor1_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C
new file mode 100644
index 00000000000..d74a520871f
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor1_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C
new file mode 100644
index 00000000000..260ab1c3418
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor2.h b/gcc/testsuite/g++.dg/compat/eh/ctor2.h
new file mode 100644
index 00000000000..c6b9f40f8d9
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor2_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C
new file mode 100644
index 00000000000..58836e26eba
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor2_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C
new file mode 100644
index 00000000000..3fa1a53ace5
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/ctor2_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C
new file mode 100644
index 00000000000..00ba92000e4
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/dtor1.h b/gcc/testsuite/g++.dg/compat/eh/dtor1.h
new file mode 100644
index 00000000000..0dfa793e0e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/dtor1.h
@@ -0,0 +1,7 @@
+struct A {
+ ~A();
+};
+
+struct B: public A {
+ ~B();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C
new file mode 100644
index 00000000000..962fa64274b
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/dtor1_x.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C
new file mode 100644
index 00000000000..f7f4cc8a7f7
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/dtor1_y.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C
new file mode 100644
index 00000000000..a1ec41a2764
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/filter1.h b/gcc/testsuite/g++.dg/compat/eh/filter1.h
new file mode 100644
index 00000000000..1f5f0c93615
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter1.h
@@ -0,0 +1,5 @@
+struct a
+{
+ a();
+ ~a();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_main.C b/gcc/testsuite/g++.dg/compat/eh/filter1_main.C
new file mode 100644
index 00000000000..2a8fca42c31
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/filter1_x.C b/gcc/testsuite/g++.dg/compat/eh/filter1_x.C
new file mode 100644
index 00000000000..b3789aa15b7
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/filter1_y.C b/gcc/testsuite/g++.dg/compat/eh/filter1_y.C
new file mode 100644
index 00000000000..48de0877d54
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/filter2_main.C b/gcc/testsuite/g++.dg/compat/eh/filter2_main.C
new file mode 100644
index 00000000000..866199c6b30
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/filter2_x.C b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
new file mode 100644
index 00000000000..cdbfffffdd1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
@@ -0,0 +1,20 @@
+#include <exception>
+#include <cstdlib>
+
+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/testsuite/g++.dg/compat/eh/filter2_y.C b/gcc/testsuite/g++.dg/compat/eh/filter2_y.C
new file mode 100644
index 00000000000..87c6fea1012
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/new1_main.C b/gcc/testsuite/g++.dg/compat/eh/new1_main.C
new file mode 100644
index 00000000000..ee4cad8e50d
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/new1_x.C b/gcc/testsuite/g++.dg/compat/eh/new1_x.C
new file mode 100644
index 00000000000..4ca3be0af90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/new1_x.C
@@ -0,0 +1,28 @@
+#include <new>
+
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+extern void * operator new[] (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/testsuite/g++.dg/compat/eh/new1_y.C b/gcc/testsuite/g++.dg/compat/eh/new1_y.C
new file mode 100644
index 00000000000..c448cbed8d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/new1_y.C
@@ -0,0 +1,18 @@
+#include <new>
+
+extern int ret;
+
+void *ptr;
+void * operator new[] (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/testsuite/g++.dg/compat/eh/nrv1.h b/gcc/testsuite/g++.dg/compat/eh/nrv1.h
new file mode 100644
index 00000000000..853ea3914e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/nrv1.h
@@ -0,0 +1,5 @@
+struct A
+{
+ A();
+ ~A();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C
new file mode 100644
index 00000000000..3b76b5c8824
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/nrv1_x.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C
new file mode 100644
index 00000000000..0647de889a5
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/nrv1_y.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C
new file mode 100644
index 00000000000..5a43af7c205
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/spec3.h b/gcc/testsuite/g++.dg/compat/eh/spec3.h
new file mode 100644
index 00000000000..a042c1004dd
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/spec3_main.C b/gcc/testsuite/g++.dg/compat/eh/spec3_main.C
new file mode 100644
index 00000000000..3f0e919b2ea
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/spec3_x.C b/gcc/testsuite/g++.dg/compat/eh/spec3_x.C
new file mode 100644
index 00000000000..b8e5fbeaa1e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/spec3_y.C b/gcc/testsuite/g++.dg/compat/eh/spec3_y.C
new file mode 100644
index 00000000000..fef6b368c86
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/template1.h b/gcc/testsuite/g++.dg/compat/eh/template1.h
new file mode 100644
index 00000000000..93999a11d49
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/template1_main.C b/gcc/testsuite/g++.dg/compat/eh/template1_main.C
new file mode 100644
index 00000000000..2d169808c46
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/template1_x.C b/gcc/testsuite/g++.dg/compat/eh/template1_x.C
new file mode 100644
index 00000000000..5a18be78989
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/template1_y.C b/gcc/testsuite/g++.dg/compat/eh/template1_y.C
new file mode 100644
index 00000000000..19425375c92
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/unexpected1_main.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C
new file mode 100644
index 00000000000..1658db77e32
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/unexpected1_x.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C
new file mode 100644
index 00000000000..61361a68d9f
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/eh/unexpected1_y.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C
new file mode 100644
index 00000000000..0c42c457953
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/array5_main.C b/gcc/testsuite/g++.dg/compat/init/array5_main.C
new file mode 100644
index 00000000000..96b2cc4b12b
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/array5_x.C b/gcc/testsuite/g++.dg/compat/init/array5_x.C
new file mode 100644
index 00000000000..dc138772cdd
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/array5_y.C b/gcc/testsuite/g++.dg/compat/init/array5_y.C
new file mode 100644
index 00000000000..64b295ed56d
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/byval1.h b/gcc/testsuite/g++.dg/compat/init/byval1.h
new file mode 100644
index 00000000000..2876b76ede1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/byval1.h
@@ -0,0 +1,6 @@
+struct C
+{
+ int m;
+ C();
+ ~C();
+};
diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_main.C b/gcc/testsuite/g++.dg/compat/init/byval1_main.C
new file mode 100644
index 00000000000..acefaab1440
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/byval1_x.C b/gcc/testsuite/g++.dg/compat/init/byval1_x.C
new file mode 100644
index 00000000000..248dbe763bc
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/byval1_y.C b/gcc/testsuite/g++.dg/compat/init/byval1_y.C
new file mode 100644
index 00000000000..6e217e84ec5
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/dtor1.h b/gcc/testsuite/g++.dg/compat/init/dtor1.h
new file mode 100644
index 00000000000..77e21c12ef2
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/dtor1_main.C b/gcc/testsuite/g++.dg/compat/init/dtor1_main.C
new file mode 100644
index 00000000000..78868784038
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/dtor1_x.C b/gcc/testsuite/g++.dg/compat/init/dtor1_x.C
new file mode 100644
index 00000000000..8a4727cfb4c
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/dtor1_y.C b/gcc/testsuite/g++.dg/compat/init/dtor1_y.C
new file mode 100644
index 00000000000..27610fc1e9e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/elide1.h b/gcc/testsuite/g++.dg/compat/init/elide1.h
new file mode 100644
index 00000000000..481e7308b5f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/elide1.h
@@ -0,0 +1,5 @@
+struct A {
+ A ();
+ A (const A&);
+ ~A ();
+};
diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_main.C b/gcc/testsuite/g++.dg/compat/init/elide1_main.C
new file mode 100644
index 00000000000..c08d02fff45
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/elide1_x.C b/gcc/testsuite/g++.dg/compat/init/elide1_x.C
new file mode 100644
index 00000000000..dbc287e4e2c
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/elide1_y.C b/gcc/testsuite/g++.dg/compat/init/elide1_y.C
new file mode 100644
index 00000000000..e767d08082e
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/init-ref2_main.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C
new file mode 100644
index 00000000000..73782829ec4
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/init-ref2_x.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C
new file mode 100644
index 00000000000..7fbec89b645
--- /dev/null
+++ b/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/testsuite/g++.dg/compat/init/init-ref2_y.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C
new file mode 100644
index 00000000000..23e66b2f9a1
--- /dev/null
+++ b/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/testsuite/g++.dg/cpp/c++98-pedantic.C b/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C
new file mode 100644
index 00000000000..61e13c5d145
--- /dev/null
+++ b/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/testsuite/g++.dg/cpp/c++98.C b/gcc/testsuite/g++.dg/cpp/c++98.C
new file mode 100644
index 00000000000..0ec4f359f04
--- /dev/null
+++ b/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/testsuite/g++.dg/dg.exp b/gcc/testsuite/g++.dg/dg.exp
index 9e48af8f914..ea96197332f 100644
--- a/gcc/testsuite/g++.dg/dg.exp
+++ b/gcc/testsuite/g++.dg/dg.exp
@@ -32,6 +32,7 @@ dg-init
# that are handled specially.
set tests [lsort [find $srcdir/$subdir *.C]]
set tests [prune $tests $srcdir/$subdir/bprob/*]
+set tests [prune $tests $srcdir/$subdir/compat/*]
set tests [prune $tests $srcdir/$subdir/debug/*]
set tests [prune $tests $srcdir/$subdir/gcov/*]
set tests [prune $tests $srcdir/$subdir/special/*]
diff --git a/gcc/testsuite/g++.dg/eh/spec5.C b/gcc/testsuite/g++.dg/eh/spec5.C
new file mode 100644
index 00000000000..be8f327c0b7
--- /dev/null
+++ b/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/testsuite/g++.dg/eh/spec6.C b/gcc/testsuite/g++.dg/eh/spec6.C
new file mode 100644
index 00000000000..eb1177b07f5
--- /dev/null
+++ b/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/testsuite/g++.dg/eh/stabilize.C b/gcc/testsuite/g++.dg/eh/stabilize.C
new file mode 100644
index 00000000000..df47cab0cf4
--- /dev/null
+++ b/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/testsuite/g++.dg/expr/cond1.C b/gcc/testsuite/g++.dg/expr/cond1.C
new file mode 100644
index 00000000000..8fb3c0f4f34
--- /dev/null
+++ b/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/testsuite/g++.dg/ext/asm3.C b/gcc/testsuite/g++.dg/ext/asm3.C
new file mode 100644
index 00000000000..699ab4c8252
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm3.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 7015. ICE with asms
+
+int two(int in)
+{
+ register int out;
+ __asm__ ("" : "r" (out) : "r" (in)); // { dg-error "output operand" "" }
+ return out;
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvaddr.C b/gcc/testsuite/g++.dg/ext/lvaddr.C
new file mode 100644
index 00000000000..184afce900b
--- /dev/null
+++ b/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 "non-lvalue" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvcast.C b/gcc/testsuite/g++.dg/ext/lvcast.C
new file mode 100644
index 00000000000..efff04ec089
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvcast.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+// { dg-options -fpermissive }
+
+void f ()
+{
+ int n;
+ (char) n = 1;
+}
diff --git a/gcc/testsuite/g++.dg/ext/typedef-init.C b/gcc/testsuite/g++.dg/ext/typedef-init.C
new file mode 100644
index 00000000000..1b2a05db63c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/typedef-init.C
@@ -0,0 +1,33 @@
+/* { 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 "initialized" "A" } */
+ /* { dg-warning "no type" "A warns" { target *-*-* } 14 } */
+A a; /* { dg-bogus "" "A error cascade" } */
+
+/* Case B: with a type also. */
+
+typedef int B = 0; /* { dg-error "initialized" "B" } */
+B b; /* { dg-bogus "" "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 "initialized" "C" } */
+ /* { dg-warning "no type" "C warns" { target *-*-* } 27 } */
+ C c; /* { dg-bogus "" "C error cascade" } */
+
+ typedef int D = 0; /* { dg-error "initialized" "D" } */
+ D d; /* { dg-bogus "" "D error cascade" } */
+};
diff --git a/gcc/testsuite/g++.dg/ext/vla1.C b/gcc/testsuite/g++.dg/ext/vla1.C
new file mode 100644
index 00000000000..bac5aaca1a5
--- /dev/null
+++ b/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 "variable-size array" }
+
+ ar[0][0] = 0;
+}
+
+class B { B (int); };
+
+B::B (int i)
+{
+ struct S {
+ int ar[1][i]; // { dg-error "variable-size|variably modified" }
+ } s;
+
+ s.ar[0][0] = 0; // { dg-error "no member" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/vlm1.C b/gcc/testsuite/g++.dg/ext/vlm1.C
new file mode 100644
index 00000000000..61628e6bba4
--- /dev/null
+++ b/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 "variably modified|no type" }
+};
+
+const int B::s=16;
+
+B b;
+
diff --git a/gcc/testsuite/g++.dg/ext/vlm2.C b/gcc/testsuite/g++.dg/ext/vlm2.C
new file mode 100644
index 00000000000..3a0b335262c
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/cond1.C b/gcc/testsuite/g++.dg/inherit/cond1.C
new file mode 100644
index 00000000000..843c72ca308
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/covariant1.C b/gcc/testsuite/g++.dg/inherit/covariant1.C
index 516047e95e3..978c3e8255a 100644
--- a/gcc/testsuite/g++.dg/inherit/covariant1.C
+++ b/gcc/testsuite/g++.dg/inherit/covariant1.C
@@ -1,12 +1,6 @@
// PR c++/5607
-// Currently we don't support covariant returns that would actually require
-// a pointer adjustment. We were failing to recognize this as such a case,
-// so were silently generating bad code. When we do support covariant
-// returns properly, the expected error should go away, and the testcase
-// should pass execution.
-
-// { NOT YET dg-do run }
+// { dg-do run }
class A {
public:
@@ -19,7 +13,7 @@ public:
virtual B* getThis() { return this; }
};
-class AB : public A, public B { // { dg-error "covariant" }
+class AB : public A, public B {
public:
virtual AB* getThis() { return this; }
};
diff --git a/gcc/testsuite/g++.dg/inherit/covariant2.C b/gcc/testsuite/g++.dg/inherit/covariant2.C
new file mode 100644
index 00000000000..b6d93d6b571
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/covariant3.C b/gcc/testsuite/g++.dg/inherit/covariant3.C
new file mode 100644
index 00000000000..b7024c45593
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/covariant4.C b/gcc/testsuite/g++.dg/inherit/covariant4.C
new file mode 100644
index 00000000000..8f6101b3fc5
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/override1.C b/gcc/testsuite/g++.dg/inherit/override1.C
new file mode 100644
index 00000000000..8f80046413f
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/thunk1.C b/gcc/testsuite/g++.dg/inherit/thunk1.C
new file mode 100644
index 00000000000..4426419e9da
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/thunk1.C
@@ -0,0 +1,41 @@
+// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* } }
+
+#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/testsuite/g++.dg/inherit/typedef1.C b/gcc/testsuite/g++.dg/inherit/typedef1.C
new file mode 100644
index 00000000000..20da08b2c43
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/typeinfo1.C b/gcc/testsuite/g++.dg/inherit/typeinfo1.C
new file mode 100644
index 00000000000..794776ecbe8
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/using2.C b/gcc/testsuite/g++.dg/inherit/using2.C
new file mode 100644
index 00000000000..19f06e9cc02
--- /dev/null
+++ b/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/testsuite/g++.dg/inherit/using3.C b/gcc/testsuite/g++.dg/inherit/using3.C
new file mode 100644
index 00000000000..d2acf80099a
--- /dev/null
+++ b/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/testsuite/g++.dg/init/aggr1.C b/gcc/testsuite/g++.dg/init/aggr1.C
new file mode 100644
index 00000000000..c63f0b02c65
--- /dev/null
+++ b/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/testsuite/g++.dg/init/array1.C b/gcc/testsuite/g++.dg/init/array1.C
index 8618e1e6018..5847247c158 100644
--- a/gcc/testsuite/g++.dg/init/array1.C
+++ b/gcc/testsuite/g++.dg/init/array1.C
@@ -6,15 +6,15 @@
typedef int iArr[];
const iArr array4={
- {1},{2},{3},{4}
+ 1, 2, 3, 4
};
const iArr array3={
- {1},{2},{3}
+ 1, 2, 3
};
const iArr array5={
- {1},{2},{3},{4},{5}
+ 1, 2, 3, 4, 5
};
int main()
diff --git a/gcc/testsuite/g++.dg/init/array6.C b/gcc/testsuite/g++.dg/init/array6.C
new file mode 100644
index 00000000000..6181d02bfd2
--- /dev/null
+++ b/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/testsuite/g++.dg/init/array7.C b/gcc/testsuite/g++.dg/init/array7.C
new file mode 100644
index 00000000000..23c6a7098ef
--- /dev/null
+++ b/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/testsuite/g++.dg/init/array8.C b/gcc/testsuite/g++.dg/init/array8.C
new file mode 100644
index 00000000000..5f28ca490e7
--- /dev/null
+++ b/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/testsuite/g++.dg/init/brace1.C b/gcc/testsuite/g++.dg/init/brace1.C
new file mode 100644
index 00000000000..a819fa2587c
--- /dev/null
+++ b/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/testsuite/g++.dg/init/brace2.C b/gcc/testsuite/g++.dg/init/brace2.C
new file mode 100644
index 00000000000..488d916aa42
--- /dev/null
+++ b/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" }
+int c = { { 2 } } ; // { dg-error "braces around scalar initializer" }
+
diff --git a/gcc/testsuite/g++.dg/init/copy2.C b/gcc/testsuite/g++.dg/init/copy2.C
new file mode 100644
index 00000000000..9a662d4cf16
--- /dev/null
+++ b/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/testsuite/g++.dg/init/copy3.C b/gcc/testsuite/g++.dg/init/copy3.C
new file mode 100644
index 00000000000..fa6a6ea1884
--- /dev/null
+++ b/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/testsuite/g++.dg/init/ctor1.C b/gcc/testsuite/g++.dg/init/ctor1.C
new file mode 100644
index 00000000000..aeb509bfa5d
--- /dev/null
+++ b/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/testsuite/g++.dg/init/dtor2.C b/gcc/testsuite/g++.dg/init/dtor2.C
new file mode 100644
index 00000000000..56c7cac914d
--- /dev/null
+++ b/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/testsuite/g++.dg/init/pm2.C b/gcc/testsuite/g++.dg/init/pm2.C
new file mode 100644
index 00000000000..35b9b32fea1
--- /dev/null
+++ b/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/testsuite/g++.dg/init/string1.C b/gcc/testsuite/g++.dg/init/string1.C
new file mode 100644
index 00000000000..597b8619e72
--- /dev/null
+++ b/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/testsuite/g++.dg/lookup/anon2.C b/gcc/testsuite/g++.dg/lookup/anon2.C
new file mode 100644
index 00000000000..b0a7c07af96
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/anon2.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "" }
+
+class { int i; } a; // { dg-error "private" }
+void foo() { a.i; } // { dg-error "context" }
+
diff --git a/gcc/testsuite/g++.dg/lookup/pretty1.C b/gcc/testsuite/g++.dg/lookup/pretty1.C
new file mode 100644
index 00000000000..a03bd3c3e8a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pretty1.C
@@ -0,0 +1 @@
+void foo() { for ( __PRETTY_FUNCTION__ ; ; ) ; }
diff --git a/gcc/testsuite/g++.dg/lookup/ptrmem1.C b/gcc/testsuite/g++.dg/lookup/ptrmem1.C
new file mode 100644
index 00000000000..5bdef2621fe
--- /dev/null
+++ b/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/testsuite/g++.dg/lookup/scoped2.C b/gcc/testsuite/g++.dg/lookup/scoped2.C
new file mode 100644
index 00000000000..80cfb1f5f00
--- /dev/null
+++ b/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 "has no member" "" }
+
+ };
+};
diff --git a/gcc/testsuite/g++.dg/opt/const2.C b/gcc/testsuite/g++.dg/opt/const2.C
new file mode 100644
index 00000000000..9ddc5e13764
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/const2.C
@@ -0,0 +1,40 @@
+// { 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/testsuite/g++.dg/opt/local1.C b/gcc/testsuite/g++.dg/opt/local1.C
new file mode 100644
index 00000000000..9cecaee6f2a
--- /dev/null
+++ b/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/testsuite/g++.dg/opt/reload1.C b/gcc/testsuite/g++.dg/opt/reload1.C
new file mode 100644
index 00000000000..0d8fb894e4e
--- /dev/null
+++ b/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/testsuite/g++.dg/other/constref1.C b/gcc/testsuite/g++.dg/other/constref1.C
new file mode 100644
index 00000000000..900a07de39c
--- /dev/null
+++ b/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/testsuite/g++.dg/other/constref2.C b/gcc/testsuite/g++.dg/other/constref2.C
new file mode 100644
index 00000000000..5c82e2dbbdb
--- /dev/null
+++ b/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/testsuite/g++.dg/other/cxa-atexit1.C b/gcc/testsuite/g++.dg/other/cxa-atexit1.C
new file mode 100644
index 00000000000..a51f3340142
--- /dev/null
+++ b/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/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C
new file mode 100644
index 00000000000..5ff6c5682ba
--- /dev/null
+++ b/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 "parse error" "" }
+
+}
diff --git a/gcc/testsuite/g++.dg/other/offsetof1.C b/gcc/testsuite/g++.dg/other/offsetof1.C
index 1051cd28cfe..6d4ebf93c14 100644
--- a/gcc/testsuite/g++.dg/other/offsetof1.C
+++ b/gcc/testsuite/g++.dg/other/offsetof1.C
@@ -11,4 +11,4 @@ struct F
char j;
};
-static int ary[((unsigned) &((struct F *)0)->j)];
+static int ary[((__SIZE_TYPE__)&((struct F *)0)->j)];
diff --git a/gcc/testsuite/g++.dg/other/warning1.C b/gcc/testsuite/g++.dg/other/warning1.C
new file mode 100644
index 00000000000..109fc46aa22
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/warning1.C
@@ -0,0 +1,18 @@
+// { 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-warning "1.0|initialization" }
+ static const float nan = 0.0f / 0.0f; // { dg-warning "0.0|initialization" }
+};
+
+int main()
+{
+ printf("%f\n%f\n", S::inf, S::nan);
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/overload/member1.C b/gcc/testsuite/g++.dg/overload/member1.C
new file mode 100644
index 00000000000..29896a5110f
--- /dev/null
+++ b/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/testsuite/g++.dg/overload/member2.C b/gcc/testsuite/g++.dg/overload/member2.C
new file mode 100644
index 00000000000..b8914146f16
--- /dev/null
+++ b/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/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
new file mode 100644
index 00000000000..e81fbabf2c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
@@ -0,0 +1,16 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: PRs 7721 and 7803
+// { dg-do compile }
+
+namespace N
+{
+ template<typename>
+ struct X { };
+}
+
+N::X X; // { dg-error "" "" }
+
+int main()
+{
+ return sizeof(X); // { dg-error "" "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/friend1.C b/gcc/testsuite/g++.dg/parse/friend1.C
new file mode 100644
index 00000000000..f19dc9c628b
--- /dev/null
+++ b/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/testsuite/g++.dg/parse/inline1.C b/gcc/testsuite/g++.dg/parse/inline1.C
new file mode 100644
index 00000000000..5c3034c6ec2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/inline1.C
@@ -0,0 +1,7 @@
+struct f
+{
+ int oo()
+ {
+ return (2; // { dg-error "" }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc/testsuite/g++.dg/parse/stmtexpr3.C
new file mode 100644
index 00000000000..79f689316ae
--- /dev/null
+++ b/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/testsuite/g++.dg/rtti/crash1.C b/gcc/testsuite/g++.dg/rtti/crash1.C
new file mode 100644
index 00000000000..eea6a3950de
--- /dev/null
+++ b/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/testsuite/g++.dg/rtti/cv1.C b/gcc/testsuite/g++.dg/rtti/cv1.C
new file mode 100644
index 00000000000..59dd6592c9d
--- /dev/null
+++ b/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/testsuite/g++.dg/template/access6.C b/gcc/testsuite/g++.dg/template/access6.C
new file mode 100644
index 00000000000..fc80402ba1b
--- /dev/null
+++ b/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/testsuite/g++.dg/template/complit1.C b/gcc/testsuite/g++.dg/template/complit1.C
new file mode 100644
index 00000000000..ab057b3b7ee
--- /dev/null
+++ b/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}) {};
+
+template class C<1>;
diff --git a/gcc/testsuite/g++.dg/template/cond.C b/gcc/testsuite/g++.dg/template/cond.C
new file mode 100644
index 00000000000..394a21c9a6b
--- /dev/null
+++ b/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/testsuite/g++.dg/template/crash2.C b/gcc/testsuite/g++.dg/template/crash2.C
new file mode 100644
index 00000000000..e6cc965ff03
--- /dev/null
+++ b/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];
+};
+template <class EnumType>
+const EnumType A<EnumType>::size;
+
+
+namespace N
+{
+enum E { max = 5 };
+
+struct B
+{
+ A<E> a; // { dg-error "" }
+};
+
+}
+
+int
+main()
+{
+ N::B b;
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/template/ctor2.C b/gcc/testsuite/g++.dg/template/ctor2.C
new file mode 100644
index 00000000000..1c8d8a65d9b
--- /dev/null
+++ b/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/testsuite/g++.dg/template/deduce1.C b/gcc/testsuite/g++.dg/template/deduce1.C
new file mode 100644
index 00000000000..262c4fe86e5
--- /dev/null
+++ b/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/testsuite/g++.dg/template/friend4.C b/gcc/testsuite/g++.dg/template/friend4.C
index 9cd3810c2c2..fabf3375bd2 100644
--- a/gcc/testsuite/g++.dg/template/friend4.C
+++ b/gcc/testsuite/g++.dg/template/friend4.C
@@ -3,7 +3,7 @@
// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@codesourcery.com>
-// PR 109, dependant member friends
+// PR 109, dependent member friends
struct B
{
diff --git a/gcc/testsuite/g++.dg/template/friend8.C b/gcc/testsuite/g++.dg/template/friend8.C
new file mode 100644
index 00000000000..21fd242f183
--- /dev/null
+++ b/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/testsuite/g++.dg/template/instantiate1.C b/gcc/testsuite/g++.dg/template/instantiate1.C
index e96bcd283fd..e4e7bc98178 100644
--- a/gcc/testsuite/g++.dg/template/instantiate1.C
+++ b/gcc/testsuite/g++.dg/template/instantiate1.C
@@ -8,12 +8,12 @@ template <class T> struct X {
T t; // { dg-error "incomplete" }
};
-template <class T> struct Y { // { dg-error "instantiated" }
- X<T> x;
+template <class T> struct Y {
+ X<T> x; // { dg-error "instantiated" }
};
-template <class T> struct Z { // { dg-error "instantiated|declaration" }
- Y<Z<T> > y;
+template <class T> struct Z { // { dg-error "declaration" }
+ Y<Z<T> > y; // { dg-error "instantiated" }
};
struct ZZ : Z<int>
diff --git a/gcc/testsuite/g++.dg/template/instantiate3.C b/gcc/testsuite/g++.dg/template/instantiate3.C
new file mode 100644
index 00000000000..e75b570cf82
--- /dev/null
+++ b/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_; } // { dg-error "no member" }
+ TYPE object_; // { dg-error "incomplete type" }
+};
+
+template class ACE_Cleanup_Adapter<ACE_Null_Mutex>; // { dg-error "instantiated from here" }
diff --git a/gcc/testsuite/g++.dg/template/meminit1.C b/gcc/testsuite/g++.dg/template/meminit1.C
new file mode 100644
index 00000000000..90b0d7d8539
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/meminit1.C
@@ -0,0 +1,7 @@
+template <class T >
+struct S
+{
+ S() : S() {} // { dg-error "base" }
+};
+
+S<int> s; // { dg-error "instantiated" }
diff --git a/gcc/testsuite/g++.dg/template/pretty1.C b/gcc/testsuite/g++.dg/template/pretty1.C
new file mode 100644
index 00000000000..99cbcd64a55
--- /dev/null
+++ b/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/testsuite/g++.dg/template/ptrmem3.C b/gcc/testsuite/g++.dg/template/ptrmem3.C
new file mode 100644
index 00000000000..fda7bf10a4d
--- /dev/null
+++ b/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/testsuite/g++.dg/template/qualttp20.C b/gcc/testsuite/g++.dg/template/qualttp20.C
index 2c6c71445c9..6c68a3a2a8a 100644
--- a/gcc/testsuite/g++.dg/template/qualttp20.C
+++ b/gcc/testsuite/g++.dg/template/qualttp20.C
@@ -16,18 +16,20 @@ struct AS
template <typename T> struct B1 : T
{
typedef typename T::L __restrict__ r;// { dg-error "`__restrict' qualifiers cannot" "" }
- typedef typename T::myT __restrict__ p;// { dg-warning "ignoring `__restrict'" "" }
-
- typedef typename T::myT volatile *myvolatile; // { dg-warning "ignoring `volatile'" "" }
- typename T::myT volatile *a; // { dg-warning "ignoring `volatile'" "" }
- myvolatile b; // { dg-bogus "ignoring `volatile'" "" { xfail *-*-* } }
+ typedef typename T::myT __restrict__ p;// { dg-warning "ignoring `__restrict'" "" { xfail *-*-* } }
+
+ // The following are DR 295 dependent
+ typedef typename T::myT volatile *myvolatile; // { dg-error "qualifiers" "" }
+ typename T::myT volatile *a; // { dg-error "qualifiers" "" }
+ myvolatile b; // { dg-error "qualifiers" "" }
};
template <typename T> struct B2 : T
{
- typedef typename T::myT const *myconst;
- typename T::myT const *a;
- myconst b;
+ // The following are DR 295 dependent
+ typedef typename T::myT const *myconst; // { dg-error "qualifiers" "" }
+ typename T::myT const *a; // { dg-error "qualifiers" "" }
+ myconst b; // { dg-error "qualifiers" "" }
};
B1<AS> b1; // { dg-error "instantiated" "" }
-B2<AS> b2;
+B2<AS> b2; // { dg-error "instantiated" "" }
diff --git a/gcc/testsuite/g++.dg/template/ref1.C b/gcc/testsuite/g++.dg/template/ref1.C
new file mode 100644
index 00000000000..3f133d488f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ref1.C
@@ -0,0 +1,3 @@
+class a {} a1;
+template <a & p> class b { public: b() { static_cast <a &> (p); }; };
+int main() { b <a1> b1; };
diff --git a/gcc/testsuite/g++.dg/template/strlen1.C b/gcc/testsuite/g++.dg/template/strlen1.C
new file mode 100644
index 00000000000..ddec51d7b1e
--- /dev/null
+++ b/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/testsuite/g++.dg/template/subst1.C b/gcc/testsuite/g++.dg/template/subst1.C
new file mode 100644
index 00000000000..827af23d21e
--- /dev/null
+++ b/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/testsuite/g++.dg/template/typename3.C b/gcc/testsuite/g++.dg/template/typename3.C
new file mode 100644
index 00000000000..1c573baa0df
--- /dev/null
+++ b/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 "no type|parse error" }
+};
diff --git a/gcc/testsuite/g++.dg/template/typename4.C b/gcc/testsuite/g++.dg/template/typename4.C
new file mode 100644
index 00000000000..add95156cec
--- /dev/null
+++ b/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 "" }
+void f () { A<B>::V p; } // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/template/union1.C b/gcc/testsuite/g++.dg/template/union1.C
new file mode 100644
index 00000000000..9019c38a285
--- /dev/null
+++ b/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/testsuite/g++.dg/template/varmod1.C b/gcc/testsuite/g++.dg/template/varmod1.C
new file mode 100644
index 00000000000..0747fe99587
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/varmod1.C
@@ -0,0 +1,10 @@
+// { dg-options "-w" }
+
+template<typename T> void foo(T);
+
+void bar()
+{
+ int i;
+ int A[i][i];
+ foo(A); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/tls/init-2.C b/gcc/testsuite/g++.dg/tls/init-2.C
index 49df50147b3..0fff6f6ab1e 100644
--- a/gcc/testsuite/g++.dg/tls/init-2.C
+++ b/gcc/testsuite/g++.dg/tls/init-2.C
@@ -1,13 +1,13 @@
/* Invalid initializations. */
extern __thread int i;
-__thread int *p = &i; /* { dg-error "run-time initialization" } */
+__thread int *p = &i; /* { dg-error "dynamically initialized" } */
extern int f();
-__thread int j = f(); /* { dg-error "run-time initialization" } */
+__thread int j = f(); /* { dg-error "dynamically initialized" } */
struct S
{
S();
};
-__thread S s; /* { dg-error "run-time initialization" } */
+__thread S s; /* { dg-error "non-POD" } */
diff --git a/gcc/testsuite/g++.dg/warn/Wreorder-1.C b/gcc/testsuite/g++.dg/warn/Wreorder-1.C
new file mode 100644
index 00000000000..bd8113a2a47
--- /dev/null
+++ b/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 () {} // { dg-warning "copy" }
+};