diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.dg/abi | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/g++.dg/abi')
150 files changed, 3422 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/abi/align1.C b/gcc/testsuite/g++.dg/abi/align1.C new file mode 100644 index 000000000..2a70bce60 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/align1.C @@ -0,0 +1,27 @@ +// This was failuring on powerpc-darwin and powerpc-aix as +// we were taking the embeded type as the first field decl. +// This was PR target/18761. +// { dg-do run } + + +union A { + double d; +}; +union B { + enum E { e }; + double d; +}; +struct AlignA { + char c; + A a; +}; +struct AlignB { + char c; + B b; +}; +extern "C" void abort (); +int main () { + if ( __alignof__ (AlignA) != __alignof__ (AlignB)) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/abi/anon1.C b/gcc/testsuite/g++.dg/abi/anon1.C new file mode 100644 index 000000000..c45917a1b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/anon1.C @@ -0,0 +1,5 @@ +// PR c++/54883 + +namespace { enum E { E1 }; } void f(E e) { } + +// { dg-final { scan-assembler-not "globl" } } diff --git a/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C b/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C new file mode 100644 index 000000000..b681a1fcb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_cxa_vec1.C @@ -0,0 +1,32 @@ +// Check that __cxa_vec_[c]ctor returns a pointer to the array +// { dg-do run { target arm*-*-* } } + +#include <cxxabi.h> + +#ifdef ___ARM_EABI__ +static void cctor (void * a, void * b) +{ + *(char *) a = *(char *) b +} + +int main() +{ + char data; + char data2; + char *p; + + p = __cxa_vec_ctor (&data, 1, 1, NULL, NULL); + if (p != &data) + return 1; + p = __cxa_vec_cctor (&data2, &data, 1, 1, cctor, NULL); + if (p != &data2) + return 1; + + return 0; +} +#else +int main() +{ + return 0; +} +#endif diff --git a/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C b/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C new file mode 100644 index 000000000..76f327aca --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_cxa_vec2.C @@ -0,0 +1,41 @@ +// Check that ARM vector delete functions accept NULL pointers as +// inputs. +// { dg-do run { target arm*-*-* } } + +#ifdef __ARM_EABI__ +#include <cxxabi.h> + +typedef void *(dtor_type)(void *); + +extern "C" { + void abort(); + void *__aeabi_vec_dtor_cookie(void *, dtor_type); + void __aeabi_vec_delete(void *, dtor_type); + void __aeabi_vec_delete3(void *, + dtor_type, + void (*)(void *, __SIZE_TYPE__)); + void __aeabi_vec_delete3_nodtor(void *, + void (*)(void *, __SIZE_TYPE__)); +} + +// These functions should never be called. +void* dtor(void *) +{ + abort (); +} + +void dealloc(void *, size_t) { + abort (); +} + +int main () { + if (__aeabi_vec_dtor_cookie (NULL, &dtor) != NULL) + return 1; + // These do not return values, but should not crash. + __aeabi_vec_delete (NULL, &dtor); + __aeabi_vec_delete3 (NULL, &dtor, &dealloc); + __aeabi_vec_delete3_nodtor (NULL, &dealloc); +} +#else +int main () {} +#endif diff --git a/gcc/testsuite/g++.dg/abi/arm_rtti1.C b/gcc/testsuite/g++.dg/abi/arm_rtti1.C new file mode 100644 index 000000000..a481bdd1f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_rtti1.C @@ -0,0 +1,14 @@ +// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } } +// { dg-options "-O2" } +// Check that, even when optimizing, we emit an out-of-line call to +// the type-info comparison function. +// { dg-final { scan-assembler _ZNKSt9type_infoeqERKS_ } } + +#include <typeinfo> + +extern const std::type_info& t1; +extern const std::type_info& t2; + +bool f() { + return t1 == t2; +} diff --git a/gcc/testsuite/g++.dg/abi/arm_va_list.C b/gcc/testsuite/g++.dg/abi/arm_va_list.C new file mode 100644 index 000000000..45a426a4f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_va_list.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-Wno-abi" } +// { dg-require-effective-target arm_eabi } + +// AAPCS \S 7.1.4 requires that va_list be a typedef for "struct +// __va_list". The mangling is as if it were "std::__va_list". +// #include <stdarg.h> +typedef __builtin_va_list va_list; + +// { dg-final { scan-assembler "\n_Z1fPSt9__va_list:" } } +void f(va_list*) {} + +// { dg-final { scan-assembler "\n_Z1gSt9__va_listS_:" } } +void g(va_list, va_list) {} diff --git a/gcc/testsuite/g++.dg/abi/arm_va_list2.C b/gcc/testsuite/g++.dg/abi/arm_va_list2.C new file mode 100644 index 000000000..f5e4ca43d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_va_list2.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-Wpsabi" } +// { dg-require-effective-target arm_eabi } + +#include <stdarg.h> +#include "arm_va_list2.h" + diff --git a/gcc/testsuite/g++.dg/abi/arm_va_list2.h b/gcc/testsuite/g++.dg/abi/arm_va_list2.h new file mode 100644 index 000000000..ebfb2deac --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/arm_va_list2.h @@ -0,0 +1,4 @@ +// The mangling of va_list changed in GCC 4.4. We want to warn about +// that -- but not in a system header. +#pragma GCC system_header +void f(va_list) {} diff --git a/gcc/testsuite/g++.dg/abi/bitfield1.C b/gcc/testsuite/g++.dg/abi/bitfield1.C new file mode 100644 index 000000000..d5d04bcd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield1.C @@ -0,0 +1,34 @@ +// { dg-do run } +// { dg-options "-ansi -pedantic-errors -funsigned-bitfields" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> + +typedef int Int; +typedef signed int SInt; +typedef unsigned int UInt; + +struct A +{ + SInt bitS : 1; // signed + UInt bitU : 1; // unsigned + Int bit : 1; // signedness by -f{signed,unsigned}-bitfields +}; + +int main () +{ + A a; + + a.bitS = 1; // { dg-warning "overflow" } + a.bitU = 1; + a.bit = 1; + + if (a.bitS != -1) + return 1; + if (a.bitU != 1) + return 2; + if (a.bit != 1) + return 3; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/bitfield10.C b/gcc/testsuite/g++.dg/abi/bitfield10.C new file mode 100644 index 000000000..df40fa3f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield10.C @@ -0,0 +1,5 @@ +// { dg-options "-w" } + +struct S { + int i : 64; +}; diff --git a/gcc/testsuite/g++.dg/abi/bitfield11.C b/gcc/testsuite/g++.dg/abi/bitfield11.C new file mode 100644 index 000000000..e78ea121d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield11.C @@ -0,0 +1,14 @@ +// { dg-do run } +// { dg-options "-w -fabi-version=0" } + +struct S { + char c : 1024; +}; + +S s; + +int main () { + s.c = 1; + if (*(char *)&s != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/bitfield12.C b/gcc/testsuite/g++.dg/abi/bitfield12.C new file mode 100644 index 000000000..6cfda5d47 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield12.C @@ -0,0 +1,5 @@ +// { dg-options "-Wabi -fabi-version=1" } + +struct S { // { dg-warning "ABI" } + char c : 1024; // { dg-warning "width" } +}; diff --git a/gcc/testsuite/g++.dg/abi/bitfield2.C b/gcc/testsuite/g++.dg/abi/bitfield2.C new file mode 100644 index 000000000..452861ec2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield2.C @@ -0,0 +1,34 @@ +// { dg-do run } +// { dg-options "-ansi -pedantic-errors -fsigned-bitfields" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> + +typedef int Int; +typedef signed int SInt; +typedef unsigned int UInt; + +struct A +{ + SInt bitS : 1; // signed + UInt bitU : 1; // unsigned + Int bit : 1; // signedness by -f{signed,unsigned}-bitfields +}; + +int main () +{ + A a; + + a.bitS = 1; // { dg-warning "overflow" } + a.bitU = 1; + a.bit = 1; // { dg-warning "overflow" } + + if (a.bitS != -1) + return 1; + if (a.bitU != 1) + return 2; + if (a.bit != -1) + return 3; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/bitfield3.C b/gcc/testsuite/g++.dg/abi/bitfield3.C new file mode 100644 index 000000000..b96c9ed8d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield3.C @@ -0,0 +1,84 @@ +// Test for oversized bitfield alignment in structs on IA-32 +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2" } +// Cygwin and mingw32 default to MASK_ALIGN_DOUBLE. Override to ensure +// 4-byte alignment. +// { dg-options "-mno-align-double" { target i?86-*-cygwin* i?86-*-mingw* } } +// { dg-require-effective-target ilp32 } + +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/bitfield4.C b/gcc/testsuite/g++.dg/abi/bitfield4.C new file mode 100644 index 000000000..5434dd973 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield4.C @@ -0,0 +1,41 @@ +/* { dg-do run { target { pcc_bitfield_type_matters || default_packed } } } */ + +/* Check bitfields and non-bitfields are aligned & sized similarly. + + Copyright (C) 2002 Free Software Foundation Inc + Contributed by Nathan Sidwell <nathan@codesourcery.com> +*/ + +#include <limits.h> +#include <stdio.h> + +static int fail; + +#define CHECK1(N, T) do { \ + typedef struct Field_##N { char c; T f; } Field_##N; \ + typedef struct BitField_##N { char c; T f : sizeof (T) * CHAR_BIT; } BitField_##N; \ + if (sizeof (Field_##N) != sizeof (BitField_##N)) { \ + fail = 1; printf ("sizeof %s failed\n", #T); \ + } \ + if (__alignof__ (Field_##N) != __alignof__ (BitField_##N)) { \ + fail = 1; printf ("__alignof__ %s failed\n", #T); \ + } \ +} while (0) + +#define CHECK(N, T) do { \ + CHECK1(N, T); \ + CHECK1 (s##N, signed T); \ + CHECK1 (u##N, unsigned T); \ +} while (0) + +int main () +{ + + CHECK (c, char); + CHECK (s, short); + CHECK (i, int); + CHECK (l, long); + CHECK (ll, long long); + + return fail; +} diff --git a/gcc/testsuite/g++.dg/abi/bitfield5.C b/gcc/testsuite/g++.dg/abi/bitfield5.C new file mode 100644 index 000000000..531314014 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield5.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-Wabi -fabi-version=1" } +// { dg-options "-Wabi -fabi-version=1 -mno-ms-bitfields" { target i?86-*-* x86_64-*-* } } + +struct A { + virtual void f(); + int f1 : 1; +}; + +struct B : public A { + int f2 : 1; // { dg-warning "ABI" } + int : 0; + int f3 : 4; + int f4 : 3; +}; diff --git a/gcc/testsuite/g++.dg/abi/bitfield6.C b/gcc/testsuite/g++.dg/abi/bitfield6.C new file mode 100644 index 000000000..50f76ab82 --- /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 000000000..b5b656ffa --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield7.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-Wabi -fabi-version=1" } + +union U { // { dg-warning "ABI" } + int i: 4096; // { dg-warning "exceeds" } +}; + diff --git a/gcc/testsuite/g++.dg/abi/bitfield8.C b/gcc/testsuite/g++.dg/abi/bitfield8.C new file mode 100644 index 000000000..58e74be08 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield8.C @@ -0,0 +1,22 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-fabi-version=0" } +// { dg-require-effective-target ilp32 } + + +struct A { + virtual void f() {} + int f1 : 1; +}; + +struct B : public A { + int f2 : 31; + int f3 : 4; + int f4 : 3; +}; + +int main () +{ + if (sizeof (B) != 16) + return 1; +} + diff --git a/gcc/testsuite/g++.dg/abi/bitfield9.C b/gcc/testsuite/g++.dg/abi/bitfield9.C new file mode 100644 index 000000000..0d3a8bf89 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield9.C @@ -0,0 +1,12 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options -w } + +struct X { + char : 45; +}; + +int main () { + if (__alignof__ (X) != 4) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/cookie1.C b/gcc/testsuite/g++.dg/abi/cookie1.C new file mode 100644 index 000000000..defc4887b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/cookie1.C @@ -0,0 +1,15 @@ +// { dg-options "-fabi-version=0" } + +void *operator new[](__SIZE_TYPE__, void *); + +struct A { + ~A(){} +}; + +int main() +{ + A * a = (A*) new char[20]; + A * b = new(a) A[3]; + if (a != b) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/cookie2.C b/gcc/testsuite/g++.dg/abi/cookie2.C new file mode 100644 index 000000000..dc180453b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/cookie2.C @@ -0,0 +1,16 @@ +// { dg-options "-fabi-version=1" } + +void *operator new[](__SIZE_TYPE__, void *); + +struct A { + ~A(){} +}; + +int main() +{ + A * a = (A*) new char[20]; + A * b = new(a) A[3]; + // In the 3.2 ABI, a cookie was allocated in this case. + if (a == b) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/covariant1.C b/gcc/testsuite/g++.dg/abi/covariant1.C new file mode 100644 index 000000000..97737ddb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant1.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-w" } + +// If a covariant thunk is overriding a virtual primary base, we have to +// use the vcall offset even though we know it will be 0. + +struct c4 {}; + +struct c6 : c4 { virtual c4* f17(); }; + +c4* c6::f17() { return 0; } + +struct c11 : virtual c6 { int i; }; + +struct c12 : c11 { }; + +struct c14 : + virtual c12, + virtual c11 { virtual void f(); c12* f17(); }; + +void c14::f() { } + +// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N3c143f17Ev" { target { ilp32 && { ! { ia64-*-hpux* } } } } } } +// { dg-final { scan-assembler-not "_ZTch0_v0_n16_N3c143f17Ev" } } +// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N3c143f17Ev" { target { lp64 || { ia64-*-hpux* } } } } } +// { dg-final { scan-assembler-not "_ZTch0_v0_n32_N3c143f17Ev" } } diff --git a/gcc/testsuite/g++.dg/abi/covariant2.C b/gcc/testsuite/g++.dg/abi/covariant2.C new file mode 100644 index 000000000..3231cc4c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant2.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Dec 2003 <nathan@codesourcery.com> +// Origin: grigory@stl.sarov.ru + +// PR c++/12881. ICE in thunk generation + +struct c1 {}; + +struct c3 : virtual c1 +{ + virtual c1* f6() {} + int i; +}; + +struct c6 : virtual c3 { }; + +struct c7 : c3 +{ + virtual c3* f6() {} +}; + +struct c24 : virtual c7 +{ + virtual c6* f6(); +}; + +c6* c24::f6() { return 0; } + +struct c31 : c24 {}; + diff --git a/gcc/testsuite/g++.dg/abi/covariant3.C b/gcc/testsuite/g++.dg/abi/covariant3.C new file mode 100644 index 000000000..178157c58 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant3.C @@ -0,0 +1,85 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Dec 2003 <nathan@codesourcery.com> +// Origin: grigory@stl.sarov.ru + +// PR c++/13118. Missing covariant thunk. + +struct c0 {}; +struct c1 : virtual c0 { + virtual c0* f6(); +}; + +struct c5 { + virtual void foo(); +}; + +struct c10 : virtual c1 { + virtual void foo(); +}; + +struct c1a : c1 {}; // disambiguation + +struct c11 : virtual c10, c1a { + int i; + virtual c1* f6 () = 0; +}; + +struct c18 : c5, virtual c1 { + virtual void bar(); +}; + +struct c28 : virtual c0, virtual c11 { + virtual c18* f6(); +}; + +c0 *c1::f6 () {} +void c5::foo () {} +void c10::foo () {} +void c18::bar () {} + +c18 ret; + +c18 *c28::f6 () +{ + return &ret; +} + +bool check_c1 (c1 *ptr) +{ + c0 *r = ptr->f6 (); + return r != &ret; +} +bool check_c10 (c10 *ptr) +{ + c0 *r = ptr->f6 (); + return r != &ret; +} +bool check_c11 (c11 *ptr) +{ + c1 *r = ptr->f6 (); + return r != &ret; +} +bool check_c28 (c28 *ptr) +{ + c18 *r = ptr->f6 (); + return r != &ret; +} + +int main () +{ + c28 obj; + + if (check_c1 (static_cast<c1a *> (&obj))) + return 1; + if (check_c1 (static_cast<c10 *> (&obj))) + return 2; + if (check_c10 (&obj)) + return 3; + if (check_c11 (&obj)) + return 4; + if (check_c28 (&obj)) + return 5; + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/covariant4.C b/gcc/testsuite/g++.dg/abi/covariant4.C new file mode 100644 index 000000000..942b1686e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant4.C @@ -0,0 +1,46 @@ +// { dg-do run } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 11 Feb 2005 <nathan@codesourcery.com> + +// Origin: bredelin@ucla.edu +// Bug 19891: Incorrect covariant vtables + +struct Model { + bool full_tree; + virtual Model* clone() const =0; + virtual const char *name() const =0; + virtual ~Model() {} +}; + +struct R: virtual public Model { + virtual R* clone() const =0; +}; +struct A: virtual public Model { + virtual A* clone() const=0; +}; +struct RA: public R, public A { + virtual RA* clone() const=0; +}; + +static const char *string = "EQU"; + +struct EQU: public RA { + virtual EQU* clone() const {return new EQU(*this);} + const char *name() const {return string;} +}; + +int main() { + Model* M1 = new EQU(); + Model* M2 = M1->clone(); + Model* M3 = M2->clone(); + + if (M1->name () != string) + return 1; + if (M2->name () != string) + return 2; + if (M3->name () != string) + return 3; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/covariant5.C b/gcc/testsuite/g++.dg/abi/covariant5.C new file mode 100644 index 000000000..03e55583d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant5.C @@ -0,0 +1,52 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Apr 2005 <nathan@codesourcery.com> + +// { dg-do run } + +// PR 20746: Covariant return pointer could be null. + +// Origin: yanliu@ca.ibm.com +// nathan@codesourcery.com + +struct A { + virtual void One (); +}; +struct B { + virtual B *Two (); + virtual B &Three (); +}; + +struct C : A, B +{ + virtual C *Two (); + virtual C &Three (); +}; +void A::One () {} +B *B::Two() {return this;} +B &B::Three() {return *this;} +C *C::Two () {return 0;} +C &C::Three () {return *(C *)0;} + +B *Foo (B *b) +{ + return b->Two (); +} + +B &Bar (B *b) +{ + return b->Three (); +} + +int main () +{ + C c; + + /* We should not adjust a null pointer. */ + if (Foo (&c)) + return 1; + /* But we should adjust a (bogus) null reference. */ + if (!&Bar (&c)) + return 2; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/covariant6.C b/gcc/testsuite/g++.dg/abi/covariant6.C new file mode 100644 index 000000000..143b4ad36 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant6.C @@ -0,0 +1,34 @@ +struct A +{ + virtual A* f(); +}; + +struct B: virtual A +{ + virtual A* f(); +}; + +struct C: B +{ + virtual C* f(); +}; + +C* C::f() { return 0; } + +// When we emit C::f, we should emit both thunks: one for B and one for A. +// { dg-final { scan-assembler "_ZTch0_v0_n16_N1C1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } } +// { dg-final { scan-assembler "_ZTch0_v0_n32_N1C1fEv" { target { lp64 || { ia64-*-hpux* } } } } } +// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N1C1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } } +// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N1C1fEv" { target { lp64 || { ia64-*-hpux* } } } } } + +struct D: B +{ + virtual void dummy (); + virtual D* f(); +}; + +void D::dummy() { } + +// When we emit the D vtable, it should refer to the thunk for B. +// { dg-final { scan-assembler "_ZTch0_v0_n16_N1D1fEv" { target { ilp32 && { ! { ia64-*-hpux* } } } } } } +// { dg-final { scan-assembler "_ZTch0_v0_n32_N1D1fEv" { target { lp64 || { ia64-*-hpux* } } } } } diff --git a/gcc/testsuite/g++.dg/abi/dcast1.C b/gcc/testsuite/g++.dg/abi/dcast1.C new file mode 100644 index 000000000..99f678ff3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/dcast1.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com> + +// PR 9433. segfault at runtime. + +struct A { virtual void f() {} }; +struct B {int b;}; +struct C : A, B { virtual void f() {} int c;}; +struct D : C {int d;}; +struct E : C {int e;}; +struct F : protected D, E {int f;}; +struct H : virtual F {int h;}; +struct I : H {int i;}; +struct J : H {int j;}; +struct K : I, J { virtual void f() {} int k; }; +struct M : K {int m;}; +struct N : M {int n;}; +struct O : M {int o;}; +struct P : N, O { virtual void f() {} int p;}; + +int main() +{ + P obj; + A* a1 = (D *) (&obj); + H* hp = dynamic_cast<H*>(a1); + return hp != 0; +} diff --git a/gcc/testsuite/g++.dg/abi/dtor1.C b/gcc/testsuite/g++.dg/abi/dtor1.C new file mode 100644 index 000000000..f9425e013 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/dtor1.C @@ -0,0 +1,23 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0" } + +struct A { + virtual void a (); +}; + +struct B { + virtual ~B (); +}; + +struct C : public A, public B { + virtual void c (); +}; + +struct D : virtual public C { + virtual void d (); +}; + +void D::d () {} + +// { dg-final { scan-assembler _ZTv0_n20_N1DD1Ev } } diff --git a/gcc/testsuite/g++.dg/abi/dtor2.C b/gcc/testsuite/g++.dg/abi/dtor2.C new file mode 100644 index 000000000..6b89cc8ea --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/dtor2.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-Wabi -fabi-version=1" } + +struct A { + virtual void a (); +}; + +struct B { + virtual ~B (); +}; + +struct C : public A, public B { // { dg-warning "virtual" } + virtual void c (); +}; diff --git a/gcc/testsuite/g++.dg/abi/empty10.C b/gcc/testsuite/g++.dg/abi/empty10.C new file mode 100644 index 000000000..ae992944d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty10.C @@ -0,0 +1,28 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0 -w" } + +struct E {}; +struct E2 : public E {}; + +struct A { + int i; +}; + +struct B { + int j; +}; + +struct C : + public E, + public A, + public E2, + virtual public B { +}; + +C c; + +int main () { + if (((char*)(B*)&c - (char*)&c) != 8) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/empty11.C b/gcc/testsuite/g++.dg/abi/empty11.C new file mode 100644 index 000000000..b35363f5b --- /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/empty4.C b/gcc/testsuite/g++.dg/abi/empty4.C new file mode 100644 index 000000000..d20a55cf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty4.C @@ -0,0 +1,86 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Jul 2001 <nathan@codesourcery.com> + +// Bug 3820. We were bit copying empty bases including the +// padding. Which clobbers whatever they overlay. + +struct Empty {}; + +struct Inter : Empty {}; + +long now = 0; + +struct NonPod +{ + long m; + + NonPod () {m = 0x12345678;} + NonPod (long m_) {m = m_;} + NonPod &operator= (NonPod const &src) {now = m; m = src.m; return *this;} + NonPod (NonPod const &src) {m = src.m;} +}; + +struct A : Inter +{ + A (long c) {m = c;} + + NonPod m; +}; + +struct B +{ + Inter empty; + NonPod m; + + B (long c) {m = c;} +}; + +struct C : NonPod, Inter +{ + C (long c) : NonPod (c), Inter () {} +}; + +int main () +{ + A a (0x12131415); + + long was = a.m.m; + + a = 0x22232425; + + if (was != now) + return 1; // we copied the empty base which clobbered a.m.m's + // original value. + + A b (0x32333435); + *(Inter *)&a = *(Inter *)&b; + + if (a.m.m != 0x22232425) + return 2; // we copied padding, which clobbered a.m.m + + A b2 (0x32333435); + (Inter &)b2 = Inter (); + if (b2.m.m != 0x32333435) + return 2; // we copied padding, which clobbered b2.m.m + + B c (0x12131415); + was = c.m.m; + c = 0x22232425; + if (was != now) + return 3; + + B d (0x32333435); + c.empty = d.empty; + + if (c.m.m != 0x22232425) + return 4; + + C e (0x32333435); + + if (e.m != 0x32333435) + return 2; // we copied padding + + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty5.C b/gcc/testsuite/g++.dg/abi/empty5.C new file mode 100644 index 000000000..c3717727e --- /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 000000000..1b14a6d03 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty6.C @@ -0,0 +1,14 @@ +// { dg-options "-Wabi -fabi-version=1" } + +struct A {}; + +struct B { + A a; // { dg-warning "empty" "" { xfail mmix-*-* } } + virtual void f () {} +} __attribute__((aligned(2 * sizeof (void *)))); +/* The preceding attribute is necessary on targets with + BIGGEST_ALIGNMENT <= POINTER_SIZE to trigger the warning, as + otherwise the offset of 'a' (i.e. POINTER_SIZE) is split into a + non-zero DECL_FIELD_OFFSET and a zero DECL_FIELD_BIT_OFFSET, + and then there is no discrepancy between DECL_FIELD_OFFSET and + byte_position to warn about. */ diff --git a/gcc/testsuite/g++.dg/abi/empty7.C b/gcc/testsuite/g++.dg/abi/empty7.C new file mode 100644 index 000000000..0a665a845 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty7.C @@ -0,0 +1,19 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0" } + +struct S1 {}; +struct S2 { virtual void f () {} S1 s1[4]; }; +struct S3 : virtual public S2 {}; +struct S4 : virtual public S2 { int i; }; +struct S5 : public S3, virtual public S4 {}; +struct S6 { S5 s5; }; +struct S7 { S1 s1[5]; }; +struct S8 : public S1, public S6, virtual public S7 { }; + +S8 s8; + +int main () { + if ((char *)(S7 *)&s8 - (char *)&s8 != 24) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/empty8.C b/gcc/testsuite/g++.dg/abi/empty8.C new file mode 100644 index 000000000..a5287b15f --- /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 000000000..06e616adb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty9.C @@ -0,0 +1,17 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-w -fabi-version=0" } + +struct E1 {}; +struct E2 : public E1 { + virtual void f (); +}; +struct E3 : virtual public E1 { +}; +struct S : public E2, virtual public E3 { +}; + +int main () { + if (sizeof (S) != 12) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/enum1.C b/gcc/testsuite/g++.dg/abi/enum1.C new file mode 100644 index 000000000..32e52fe0f --- /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/forced.C b/gcc/testsuite/g++.dg/abi/forced.C new file mode 100644 index 000000000..7a9c35964 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/forced.C @@ -0,0 +1,25 @@ +// This test only applies to glibc (NPTL) targets. +// { dg-do run { target *-*-linux* } } +// { dg-options "-pthread" } + +#include <pthread.h> +#include <cxxabi.h> +extern "C" int printf (const char *, ...); + +int main() +{ + try + { + pthread_exit (0); + } + catch (abi::__forced_unwind &) + { + printf ("caught forced unwind\n"); + throw; + } + catch (...) + { + printf ("caught ...\n"); + return 1; + } +} diff --git a/gcc/testsuite/g++.dg/abi/guard1.C b/gcc/testsuite/g++.dg/abi/guard1.C new file mode 100644 index 000000000..76b43d30f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/guard1.C @@ -0,0 +1,10 @@ +// PR c++/41611 +// { dg-final { scan-assembler-not "_ZGVZN1A1fEvE1i" } } + +struct A { + static int f() + { + static int &i = *new int(); + return i; + } +}; diff --git a/gcc/testsuite/g++.dg/abi/guard2.C b/gcc/testsuite/g++.dg/abi/guard2.C new file mode 100644 index 000000000..988fd385b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/guard2.C @@ -0,0 +1,16 @@ +// PR c++/41611 +// Test that the guard gets its own COMDAT group. +// { dg-final { scan-assembler "_ZGVZN1A1fEvE1i,comdat" { target *-*-linux* } } } + +struct A { + static int f() + { + static int &i = *new int(); + return i; + } +}; + +int main() +{ + return A::f(); +} diff --git a/gcc/testsuite/g++.dg/abi/inline1.C b/gcc/testsuite/g++.dg/abi/inline1.C new file mode 100644 index 000000000..97082aa73 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/inline1.C @@ -0,0 +1,6 @@ +struct S { + S() {} + virtual void g() {} +}; + +// { dg-final { scan-assembler-not "_ZTV1S" } } diff --git a/gcc/testsuite/g++.dg/abi/key1.C b/gcc/testsuite/g++.dg/abi/key1.C new file mode 100644 index 000000000..6c0380926 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/key1.C @@ -0,0 +1,26 @@ +// On ARM EABI platforms, key methods may never be inline. +// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } } +// { dg-final { scan-assembler-not _ZTV1S } } +// { dg-final { scan-assembler-not _ZTV1T } } +// { dg-final { scan-assembler _ZTV1U } } + +struct S { + virtual void f(); +}; + +inline void S::f() {} + +struct T { + virtual void g(); + virtual void h(); +}; + +inline void T::g() {} + +struct U { + virtual void i(); + virtual void j(); +}; + +inline void U::i() {} +void U::j () {} diff --git a/gcc/testsuite/g++.dg/abi/key2.C b/gcc/testsuite/g++.dg/abi/key2.C new file mode 100644 index 000000000..0d1347aaa --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/key2.C @@ -0,0 +1,16 @@ +// On Darwin, key methods that are inline result in comdat style things. */ +// PR darwin/25908 + +// { dg-do compile { target *-*-darwin* } } +// { dg-final { scan-assembler ".globl __ZTV1f\\n .weak_definition __ZTV1f(\\n .section __DATA,__const_coal,coalesced)?\\n .align" } } +// { dg-final { scan-assembler ".globl __ZTS1f\\n .weak_definition __ZTS1f\\n .section __TEXT,__const_coal,coalesced" } } +// { dg-final { scan-assembler ".globl __ZTI1f\\n .weak_definition __ZTI1f(\\n .section __DATA,__const_coal,coalesced)?\\n .align" } } + +class f +{ + virtual void g(); + virtual void h(); +} c; +inline void f::g() {} +int sub(void) +{} diff --git a/gcc/testsuite/g++.dg/abi/layout1.C b/gcc/testsuite/g++.dg/abi/layout1.C new file mode 100644 index 000000000..645ed6acf --- /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 000000000..fb4e1e5d9 --- /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/layout3.C b/gcc/testsuite/g++.dg/abi/layout3.C new file mode 100644 index 000000000..a30a85219 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/layout3.C @@ -0,0 +1,27 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0 -w" } + +struct S { + virtual void f() {} +}; + +struct T : virtual public S { }; + +struct U : public S, virtual public T { + char c[100]; +}; + +struct V : public U, virtual public S {}; + +struct W : public V { + int i; +}; + +int main () { + W w; + + if ((char*) &w.i - (char *) &w != 104) + return 1; +} + diff --git a/gcc/testsuite/g++.dg/abi/layout4.C b/gcc/testsuite/g++.dg/abi/layout4.C new file mode 100644 index 000000000..da3c2f5d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/layout4.C @@ -0,0 +1,19 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=1" } + +struct C4 +{ + int b:30; + C4(){}; +}; + +struct C1: virtual C4 +{ + int i; +}; + +int main() { + if (sizeof (C1) != 12) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/local1-a.cc b/gcc/testsuite/g++.dg/abi/local1-a.cc new file mode 100644 index 000000000..638479e74 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/local1-a.cc @@ -0,0 +1,14 @@ +struct B { + virtual void b() {} +}; + +static B* f() { + struct D : public B { + }; + + return new D; +} + +B* g() { + return f(); +} diff --git a/gcc/testsuite/g++.dg/abi/local1.C b/gcc/testsuite/g++.dg/abi/local1.C new file mode 100644 index 000000000..518193c89 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/local1.C @@ -0,0 +1,22 @@ +// { dg-do run } +// { dg-additional-sources "local1-a.cc" } + +#include <typeinfo> + +struct B { + virtual void b() {} +}; + +static B* f() { + struct D : public B { + }; + + return new D; +} + +extern B* g(); + +int main () { + if (typeid (*f()) == typeid (*g())) + return 1; +} diff --git a/gcc/testsuite/g++.dg/abi/local2.C b/gcc/testsuite/g++.dg/abi/local2.C new file mode 100644 index 000000000..f56701610 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/local2.C @@ -0,0 +1,17 @@ +// PR c++/42010 +// { dg-final { scan-assembler "ZZN1A1fEvE1s" } } + +struct A { + static int f() + { + static struct { + int i; + } s; + return s.i; + } +}; + +int main() +{ + return A::f(); +} diff --git a/gcc/testsuite/g++.dg/abi/macro0.C b/gcc/testsuite/g++.dg/abi/macro0.C new file mode 100644 index 000000000..6c391e689 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/macro0.C @@ -0,0 +1,5 @@ +// { dg-options "-fabi-version=0" } + +#if __GXX_ABI_VERSION != 999999 +#error "Incorrect value of __GXX_ABI_VERSION" +#endif diff --git a/gcc/testsuite/g++.dg/abi/macro1.C b/gcc/testsuite/g++.dg/abi/macro1.C new file mode 100644 index 000000000..871208da3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/macro1.C @@ -0,0 +1,5 @@ +// { dg-options "-fabi-version=1" } + +#if __GXX_ABI_VERSION != 102 +#error "Incorrect value of __GXX_ABI_VERSION" +#endif diff --git a/gcc/testsuite/g++.dg/abi/macro2.C b/gcc/testsuite/g++.dg/abi/macro2.C new file mode 100644 index 000000000..9f0af9cff --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/macro2.C @@ -0,0 +1,5 @@ +// { dg-options "-fabi-version=2" } + +#if __GXX_ABI_VERSION != 1002 +#error "Incorrect value of __GXX_ABI_VERSION" +#endif diff --git a/gcc/testsuite/g++.dg/abi/mangle-neon.C b/gcc/testsuite/g++.dg/abi/mangle-neon.C new file mode 100644 index 000000000..af1fe49f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle-neon.C @@ -0,0 +1,49 @@ +// Test that ARM NEON vector types have their names mangled correctly. + +// { dg-do compile } +// { dg-require-effective-target arm_neon_ok } +// { dg-add-options arm_neon } + +#include <arm_neon.h> + +void f0 (int8x8_t a) {} +void f1 (int16x4_t a) {} +void f2 (int32x2_t a) {} +void f3 (uint8x8_t a) {} +void f4 (uint16x4_t a) {} +void f5 (uint32x2_t a) {} +void f6 (float32x2_t a) {} +void f7 (poly8x8_t a) {} +void f8 (poly16x4_t a) {} + +void f9 (int8x16_t a) {} +void f10 (int16x8_t a) {} +void f11 (int32x4_t a) {} +void f12 (uint8x16_t a) {} +void f13 (uint16x8_t a) {} +void f14 (uint32x4_t a) {} +void f15 (float32x4_t a) {} +void f16 (poly8x16_t a) {} +void f17 (poly16x8_t a) {} + +void f18 (int8x16_t, int8x16_t) {} + +// { dg-final { scan-assembler "_Z2f015__simd64_int8_t:" } } +// { dg-final { scan-assembler "_Z2f116__simd64_int16_t:" } } +// { dg-final { scan-assembler "_Z2f216__simd64_int32_t:" } } +// { dg-final { scan-assembler "_Z2f316__simd64_uint8_t:" } } +// { dg-final { scan-assembler "_Z2f417__simd64_uint16_t:" } } +// { dg-final { scan-assembler "_Z2f517__simd64_uint32_t:" } } +// { dg-final { scan-assembler "_Z2f618__simd64_float32_t:" } } +// { dg-final { scan-assembler "_Z2f716__simd64_poly8_t:" } } +// { dg-final { scan-assembler "_Z2f817__simd64_poly16_t:" } } +// { dg-final { scan-assembler "_Z2f916__simd128_int8_t:" } } +// { dg-final { scan-assembler "_Z3f1017__simd128_int16_t:" } } +// { dg-final { scan-assembler "_Z3f1117__simd128_int32_t:" } } +// { dg-final { scan-assembler "_Z3f1217__simd128_uint8_t:" } } +// { dg-final { scan-assembler "_Z3f1318__simd128_uint16_t:" } } +// { dg-final { scan-assembler "_Z3f1418__simd128_uint32_t:" } } +// { dg-final { scan-assembler "_Z3f1519__simd128_float32_t:" } } +// { dg-final { scan-assembler "_Z3f1617__simd128_poly8_t:" } } +// { dg-final { scan-assembler "_Z3f1718__simd128_poly16_t:" } } +// { dg-final { scan-assembler "_Z3f1816__simd128_int8_tS_:" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle1.C b/gcc/testsuite/g++.dg/abi/mangle1.C new file mode 100644 index 000000000..ab377d13b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle1.C @@ -0,0 +1,28 @@ +// Test for mangling of simple testcase involving construction vtables. + +// { dg-do compile } +// { dg-options "-fno-inline" } + +struct A { + virtual void f () { } +}; + +struct B: public virtual A { }; +struct C: public B { }; + +C c; + +// { dg-final { scan-assembler "\n_?_ZN1A1fEv\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZN1AC2Ev\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZN1BC2Ev\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZN1CC1Ev\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTC1C0_1B\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTI1A\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTI1B\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTI1C\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTS1A\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTS1B\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTS1C\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTT1C\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTV1A\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_ZTV1C\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle10.C b/gcc/testsuite/g++.dg/abi/mangle10.C new file mode 100644 index 000000000..d5782ba6d --- /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 000000000..3152c256f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle11.C @@ -0,0 +1,10 @@ +// { dg-options "-Wabi -fabi-version=1" } + +template <typename Q> +void f (typename Q::X) {} // { dg-warning "mangle" } + +struct S { + typedef int X; +}; + +template void f<S> (int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/abi/mangle12.C b/gcc/testsuite/g++.dg/abi/mangle12.C new file mode 100644 index 000000000..3910cfc93 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle12.C @@ -0,0 +1,11 @@ +// { dg-options "-Wabi -fabi-version=1" } + +template <template <typename> class Q> +void f (typename Q<int>::X) {} // { dg-warning "mangle" } + +template <typename Q> +struct S { + typedef int X; +}; + +template void f<S> (int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/abi/mangle13.C b/gcc/testsuite/g++.dg/abi/mangle13.C new file mode 100644 index 000000000..716c4c36f --- /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 000000000..2b38255ac --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle14.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Wabi -fabi-version=1" } +// { dg-final { scan-assembler "_Z1g1SIXadsr1ANS0_1fIiEEivEE" } } + +struct A { + template <typename T> int f (); +}; + +typedef int (A::*P)(); + +template <P> struct S {}; + +void g (S<&A::f<int> >) {} // { dg-warning "mangle" } diff --git a/gcc/testsuite/g++.dg/abi/mangle15.C b/gcc/testsuite/g++.dg/abi/mangle15.C new file mode 100644 index 000000000..3c112e263 --- /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 000000000..1f3039f86 --- /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 000000000..57f1a045c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle17.C @@ -0,0 +1,11 @@ +// { dg-options "-Wabi -fabi-version=1" } + +enum E { e = 3 }; + +template <int I> struct S {}; + +template <int I> void f (S<I + e + int (3.7)>) {} // { dg-warning "mangle" } +template void f<7>(S<7 + e + int (3.7)>); // { dg-message "instantiated" } + +template <int I> void g (S<I + e + int (3.7)>) {} // { dg-warning "mangle" } +template void g<7>(S<7 + e + int (3.7)>); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/abi/mangle18-1.C b/gcc/testsuite/g++.dg/abi/mangle18-1.C new file mode 100644 index 000000000..a1be5e48c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle18-1.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2003 <nathan@codesourcery.com> + +// PR 13241 +// mangled template arguments that are external objects incorrectly + +extern "C" void Foo (); +namespace NMS +{ + extern "C" int V; +} + +template <void (*)()> struct S {}; +template <int *> struct T {}; + +void f (S<Foo>){} +// { dg-final { scan-assembler "\n_?_Z1f1SIXadL_Z3FooEEE\[: \t\n\]" } } + +void g (T<&NMS::V>){} +// { dg-final { scan-assembler "\n_?_Z1g1TIXadL_Z1VEEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle18-2.C b/gcc/testsuite/g++.dg/abi/mangle18-2.C new file mode 100644 index 000000000..a231d495f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle18-2.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1 -Wabi" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2003 <nathan@codesourcery.com> + +// PR 13241 +// mangled template arguments that are external objects incorrectly + +extern "C" void Foo (); +namespace NMS +{ + extern "C" int V; +} + +template <void (*)()> struct S {}; +template <int *> struct T {}; + +void f (S<Foo>){} // { dg-warning "mangled name" } +// { dg-final { scan-assembler "\n_?_Z1f1SIXadL3FooEEE\[: \t\n\]" } } + +void g (T<&NMS::V>){} // { dg-warning "mangled name" } +// { dg-final { scan-assembler "\n_?_Z1g1TIXadL_ZN3NMS1VEEEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle19-1.C b/gcc/testsuite/g++.dg/abi/mangle19-1.C new file mode 100644 index 000000000..1463d03f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle19-1.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2 -Wno-abi" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> + +// PR 13242 +// mangled template arguments that are external objects incorrectly + +extern int N; +template <int &> struct S {}; +void n (S<N>) {} +// { dg-final { scan-assembler "\n_?_Z1n1SILZ1NEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle19-2.C b/gcc/testsuite/g++.dg/abi/mangle19-2.C new file mode 100644 index 000000000..f0855e69d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle19-2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1 -Wabi" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> + +// PR 13242 +// mangled template arguments that are external objects incorrectly + +extern int N; +template <int &> struct S {}; +void n (S<N>) {} // { dg-warning "mangled name" } +// { dg-final { scan-assembler "\n_?_Z1n1SIXadL_Z1NEEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle2.C b/gcc/testsuite/g++.dg/abi/mangle2.C new file mode 100644 index 000000000..e8b5f409d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle2.C @@ -0,0 +1,19 @@ +// Test that we handle mangling of statics in inlines properly. +// { dg-options -fno-weak } +// { dg-do run } + +inline int f () +{ + static int nested; + nested = 24; + { + static int nested; + nested = 42; + } + return (nested != 24); +} + +int main() +{ + return f (); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle20-1.C b/gcc/testsuite/g++.dg/abi/mangle20-1.C new file mode 100644 index 000000000..1985fe3c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle20-1.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> + +// PR 9043 +// mangled array types in templates + +template <int I> void f(int (*)[2]) {} +template <int I> void g(int (*)[I+2]) {} + +static const int I=1; +static const int J=2; + +template void f<1>(int (*)[2]); +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_i\[: \t\n\]" } } +template void g<1>(int (*)[3]); +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_i\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle20-2.C b/gcc/testsuite/g++.dg/abi/mangle20-2.C new file mode 100644 index 000000000..b244e2e79 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle20-2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1 -Wabi" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> + +// PR 9043 +// mangled array types in templates + +template <int I> void f(int (*)[2]) {} // { dg-warning "mangled name" } +template <int I> void g(int (*)[I+2]) {} + +template void f<1>(int (*)[2]); // { dg-message "instantiated" } +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPALi2E_i\[: \t\n\]" } } +template void g<1>(int (*)[3]); +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_i\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle21.C b/gcc/testsuite/g++.dg/abi/mangle21.C new file mode 100644 index 000000000..f457d600c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle21.C @@ -0,0 +1,13 @@ +// PR c++/14324 +// { dg-do assemble } + +extern "C" { + +void fun1(void) +{ + do { static int xyz __attribute__((unused)) = 1; } while (0); + do { static int xyz __attribute__((unused)) = 2; } while (0); + do { static int xyz __attribute__((unused)) = 3; } while (0); +} + +} diff --git a/gcc/testsuite/g++.dg/abi/mangle22.C b/gcc/testsuite/g++.dg/abi/mangle22.C new file mode 100644 index 000000000..93ddd1e87 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle22.C @@ -0,0 +1,9 @@ +// PR c++/16240 +// { dg-options "-fabi-version=3" } + +void foo(char); +template<void (&)(char)> struct CB {}; + +void g(CB<foo> i) {} + +// { dg-final { scan-assembler "\n_?_Z1g2CBIL_Z3foocEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle23.C b/gcc/testsuite/g++.dg/abi/mangle23.C new file mode 100644 index 000000000..f22347a04 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle23.C @@ -0,0 +1,9 @@ +// PR c++/16240 +// { dg-options "-fabi-version=2 -Wno-abi" } + +void foo(char); +template<void (&)(char)> struct CB {}; + +void g(CB<foo> i) {} + +// { dg-final { scan-assembler "\n_?_Z1g2CBILZ3foocEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle24.C b/gcc/testsuite/g++.dg/abi/mangle24.C new file mode 100644 index 000000000..1f5c5c1c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle24.C @@ -0,0 +1,12 @@ +// Test mangling of __float80. +// The C++ ABI document says __float80 is mangled as "e". It +// also says that "long double" is mangled as "e", so these conflict on +// ia64-hpux where "long double" is "e" and __float80 is "u9__float80". +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile { target i?86-*-* x86_64-*-* ia64-*-* } } +// { dg-options "" } +// { dg-final { scan-assembler "_Z1fe" { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler "_Z1fe" { target { ia64-*-* && { ! "ia64-*-hpux*" } } } } } +// { dg-final { scan-assembler "_Z1fu9__float80" { target ia64-*-hpux* } } } + +int f(__float80 x) { return 0; } diff --git a/gcc/testsuite/g++.dg/abi/mangle25.C b/gcc/testsuite/g++.dg/abi/mangle25.C new file mode 100644 index 000000000..74397f778 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle25.C @@ -0,0 +1,13 @@ +// Test mangling of __float128. +// The C++ ABI document says __float128 is mangled as "g". It +// also says that "long double" is mangled as "e", so these conflict on +// ia64-hpux where "long double" is "e" and __float128 is synonymous with +// "long double". +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile { target ia64-*-* i?86-*-* x86_64-*-* } } +// { dg-options "" } +// { dg-final { scan-assembler "_Z1fg" { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler "_Z1fg" { target { ia64-*-* && { ! "ia64-*-hpux*" } } } } } +// { dg-final { scan-assembler "_Z1fe" { target ia64-*-hpux* } } } + +int f(__float128 x) { return 0; } diff --git a/gcc/testsuite/g++.dg/abi/mangle26.C b/gcc/testsuite/g++.dg/abi/mangle26.C new file mode 100644 index 000000000..5d1609596 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle26.C @@ -0,0 +1,14 @@ +// Test of std mangling + +// { dg-do compile } +// { dg-options "-fno-inline" } + +namespace std { + struct A { + A() { } + }; +} + +std::A a; + +// { dg-final { scan-assembler "\n_?_ZNSt1AC\[12\]Ev\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle27.C b/gcc/testsuite/g++.dg/abi/mangle27.C new file mode 100644 index 000000000..2d15abbf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle27.C @@ -0,0 +1,14 @@ +// Test of std::basic_iostream<char, std::char_traits<char> > mangling + +// { dg-do compile } +// { dg-options "-fno-inline" } + +namespace std { + template<typename> struct char_traits; + + template<typename, typename> struct basic_iostream { basic_iostream(){} }; +} + +std::basic_iostream<char,std::char_traits<char> > s1; + +// { dg-final { scan-assembler "\n_?_ZNSdC\[12\]Ev\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle28.C b/gcc/testsuite/g++.dg/abi/mangle28.C new file mode 100644 index 000000000..bea8ce019 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle28.C @@ -0,0 +1,14 @@ +// Test of std::basic_istream<char, std::char_traits<char> > mangling + +// { dg-do compile } +// { dg-options "-fno-inline" } + +namespace std { + template<typename> struct char_traits; + + template<typename, typename> struct basic_istream { basic_istream(){} }; +} + +std::basic_istream<char,std::char_traits<char> > s1; + +// { dg-final { scan-assembler "\n_?_ZNSiC\[12\]Ev\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle29.C b/gcc/testsuite/g++.dg/abi/mangle29.C new file mode 100644 index 000000000..aaff2b4eb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle29.C @@ -0,0 +1,14 @@ +// Test of std::basic_ostream<char, std::char_traits<char> > mangling + +// { dg-do compile } +// { dg-options "-fno-inline" } + +namespace std { + template<typename> struct char_traits; + + template<typename, typename> struct basic_ostream { basic_ostream(){} }; +} + +std::basic_ostream<char,std::char_traits<char> > s1; + +// { dg-final { scan-assembler "\n_?_ZNSoC\[12\]Ev\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle3.C b/gcc/testsuite/g++.dg/abi/mangle3.C new file mode 100644 index 000000000..a20b877f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle3.C @@ -0,0 +1,19 @@ +// Test mangling of type casts +// { dg-do compile } + +template<int i> class A {}; +template<bool b> class B {}; + +template<int i> void f(A<i> &, B<bool(i)> &) {} +template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {} + +int main() +{ + A<1> a; + B<true> b; + f(a, b); + g(a, b); +} + +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle30.C b/gcc/testsuite/g++.dg/abi/mangle30.C new file mode 100644 index 000000000..f0b83dbe9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle30.C @@ -0,0 +1,22 @@ +// Test for mangling of template args in a typename type. + +struct A +{ + template <class T> + struct B + { + typedef T myT; + }; +}; + +struct C {}; + +template <class T> +void f (T t, typename T::template B<C>::myT u, typename T::template B<int>::myT v); + +int main() +{ + f (A(), C(), 1); +} + +// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BI1CE3myTENS2_IiE3myTE" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle31.C b/gcc/testsuite/g++.dg/abi/mangle31.C new file mode 100644 index 000000000..4be2e0b03 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle31.C @@ -0,0 +1,35 @@ +// PR c++/39095 +// { dg-do compile } + +struct B +{ + int b; +}; + +struct A +{ + B *operator->(); + A (); + B b; +}; + +A::A () +{ +} + +B * +A::operator->() +{ + return &b; +} + +A a; + +int +foo () +{ + return a->b; +} + +// { dg-final { scan-assembler "_ZN1AptEv" } } +// { dg-final { scan-assembler-not "_ZN1AdtEv" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle32.C b/gcc/testsuite/g++.dg/abi/mangle32.C new file mode 100644 index 000000000..244d07490 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle32.C @@ -0,0 +1,44 @@ +// Testcase for mangling of unnamed types. + +// namespace-scope unnamed types have no linkage, so we only test that they +// are distinct. + +// { dg-options -std=c++0x } + +typedef struct { } *A; +typedef struct { } *B; + +void f(A) { } +void f(B) { } + +struct C +{ + typedef struct { }* D; + typedef enum { }* E; +}; + +// { dg-final { scan-assembler "_Z2g1PN1CUt_E" } } +void g1(C::D) { } +// { dg-final { scan-assembler "_Z2g2PN1CUt0_E" } } +void g2(C::E) { } + +template <class T> +void h1(T t) { } + +template <class T> +void h2(T t) { } + +inline void j() +{ + typedef enum { }* F; +// { dg-final { scan-assembler "_Z2h1IPZ1jvEUt_EvT_" } } + h1(F()); + typedef struct { }* G; +// { dg-final { scan-assembler "_Z2h2IPZ1jvEUt0_EvT_" } } + h2(G()); +} + +int main() +{ + j(); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle33.C b/gcc/testsuite/g++.dg/abi/mangle33.C new file mode 100644 index 000000000..f0a4e5012 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle33.C @@ -0,0 +1,19 @@ +// Testcase for mangling very long names. + +#define N \ +abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm + +namespace N { + int i; +} + +#undef N +#define N \ +abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk + +namespace N { + int j; +} + +// { dg-final { scan-assembler "_ZN4043abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm1iE" } } +// { dg-final { scan-assembler "_ZN4041abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk1jE" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle34.C b/gcc/testsuite/g++.dg/abi/mangle34.C new file mode 100644 index 000000000..08c3bc0a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle34.C @@ -0,0 +1,41 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40808 +// { dg-do compile } +// This tests the mangling of empty template argument list in a template +// id. +// { dg-final { scan-assembler "_ZNK5DummyclI3GenEENT_3SigIE10ResultTypeERKS2_" } } + + +struct Void {}; + +template <class R> struct FunType { + typedef R ResultType; +}; + +struct WrongNumberOfSigArgs {}; + +template <typename R> struct CFunType { + template <class Dummy1=Void, class Dummy2=Void> struct Sig : public +FunType<WrongNumberOfSigArgs> {}; + template <class Dummy> struct Sig<Void,Dummy> : public FunType<R> {}; +}; + +struct Dummy { + template <typename F> typename F::template Sig<>::ResultType operator()(F +const& f) const { + return typename F::template Sig<>::ResultType(0); + } +}; + +struct Gen: public CFunType<int> { + int operator()() const {return 0;} + Gen() {} +}; + +int myfunction() { + return Dummy()(Gen()); +} + +int main() { + myfunction(); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle35.C b/gcc/testsuite/g++.dg/abi/mangle35.C new file mode 100644 index 000000000..78d993344 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle35.C @@ -0,0 +1,13 @@ +// PR c++/38600 +// { dg-final { scan-assembler "_Z3barIiE1AIX3fooIT_EEEv" } } + +template<void (*)()> struct A {}; + +template<typename> void foo(); + +template<typename T> A<foo<T> > bar(); + +void baz() +{ + bar<int>(); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle36.C b/gcc/testsuite/g++.dg/abi/mangle36.C new file mode 100644 index 000000000..aaace6570 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle36.C @@ -0,0 +1,9 @@ +// PR c++/41959 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-mavx -fabi-version=4" } +// { dg-final { scan-assembler "_Z1fDv4_f" } } +// { dg-final { scan-assembler "_Z1fDv8_f" } } + +#include <x86intrin.h> +void f(__m128) { } +void f(__m256) { } diff --git a/gcc/testsuite/g++.dg/abi/mangle37.C b/gcc/testsuite/g++.dg/abi/mangle37.C new file mode 100644 index 000000000..7270861ac --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle37.C @@ -0,0 +1,35 @@ +// Testcase for mangling of expressions involving operator names. +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_Z1fI1AEDTclonplfp_fp_EET_" } } +// { dg-final { scan-assembler "_Z1gI1AEDTclonplIT_Efp_fp_EES1_" } } +// { dg-final { scan-assembler "_Z1hI1AEDTcldtfp_miEET_" } } +// { dg-final { scan-assembler "_Z1iI1AEDTcldtfp_srT_miEES1_" } } +// { dg-final { scan-assembler "_Z1jI1AEDTcldtfp_cvPT_EES1_" } } + +struct A { + void operator-(); + template <class T> + operator T(); +}; +template <class T> +T operator+(T,T); + +template <class T> +auto f (T t) -> decltype(operator+(t,t)); +template <class T> +auto g (T t) -> decltype(operator+<T>(t,t)); +template <class T> +auto h (T t) -> decltype(t.operator-()); +template <class T> +auto i (T t) -> decltype(t.T::operator-()); +template <class T> +auto j (T t) -> decltype(t.operator T*()); + +int main() +{ + f(A()); + g(A()); + h(A()); + i(A()); + j(A()); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle39.C b/gcc/testsuite/g++.dg/abi/mangle39.C new file mode 100644 index 000000000..289635610 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle39.C @@ -0,0 +1,28 @@ +// PR c++/42338 +// { dg-options "-std=c++0x -fabi-version=5" } +// { dg-final { scan-assembler "_Z1fIPiEDTcmppfp_Li0EET_" } } +// { dg-final { scan-assembler "_Z1gIiEvRK1AIT_EDTixfL0p_Li0EE" } } + +template<typename T> +auto f(T t) -> decltype(++t, 0) +{ + ++t; + return 0; +} + +template <class T> +struct A +{ + T operator[](int) const { return 0; } +}; + +template< typename T > +void g(const A<T> &a, decltype(a[0]) t) { } + +int main() +{ + f((int*)0); + + A<int> a; + g(a,1); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle4.C b/gcc/testsuite/g++.dg/abi/mangle4.C new file mode 100644 index 000000000..3ce224716 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle4.C @@ -0,0 +1,24 @@ +// Test mangling of type casts +// { dg-do compile } + +class A {}; +class B : public A {}; + +template<const A* a> class C {}; +template<const B* b> class D {}; +template<B* b> class E {}; + +template<const B* b> void f(D<b> &, C<static_cast<const A*>(b)> &) {} // { dg-error "" } +template<const B* b> void g(D<b> &, E<const_cast<B*>(b)> &) {} // { dg-error "" } + +B b; + +int main() +{ + C<static_cast<const A*>(&b)> c; // { dg-error "" } + D<&b> d; + E<const_cast<B*>(&b)> e; // { dg-error "" } + f(d, c); + g(d, e); +} + diff --git a/gcc/testsuite/g++.dg/abi/mangle40.C b/gcc/testsuite/g++.dg/abi/mangle40.C new file mode 100644 index 000000000..2b8300bff --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle40.C @@ -0,0 +1,28 @@ +// PR c++/12909 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-weak "" } +// { dg-require-alias "" } +// { dg-options "-mavx -Wabi -fabi-version=2" } +// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z1fIDv4_fEvT_" } } +// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z1fIU8__vectorfEvT_" } } +// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_ZN1AIDv4_fE1tE" } } +// { dg-final { scan-assembler "(weak|glob)\[^\n\]*_ZN1AIU8__vectorfE1tE" } } + +#include <x86intrin.h> + +template <class T> +struct A +{ + static T t; +}; + +template <class T> +T A<T>::t; // { dg-warning "mangled name" } + +template <class T> +void f (T t) { } // { dg-warning "mangled name" } + +int main() +{ + f (A<__m128>::t); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle41.C b/gcc/testsuite/g++.dg/abi/mangle41.C new file mode 100644 index 000000000..3a9c04f77 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle41.C @@ -0,0 +1,7 @@ +// PR c++/41959 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-mavx -fabi-version=2" } + +#include <x86intrin.h> +void f(__m128) { } // { dg-error "previous" } +void f(__m256) { } // { dg-message "declaration|mangling" } diff --git a/gcc/testsuite/g++.dg/abi/mangle42.C b/gcc/testsuite/g++.dg/abi/mangle42.C new file mode 100644 index 000000000..b7e3bd561 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle42.C @@ -0,0 +1,15 @@ +// Origin: PR c++/43375 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-msse2 -std=gnu++0x" } +// { dg-require-effective-target sse2 } + +typedef float __v4sf __attribute__ ((__vector_size__ (16))); +typedef int __v4si __attribute__ ((__vector_size__ (16))); +__v4sf my_asin(__v4sf x) +{ + static const __v4si g_Mask{0x7fffffff, + 0x00000000, + 0x7fffffff, + 0x7fffffff }; + return __builtin_ia32_andnps ((__v4sf) g_Mask, x); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle43.C b/gcc/testsuite/g++.dg/abi/mangle43.C new file mode 100644 index 000000000..4dfa425f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle43.C @@ -0,0 +1,43 @@ +// { dg-do compile { target int128 } } +// { dg-options "" } + +struct S { + S(void) { m_i128 = 0; m_u128 = 0; } + ~S(void) { } + __int128 get1 (void) { return m_i128; } + unsigned __int128 get2 (void) { return m_u128; } + void set1 (__int128 i) { m_i128 = i; } + void set2 (unsigned int i) { m_u128 = 1; } + __int128 m_i128; + unsigned __int128 m_u128; +}; + +struct S glb; + +__int128 fo1 (void) { return glb.get1 (); } +unsigned __int128 fo2 (void) { return glb.get2 (); } +__int128 fo3 (__int128 i) { __int128 v = fo1 (); glb.set1 (i); return v; } +unsigned __int128 fo4 (unsigned __int128 i) +{ + unsigned __int128 v = fo2 (); glb.set2 (i); + return v; +} + +__int128 fo5 (__int128 i) +{ + return fo3 (i); +} + +__int128 fo5 (unsigned __int128 i) +{ + return (__int128) fo4 (i); +} + + +// { dg-final { scan-assembler "\n_?_Z3fo1v\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z3fo2v\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z3fo3n\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z3fo4o\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z3fo5n\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z3fo5o\[: \t\n\]" } } + diff --git a/gcc/testsuite/g++.dg/abi/mangle44.C b/gcc/testsuite/g++.dg/abi/mangle44.C new file mode 100644 index 000000000..845414842 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle44.C @@ -0,0 +1,19 @@ +// PR c++/45008 + +template <typename T> +struct A +{ + void fn1 () { + struct Nested { + static void fn2 () { } + }; + Nested::fn2(); + } +}; + +void fn3 () { + A<double> a; + a.fn1(); +} + +// { dg-final { scan-assembler-not "_ZZN1AIT_E3fn1EvEN6Nested3fn2Ev" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle45.C b/gcc/testsuite/g++.dg/abi/mangle45.C new file mode 100644 index 000000000..3ce9abcb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle45.C @@ -0,0 +1,25 @@ +// Testcase for mangling of parameters used other than in a trailing return type +// { dg-options "-std=c++0x -fabi-version=5" } + +template<class T> void f(T p, decltype(p)) { } // L = 1 +template<class T> void g(T p, decltype(p) (*)()) { } // L = 1 +// G++ incorrectly rejects these currently. +// template<class T> void h(T p, auto (*)()->decltype(p)); // L = 1 +// template<class T> void i(T p, auto (*)(T q)->decltype(q)); // L = 0 +// template<class T> void j(T p, auto (*)(decltype(p))->T); // L = 2 +template<class T> void k(T p, int (*(*)(T* p))[sizeof(p)]) {} // L = 1 + +int garg(); +int (*karg (int*))[sizeof(int)]; +int main() +{ + // { dg-final { scan-assembler "_Z1fIiEvT_DtfL0p_E" } } + f (1,0); + // { dg-final { scan-assembler "_Z1gIiEvT_PFDtfL0p_EvE" } } + g (1,garg); + // h (1,0); + // i (1,0); + // j (1,0); + // { dg-final { scan-assembler "_Z1kIiEvT_PFPAszfL0p__iPS0_E" } } + k (1,karg); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle46.C b/gcc/testsuite/g++.dg/abi/mangle46.C new file mode 100644 index 000000000..fddc88d0a --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle46.C @@ -0,0 +1,15 @@ +// PR c++/48008 +// { dg-options -fabi-version=5 } +// Test that we retain function-cv-quals in template argument mangling. + +template <class T> +struct A +{ }; + +typedef void cfn(int) const; +typedef void fn(int); + +// { dg-final { scan-assembler "_Z1f1AIFviEE" } } +void f(A<fn>) { } +// { dg-final { scan-assembler "_Z1f1AIKFviEE" } } +void f(A<cfn>) { } diff --git a/gcc/testsuite/g++.dg/abi/mangle5.C b/gcc/testsuite/g++.dg/abi/mangle5.C new file mode 100644 index 000000000..99a08730f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle5.C @@ -0,0 +1,6 @@ +// Test mangling of pointers to cv-qualified member functions + +struct A; +void f (void (A::*)() const) {} + +// { dg-final { scan-assembler "\n_?_Z1fM1AKFvvE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle6.C b/gcc/testsuite/g++.dg/abi/mangle6.C new file mode 100644 index 000000000..280fe2499 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle6.C @@ -0,0 +1,23 @@ +/* Check that __int128 types are mangled. */ +/* { dg-do compile { target mips*-*-* } } */ + +#ifdef __mips64 +typedef int int128 __attribute__ ((mode(TI))); +typedef unsigned int uint128 __attribute__ ((mode(TI))); + +struct S +{ + int128 i; + int128 func1 (int128) const { return i; } + uint128 func2 (uint128) const { return i; } +}; + +int128 (S::*ptr1) (int128) const = &S::func1; +uint128 (S::*ptr2) (uint128) const = &S::func2; +#else +const char *str1 = "_ZNK1S5func1En"; +const char *str2 = "_ZNK1S5func2Eo"; +#endif + +/* { dg-final { scan-assembler _ZNK1S5func1En } } */ +/* { dg-final { scan-assembler _ZNK1S5func2Eo } } */ diff --git a/gcc/testsuite/g++.dg/abi/mangle60.C b/gcc/testsuite/g++.dg/abi/mangle60.C new file mode 100644 index 000000000..189be8590 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle60.C @@ -0,0 +1,21 @@ +// PR c++/51854 +// { dg-options "" } +// { dg-excess-errors "" { xfail *-*-* } } + +template <unsigned N> struct A; + +template <typename U, typename V> +char foo(U, V); + +// { not-dg-final { scan-assembler "_Z3barIiEvP1AIXszcl3foocvT__ELCi0_42EEEE" } } +template <typename U> +void bar(A<sizeof(foo(U(), 42i))> *); + +// { not-dg-final { scan-assembler "_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE" } } +template <typename U> +void baz(A<sizeof(foo(U(), 0.0fj))> *); + +int main() { + bar<int>(0); + baz<int>(0); +} diff --git a/gcc/testsuite/g++.dg/abi/mangle7.C b/gcc/testsuite/g++.dg/abi/mangle7.C new file mode 100644 index 000000000..af178d3e5 --- /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 000000000..6a073588a --- /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/mangle9.C b/gcc/testsuite/g++.dg/abi/mangle9.C new file mode 100644 index 000000000..f3ededfb4 --- /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/noreturn1.C b/gcc/testsuite/g++.dg/abi/noreturn1.C new file mode 100644 index 000000000..0532cf2f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/noreturn1.C @@ -0,0 +1,14 @@ +// Test that attribute noreturn is not part of the mangled name. +// { dg-options -fabi-version=0 } + +void baz (const char *fmt, ...); + +// { dg-final { scan-assembler "_Z3barPFvPKczE" } } +void bar (void (*baz) (const char *fmt, ...) + __attribute__ ((noreturn, format (printf, 1, 2)))); + +void +foo () +{ + bar (&baz); +} diff --git a/gcc/testsuite/g++.dg/abi/noreturn2.C b/gcc/testsuite/g++.dg/abi/noreturn2.C new file mode 100644 index 000000000..72accafe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/noreturn2.C @@ -0,0 +1,14 @@ +// Test for buggy mangling of attribute noreturn in abi<=4 +// { dg-options -fabi-version=4 } + +void baz (const char *fmt, ...); + +// { dg-final { scan-assembler "_Z3barPVFvPKczE" } } +void bar (void (*baz) (const char *fmt, ...) + __attribute__ ((noreturn, format (printf, 1, 2)))); + +void +foo () +{ + bar (&baz); +} diff --git a/gcc/testsuite/g++.dg/abi/offsetof.C b/gcc/testsuite/g++.dg/abi/offsetof.C new file mode 100644 index 000000000..d6a53e6f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/offsetof.C @@ -0,0 +1,22 @@ +// Test that we can refer to the address of a base member of a null pointer +// to get its offset. The standard says that offsetof shall not be used on +// non-POD classes, but there seems to be no such restriction on the common +// implementation thereof. + +// Yes, this is bad, naughty, evil code. But it seems to be well-formed. +// So we'll just warn. + +// { dg-do run } + +struct A { int i; }; + +struct B: public A { + virtual void f (); +}; + +struct C: public B { }; + +int main () +{ + return ((__SIZE_TYPE__) &((C*)0)->i) != sizeof(void*); // { dg-warning "offsetof|invalid" "" } +} diff --git a/gcc/testsuite/g++.dg/abi/packed1.C b/gcc/testsuite/g++.dg/abi/packed1.C new file mode 100644 index 000000000..834537532 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/packed1.C @@ -0,0 +1,24 @@ +// PR c++/41788 +// { dg-do run } +// { dg-options "-Wpacked -Wno-attributes" } + +extern "C" void abort (); + +struct INNER { + virtual int foo() const { return 1; } +} __attribute__ ((packed)); + +struct OUTER { + char c; + INNER inner; +} __attribute__ ((packed)); + +int main() +{ + OUTER outer; + int s = sizeof(outer); + int o = (char *)&outer.inner - (char *)&outer; + if (s != sizeof (char) + sizeof (void*) + || o != sizeof (char)) + abort (); +} diff --git a/gcc/testsuite/g++.dg/abi/param1.C b/gcc/testsuite/g++.dg/abi/param1.C new file mode 100644 index 000000000..c438a1940 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/param1.C @@ -0,0 +1,28 @@ +// { dg-do run } +// + +// Failed on powerpc64-linux for structure sizes > 64 and with size not a +// multiple of 8 after padding. +struct object +{ + int i1; + char s1[60]; + int i2; + char s2[64]; +}; + +extern int subr (struct object obj); + +int main () +{ + struct object obj; + + obj.i1 = 1234; + obj.i2 = 5678; + return subr (obj); +} + +int subr (struct object obj) +{ + return obj.i1 != 1234 || obj.i2 != 5678; +} diff --git a/gcc/testsuite/g++.dg/abi/param2.C b/gcc/testsuite/g++.dg/abi/param2.C new file mode 100644 index 000000000..d28387ab3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/param2.C @@ -0,0 +1,19 @@ +// PR target/20795 +// Test passing aligned empty aggregate +// { dg-do compile } +// { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +struct S { union {} a; } __attribute__((aligned)); + +S +foo (S arg) +{ + return arg; +} + +void +bar (void) +{ + S arg; + foo (arg); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1.h b/gcc/testsuite/g++.dg/abi/pr39188-1.h new file mode 100644 index 000000000..ece67daae --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1.h @@ -0,0 +1,11 @@ +inline int +f (int x) +{ + static union + { + int i; + }; + int j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1a.C b/gcc/testsuite/g++.dg/abi/pr39188-1a.C new file mode 100644 index 000000000..eb646696d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-1b.C" } + +#include "pr39188-1.h" + +int +x (int i) +{ + return f (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1b.C b/gcc/testsuite/g++.dg/abi/pr39188-1b.C new file mode 100644 index 000000000..71c992637 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1b.C @@ -0,0 +1,15 @@ +#include "pr39188-1.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f (1) != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2.h b/gcc/testsuite/g++.dg/abi/pr39188-2.h new file mode 100644 index 000000000..6ff5f49db --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2.h @@ -0,0 +1,12 @@ +template<typename T> +T +f (T x) +{ + static union + { + T i; + }; + T j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2a.C b/gcc/testsuite/g++.dg/abi/pr39188-2a.C new file mode 100644 index 000000000..071b585f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-2b.C" } + +#include "pr39188-2.h" + +int +x (int i) +{ + return f<int> (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2b.C b/gcc/testsuite/g++.dg/abi/pr39188-2b.C new file mode 100644 index 000000000..f91367ba2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2b.C @@ -0,0 +1,15 @@ +#include "pr39188-2.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f<int> (1) != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3.h b/gcc/testsuite/g++.dg/abi/pr39188-3.h new file mode 100644 index 000000000..e0c9f619c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3.h @@ -0,0 +1,11 @@ +static int +f (int x) +{ + static union + { + int i; + }; + int j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3a.C b/gcc/testsuite/g++.dg/abi/pr39188-3a.C new file mode 100644 index 000000000..5596d1241 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-3b.C" } + +#include "pr39188-3.h" + +int +x (int i) +{ + return f (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3b.C b/gcc/testsuite/g++.dg/abi/pr39188-3b.C new file mode 100644 index 000000000..84db157a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3b.C @@ -0,0 +1,15 @@ +#include "pr39188-3.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f (1) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pragma-pack1.C b/gcc/testsuite/g++.dg/abi/pragma-pack1.C new file mode 100644 index 000000000..d90fc200c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pragma-pack1.C @@ -0,0 +1,37 @@ +// PR c++/7046 + +extern "C" int printf (const char *, ...); + +#pragma pack(4) + +template <typename X > +struct T +{ + char x1; /* Usually 3 padding bytes are added after x1 member. */ + int x2; +}; + +template <class T> +int f() +{ + struct A { char i1; int i2; }; + return sizeof (A); +} + +#pragma pack(1) +template struct T<int>; /* T<int> is instantiated here */ +template int f<int>(); + +#pragma pack(4) +template struct T<float>; /* T<float> is instantiated here */ +template int f<double>(); + +int main() +{ + printf("sizeof T<int> = %d\n", sizeof(T<int>)); + printf("sizeof T<float> = %d\n", sizeof(T<float>)); + printf("f<int>() = %d\n", f<int>()); + printf("f<float>() = %d\n", f<float>()); + return (sizeof(T<int>) != sizeof(T<float>) + || f<int>() != f<float>()); +} diff --git a/gcc/testsuite/g++.dg/abi/regparm1.C b/gcc/testsuite/g++.dg/abi/regparm1.C new file mode 100644 index 000000000..42a54a0e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/regparm1.C @@ -0,0 +1,51 @@ +// PR c++/29911 (9381) +// { dg-options -std=c++0x } +// { dg-do run { target i?86-*-* x86_64-*-* } } + +extern "C" int printf(const char *, ...); + +void *save_this; +int *save_addr1, *save_addr2; + +int fail; + +struct Base +{ + __attribute((regparm(3))) void + set(int *addr1, int *addr2) + { + if (this != save_this) + { + ++fail; + printf("error! this == %p, should be %p\n", this, save_this); + } + if (addr1 != save_addr1) + { + ++fail; + printf("error! addr1 == %p, should be %p\n", addr1, save_addr1); + } + if (addr2 != save_addr2) + { + ++fail; + printf("error! addr2 == %p, should be %p\n", addr2, save_addr1); + } + } +}; + +int main() +{ + void (__attribute((regparm(3))) Base::* pfm)(int *, int *) = &Base::set; + __typeof (&Base::set) pfm2 = &Base::set; + decltype (&Base::set) pfm3 = &Base::set; + auto pfm4 = &Base::set; + + Base obj; save_this = &obj; + int x, y; save_addr1 = &x; save_addr2 = &y; + + (obj.* pfm) (&x, &y); + (obj.* pfm2) (&x, &y); + (obj.* pfm3) (&x, &y); + (obj.* pfm4) (&x, &y); + + return fail; +} diff --git a/gcc/testsuite/g++.dg/abi/rtti1.C b/gcc/testsuite/g++.dg/abi/rtti1.C new file mode 100644 index 000000000..f17d88aad --- /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/rtti2.C b/gcc/testsuite/g++.dg/abi/rtti2.C new file mode 100644 index 000000000..eece8724a --- /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/rtti3.C b/gcc/testsuite/g++.dg/abi/rtti3.C new file mode 100644 index 000000000..60dc9b8d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/rtti3.C @@ -0,0 +1,18 @@ +// PR 20647, we must emit the typeinfo's string as weak, but not the +// necessarily the type info object + +// { dg-require-weak "" } +// { dg-skip-if "Linkonce not weak" { *-*-mingw* *-*-cygwin } { "*" } { "" } } +// { dg-final { scan-assembler ".weak\[ \t\]_?_ZTSPP1A" { target { ! { *-*-darwin* alpha*-dec-osf* } } } } } +// { dg-final { scan-assembler-not ".weak\[ \t\]_?_ZTIPP1A" { target { ! { *-*-darwin* alpha*-dec-osf* } } } } } +// { dg-final { scan-assembler ".weak_definition\[ \t\]_?_ZTSPP1A" { target { *-*-darwin* } } } } +// { dg-final { scan-assembler-not ".weak_definition\[ \t\]_?_ZTIPP1A" { target { *-*-darwin* } } } } +// { dg-final { scan-assembler ".weakext\[ \t\]_?_ZTSPP1A" { target { alpha*-dec-osf* } } } } +// { dg-final { scan-assembler-not ".weakext\[ \t\]_?_ZTIPP1A" { target { alpha*-dec-osf* } } } } + +struct A; + +void Foo () +{ + throw (A **)0; +} diff --git a/gcc/testsuite/g++.dg/abi/structret1.C b/gcc/testsuite/g++.dg/abi/structret1.C new file mode 100644 index 000000000..e9d4fd0ff --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/structret1.C @@ -0,0 +1,31 @@ +// { dg-do run { target ia64-*-* } } +// { dg-options "-fabi-version=0" } + +extern "C" void abort (); + +struct ConstructedObject { + ConstructedObject() {}; + ~ConstructedObject() {}; + ConstructedObject(const ConstructedObject &from) {}; +}; + +struct FrameworkObject { + ConstructedObject action(); +}; + +ConstructedObject FrameworkObject::action() { + void *r32, *r33; + + asm("mov %0 = r32\nmov %1 = r33" : "=r"(r32), "=r"(r33) : ); + if (this != r33) { + abort (); + } +} + +int main() +{ + FrameworkObject slawa; + slawa.action(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/abi/thunk1.C b/gcc/testsuite/g++.dg/abi/thunk1.C new file mode 100644 index 000000000..343a2aa6e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/thunk1.C @@ -0,0 +1,24 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } + + +struct A { + virtual void f (); +}; + +struct B : public virtual A { + virtual void f (); +}; + +struct C { + virtual void g (); +}; + +struct D : public C, public B { + virtual void f (); +}; + +void D::f () {} + +// { dg-final { scan-assembler _ZThn4_N1D1fEv } } +// { dg-final { scan-assembler _ZTv0_n12_N1D1fEv } } diff --git a/gcc/testsuite/g++.dg/abi/thunk2.C b/gcc/testsuite/g++.dg/abi/thunk2.C new file mode 100644 index 000000000..e6b2924cf --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/thunk2.C @@ -0,0 +1,27 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options -w } + +struct A { + virtual void f2 (); + virtual void f3 (); +}; + +struct B : virtual public A { + virtual void f3 (); +}; + +struct C : public A, public B { + virtual void f4 (); +}; + +struct D : virtual public B, virtual public C, virtual public A +{ + virtual void f5 (); + virtual void f6 (); + virtual void f3 (); +}; + +void D::f3 () {} + +// { dg-final { scan-assembler _ZTvn4_n20_N1D2f3Ev } } diff --git a/gcc/testsuite/g++.dg/abi/thunk3.C b/gcc/testsuite/g++.dg/abi/thunk3.C new file mode 100644 index 000000000..f2347f79e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/thunk3.C @@ -0,0 +1,22 @@ +// { dg-require-weak "" } +// { dg-final { scan-assembler-not ".weak\[\t \]_?_ZThn._N7Derived3FooEv" { target { ! { *-*-darwin* } } } } } +// { dg-final { scan-assembler-not ".weak_definition\[\t \]_?_ZThn._N7Derived3FooEv" { target { *-*-darwin* } } } } + +struct Base +{ + virtual void Foo (); +}; + +struct Filler +{ + virtual void Baz (); +}; + +struct Derived : Filler, Base +{ + virtual void Foo (); +}; + +void Derived::Foo () +{ +} diff --git a/gcc/testsuite/g++.dg/abi/thunk4.C b/gcc/testsuite/g++.dg/abi/thunk4.C new file mode 100644 index 000000000..cd9eac3ea --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/thunk4.C @@ -0,0 +1,26 @@ +// { dg-require-weak "" } +// { dg-skip-if "Linkonce not weak" { *-*-mingw* *-*-cygwin } { "*" } { "" } } +// { dg-final { scan-assembler ".weak\[ \t\]_?_ZThn._N7Derived3FooEv" { target { ! { *-*-darwin* alpha*-dec-osf* } } } } } +// { dg-final { scan-assembler ".weak_definition\[ \t\]_?_ZThn._N7Derived3FooEv" { target { *-*-darwin* } } } } +// { dg-final { scan-assembler ".weakext\[ \t\]_?_ZThn._N7Derived3FooEv" { target { alpha*-dec-osf* } } } } + +struct Base +{ + virtual void Foo (); +}; + +struct Filler +{ + virtual void Baz (); +}; + +struct Derived : Filler, Base +{ + virtual void Foo (); +}; + +inline void Derived::Foo () +{ +} + +Derived f; diff --git a/gcc/testsuite/g++.dg/abi/thunk5.C b/gcc/testsuite/g++.dg/abi/thunk5.C new file mode 100644 index 000000000..15526bf9e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/thunk5.C @@ -0,0 +1,13 @@ +// PR c++/35067 +// The thunks should be weak even on targets without one-only support. +// { dg-require-weak "" } +// { dg-final { scan-assembler "weak.*ZTv" } } + +struct A +{ + virtual ~A() { } +}; + +struct B: virtual A { }; + +B b; diff --git a/gcc/testsuite/g++.dg/abi/vague1.C b/gcc/testsuite/g++.dg/abi/vague1.C new file mode 100644 index 000000000..02feee9e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vague1.C @@ -0,0 +1,17 @@ +// Test that we don't emit unneeded copies of static data member template +// instantiations. + +// Disable debug info so we don't get confused by the symbol name there. +// { dg-options "-g0" } + +template <class T> struct A { + static const T t = 0; +}; + +template <class T> const T A<T>::t; + +int i; +int main () +{ + i = A<int>::t; // Should just use the value +} diff --git a/gcc/testsuite/g++.dg/abi/vbase1.C b/gcc/testsuite/g++.dg/abi/vbase1.C new file mode 100644 index 000000000..39d8b8102 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase1.C @@ -0,0 +1,60 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Sept 2001 <nathan@codesourcery.com> + +// Bug 3986. Another indirect primary base problem. + +struct Consts +{ +}; + +struct MathLib : + virtual Consts +{ +}; + +struct Parallel : + virtual Consts +{ +}; + +struct Particles : + virtual MathLib, + virtual Parallel +{ +}; + +struct Ring : + virtual Particles +{ +}; + +struct Injection : + virtual Particles, + virtual Ring +{ +}; + +struct LSpaceCharge : + virtual Ring, + virtual Injection +{ +}; + +struct Bump : + virtual Consts +{ +}; + +struct Output : + virtual Injection, + virtual Bump +{ +}; + +struct Plots : + virtual LSpaceCharge, + virtual Output +{ +}; diff --git a/gcc/testsuite/g++.dg/abi/vbase10.C b/gcc/testsuite/g++.dg/abi/vbase10.C new file mode 100644 index 000000000..b6e7f88fc --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase10.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// -fpack-struct is necessary because the code below assumes the initial +// packing is larger than 1, which cannot ge guaranteed for all targets. +// { dg-options "-Wabi -fabi-version=1 -fpack-struct=8" } +// On ARM processors, the alignment of B will be 4 even though it +// contains only a single "char". That would avoids the situation +// that the warning below is designed to catch. We therefore +// explicitly set the default structure alignment to 1. +// { dg-options "-Wabi -fabi-version=1 -mstructure-size-boundary=8" { target arm*-*-* } } + +struct A { virtual void f(); char c1; }; +struct B { B(); char c2; }; +struct C : public A, public virtual B {}; // { dg-warning "ABI" } + diff --git a/gcc/testsuite/g++.dg/abi/vbase11.C b/gcc/testsuite/g++.dg/abi/vbase11.C new file mode 100644 index 000000000..8c854b9c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase11.C @@ -0,0 +1,13 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0" } + +struct A { virtual void f(); char c1; }; +struct B { B(); char c2; }; +struct C : public A, public virtual B { }; + +int main () { + if (sizeof (C) != 8) + return 1; +} + diff --git a/gcc/testsuite/g++.dg/abi/vbase12.C b/gcc/testsuite/g++.dg/abi/vbase12.C new file mode 100644 index 000000000..98b9054f0 --- /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 000000000..6a0bff484 --- /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 000000000..320d5ba77 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase14.C @@ -0,0 +1,6 @@ +// { dg-options "-Wabi -fabi-version=1" } + +struct E1 {}; +struct E2 : public E1 {}; // { dg-warning "layout" } +struct E : public E1, public E2 {}; // { dg-warning "layout|ambiguity" } +struct N : public E { virtual void f () {} }; // { dg-warning "nearly" } diff --git a/gcc/testsuite/g++.dg/abi/vbase15.C b/gcc/testsuite/g++.dg/abi/vbase15.C new file mode 100644 index 000000000..a0908f40e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase15.C @@ -0,0 +1,30 @@ + // { dg-do run } + +struct Spec + +{ + virtual int id () const = 0; +}; +class D1_1_Spec : public virtual Spec { }; +class D1_2_Spec : public virtual Spec { }; +class D1_3_Spec : public virtual Spec { }; +class D2_1_Spec : public D1_1_Spec, public D1_2_Spec { }; +class D2_Spec : public virtual D2_1_Spec, public virtual D1_3_Spec { }; + +struct D3_Spec : public D2_Spec +{ + virtual int id () const { return 3; } + +}; + +__attribute__((noinline)) void foo(D3_Spec* spec) +{ + spec->id(); +} + +int main() +{ + D3_Spec spec; + foo(&spec); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/vbase8-10.C b/gcc/testsuite/g++.dg/abi/vbase8-10.C new file mode 100644 index 000000000..81896ed64 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase8-10.C @@ -0,0 +1,75 @@ +// { dg-options -w } +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com> + +// Origin stefan@space.twc.de +// Bug 3145 case 10. Horribly complicated class hierarchy + +class C0 +{}; +class C1 + : public C0 +{}; +class C2 + : public C1 + , virtual public C0 +{}; +class C3 + : public C1 + , public C2 + , virtual public C0 +{}; +class C4 + : virtual public C1 + , virtual public C0 + , virtual public C3 + , public C2 +{}; +class C5 + : public C3 + , virtual public C0 + , virtual public C2 +{}; +class C6 + : public C1 + , public C2 + , virtual public C5 + , virtual public C3 + , virtual public C0 +{}; +class C7 + : public C1 + , virtual public C5 + , virtual public C4 + , virtual public C2 + , virtual public C0 + , virtual public C6 +{}; +class C8 + : virtual public C4 + , public C3 + , public C0 + , virtual public C7 + , virtual public C6 +{}; +class C9 + : virtual public C0 + , public C4 + , public C8 + , public C1 + , public C6 +{}; +main() { + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; +} diff --git a/gcc/testsuite/g++.dg/abi/vbase8-21.C b/gcc/testsuite/g++.dg/abi/vbase8-21.C new file mode 100644 index 000000000..0da644625 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase8-21.C @@ -0,0 +1,75 @@ +// { dg-options -w } +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com> + +// Origin stefan@space.twc.de +// Bug 3145 case 10. Horribly complicated class hierarchy + +class C0 +{}; +class C1 + : virtual public C0 +{}; +class C2 + : virtual public C1 + , virtual public C0 +{}; +class C3 + : virtual public C2 + , virtual public C1 +{}; +class C4 + : virtual public C2 + , public C0 + , public C1 +{}; +class C5 + : virtual public C0 + , public C2 + , virtual public C1 + , virtual public C3 + , virtual public C4 +{}; +class C6 + : virtual public C1 + , virtual public C3 + , public C0 + , public C2 + , virtual public C4 +{}; +class C7 + : virtual public C5 + , public C2 + , public C6 + , virtual public C0 + , public C3 +{}; +class C8 + : virtual public C5 + , public C7 + , virtual public C0 + , virtual public C2 + , virtual public C6 +{}; +class C9 + : virtual public C2 + , virtual public C4 + , public C1 + , virtual public C0 + , public C7 + , public C5 +{}; +main() { + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; +} diff --git a/gcc/testsuite/g++.dg/abi/vbase8-22.C b/gcc/testsuite/g++.dg/abi/vbase8-22.C new file mode 100644 index 000000000..4edb2b47a --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase8-22.C @@ -0,0 +1,80 @@ +// { dg-options -w } +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Jul 2001 <nathan@codesourcery.com> + +// Origin stefan@space.twc.de +// Bug 3145 case 22. Horribly complicated class hierarchy + +class C0 +{}; +class C1 + : public C0 +{}; +class C2 + : public C1 + , virtual public C0 +{}; +class C3 + : virtual public C0 + , virtual public C2 + , virtual public C1 +{}; +class C4 + : virtual public C2 + , public C1 + , virtual public C3 + , public C0 +{}; +class C5 + : virtual public C0 + , virtual public C4 + , public C1 + , virtual public C2 + , virtual public C3 +{}; +class C6 + : public C0 + , virtual public C1 + , public C5 + , public C2 + , virtual public C3 + , virtual public C4 +{}; +class C7 + : virtual public C1 + , public C5 + , virtual public C6 + , virtual public C4 + , virtual public C3 + , virtual public C0 +{}; +class C8 + : virtual public C6 + , virtual public C1 + , virtual public C2 + , public C3 + , virtual public C4 +{}; +class C9 + : public C4 + , virtual public C2 + , virtual public C8 + , public C3 + , public C1 + , public C6 + , public C5 +{}; +main() { + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; +} diff --git a/gcc/testsuite/g++.dg/abi/vbase8-4.C b/gcc/testsuite/g++.dg/abi/vbase8-4.C new file mode 100644 index 000000000..2e816f6a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vbase8-4.C @@ -0,0 +1,78 @@ +// { dg-options -w } +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com> + +// Origin stefan@space.twc.de +// Bug 3145 case 4. Horribly complicated class hierarchy + +class C0 +{}; +class C1 + : virtual public C0 +{}; +class C2 + : public C0 + , public C1 +{}; +class C3 + : virtual public C0 + , public C1 + , public C2 +{}; +class C4 + : public C2 + , public C3 + , virtual public C1 + , virtual public C0 +{}; +class C5 + : virtual public C2 + , public C1 + , public C0 +{}; +class C6 + : virtual public C0 + , virtual public C5 + , public C1 + , public C3 + , public C4 +{}; +class C7 + : public C6 + , virtual public C0 + , public C1 + , public C2 + , virtual public C4 +{}; +class C8 + : public C2 + , virtual public C6 + , virtual public C7 + , public C5 + , public C3 + , virtual public C4 +{}; +class C9 + : public C5 + , virtual public C3 + , virtual public C8 + , public C0 + , public C2 + , public C7 + , public C6 + , public C4 +{}; +main() { + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; +} diff --git a/gcc/testsuite/g++.dg/abi/vbase9.C b/gcc/testsuite/g++.dg/abi/vbase9.C new file mode 100644 index 000000000..4a0540d06 --- /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 {}; diff --git a/gcc/testsuite/g++.dg/abi/vcall1.C b/gcc/testsuite/g++.dg/abi/vcall1.C new file mode 100644 index 000000000..00830cd23 --- /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/vthunk1.C b/gcc/testsuite/g++.dg/abi/vthunk1.C new file mode 100644 index 000000000..73a0b13f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vthunk1.C @@ -0,0 +1,45 @@ +// { dg-do link } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Jul 2001 <nathan@codesourcery.com> + +// Origin snyder@fnal.gov +// Bug 3631. We mis-calculated the non-virtual part of a virtual +// thunk. Leading to a link failure, in this case. + +struct A { virtual ~A () {} }; + +struct B : virtual public A +{ + virtual void destroy() {} +}; + +class C : virtual public B {}; +class D : virtual public C {}; +class E : public virtual A {}; + +struct F : virtual public B, virtual public E +{ + virtual void destroy() = 0; +}; + +struct G : public virtual F +{ + virtual void destroy() {} +}; + +class H : virtual public C, virtual public F {}; +class I : virtual public D, virtual public H {}; +class J : public virtual G, public virtual H {}; + +class K : public virtual I, public virtual J +{ + public: + virtual ~K(); +}; +K::~K() {} + +int main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/vthunk2.C b/gcc/testsuite/g++.dg/abi/vthunk2.C new file mode 100644 index 000000000..9b6f14c50 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vthunk2.C @@ -0,0 +1,17 @@ +// { dg-do compile { target i?86-*-* x86_64-*-*} } +// { dg-require-effective-target ilp32 } + +struct c0 { + virtual void f (); +}; + +struct c1 : virtual public c0 { +}; + +struct c2 : virtual public c0, public c1 { + virtual void f (); +}; + +void c2::f () {} + +// { dg-final { scan-assembler _ZTv0_n12_N2c21fEv } } diff --git a/gcc/testsuite/g++.dg/abi/vthunk3.C b/gcc/testsuite/g++.dg/abi/vthunk3.C new file mode 100644 index 000000000..59fbbdc4b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/vthunk3.C @@ -0,0 +1,27 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0" } + +struct A { + virtual void a (); +}; + +struct B : virtual public A { + virtual void b (); + virtual void a (); +}; + +struct C { + virtual void c (); +}; + +struct D : public C, public B { +}; + +struct E : virtual public D { + void b (); +}; + +void E::b () {} + +// { dg-final { scan-assembler _ZTvn4_n20_N1E1bEv } } diff --git a/gcc/testsuite/g++.dg/abi/vtt1.C b/gcc/testsuite/g++.dg/abi/vtt1.C new file mode 100644 index 000000000..8235c460b --- /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 } } |