diff options
author | no-author <no-author@gcc.gnu.org> | 2002-11-19 17:50:19 +0000 |
---|---|---|
committer | no-author <no-author@gcc.gnu.org> | 2002-11-19 17:50:19 +0000 |
commit | 33619cbc0404045aa1d0003c10c485d3f5c260b2 (patch) | |
tree | 6d819852cf5d3da1b6144fe83cbfad444ecea97c /gcc/testsuite/g++.dg/abi | |
parent | fefb15d75743dd7f453d7ed065327338b8c27017 (diff) |
This commit was manufactured by cvs2svn to create taggcc_3_2_1_release
'gcc_3_2_1_release'.
git-svn-id: https://gcc.gnu.org/svn/gcc/tags/gcc_3_2_1_release@59268 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg/abi')
-rw-r--r-- | gcc/testsuite/g++.dg/abi/bitfield3.C | 80 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/bitfield5.C | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/enum1.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/layout1.C | 31 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/layout2.C | 33 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle11.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle14.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle17.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle6.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle7.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle8.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/rtti1.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/vbase10.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/vbase9.C | 29 |
14 files changed, 296 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/abi/bitfield3.C b/gcc/testsuite/g++.dg/abi/bitfield3.C new file mode 100644 index 00000000000..da7b92fad7f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield3.C @@ -0,0 +1,80 @@ +// Test for oversized bitfield alignment in structs on IA-32 +// { dg-do run { target i?86-*-* } } +// { dg-options "-O2" } + +struct A +{ + char a; + int b : 224; // { dg-warning "exceeds its type" "" } + char c; +} a, a4[4]; + +struct B +{ + char d; + A e; + char f; +} b; + +struct C +{ + char g; + long long h : 64; + char i; +} c, c4[4]; + +struct D +{ + char j; + C k; + char l; +} d; + +struct E +{ + char m; + long long n : 160; // { dg-warning "exceeds its type" "" } + char o; +} e, e4[4]; + +struct F +{ + char p; + E q; + char r; +} f; + +int main (void) +{ + if (&a.c - &a.a != 32) + return 1; + if (sizeof (a) != 36) + return 2; + if (sizeof (a4) != 4 * 36) + return 3; + if (sizeof (b) != 2 * 4 + 36) + return 4; + if (__alignof__ (b.e) != 4) + return 5; + if (&c.i - &c.g != 12) + return 6; + if (sizeof (c) != 16) + return 7; + if (sizeof (c4) != 4 * 16) + return 8; + if (sizeof (d) != 2 * 4 + 16) + return 9; + if (__alignof__ (d.k) != 4) + return 10; + if (&e.o - &e.m != 24) + return 11; + if (sizeof (e) != 28) + return 12; + if (sizeof (e4) != 4 * 28) + return 13; + if (sizeof (f) != 2 * 4 + 28) + return 14; + if (__alignof__ (f.q) != 4) + return 15; + return 0; +} diff --git a/gcc/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/enum1.C b/gcc/testsuite/g++.dg/abi/enum1.C new file mode 100644 index 00000000000..32e52fe0f5e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/enum1.C @@ -0,0 +1,16 @@ +// { dg-do run } + +#include <cstdlib> + +enum foo +{ + foo1 = 0, + foo2 = 0xffffffffffffffffULL, + foo3 = 0xf0fffffffffffffeULL +}; + +int main () +{ + if (sizeof (enum foo) != sizeof (unsigned long long)) + std::abort (); +} diff --git a/gcc/testsuite/g++.dg/abi/layout1.C b/gcc/testsuite/g++.dg/abi/layout1.C new file mode 100644 index 00000000000..645ed6acfee --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/layout1.C @@ -0,0 +1,31 @@ +// Red Hat bugzilla 64535 +// Bug: We are allocationg stuff into the tail padding of POD class "A". +// { dg-do run } + +struct A +{ + int x; + char y; +}; + +struct B : public A { + virtual void f () {} + char z; +}; + +A a = { 21, 42 }; +B b; + +int +main (void) +{ + b.x = 12; + b.y = 24; + b.z = 36; + + A *ap = &b; + + *ap = a; + + return (b.z != 36); +} diff --git a/gcc/testsuite/g++.dg/abi/layout2.C b/gcc/testsuite/g++.dg/abi/layout2.C new file mode 100644 index 00000000000..fb4e1e5d9ff --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/layout2.C @@ -0,0 +1,33 @@ +// Red Hat bugzilla 65210 +// { dg-do run } + +struct A { + int a; +}; + +struct B : public virtual A {}; + +struct C { + long double c; +}; + +struct D : public virtual C { + int d; +}; + +struct E : public B, public D { + int e; +}; + +E e; + +/* The layout of E should begin with the B-in-E vtable pointer, followed by + the D-in-E vtable pointer. The bug was that we used to pad out the D + fields for long double alignment. */ + +int main () +{ + D* dp = &e; + unsigned long d_offset = ((char*)dp) - ((char*) &e); + return (d_offset != sizeof(void *)); +} diff --git a/gcc/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/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/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/mangle6.C b/gcc/testsuite/g++.dg/abi/mangle6.C new file mode 100644 index 00000000000..e17ee7e653b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle6.C @@ -0,0 +1,18 @@ +/* Check that __int128 types are mangled. */ +/* { dg-do compile { target mips64*-*-* } } */ + +typedef int int128 __attribute__ ((mode(TI))); +typedef unsigned int uint128 __attribute__ ((mode(TI))); + +struct S +{ + int128 i; + int128 func1 (int128) const { return i; } + uint128 func2 (uint128) const { return i; } +}; + +int128 (S::*ptr1) (int128) const = &S::func1; +uint128 (S::*ptr2) (uint128) const = &S::func2; + +/* { dg-final { scan-assembler _ZNK1S5func1En } } */ +/* { dg-final { scan-assembler _ZNK1S5func2Eo } } */ diff --git a/gcc/testsuite/g++.dg/abi/mangle7.C b/gcc/testsuite/g++.dg/abi/mangle7.C new file mode 100644 index 00000000000..af178d3e599 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle7.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +typedef void *const t1[2]; +float const f1(t1 (&)[79], ...) {} + +/* { dg-final { scan-assembler _Z2f1RA79_A2_KPvz } } */ diff --git a/gcc/testsuite/g++.dg/abi/mangle8.C b/gcc/testsuite/g++.dg/abi/mangle8.C new file mode 100644 index 00000000000..6a073588aae --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle8.C @@ -0,0 +1,16 @@ +// Red Hat bugzilla 65035 +// Bug: We were encoding the name of the instantiation as 'operator int' +// rather than 'operator T'. +// { dg-do compile } + +struct C { + template <class T> + operator T (); +}; + +template <class T> +C::operator T () { return 0; } + +template C::operator int (); + +// { dg-final { scan-assembler _ZN1CcvT_IiEEv } } diff --git a/gcc/testsuite/g++.dg/abi/rtti1.C b/gcc/testsuite/g++.dg/abi/rtti1.C new file mode 100644 index 00000000000..f17d88aad26 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/rtti1.C @@ -0,0 +1,13 @@ +// Test that we don't emit the type_info for a polymorphic class other than +// with the vtable. + +struct A { + virtual ~A(); +}; + +void f () +{ + throw A(); +} + +// { dg-final { scan-assembler-dem-not {\ntypeinfo for A[: \t\n]} } } diff --git a/gcc/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/vbase9.C b/gcc/testsuite/g++.dg/abi/vbase9.C new file mode 100644 index 00000000000..4a0540d06f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase9.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Mar 2002 <nathan@codesourcery.com> +// Origin: Jakub Jelinek <jakub@redhat.com> + +// PR 5681. ICE in build_secondary_vtable + +struct A { + virtual int f1 (); +}; + +struct B : virtual A {}; + +struct C { + virtual int f2 (); +}; + +struct E : A {}; + +struct D : E, B {}; + +struct F : virtual D {}; + +struct G : virtual F, C {}; + +struct H : virtual F {}; + +struct I : G, H {}; |