aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/abi
diff options
context:
space:
mode:
authorno-author <no-author@gcc.gnu.org>2002-11-19 17:50:19 +0000
committerno-author <no-author@gcc.gnu.org>2002-11-19 17:50:19 +0000
commit33619cbc0404045aa1d0003c10c485d3f5c260b2 (patch)
tree6d819852cf5d3da1b6144fe83cbfad444ecea97c /gcc/testsuite/g++.dg/abi
parentfefb15d75743dd7f453d7ed065327338b8c27017 (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.C80
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield5.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/enum1.C16
-rw-r--r--gcc/testsuite/g++.dg/abi/layout1.C31
-rw-r--r--gcc/testsuite/g++.dg/abi/layout2.C33
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle11.C10
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle14.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle17.C11
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle6.C18
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle7.C6
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle8.C16
-rw-r--r--gcc/testsuite/g++.dg/abi/rtti1.C13
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase10.C7
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase9.C29
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 {};