diff options
Diffstat (limited to 'gcc/testsuite/g++.dg')
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" } +}; |